git ssb

0+

wanderer🌟 / js-primea-hypervisor



Tree: 463dc84f2cfff964ba0c0ea55de6f903a4f344a3

Files: 463dc84f2cfff964ba0c0ea55de6f903a4f344a3 / index.js

2331 bytesRaw
1const Graph = require('ipld-graph-builder')
2const multibase = require('multibase')
3const Kernel = require('./kernel.js')
4
5module.exports = class Hypervisor {
6 constructor (opts) {
7 this.graph = new Graph(opts.dag)
8 this._vmInstances = new Map()
9 this._VMs = {}
10 }
11
12 async getInstance (port) {
13 let id = await this.generateID(port)
14 let kernel = this._vmInstances.get(id)
15 if (!kernel) {
16 // load the the ID from the merkle store
17 await this.graph.tree(port.id, 1)
18 const parentID = await this.generateID({id: port.id['/'].parent})
19 const parentKernel = await this._vmInstances.get(parentID)
20 const parentPort = parentKernel.entryPort
21
22 kernel = await this.createInstanceFromPort(port, parentPort)
23 kernel.on('idle', () => {
24 this._vmInstances.delete(id)
25 })
26 }
27 return kernel
28 }
29
30 // given a port, wait untill its source contract has reached the threshold
31 // tick count
32 async wait (port, threshold, fromPort) {
33 let kernel = await this.getInstance(port)
34 return kernel.wait(threshold, fromPort)
35 }
36
37 async createInstance (type, state, entryPort = null, parentPort) {
38 const VM = this._VMs[type]
39 if (!state) {
40 state = {
41 '/': VM.createState()
42 }
43 }
44
45 // create a new kernel instance
46 const kernel = new Kernel({
47 entryPort: entryPort,
48 parentPort: parentPort,
49 hypervisor: this,
50 state: state,
51 VM: VM
52 })
53
54 const id = await this.generateID(entryPort)
55 // save the newly created instance
56 this._vmInstances.set(id, kernel)
57 await kernel.start()
58 return kernel
59 }
60
61 /**
62 * opts.entryPort
63 * opts.parentPort
64 */
65 async createInstanceFromPort (entryPort, parentPort) {
66 const state = entryPort.link
67 return this.createInstance(entryPort.type, state, entryPort, parentPort)
68 }
69
70 async createStateRoot (container, ticks) {
71 await container.wait(ticks)
72 return this.graph.flush(container.state)
73 }
74
75 async generateID (port) {
76 if (!port || !port.id) {
77 return null
78 }
79 let id = Object.assign({}, port.id)
80 id = await this.graph.flush(id)
81 id = id['/']
82 if (Buffer.isBuffer(id)) {
83 id = multibase.encode('base58btc', id).toString()
84 }
85 return id
86 }
87
88 registerContainer (type, vm) {
89 this._VMs[type] = vm
90 }
91}
92

Built with git-ssb-web