Files: 67bff6abda5477a082d3bc7a33ada595b985e2eb / index.js
1518 bytesRaw
1 | const Graph = require('ipld-graph-builder') |
2 | const Kernel = require('./kernel.js') |
3 | |
4 | module.exports = class Hypervisor { |
5 | constructor (opts) { |
6 | this.graph = new Graph(opts.dag) |
7 | this._vmInstances = new Map() |
8 | this._VMs = {} |
9 | } |
10 | |
11 | async getInstance (port, parentPort) { |
12 | let kernel = this._vmInstances.get(port) |
13 | if (!kernel) { |
14 | kernel = await this.createInstance(port.type, port.link, port, parentPort) |
15 | kernel.on('idle', () => { |
16 | this._vmInstances.delete(port) |
17 | }) |
18 | } |
19 | return kernel |
20 | } |
21 | |
22 | // given a port, wait untill its source contract has reached the threshold |
23 | // tick count |
24 | async wait (port, threshold, fromPort) { |
25 | let kernel = this._vmInstances.get(port) |
26 | if (kernel) { |
27 | return kernel.wait(threshold, fromPort) |
28 | } else { |
29 | return threshold |
30 | } |
31 | } |
32 | |
33 | async createInstance (type, state, entryPort = null, parentPort) { |
34 | const VM = this._VMs[type] |
35 | |
36 | if (!state) { |
37 | state = { |
38 | '/': VM.createState() |
39 | } |
40 | } |
41 | |
42 | // create a new kernel instance |
43 | const kernel = new Kernel({ |
44 | entryPort: entryPort, |
45 | parentPort: parentPort, |
46 | hypervisor: this, |
47 | state: state, |
48 | VM: VM |
49 | }) |
50 | |
51 | // save the newly created instance |
52 | this._vmInstances.set(entryPort, kernel) |
53 | await kernel.start() |
54 | return kernel |
55 | } |
56 | |
57 | async createStateRoot (container, ticks) { |
58 | await container.wait(ticks) |
59 | return this.graph.flush(container.state) |
60 | } |
61 | |
62 | registerContainer (type, vm) { |
63 | this._VMs[type] = vm |
64 | } |
65 | } |
66 |
Built with git-ssb-web