wao 0.7.2 → 0.8.0

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/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
- let mod = opt.module ?? mem.modules["aos2_0_1"]
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 wdrive = extensions[t.Extension || "WeaveDrive"]
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[mod],
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[_tags["On-Boot"]]?.data ?? ""
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[id] = opt
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
- mem.env[id].cronTags = cronTags
240
- mem.env[id].span = int
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[opt.process]
237
+ const p = await mem.get("env", opt.process)
256
238
  if (!p) return null
257
- let _opt = mem.msgs[opt.message]
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.msgs[opt.message] = _opt
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[v.Target]) {
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[opt.process]
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[id] = opt
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[opt.process]
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[opt.process]
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[opt.process].res[opt.message],
417
+ result: async opt => (await mem.get("env", opt.process)).res[opt.message],
424
418
  results: async opt => {
425
- const p = mem.env[opt.process]
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[opt.process]
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/run.js CHANGED
@@ -1,9 +1,20 @@
1
1
  #!/usr/bin/env -S node --experimental-wasm-memory64
2
2
  import yargs from "yargs"
3
- let { port = 4000 } = yargs(process.argv.slice(2)).argv
4
-
3
+ import { resolve } from "path"
4
+ import { unlinkSync } from "fs"
5
5
  import Server from "./server.js"
6
-
7
- const main = async () => new Server({ log: true, port })
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!", count)
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, { extensions: opt.extensions })
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.addrmap[owner] = { key: di.owner, address: owner }
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[await di.id] = _item
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 += 1
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: this.mem.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
- this.mem.txs[item.id] = item
111
- this.mem.txs[item.id].parent = { id: tx.id }
112
- this.mem.txs[item.id].bundledIn = { id: tx.id }
113
- this.mem.txs[item.id].anchor = ""
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
- this.mem.txs[item.id].block = block.id
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.wasms[tx.id] = {
147
- data: Buffer.from(tx.data, "base64"),
148
- format: __tags["Module-Format"],
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
- this.mem.txs[tx.id] = tx
156
+ let _txs = tx
154
157
  block.txs.push(tx.id)
155
- this.mem.txs[tx.id].block = block.id
156
- this.mem.blocks.push(block.id)
157
- this.mem.blockmap[block.id] = block
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.addrmap[owner] = { address: owner, key: jwk.n }
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[id]
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[id]
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,6 +1,6 @@
1
1
  {
2
2
  "name": "wao",
3
- "version": "0.7.2",
3
+ "version": "0.8.0",
4
4
  "description": "",
5
5
  "main": "cjs/index.js",
6
6
  "module": "esm/index.js",
@@ -18,8 +18,6 @@
18
18
  "import": "./esm/test.js"
19
19
  }
20
20
  },
21
- "author": "",
22
- "license": "MIT",
23
21
  "dependencies": {
24
22
  "@babel/plugin-transform-modules-commonjs": "^7.24.8",
25
23
  "@permaweb/ao-loader": "^0.0.44",
@@ -31,6 +29,8 @@
31
29
  "cors": "^2.8.5",
32
30
  "express": "^4.21.2",
33
31
  "graphql": "^16.10.0",
32
+ "lmdb": "^3.2.2",
33
+ "pm2": "^5.4.3",
34
34
  "ramda": "^0.30.1",
35
35
  "yargs": "^17.7.2"
36
36
  },
@@ -1 +0,0 @@
1
- {"ar":{"port":4000},"jwk":{"kty":"RSA","n":"tBba3N1KKiDvu4TnAd_lhYDBXs0QrLH4Hgd6mHTeovFvZDLZHlNukT9SXeHx1_58hQWtcIPvS6F9tASdpMREKMVkG9hb6nMXtUCkTJE7PURvqeJf5VGJt9rUBtYaaJ_8eVJ3w98_RqUR0k0rYsYcJqiFFYaSFG2mIbyP7lBSUifF0dsOI1j1IRlvhZ02BOD7LJpwycX-fsXq7DAbpC6ywkuQ0EU830f3DefhfCQRRreZiKKNHRVvKhe9Z8LTjtMWHcAotg5-lLWLVUT1fO5tUnVwcJ_fGGFtLC1RGjryGg2ZOykktpDuALvZrZd3psIGQPnpuF75QYTVSbiadCK_JOelt8xcwIUphYAeWJQ6BNBmA8afPvVhS6rma0zp30ChXLQJEgtRWm9FpI-DQaM9PPcDlupsDFmmBtZGj0fLSTcpf00i0gpoDVJWcBVrd5aBiks0rRNUWRgWHadWBfBskUCrA1DG99seZOKKL9qLIknK3c6cTO068JegbwAW51eEH-etaoAvZ5mmyIB7LHKEomOQjeobek5_7OChwA66cS882gbFc3CfX0QdQRWWrNJ84hm3_xgHG6VjQOWNTh751WrVe4PnlLPvqKt8u2It4ZIlBxri7JklRxLL4Y1xkuV1a3gKllLVWizULPFN8Dms_7hjGSk1N3UUV3Bv_oxlRTk","e":"AQAB","d":"BQo4tAKraMdrZIhhI9yXIoFw2ybXbYXWuq-dGJ3FfbKB2nOD2QUe7Iixobf8Wf4HKeMRSggfNWYlGIy8HrILC3sOt936IIytBq3ZWBBrPUxoTzOEv7jkjXuRAH0tPjojL8zR79ThHMIeeamFA9DyIiQINj4blRL5s140E8hpE8Ye-dls3JD73aIsTIVF6Qs-bEg8Mzr-_TkSJh8CJW07JBRHG4g8hMeRgr2d28JxcbtOQpRaz6Woat_am9Th5J1ETeI-IW40nUcBY1cFNpEm1RTW6Af8j3gDVqYQ0koBBlKhtBXZyOEAdo7-fHNNoW7_pTTfrudVh9ktIOpXxDuutR0tL57GPvq-GQHJM_wUyYJKPNI3LUzm0HK9W6UFjvCPmHqofw_PT8lgGswwY1isB9TLkuMOv_rcc7a2y2TtjxlHOuIkQXeNdhvcEX_aBUCzvhmWwKR3_MgFaUDCT5ax1leBtnC7ZdWroJSnvF-jGNn8yZqIs8i5llarkc4Ll-3TBwt7bTb4bFcYpWNhTWrIInw1fxQ2fbATGWgWGU-VH8urk8AxPCT4k3Oa3COacQcS_87BaEA8itddp3-rBYSXFVKR2J91_O5lzX65T-y646-oZmcJtSNax5l9_9ceakzTt861zNm9990kUcJ5YJI2w3hVmls-hQh-8lRX9U9RQns","p":"2af2yCQkk8zUNyAHxsnbfhRW2FIPB9poJsqQaxeqza05vyBqbQTnwOUdbFC4fkmMp-9YPAFMP9qcZEIenAcww3hMES9MKJiU3LvFlJ6Fm14HccigfcD9Tt8HED-8fxG-UqGj31N2BWkXbhX6V81SFDAc3DstlKc19Q2ls1RRkY-gn4kMBSQAQd-lsyMPfSIbQj5_iyXIWvkj7tnGoGKRXAzb_d3U00YVpQ4dxXZxEVO5FZnq3pUiYwZP08A5eAdQRsOI0wXWQikNRu2vplm98PToayfmvoWvPrLTJD8E2LpldD-m4eUL4GABjgeOII4t3WRiSmZSAK7aq4rvLxYoxw","q":"09CrtV1BO5CfYSq7w2gKEr-s5UHSxscr4TTbCdoG0XwiwPYX5N963LtswhS-rZaIrdoSPDyvNdTTrY9nHuV-KD8LbjU1CY7rzcA33Wv3QP-HEvoJmCdVB3tjKrW0ypx9hBNKTgjxq0u3-CS6sya1MHLZft0ijXBy5dzguA3OphhxXVHtgbJ2jd3DgjJbj7yocPrye2HMVhkputetYKjjcNg5BlMW6oTDUnFzVpO-bN2qPmOkzqCKPN1Cu8a-6_RcWUuqH5RgfxnL6ApM5ZMQztT3jrR64afZOYeDhz2po24uVcB48o_pl3qzlsKWW3whP2lBaKw23kwNf7i8jmch_w","dp":"b0VPBEJ18JlmZEgbsaTAcVQ0kaJhzMH7PNmRuy3-Q-eq_eq0fcdkM1juEdGyf91Z6wCROxvuvzYjfZ3PyDRk2YlGWgK0DIz0jWPxPmlMJIGNjL3kTmW7GfcqxUPQOaX4hoXcIO-qBloTgFP8B6cPrwJpvq0CQFy7WOwBKgyRJrkmhGirnHUrLIIJU-s4n-Avz03kJl7KbrevhwwOXzAE3-ozDTW698d8iUUOM0S5yQHkPQbS67eSPM2dQcOjnZkfkQ2lhTwWrPwPrZMVmRWH5QdPSni7ner6DDOffYg6EhI4i5V-2z0dNTffk5yJLFuDVwtatG5avb6mS8xbOtc5QQ","dq":"Q8Foa-ecylUE5qwoy-Un879kqyFXL0be_ndN6eTYcYJoC5mtIwVp49oAfETuidCxgAtV8fbnhSzDWa2ZqwR2SqGAIozanmgdff-S3z1-JkiXCLb7ArTyOiZ6HltprbZJYEpbZoLt64GZI8N8BXrIUusqL67FMsFZv7XcHIQuKmt_N_7RHr_btJ3PwIIjT-Nlbl6X2mf6WUBLXP1I9LaRqrM_6ooBtpspb-Hipzszmtd9cd-mBILONZIBmteEky3jrJzLmrZ397BkzaEd4AIfSkpNtlR9SlnK3uA-brCG50SDheK_zbfDXTVe5UbxmeonKIWe6sDL_GgPmV-a0WKkOQ","qi":"ri8WWvi1zib1qNyqXjFvsqi3AdgmH-QFt_cnx4F8vyeEd-4VPP9Ne6I-cr6-BtYJbfZSkpuBY9G7RLnRHnyY9nlbBPyP9mdJiBgs8f5-__2_pKhO5pvzRPCU-N-YLQH0NAKIYlSfWarObe84SW5Ds0OUb46WuoRGDqrLIokt2HxFi6uA_ZzuEvdmxZk9HWRRaPiKCif3uJfZtJ3_4WxpFvw-IYY3p8m3nt9qdU8EPhiZBEKdYdyAkHN6bIN9GbpUpUbEwYJXTCtqOgG4nuiWl8HWijk7QgcEO1gRG-pt4HzzFTa01BBIxdbelBii35uUoUVzco3dntUghotXOMGeCg"},"ao":{"module":"nrwqdbTzLYTALBkzLv9HwmF97b0eoGvlT3YwfJnyOjY","scheduler":"FKtGpY1kBbr8hBIocph3nMvadgBSQtQBTYnlAJetrDU","aoconnect":{"MU_URL":"http://localhost:4002","CU_URL":"http://localhost:4004","GATEWAY_URL":"http://localhost:4000"},"ar":{"port":4000},"authority":"7WspynohDWhx3_Q37pzHmDGStf2T_p8ghdk_XTSUm8s"},"ao2":{"module":"9Xx6YzV2-giIaD8b9HTewr0FxRjugwm5FCuaQU-kJvI","scheduler":"FKtGpY1kBbr8hBIocph3nMvadgBSQtQBTYnlAJetrDU","aoconnect":{"MU_URL":"http://localhost:4002","CU_URL":"http://localhost:4004","GATEWAY_URL":"http://localhost:4000"},"ar":{"port":4000},"authority":"7WspynohDWhx3_Q37pzHmDGStf2T_p8ghdk_XTSUm8s"},"authority":"7WspynohDWhx3_Q37pzHmDGStf2T_p8ghdk_XTSUm8s","targets":{"profile":false,"note":false,"asset":false},"modules":{"aos2":"9Xx6YzV2-giIaD8b9HTewr0FxRjugwm5FCuaQU-kJvI","aos1":"MSCReWoRQ3w3JmPvbsTvPFnJrdzPym0F61cdBGEsBgs","sqlite":"nrwqdbTzLYTALBkzLv9HwmF97b0eoGvlT3YwfJnyOjY"}}