wao 0.7.2 → 0.8.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.cache/data.mdb +0 -0
- package/.cache/lock.mdb +0 -0
- package/cjs/aoconnect.js +565 -365
- package/cjs/armem.js +399 -73
- package/cjs/cli.js +63 -0
- package/cjs/run.js +19 -3
- package/cjs/server.js +4 -2
- package/cjs/tao.js +3 -1
- package/cjs/tar.js +185 -103
- package/esm/.cache/data.mdb +0 -0
- package/esm/.cache/lock.mdb +0 -0
- package/esm/aoconnect.js +56 -51
- package/esm/armem.js +94 -7
- package/esm/cli.js +39 -0
- package/esm/run.js +15 -4
- package/esm/server.js +3 -2
- package/esm/tao.js +5 -1
- package/esm/tar.js +31 -25
- package/package.json +8 -11
- package/esm/.cache/opt.json +0 -1
package/esm/aoconnect.js
CHANGED
|
@@ -23,12 +23,12 @@ import { scheduler, mu, su, cu, acc } from "./test.js"
|
|
|
23
23
|
import { is, clone, fromPairs, map, mergeLeft, isNil } from "ramda"
|
|
24
24
|
import AR from "./tar.js"
|
|
25
25
|
|
|
26
|
-
export const connect = (mem, { log = false, extensions = {} } = {}) => {
|
|
26
|
+
export const connect = (mem, { cache, log = false, extensions = {} } = {}) => {
|
|
27
27
|
const isMem = mem?.__type__ === "mem"
|
|
28
28
|
if (!isMem) {
|
|
29
|
-
let args = {}
|
|
29
|
+
let args = { cache }
|
|
30
30
|
if (mem?.SU_URL) {
|
|
31
|
-
args = mem
|
|
31
|
+
args = mergeLeft(mem, args)
|
|
32
32
|
args.scheduler = scheduler
|
|
33
33
|
}
|
|
34
34
|
mem = new ArMem(args)
|
|
@@ -56,14 +56,14 @@ export const connect = (mem, { log = false, extensions = {} } = {}) => {
|
|
|
56
56
|
return output
|
|
57
57
|
}
|
|
58
58
|
|
|
59
|
-
const genMsg = (Id, p, data, Tags, from, Owner, dry = false) => {
|
|
59
|
+
const genMsg = async (Id, p, data, Tags, from, Owner, dry = false) => {
|
|
60
60
|
if (!dry) p.height += 1
|
|
61
61
|
return {
|
|
62
62
|
Id,
|
|
63
63
|
Target: p.id,
|
|
64
64
|
Owner,
|
|
65
65
|
Data: data?.length ? data : "",
|
|
66
|
-
"Block-Height": mem.height.toString(),
|
|
66
|
+
"Block-Height": (await mem.get("height")).toString(),
|
|
67
67
|
Timestamp: Date.now().toString(),
|
|
68
68
|
Module: p.module,
|
|
69
69
|
From: from,
|
|
@@ -94,31 +94,10 @@ export const connect = (mem, { log = false, extensions = {} } = {}) => {
|
|
|
94
94
|
},
|
|
95
95
|
}
|
|
96
96
|
}
|
|
97
|
-
|
|
98
97
|
const spawn = async (opt = {}) => {
|
|
99
98
|
if (!opt.module) throw Error("module missing")
|
|
100
99
|
if (!opt.scheduler) throw Error("scheduler missing")
|
|
101
|
-
|
|
102
|
-
let _module = null
|
|
103
|
-
const __dirname = await dirname()
|
|
104
|
-
let format = null
|
|
105
|
-
let wasm = mem.wasms[mod]?.data
|
|
106
|
-
if (!wasm) {
|
|
107
|
-
if (mem.wasms[mod]?.file) {
|
|
108
|
-
wasm = readFileSync(
|
|
109
|
-
resolve(__dirname, `lua/${mem.wasms[mod].file}.wasm`),
|
|
110
|
-
)
|
|
111
|
-
format = mem.wasms[mod].format
|
|
112
|
-
} else if (mem.txs[mod]) {
|
|
113
|
-
wasm = Buffer.from(mem.txs[mod].data, "base64")
|
|
114
|
-
format = tags(mem.txs[mod].tags)["Module-Format"]
|
|
115
|
-
}
|
|
116
|
-
} else {
|
|
117
|
-
format = mem.wasms[mod].format
|
|
118
|
-
}
|
|
119
|
-
format ??= "wasm64-unknown-emscripten-draft_2024_02_15"
|
|
120
|
-
|
|
121
|
-
if (!mod) throw Error("module not found")
|
|
100
|
+
const { mod, wasm, format } = await mem.getWasm(opt.module, mem)
|
|
122
101
|
opt.tags = buildTags(
|
|
123
102
|
null,
|
|
124
103
|
mergeLeft(tags(opt.tags ?? []), {
|
|
@@ -132,7 +111,6 @@ export const connect = (mem, { log = false, extensions = {} } = {}) => {
|
|
|
132
111
|
}),
|
|
133
112
|
)
|
|
134
113
|
let ex = false
|
|
135
|
-
opt.tags ??= []
|
|
136
114
|
for (let v of opt.tags) if (v.name === "Type") ex = true
|
|
137
115
|
if (!ex) opt.tags.push({ name: "Type", value: "Process" })
|
|
138
116
|
const {
|
|
@@ -151,24 +129,28 @@ export const connect = (mem, { log = false, extensions = {} } = {}) => {
|
|
|
151
129
|
await ar.postItems(item, su.jwk)
|
|
152
130
|
const now = Date.now
|
|
153
131
|
const t = tags(opt.tags)
|
|
154
|
-
const
|
|
132
|
+
const ext = t.Extension || "WeaveDrive"
|
|
133
|
+
const wdrive = extensions[ext]
|
|
155
134
|
let handle = null
|
|
156
135
|
try {
|
|
157
136
|
handle = await AoLoader(wasm, {
|
|
158
137
|
format,
|
|
159
138
|
WeaveDrive: wdrive,
|
|
160
139
|
spawn: item,
|
|
161
|
-
module: mem.txs
|
|
140
|
+
module: await mem.get("txs", mod),
|
|
162
141
|
})
|
|
163
142
|
} catch (e) {}
|
|
164
143
|
if (!handle) return null
|
|
144
|
+
let _module = null
|
|
165
145
|
_module = { handle, id: mod }
|
|
166
146
|
Date.now = now
|
|
167
|
-
|
|
168
147
|
const _tags = tags(opt.tags)
|
|
169
148
|
let res = null
|
|
170
149
|
let memory = opt.memory ?? null
|
|
171
150
|
let p = {
|
|
151
|
+
extension: ext,
|
|
152
|
+
item: item?.binary,
|
|
153
|
+
format,
|
|
172
154
|
id: id,
|
|
173
155
|
epochs: [],
|
|
174
156
|
handle: _module.handle,
|
|
@@ -187,8 +169,8 @@ export const connect = (mem, { log = false, extensions = {} } = {}) => {
|
|
|
187
169
|
} else if (_tags["On-Boot"] || true) {
|
|
188
170
|
let data = ""
|
|
189
171
|
if (_tags["On-Boot"] === "Data") data = opt.data ?? ""
|
|
190
|
-
else data = mem.msgs
|
|
191
|
-
let msg = genMsg(id, p, data, opt.tags, owner, mu.addr, true)
|
|
172
|
+
else data = (await mem.get("msgs", _tags["On-Boot"]))?.data ?? ""
|
|
173
|
+
let msg = await genMsg(id, p, data, opt.tags, owner, mu.addr, true)
|
|
192
174
|
const _env = genEnv({
|
|
193
175
|
pid: p.id,
|
|
194
176
|
owner: p.owner,
|
|
@@ -202,8 +184,7 @@ export const connect = (mem, { log = false, extensions = {} } = {}) => {
|
|
|
202
184
|
} else {
|
|
203
185
|
p.height += 1
|
|
204
186
|
}
|
|
205
|
-
mem.msgs
|
|
206
|
-
mem.env[id] = p
|
|
187
|
+
await mem.set(opt, "msgs", id)
|
|
207
188
|
if (_tags["Cron-Interval"]) {
|
|
208
189
|
let [num, unit] = _tags["Cron-Interval"].split("-")
|
|
209
190
|
let int = 0
|
|
@@ -236,9 +217,10 @@ export const connect = (mem, { log = false, extensions = {} } = {}) => {
|
|
|
236
217
|
cronTags.push({ name: k.replace(/Cron-Tag-/, ""), value: _tags[k] })
|
|
237
218
|
}
|
|
238
219
|
}
|
|
239
|
-
|
|
240
|
-
|
|
220
|
+
p.cronTags = cronTags
|
|
221
|
+
p.span = int
|
|
241
222
|
}
|
|
223
|
+
await mem.set(p, "env", id)
|
|
242
224
|
return id
|
|
243
225
|
}
|
|
244
226
|
|
|
@@ -252,9 +234,9 @@ export const connect = (mem, { log = false, extensions = {} } = {}) => {
|
|
|
252
234
|
}
|
|
253
235
|
|
|
254
236
|
const assign = async opt => {
|
|
255
|
-
const p = mem.env
|
|
237
|
+
const p = await mem.get("env", opt.process)
|
|
256
238
|
if (!p) return null
|
|
257
|
-
let _opt = mem.msgs
|
|
239
|
+
let _opt = await mem.get("msgs", opt.message)
|
|
258
240
|
let hash = genHashChain(p.hash, opt.message)
|
|
259
241
|
p.hash = hash
|
|
260
242
|
opt.tags = buildTags(
|
|
@@ -267,7 +249,7 @@ export const connect = (mem, { log = false, extensions = {} } = {}) => {
|
|
|
267
249
|
Variant: "ao.TN.1",
|
|
268
250
|
SDK: "aoconnect",
|
|
269
251
|
Type: "Assignment",
|
|
270
|
-
"Block-Height": mem.height,
|
|
252
|
+
"Block-Height": await mem.get("height"),
|
|
271
253
|
Process: opt.process,
|
|
272
254
|
Message: opt.message,
|
|
273
255
|
"Hash-Chain": hash,
|
|
@@ -305,22 +287,34 @@ export const connect = (mem, { log = false, extensions = {} } = {}) => {
|
|
|
305
287
|
}
|
|
306
288
|
}
|
|
307
289
|
// check: is owner=mu.addr right?
|
|
308
|
-
const msg = genMsg(opt.message, p, data, _tags, from, mu.addr)
|
|
290
|
+
const msg = await genMsg(opt.message, p, data, _tags, from, mu.addr)
|
|
309
291
|
const _env = genEnv({
|
|
310
292
|
pid: p.id,
|
|
311
293
|
owner: p.owner,
|
|
312
294
|
module: p.module,
|
|
313
295
|
auth: mu.addr,
|
|
314
296
|
})
|
|
297
|
+
if (!p.handle) {
|
|
298
|
+
const { format, mod, wasm } = await mem.getWasm(p.modulea)
|
|
299
|
+
const wdrive = extensions[p.extention]
|
|
300
|
+
p.handle = await AoLoader(wasm, {
|
|
301
|
+
format,
|
|
302
|
+
WeaveDrive: wdrive,
|
|
303
|
+
spawn: new DataItem(p.item),
|
|
304
|
+
module: await mem.get("txs", mod),
|
|
305
|
+
})
|
|
306
|
+
mem.env[opt.process].handle = p.handle
|
|
307
|
+
}
|
|
315
308
|
const res = await p.handle(p.memory, msg, _env)
|
|
316
309
|
p.memory = res.Memory
|
|
317
310
|
delete res.Memory
|
|
318
311
|
p.res[opt.message] = res
|
|
319
312
|
p.results.push(opt.message)
|
|
320
313
|
p.txs.unshift({ id, ...opt })
|
|
321
|
-
mem.
|
|
314
|
+
await mem.set(p, "env", opt.process)
|
|
315
|
+
await mem.set(_opt, "msgs", opt.message)
|
|
322
316
|
for (const v of res.Messages ?? []) {
|
|
323
|
-
if (mem.env
|
|
317
|
+
if (await mem.get("env", v.Target)) {
|
|
324
318
|
await message({
|
|
325
319
|
process: v.Target,
|
|
326
320
|
tags: v.Tags,
|
|
@@ -360,7 +354,7 @@ export const connect = (mem, { log = false, extensions = {} } = {}) => {
|
|
|
360
354
|
}
|
|
361
355
|
|
|
362
356
|
const message = async opt => {
|
|
363
|
-
const p = mem.env
|
|
357
|
+
const p = await mem.get("env", opt.process)
|
|
364
358
|
if (!p) return null
|
|
365
359
|
let ex = false
|
|
366
360
|
let id = opt?.item?.id ?? ""
|
|
@@ -384,7 +378,7 @@ export const connect = (mem, { log = false, extensions = {} } = {}) => {
|
|
|
384
378
|
target: opt.process,
|
|
385
379
|
}))
|
|
386
380
|
}
|
|
387
|
-
mem.msgs
|
|
381
|
+
await mem.set(opt, "msgs", id)
|
|
388
382
|
await assign({
|
|
389
383
|
message_item: item,
|
|
390
384
|
message: id,
|
|
@@ -398,14 +392,14 @@ export const connect = (mem, { log = false, extensions = {} } = {}) => {
|
|
|
398
392
|
return {
|
|
399
393
|
message,
|
|
400
394
|
unmonitor: async opt => {
|
|
401
|
-
const p = mem.env
|
|
395
|
+
const p = await mem.get("env", opt.process)
|
|
402
396
|
try {
|
|
403
397
|
clearInterval(p.cron)
|
|
404
398
|
p.cron = null
|
|
405
399
|
} catch (e) {}
|
|
406
400
|
},
|
|
407
401
|
monitor: async opt => {
|
|
408
|
-
const p = mem.env
|
|
402
|
+
const p = await mem.get("env", opt.process)
|
|
409
403
|
if (isNil(p.cron)) {
|
|
410
404
|
p.cron = setInterval(async () => {
|
|
411
405
|
await message({
|
|
@@ -420,9 +414,9 @@ export const connect = (mem, { log = false, extensions = {} } = {}) => {
|
|
|
420
414
|
spawn,
|
|
421
415
|
assign,
|
|
422
416
|
ar,
|
|
423
|
-
result: async opt => mem.env
|
|
417
|
+
result: async opt => (await mem.get("env", opt.process)).res[opt.message],
|
|
424
418
|
results: async opt => {
|
|
425
|
-
const p = mem.env
|
|
419
|
+
const p = await mem.get("env", opt.process)
|
|
426
420
|
let results = []
|
|
427
421
|
const limit = opt.limit ?? 25
|
|
428
422
|
if (opt.sort === "DESC") {
|
|
@@ -439,7 +433,7 @@ export const connect = (mem, { log = false, extensions = {} } = {}) => {
|
|
|
439
433
|
return { edges: results }
|
|
440
434
|
},
|
|
441
435
|
dryrun: async opt => {
|
|
442
|
-
const p = mem.env
|
|
436
|
+
const p = await mem.get("env", opt.process)
|
|
443
437
|
if (!p) return null
|
|
444
438
|
let id = opt.id ?? ""
|
|
445
439
|
let owner = opt.owner ?? ""
|
|
@@ -447,7 +441,7 @@ export const connect = (mem, { log = false, extensions = {} } = {}) => {
|
|
|
447
441
|
;({ id, owner } = await ar.dataitem({ ...opt, target: opt.process }))
|
|
448
442
|
}
|
|
449
443
|
try {
|
|
450
|
-
const msg = genMsg(
|
|
444
|
+
const msg = await genMsg(
|
|
451
445
|
id,
|
|
452
446
|
p,
|
|
453
447
|
opt.data ?? "",
|
|
@@ -470,6 +464,17 @@ export const connect = (mem, { log = false, extensions = {} } = {}) => {
|
|
|
470
464
|
shared: memory.shared || false,
|
|
471
465
|
})
|
|
472
466
|
}
|
|
467
|
+
if (!p.handle) {
|
|
468
|
+
const { format, mod, wasm } = await mem.getWasm(p.modulea)
|
|
469
|
+
const wdrive = extensions[p.extention]
|
|
470
|
+
p.handle = await AoLoader(wasm, {
|
|
471
|
+
format,
|
|
472
|
+
WeaveDrive: wdrive,
|
|
473
|
+
spawn: new DataItem(p.item),
|
|
474
|
+
module: await mem.get("txs", mod),
|
|
475
|
+
})
|
|
476
|
+
mem.env[opt.process].handle = p.handle
|
|
477
|
+
}
|
|
473
478
|
const res = await p.handle(p.memory, msg, _env)
|
|
474
479
|
return res
|
|
475
480
|
} catch (e) {
|
package/esm/armem.js
CHANGED
|
@@ -1,12 +1,83 @@
|
|
|
1
1
|
import Arweave from "arweave"
|
|
2
2
|
import { last } from "ramda"
|
|
3
|
-
import { buildTags } from "./utils.js"
|
|
3
|
+
import { tags, buildTags, dirname } from "./utils.js"
|
|
4
|
+
import { open } from "lmdb"
|
|
5
|
+
import { readFileSync } from "fs"
|
|
6
|
+
import { resolve } from "path"
|
|
7
|
+
|
|
4
8
|
export default class ArMem {
|
|
5
|
-
constructor({ MU_URL, CU_URL, SU_URL, GATEWAY_URL, scheduler } = {}) {
|
|
9
|
+
constructor({ MU_URL, CU_URL, SU_URL, GATEWAY_URL, scheduler, cache } = {}) {
|
|
6
10
|
this.__type__ = "mem"
|
|
11
|
+
this.isInit = false
|
|
12
|
+
if (cache) this.db = open({ path: cache, compression: true })
|
|
7
13
|
this.arweave = Arweave.init()
|
|
8
14
|
this.arweave.transactions.getTransactionAnchor = () => this.getAnchor()
|
|
9
15
|
this.arweave.transactions.getPrice = () => 0
|
|
16
|
+
this.scheduler = scheduler
|
|
17
|
+
this.SU_URL = SU_URL
|
|
18
|
+
this.initSync()
|
|
19
|
+
}
|
|
20
|
+
async putAll(key) {
|
|
21
|
+
for (let k in this[key]) await this.set(this[key][k], key, k)
|
|
22
|
+
}
|
|
23
|
+
async init() {
|
|
24
|
+
if (this.isInit) return
|
|
25
|
+
this.isInit = true
|
|
26
|
+
if (this.db) {
|
|
27
|
+
for (const v of ["height", "blocks"]) this[v] = await this.get(v)
|
|
28
|
+
for (const v of [
|
|
29
|
+
"txs",
|
|
30
|
+
"jwks",
|
|
31
|
+
"env",
|
|
32
|
+
"modules",
|
|
33
|
+
"wasms",
|
|
34
|
+
"addrmap",
|
|
35
|
+
"blockmap",
|
|
36
|
+
"modmap",
|
|
37
|
+
"msgs",
|
|
38
|
+
]) {
|
|
39
|
+
this[v] ??= {}
|
|
40
|
+
const items = await this.db.getKeys({ start: v, end: v + "a" })
|
|
41
|
+
for (const v2 of items) {
|
|
42
|
+
const key = v2.split(".")[0]
|
|
43
|
+
const field = v2.split(".")[1]
|
|
44
|
+
if (key === v) this[v][field] = await this.db.get(v2)
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
} else {
|
|
48
|
+
for (const v of ["height", "blocks"]) await this.set(this[v], v)
|
|
49
|
+
for (const v of ["modules", "wasms", "addrmap", "blockmap"]) {
|
|
50
|
+
await this.putAll(v)
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
async getWasm(module) {
|
|
55
|
+
let mod = module ?? this.modules.aos2_0_1
|
|
56
|
+
if (!mod) throw Error("module not found")
|
|
57
|
+
const __dirname = await dirname()
|
|
58
|
+
let format = null
|
|
59
|
+
let _wasm = await this.wasms[mod]
|
|
60
|
+
let wasm = _wasm?.data
|
|
61
|
+
if (!wasm) {
|
|
62
|
+
if (_wasm?.file) {
|
|
63
|
+
wasm = readFileSync(
|
|
64
|
+
resolve(__dirname, `lua/${this.wasms[mod].file}.wasm`),
|
|
65
|
+
)
|
|
66
|
+
format = _wasm.format
|
|
67
|
+
} else {
|
|
68
|
+
const tx = await this.get("txs", mod)
|
|
69
|
+
if (tx) {
|
|
70
|
+
wasm = Buffer.from(tx.data, "base64")
|
|
71
|
+
format = tags(tx.tags)["Module-Format"]
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
} else {
|
|
75
|
+
format = _wasm.format
|
|
76
|
+
}
|
|
77
|
+
format ??= "wasm64-unknown-emscripten-draft_2024_02_15"
|
|
78
|
+
return { format, mod, wasm }
|
|
79
|
+
}
|
|
80
|
+
initSync() {
|
|
10
81
|
this.addrmap = {}
|
|
11
82
|
this.txs = {}
|
|
12
83
|
this.jwks = {}
|
|
@@ -54,19 +125,19 @@ export default class ArMem {
|
|
|
54
125
|
}),
|
|
55
126
|
}
|
|
56
127
|
}
|
|
57
|
-
if (scheduler && SU_URL) {
|
|
58
|
-
const key = scheduler
|
|
128
|
+
if (this.scheduler && this.SU_URL) {
|
|
129
|
+
const key = this.scheduler
|
|
59
130
|
txs.push(key)
|
|
60
|
-
this.addrmap[scheduler] = { address: scheduler }
|
|
131
|
+
this.addrmap[this.scheduler] = { address: this.scheduler }
|
|
61
132
|
this.txs[key] = {
|
|
62
133
|
id: key,
|
|
63
134
|
block: 0,
|
|
64
|
-
owner: scheduler,
|
|
135
|
+
owner: this.scheduler,
|
|
65
136
|
tags: buildTags(null, {
|
|
66
137
|
"Data-Protocol": "ao",
|
|
67
138
|
Variant: "ao.TN.1",
|
|
68
139
|
Type: "Scheduler-Location",
|
|
69
|
-
Url: SU_URL,
|
|
140
|
+
Url: this.SU_URL,
|
|
70
141
|
"Time-To-Live": 1000 * 60 * 60 * 24 * 365 * 10,
|
|
71
142
|
}),
|
|
72
143
|
}
|
|
@@ -86,4 +157,20 @@ export default class ArMem {
|
|
|
86
157
|
? "Do_Uc2Sju_ffp6Ev0AnLVdPtot15rvMjP-a9VVaA5fM"
|
|
87
158
|
: last(this.blockmap[last(this.blocks)].txs)
|
|
88
159
|
}
|
|
160
|
+
async get(key, field) {
|
|
161
|
+
await this.init()
|
|
162
|
+
if (!field) return this[key]
|
|
163
|
+
return this[key]?.[field]
|
|
164
|
+
}
|
|
165
|
+
async set(val, key, field) {
|
|
166
|
+
await this.init()
|
|
167
|
+
if (!field) {
|
|
168
|
+
this[key] = val
|
|
169
|
+
if (this.db) await this.db.put(`${key}`, this[key])
|
|
170
|
+
} else {
|
|
171
|
+
this[key] ??= {}
|
|
172
|
+
this[key][field] = val
|
|
173
|
+
if (this.db) await this.db.put(`${key}.${field}`, this[key][field])
|
|
174
|
+
}
|
|
175
|
+
}
|
|
89
176
|
}
|
package/esm/cli.js
ADDED
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import pm2 from "pm2"
|
|
3
|
+
import { dirname } from "./utils.js"
|
|
4
|
+
import { resolve } from "path"
|
|
5
|
+
const args = process.argv.slice(2)
|
|
6
|
+
|
|
7
|
+
pm2.connect(false, async err => {
|
|
8
|
+
if (err) {
|
|
9
|
+
console.error("Error connecting to PM2:", err)
|
|
10
|
+
process.exit(2)
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
pm2.start(
|
|
14
|
+
{
|
|
15
|
+
script: resolve(await dirname(), "run.js"),
|
|
16
|
+
nodeArgs: "--experimental-wasm-memory64",
|
|
17
|
+
instances: 1,
|
|
18
|
+
force: true,
|
|
19
|
+
args: args,
|
|
20
|
+
daemon: false,
|
|
21
|
+
name: "wao",
|
|
22
|
+
},
|
|
23
|
+
err => {
|
|
24
|
+
if (err) {
|
|
25
|
+
console.error("Error starting process:", err)
|
|
26
|
+
pm2.disconnect()
|
|
27
|
+
process.exit(2)
|
|
28
|
+
}
|
|
29
|
+
},
|
|
30
|
+
)
|
|
31
|
+
pm2.streamLogs("all", 0, false)
|
|
32
|
+
})
|
|
33
|
+
|
|
34
|
+
process.on("SIGINT", () => {
|
|
35
|
+
pm2.delete("wao", err => {
|
|
36
|
+
pm2.disconnect()
|
|
37
|
+
process.exit(err ? 1 : 0)
|
|
38
|
+
})
|
|
39
|
+
})
|
package/esm/run.js
CHANGED
|
@@ -1,9 +1,20 @@
|
|
|
1
1
|
#!/usr/bin/env -S node --experimental-wasm-memory64
|
|
2
2
|
import yargs from "yargs"
|
|
3
|
-
|
|
4
|
-
|
|
3
|
+
import { resolve } from "path"
|
|
4
|
+
import { unlinkSync } from "fs"
|
|
5
5
|
import Server from "./server.js"
|
|
6
|
-
|
|
7
|
-
|
|
6
|
+
let {
|
|
7
|
+
reset = false,
|
|
8
|
+
memory = false,
|
|
9
|
+
port = 4000,
|
|
10
|
+
db = ".cache",
|
|
11
|
+
} = yargs(process.argv.slice(2)).argv
|
|
12
|
+
db = memory ? null : resolve(process.cwd(), db)
|
|
13
|
+
if (reset) {
|
|
14
|
+
try {
|
|
15
|
+
unlinkSync(db)
|
|
16
|
+
} catch (e) {}
|
|
17
|
+
}
|
|
18
|
+
const main = async () => new Server({ log: true, port, db })
|
|
8
19
|
|
|
9
20
|
main()
|
package/esm/server.js
CHANGED
|
@@ -16,6 +16,7 @@ class Server {
|
|
|
16
16
|
cu = 4004,
|
|
17
17
|
aoconnect,
|
|
18
18
|
log = false,
|
|
19
|
+
db,
|
|
19
20
|
port,
|
|
20
21
|
} = {}) {
|
|
21
22
|
if (port) {
|
|
@@ -35,7 +36,7 @@ class Server {
|
|
|
35
36
|
mem,
|
|
36
37
|
monitor,
|
|
37
38
|
unmonitor,
|
|
38
|
-
} = connect(aoconnect, { log })
|
|
39
|
+
} = connect(aoconnect, { log, cache: db })
|
|
39
40
|
this.monitor = monitor
|
|
40
41
|
this.unmonitor = unmonitor
|
|
41
42
|
this.spawn = spawn
|
|
@@ -288,7 +289,7 @@ class Server {
|
|
|
288
289
|
v.close(() => {
|
|
289
290
|
count += 1
|
|
290
291
|
if (count >= 4) {
|
|
291
|
-
console.log("servers closed!"
|
|
292
|
+
console.log("servers closed!")
|
|
292
293
|
res()
|
|
293
294
|
}
|
|
294
295
|
})
|
package/esm/tao.js
CHANGED
|
@@ -64,7 +64,11 @@ class AO extends MAO {
|
|
|
64
64
|
monitor,
|
|
65
65
|
unmonitor,
|
|
66
66
|
mem,
|
|
67
|
-
} = connect(opt.mem, {
|
|
67
|
+
} = connect(opt.mem, {
|
|
68
|
+
extensions: opt.extensions,
|
|
69
|
+
cache: opt.cache,
|
|
70
|
+
reset: opt.reset,
|
|
71
|
+
})
|
|
68
72
|
this.module = mem.modules.aos2_0_1
|
|
69
73
|
this.assign = assign
|
|
70
74
|
this.result = async (...opt) => {
|
package/esm/tar.js
CHANGED
|
@@ -8,6 +8,7 @@ import base64url from "base64url"
|
|
|
8
8
|
import ArMem from "./armem.js"
|
|
9
9
|
import GQL from "./tgql.js"
|
|
10
10
|
import { last, is, includes, isNil } from "ramda"
|
|
11
|
+
|
|
11
12
|
class AR extends MAR {
|
|
12
13
|
constructor(opt = {}) {
|
|
13
14
|
super({ ...opt, in_memory: true })
|
|
@@ -60,11 +61,8 @@ class AR extends MAR {
|
|
|
60
61
|
for (const t of di.tags)
|
|
61
62
|
if (t.name === "Content-Type") data_type = t.value
|
|
62
63
|
const owner = await this.owner(di)
|
|
63
|
-
this.mem.
|
|
64
|
+
await this.mem.set({ key: di.owner, address: owner }, "addrmap", owner)
|
|
64
65
|
let data = di.data
|
|
65
|
-
try {
|
|
66
|
-
//data = base64url.decode(di.data)
|
|
67
|
-
} catch (e) {}
|
|
68
66
|
let _item = {
|
|
69
67
|
_data: { size: data_size, type: data_type },
|
|
70
68
|
anchor: di.anchor,
|
|
@@ -76,7 +74,7 @@ class AR extends MAR {
|
|
|
76
74
|
tags: di.tags,
|
|
77
75
|
data,
|
|
78
76
|
}
|
|
79
|
-
this.mem.txs
|
|
77
|
+
await this.mem.set(_item, "txs", await di.id)
|
|
80
78
|
_items.push(_item)
|
|
81
79
|
}
|
|
82
80
|
const bundle = await bundleAndSignData(items, new ArweaveSigner(jwk))
|
|
@@ -96,21 +94,22 @@ class AR extends MAR {
|
|
|
96
94
|
|
|
97
95
|
let res = null
|
|
98
96
|
if (!tx.id) await this.mem.arweave.transactions.sign(tx, jwk)
|
|
99
|
-
this.mem.height
|
|
97
|
+
let height = (await this.mem.get("height")) + 1
|
|
98
|
+
await this.mem.set(height, "height")
|
|
100
99
|
let block = {
|
|
101
100
|
id: tx.id,
|
|
102
101
|
timestamp: Date.now(),
|
|
103
|
-
height
|
|
104
|
-
previous: last(this.mem.blocks) ?? "",
|
|
102
|
+
height,
|
|
103
|
+
previous: last(await this.mem.get("blocks")) ?? "",
|
|
105
104
|
txs: [],
|
|
106
105
|
}
|
|
107
106
|
let msg = null
|
|
108
107
|
if (items) {
|
|
109
108
|
for (const item of items) {
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
109
|
+
let _txs = item
|
|
110
|
+
_txs.parent = { id: tx.id }
|
|
111
|
+
_txs.bundledIn = { id: tx.id }
|
|
112
|
+
_txs.anchor = ""
|
|
114
113
|
const _tags = t(item.tags)
|
|
115
114
|
if (
|
|
116
115
|
includes(_tags.Type, [
|
|
@@ -129,9 +128,9 @@ class AR extends MAR {
|
|
|
129
128
|
for (const v of item.item.tags) {
|
|
130
129
|
if (v.name === "Content-Type") data_type = v.value
|
|
131
130
|
}
|
|
132
|
-
//this.mem.txs[tx.id]._data = { size: tx.data_size, type: data_type }
|
|
133
131
|
block.txs.push(item.id)
|
|
134
|
-
|
|
132
|
+
_txs.block = block.id
|
|
133
|
+
await this.mem.set(_txs, "txs", item.id)
|
|
135
134
|
}
|
|
136
135
|
}
|
|
137
136
|
let _tags = []
|
|
@@ -143,22 +142,29 @@ class AR extends MAR {
|
|
|
143
142
|
}
|
|
144
143
|
const __tags = t(_tags)
|
|
145
144
|
if (__tags.Type === "Module") {
|
|
146
|
-
this.mem.
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
145
|
+
await this.mem.set(
|
|
146
|
+
{
|
|
147
|
+
data: Buffer.from(tx.data, "base64"),
|
|
148
|
+
format: __tags["Module-Format"],
|
|
149
|
+
},
|
|
150
|
+
"wasms",
|
|
151
|
+
tx.id,
|
|
152
|
+
)
|
|
150
153
|
}
|
|
151
154
|
tx.tags = _tags
|
|
152
155
|
tx.owner = await this.arweave.wallets.jwkToAddress({ n: tx.owner })
|
|
153
|
-
|
|
156
|
+
let _txs = tx
|
|
154
157
|
block.txs.push(tx.id)
|
|
155
|
-
|
|
156
|
-
this.mem.
|
|
157
|
-
this.mem.
|
|
158
|
+
_txs.block = block.id
|
|
159
|
+
await this.mem.set(_txs, "txs", tx.id)
|
|
160
|
+
let blocks = await this.mem.get("blocks")
|
|
161
|
+
blocks.push(block.id)
|
|
162
|
+
await this.mem.set(blocks, "blocks")
|
|
163
|
+
await this.mem.set(block, "blockmap", block.id)
|
|
158
164
|
|
|
159
165
|
if (jwk) {
|
|
160
166
|
const owner = await this.arweave.wallets.jwkToAddress(jwk)
|
|
161
|
-
this.mem.
|
|
167
|
+
await this.mem.set({ address: owner, key: jwk.n }, "addrmap", owner)
|
|
162
168
|
}
|
|
163
169
|
res = { id: tx.id, status: 200, statusText: "200" }
|
|
164
170
|
if (this.log) {
|
|
@@ -174,7 +180,7 @@ class AR extends MAR {
|
|
|
174
180
|
}
|
|
175
181
|
|
|
176
182
|
async tx(id) {
|
|
177
|
-
return this.mem.txs
|
|
183
|
+
return await this.mem.get("txs", id)
|
|
178
184
|
}
|
|
179
185
|
|
|
180
186
|
async data(id, _string, log) {
|
|
@@ -184,7 +190,7 @@ class AR extends MAR {
|
|
|
184
190
|
if (!isNil(_string.decode)) decode = _string.decode
|
|
185
191
|
if (!isNil(_string.string)) string = _string.string
|
|
186
192
|
}
|
|
187
|
-
let tx = this.mem.txs
|
|
193
|
+
let tx = await this.mem.get("txs", id)
|
|
188
194
|
let _data = tx?.data ?? null
|
|
189
195
|
if (tx?.format === 2 && _data) {
|
|
190
196
|
_data = Buffer.from(_data, "base64")
|
package/package.json
CHANGED
|
@@ -1,7 +1,10 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "wao",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"
|
|
3
|
+
"version": "0.8.2",
|
|
4
|
+
"bin": {
|
|
5
|
+
"wao": "./cjs/cli.js",
|
|
6
|
+
"wao-esm": "./esm/cli.js"
|
|
7
|
+
},
|
|
5
8
|
"main": "cjs/index.js",
|
|
6
9
|
"module": "esm/index.js",
|
|
7
10
|
"exports": {
|
|
@@ -18,8 +21,6 @@
|
|
|
18
21
|
"import": "./esm/test.js"
|
|
19
22
|
}
|
|
20
23
|
},
|
|
21
|
-
"author": "",
|
|
22
|
-
"license": "MIT",
|
|
23
24
|
"dependencies": {
|
|
24
25
|
"@babel/plugin-transform-modules-commonjs": "^7.24.8",
|
|
25
26
|
"@permaweb/ao-loader": "^0.0.44",
|
|
@@ -31,19 +32,15 @@
|
|
|
31
32
|
"cors": "^2.8.5",
|
|
32
33
|
"express": "^4.21.2",
|
|
33
34
|
"graphql": "^16.10.0",
|
|
35
|
+
"lmdb": "^3.2.2",
|
|
36
|
+
"pm2": "^5.4.3",
|
|
34
37
|
"ramda": "^0.30.1",
|
|
35
38
|
"yargs": "^17.7.2"
|
|
36
39
|
},
|
|
37
40
|
"devDependencies": {
|
|
38
41
|
"@babel/cli": "^7.24.8",
|
|
39
42
|
"@babel/core": "^7.25.2",
|
|
40
|
-
"@babel/preset-env": "^7.25.3"
|
|
41
|
-
"chai": "^5.1.1",
|
|
42
|
-
"mocha": "^10.7.3"
|
|
43
|
-
},
|
|
44
|
-
"bin": {
|
|
45
|
-
"wao": "./cjs/run.js",
|
|
46
|
-
"wao-esm": "./esm/run.js"
|
|
43
|
+
"@babel/preset-env": "^7.25.3"
|
|
47
44
|
},
|
|
48
45
|
"scripts": {
|
|
49
46
|
"server": "node --experimental-wasm-memory64 cjs/run.js"
|