git ssb

0+

wanderer🌟 / js-primea-hypervisor



Tree: eec495cebe6cfffd8d1cb71c3d83f4ce2c9d30a7

Files: eec495cebe6cfffd8d1cb71c3d83f4ce2c9d30a7 / index.js

1518 bytesRaw
1const Graph = require('ipld-graph-builder')
2const Kernel = require('./kernel.js')
3
4module.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