Commit c091abb0870d405499f6c16a44b7e83135f443d2
added valid port checks
wanderer committed on 5/15/2017, 9:39:17 PMParent: 96e39ab7ae1995be4bbba6a87ca43f4a1e310e4c
Files changed
kernel.js | changed |
portManager.js | changed |
tests/index.js | changed |
kernel.js | ||
---|---|---|
@@ -115,8 +115,12 @@ | ||
115 | 115 | } |
116 | 116 | } |
117 | 117 | |
118 | 118 | async send (portRef, message) { |
119 | + if (!this.ports.isValidPort(portRef)) { | |
120 | + throw new Error('invalid port referance') | |
121 | + } | |
122 | + | |
119 | 123 | message._fromPort = this.entryPort |
120 | 124 | message._fromPortTicks = this.ticks |
121 | 125 | |
122 | 126 | const vm = await this.hypervisor.getInstance(portRef, true, this.entryPort) |
portManager.js | ||
---|---|---|
@@ -14,8 +14,9 @@ | ||
14 | 14 | } else if (!b) { |
15 | 15 | return pairA |
16 | 16 | } |
17 | 17 | |
18 | + // order by number of ticks if messages have different number of ticks | |
18 | 19 | if (a._fromPortTicks !== b._fromPortTicks) { |
19 | 20 | return a._fromPortTicks < b._fromPortTicks ? pairA : pairB |
20 | 21 | } else if (a.priority !== b.priority) { |
21 | 22 | // decide by priority |
@@ -37,9 +38,9 @@ | ||
37 | 38 | |
38 | 39 | async start () { |
39 | 40 | // skip the root, since it doesn't have a parent |
40 | 41 | if (this.parentPort !== undefined) { |
41 | - this._portMap.set(this.parentPort, new Port(ENTRY)) | |
42 | + this._mapPort(ENTRY, this.parentPort) | |
42 | 43 | } |
43 | 44 | // map ports to thier id's |
44 | 45 | this.ports = await this.hypervisor.graph.get(this.state, 'ports') |
45 | 46 | Object.keys(this.ports).map(name => { |
@@ -60,8 +61,18 @@ | ||
60 | 61 | get (key) { |
61 | 62 | return this.ports[key] |
62 | 63 | } |
63 | 64 | |
65 | + delete (key) { | |
66 | + const port = this.ports[key] | |
67 | + delete this.ports[key] | |
68 | + this._portMap.delete(port) | |
69 | + } | |
70 | + | |
71 | + isValidPort (port) { | |
72 | + return this._portMap.has(port) | |
73 | + } | |
74 | + | |
64 | 75 | create (type, name) { |
65 | 76 | const VM = this.hypervisor._VMs[type] |
66 | 77 | const parentId = this.entryPort ? this.entryPort.id : null |
67 | 78 | let nonce = this.state['/'].nonce |
@@ -79,9 +90,9 @@ | ||
79 | 90 | '/': VM.createState() |
80 | 91 | } |
81 | 92 | } |
82 | 93 | |
83 | - // create the port instance | |
94 | + // save the port instance | |
84 | 95 | this.ports[name] = portRef |
85 | 96 | this._mapPort(name, portRef) |
86 | 97 | |
87 | 98 | // incerment the nonce |
@@ -101,13 +112,16 @@ | ||
101 | 112 | const promises = unkownPorts.map(async ([portRef, port]) => { |
102 | 113 | // update the port's tick count |
103 | 114 | port.ticks = await this.hypervisor.wait(portRef, threshold, this.entryPort) |
104 | 115 | }) |
116 | + | |
105 | 117 | return Promise.all(promises) |
106 | 118 | } |
107 | 119 | |
108 | 120 | async getNextMessage () { |
109 | - await this.wait(this.kernel.ticks, this.entryPort) | |
110 | - const portMap = [...this._portMap].reduce(messageArbiter) | |
111 | - return portMap[1].shift() | |
121 | + if (this._portMap.size) { | |
122 | + await this.wait(this.kernel.ticks, this.entryPort) | |
123 | + const portMap = [...this._portMap].reduce(messageArbiter) | |
124 | + return portMap[1].shift() | |
125 | + } | |
112 | 126 | } |
113 | 127 | } |
tests/index.js | ||
---|---|---|
@@ -201,13 +201,11 @@ | ||
201 | 201 | tape('traps', async t => { |
202 | 202 | t.plan(1) |
203 | 203 | class Root extends BaseContainer { |
204 | 204 | async run (m) { |
205 | - await Promise.all([ | |
206 | - this.kernel.ports.create('root', 'one'), | |
207 | - this.kernel.ports.create('root', 'two'), | |
208 | - this.kernel.ports.create('root', 'three') | |
209 | - ]) | |
205 | + this.kernel.ports.create('root', 'one') | |
206 | + this.kernel.ports.create('root', 'two') | |
207 | + this.kernel.ports.create('root', 'three') | |
210 | 208 | |
211 | 209 | throw new Error('it is a trap!!!') |
212 | 210 | } |
213 | 211 | } |
@@ -227,8 +225,38 @@ | ||
227 | 225 | } |
228 | 226 | }, 'should revert the state') |
229 | 227 | }) |
230 | 228 | |
229 | + tape('invalid port referances', async t => { | |
230 | + t.plan(2) | |
231 | + class Root extends BaseContainer { | |
232 | + async run (m) { | |
233 | + const ports = this.kernel.ports.create('root', 'three') | |
234 | + this.kernel.ports.delete('three') | |
235 | + try { | |
236 | + await this.kernel.send(ports, new Message()) | |
237 | + } catch (e) { | |
238 | + t.pass() | |
239 | + } | |
240 | + } | |
241 | + } | |
242 | + | |
243 | + const hypervisor = new Hypervisor({ | |
244 | + dag: node.dag | |
245 | + }) | |
246 | + | |
247 | + hypervisor.registerContainer('root', Root) | |
248 | + const root = await hypervisor.createInstance('root') | |
249 | + await root.run() | |
250 | + | |
251 | + t.deepEquals(root.state, { | |
252 | + '/': { | |
253 | + nonce: [1], | |
254 | + ports: {} | |
255 | + } | |
256 | + }) | |
257 | + }) | |
258 | + | |
231 | 259 | tape('message should arrive in the correct oder if sent in order', async t => { |
232 | 260 | t.plan(2) |
233 | 261 | |
234 | 262 | class Root extends BaseContainer { |
Built with git-ssb-web