wao 0.8.4 → 0.8.5

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/ao.js CHANGED
@@ -17,6 +17,7 @@ import {
17
17
  } from "@permaweb/aoconnect"
18
18
 
19
19
  import {
20
+ equals,
20
21
  concat,
21
22
  is,
22
23
  mergeLeft,
@@ -29,6 +30,7 @@ import {
29
30
  } from "ramda"
30
31
 
31
32
  import {
33
+ allChecked,
32
34
  searchTag,
33
35
  checkTag,
34
36
  wait,
@@ -379,11 +381,42 @@ class AO {
379
381
  tags = {},
380
382
  check = [],
381
383
  get,
382
- timeout = 10000,
384
+ timeout = 0,
383
385
  }) {
384
386
  let err = null
385
387
  ;({ jwk, err } = await this.ar.checkWallet({ jwk }))
386
388
  if (err) return { err }
389
+ const getNewTxs = async (pid, _txs, _txmap) => {
390
+ const txs = await this.ar.gql.txs({
391
+ recipient: pid,
392
+ fields: ["id", "recipient", "tags", { owner: ["address"] }],
393
+ })
394
+ for (const v of txs) {
395
+ if (isNil(_txmap[v.id])) {
396
+ const t = ltags(v.tags)
397
+ if (t.type === "Message") {
398
+ v.from = t["from-process"] ?? v.owner?.address
399
+ _txs.unshift(v)
400
+ _txmap[v.id] = { checked: false, ref: t["x-reference"] }
401
+ }
402
+ }
403
+ }
404
+ }
405
+ const checkOut = async (get, _txs, _txmap) => {
406
+ let out = null
407
+ for (let v of _txs) {
408
+ if (isNil(_txmap[v.id].res)) {
409
+ const res = await this.result({ process: pid, message: v.id })
410
+ _txmap[v.id].res = res
411
+ }
412
+ if (!isNil(_txmap[v.id].res) && _txmap[v.id].out !== true) {
413
+ _txmap[v.id].out = true
414
+ out = getTagVal(get, _txmap[v.id].res, v.from)
415
+ if (out) break
416
+ }
417
+ }
418
+ return out
419
+ }
387
420
  let [res, out, mid, results] = [null, null, null, []]
388
421
  let _tags = buildTags(act, tags)
389
422
  let start = Date.now()
@@ -394,108 +427,51 @@ class AO {
394
427
  tags: _tags,
395
428
  data: jsonToStr(data),
396
429
  })
397
-
398
- const exRef = (ref, txs) => {
399
- for (const v2 of txs ?? []) {
400
- const t = ltags(v2.tags)
401
- if (t.type === "Message" && t["x-reference"] === ref) return true
402
- }
403
- return false
404
- }
405
-
406
- const getRef = async (ref, txs = []) => {
407
- let ex = exRef(ref, txs)
408
- if (!ex) {
409
- if (!this.in_memory) await wait(1000)
410
- txs = await this.ar.gql.txs({
411
- recipient: pid,
412
- fields: ["id", "recipient", "tags", { owner: ["address"] }],
413
- })
414
- ex = exRef(ref, txs)
415
- }
416
- if (ex) return txs
417
- if (this.in_memory) await wait(1)
418
- return Date.now() - start < timeout ? await getRef(ref) : []
419
- }
420
-
421
- let [cache, checks, isOK] = [[], [], false]
422
- const getResult = async mid => {
423
- const res = await this.result({ process: pid, message: mid })
424
- results.push({ mid, res })
425
- let err = null
426
- if (res.Error) err = res.Error
427
- else {
428
- if (!is(Array, check)) check = [check]
429
- let i = 0
430
- for (const v of check) {
431
- let _checks = checks[i] ?? null
432
- if (isRegExp(v) || includes(typeof v)(["string", "boolean"])) {
433
- _checks = mergeChecks(_checks, isData(v, res), v)
434
- } else {
435
- const checks2 = {}
436
- for (const k in v ?? {}) {
437
- checks2[k] = checkTag(res, k, v[k])
438
- }
439
- _checks = mergeChecks(_checks, checks2, v)
430
+ if (!is(Array, check)) check = [check]
431
+ let _txs = [{ id: mid, from: await this.ar.toAddr(jwk) }]
432
+ let _txmap = {}
433
+ const t = ltags(_tags)
434
+ let checked = false
435
+ _txmap[mid] = { checked: false, ref: t["x-reference"] }
436
+ do {
437
+ for (let v of _txs) {
438
+ if (!_txmap[v.id].checked) {
439
+ _txmap[v.id].checked = true
440
+ const _res = await this.result({ process: pid, message: v.id })
441
+ if (isNil(res)) {
442
+ res = _res
443
+ mid = v.id
444
+ results.push({ mid, res })
440
445
  }
441
- checks[i] = _checks
442
- i++
443
- }
444
- if (isCheckComplete(checks, check)) isOK = true
445
- if (!isNil(get) && !isOutComplete(out, get)) {
446
- out = mergeOut(out, getTagVal(get, res), get)
446
+ _txmap[v.id].res = _res
447
+ checked = allChecked(check, _res, v.from)
448
+ if (checked) break
447
449
  }
448
450
  }
449
- if ((!isOutComplete(out, get) || !isOK) && !err) {
450
- let refs = []
451
- for (const v of res.Messages) {
452
- const _ltags = ltags(v.Tags)
453
- if (_ltags.type === "Message" && _ltags.reference) {
454
- refs.push(_ltags.reference)
455
- }
456
- }
457
-
458
- for (const v of res.Messages) {
459
- const _ltags = ltags(v.Tags)
460
- if (_ltags.type === "Message" && _ltags.reference) {
461
- const txs = await getRef(_ltags.reference, cache)
462
- cache = o(uniqBy(prop("id")), concat(cache))(txs)
463
- for (const v2 of txs) {
464
- const _ltags2 = ltags(v2.tags)
465
- if (
466
- _ltags2.type === "Message" &&
467
- _ltags2["x-reference"] === _ltags.reference
468
- ) {
469
- const {
470
- res: _res,
471
- out: _out,
472
- err: _err,
473
- ok: _ok,
474
- } = await getResult(v2.id)
475
- if (_err) {
476
- err = _err
477
- break
478
- }
479
- if (!isOutComplete(out, get) && _out)
480
- out = mergeOut(out, _out, get)
481
- if (isOutComplete(out, get) && isOK) break
482
- }
483
- }
484
- if (isOutComplete(out, get) && isOK) break
485
- }
451
+ if (checked) break
452
+ await wait(1000)
453
+ await getNewTxs(pid, _txs, _txmap)
454
+ } while (Date.now() - start < timeout)
455
+ if (!checked) {
456
+ err = "something went wrong!"
457
+ } else {
458
+ out = mergeOut(out, await checkOut(get, _txs, _txmap), get)
459
+ if (!isOutComplete(out, get) && !isNil(get)) {
460
+ while (Date.now() - start < timeout) {
461
+ await getNewTxs(pid, _txs, _txmap)
462
+ out = mergeOut(out, await checkOut(get, _txs, _txmap), get)
463
+ if (isOutComplete(out, get)) break
464
+ await wait(1000)
486
465
  }
487
466
  }
488
- return { res, err }
489
467
  }
490
- ;({ res, err } = await getResult(mid))
491
- if (!isOK && !err) err = "something went wrong!"
492
468
  } catch (e) {
493
469
  err = e
494
470
  }
495
471
  return { mid, res, err, out, results }
496
472
  }
497
473
 
498
- async asgn({ pid, mid, jwk, check, get }) {
474
+ async asgn({ pid, mid, jwk, check = [], get }) {
499
475
  let err = null
500
476
  ;({ jwk, err } = await this.ar.checkWallet({ jwk }))
501
477
  if (err) return { err }
@@ -509,28 +485,11 @@ class AO {
509
485
  })
510
486
  res = await this.result({ process: pid, message: mid })
511
487
  if (!res) err = "something went wrong"
512
-
513
488
  if (res.Error) err = res.Error
514
489
  else {
515
- let checks = []
516
490
  if (!is(Array, check)) check = [check]
517
- let i = 0
518
- for (const v of check) {
519
- let _checks = checks[i] ?? null
520
- if (isRegExp(v) || includes(typeof v)(["string", "boolean"])) {
521
- _checks = mergeChecks(_checks, isData(v, res), v)
522
- } else {
523
- const checks2 = {}
524
- for (const k in v ?? {}) {
525
- checks2[k] = checkTag(res, k, v[k])
526
- }
527
- _checks = mergeChecks(_checks, checks2, v)
528
- }
529
- checks[i] = _checks
530
- i++
531
- }
532
- if (!isCheckComplete(checks, check)) err = "something went wrong"
533
- if (!err && !isNil(get)) out = getTagVal(get, res)
491
+ if (!allChecked(check, res)) err = "something went wrong"
492
+ if (!err && !isNil(get)) out = getTagVal(get, res) // todo: from
534
493
  }
535
494
  } catch (e) {
536
495
  err = e
@@ -538,16 +497,7 @@ class AO {
538
497
  return { mid, res, err, out }
539
498
  }
540
499
 
541
- async dry({
542
- pid,
543
- jwk,
544
- data,
545
- act = "Eval",
546
- tags = {},
547
- check,
548
- get,
549
- timeout = 10000,
550
- }) {
500
+ async dry({ pid, jwk, data, act = "Eval", tags = {}, check = [], get }) {
551
501
  let err = null
552
502
  ;({ jwk, err } = await this.ar.checkWallet({ jwk }))
553
503
  if (err) return { err }
@@ -563,22 +513,7 @@ class AO {
563
513
  res = _res
564
514
  let checks = []
565
515
  if (!is(Array, check)) check = [check]
566
- let i = 0
567
- for (const v of check) {
568
- let _checks = checks[i] ?? null
569
- if (isRegExp(v) || includes(typeof v)(["string", "boolean"])) {
570
- _checks = mergeChecks(_checks, isData(v, res), v)
571
- } else {
572
- const checks2 = {}
573
- for (const k in v ?? {}) {
574
- checks2[k] = checkTag(res, k, v[k])
575
- }
576
- _checks = mergeChecks(_checks, checks2, v)
577
- }
578
- checks[i] = _checks
579
- i++
580
- }
581
- if (!isCheckComplete(checks, check)) err = "something went wrong"
516
+ if (!allChecked(check, res)) err = "something went wrong"
582
517
  if (!err && !isNil(get)) out = getTagVal(get, res)
583
518
  } catch (e) {
584
519
  err = e
package/esm/aoconnect.js CHANGED
@@ -105,6 +105,7 @@ export const connect = (mem, { cache, log = false, extensions = {} } = {}) => {
105
105
  let ex = false
106
106
  for (let v of opt.tags) if (v.name === "Type") ex = true
107
107
  if (!ex) opt.tags.push({ name: "Type", value: "Process" })
108
+ if (opt.for) opt.tags.push({ name: "Pushed-For", value: opt.for })
108
109
  const {
109
110
  id,
110
111
  owner,
@@ -306,6 +307,7 @@ export const connect = (mem, { cache, log = false, extensions = {} } = {}) => {
306
307
  for (const v of res.Messages ?? []) {
307
308
  if (await mem.get("env", v.Target)) {
308
309
  await message({
310
+ for: opt.message,
309
311
  process: v.Target,
310
312
  tags: v.Tags,
311
313
  data: v.Data,
@@ -317,6 +319,7 @@ export const connect = (mem, { cache, log = false, extensions = {} } = {}) => {
317
319
  for (const v of res.Spawns ?? []) {
318
320
  const __tags = tags(v.Tags)
319
321
  await spawn({
322
+ for: opt.message,
320
323
  module: __tags.Module,
321
324
  scheduler,
322
325
  tags: v.Tags,
@@ -361,6 +364,14 @@ export const connect = (mem, { cache, log = false, extensions = {} } = {}) => {
361
364
  SDK: "aoconnect",
362
365
  }),
363
366
  )
367
+ if (opt.for) {
368
+ opt.tags.push({ name: "Pushed-For", value: opt.for })
369
+ opt.tags.push({ name: "From-Process", value: opt.from })
370
+ const pr = (await mem.get("txs", opt.from))?.tags ?? []
371
+ const module = tags(pr).Module
372
+ if (module) opt.tags.push({ name: "From-Module", value: module })
373
+ }
374
+
364
375
  ;({ item, id, owner } = await ar.dataitem({
365
376
  data: opt.data,
366
377
  signer: opt.signer,
@@ -404,7 +415,7 @@ export const connect = (mem, { cache, log = false, extensions = {} } = {}) => {
404
415
  spawn,
405
416
  assign,
406
417
  ar,
407
- result: async opt => (await mem.get("env", opt.process)).res[opt.message],
418
+ result: async opt => (await mem.get("env", opt.process))?.res[opt.message],
408
419
  results: async opt => {
409
420
  const p = await mem.get("env", opt.process)
410
421
  let results = []
Binary file
package/esm/utils.js CHANGED
@@ -1,6 +1,6 @@
1
1
  import { graphql, parse, validate, buildSchema } from "graphql"
2
2
 
3
- import { clone, is, includes, fromPairs, map, isNil } from "ramda"
3
+ import { clone, is, includes, fromPairs, map, isNil, equals } from "ramda"
4
4
 
5
5
  const allows = [
6
6
  { key: "allowed", val: "Allowed" },
@@ -86,6 +86,8 @@ const isData = (data, res) => {
86
86
  try {
87
87
  if (data.test(v.Data)) return true
88
88
  } catch (e) {}
89
+ } else if (typeof data === "function") {
90
+ return data(v.Data)
89
91
  } else {
90
92
  if (data === true || v.Data === data) return true
91
93
  }
@@ -149,6 +151,7 @@ const modGet = get => {
149
151
  } else if (
150
152
  is(Object, get) &&
151
153
  isNil(get.data) &&
154
+ isNil(get.from) &&
152
155
  isNil(get.json) &&
153
156
  isNil(get.name) &&
154
157
  isNil(get.obj)
@@ -158,23 +161,32 @@ const modGet = get => {
158
161
  return _get
159
162
  }
160
163
 
161
- const _getTagVal = (get, res) => {
164
+ const _getTagVal = (get, res, from) => {
162
165
  let out = null
163
166
  const _get = modGet(get)
164
167
  if (typeof _get === "object" && _get.obj) {
165
168
  out = {}
166
- for (const k in _get.obj ?? {}) out[k] = _getTagVal(_get.obj[k], res)
169
+ for (const k in _get.obj ?? {}) out[k] = _getTagVal(_get.obj[k], res, from)
167
170
  } else {
168
171
  for (const v of res.Messages ?? []) {
172
+ if (typeof _get === "object" && isNil(_get.name) && isNil(_get.data)) {
173
+ _get.data = true
174
+ }
169
175
  if (
170
176
  (typeof _get === "object" && _get.data) ||
171
177
  typeof _get === "boolean"
172
178
  ) {
179
+ let _from = null
180
+ if (is(Object, _get) && _get.from) _from = _get.from
181
+ if (_from && _from !== from) break
173
182
  if (v.Data) out = v.Data
174
183
  try {
175
184
  if (_get.json || _get === true) out = JSON.parse(out)
176
185
  } catch (e) {}
177
186
  } else if (typeof _get === "object" && typeof _get.name === "string") {
187
+ let _from = null
188
+ if (is(Object, _get) && _get.from) _from = _get.from
189
+ if (_from && _from !== from) break
178
190
  out = getTag(v.Tags ?? [], _get.name)
179
191
  try {
180
192
  if (_get.json) out = JSON.parse(out)
@@ -186,9 +198,9 @@ const _getTagVal = (get, res) => {
186
198
  return out
187
199
  }
188
200
 
189
- const getTagVal = (get, res) => {
201
+ const getTagVal = (get, res, from) => {
190
202
  const _get = modGet(get)
191
- return _getTagVal(_get, res)
203
+ return _getTagVal(_get, res, from)
192
204
  }
193
205
 
194
206
  const srcs = {
@@ -218,7 +230,7 @@ const buildTags = (act, tags) => {
218
230
 
219
231
  const mergeOut = (out, out2, get) => {
220
232
  const _get = modGet(get)
221
- if (_get.obj) {
233
+ if (_get?.obj) {
222
234
  for (const k in out2 ?? {}) {
223
235
  if (isNil(out?.[k])) {
224
236
  if (!out) out = {}
@@ -243,27 +255,20 @@ const isOutComplete = (out, get) => {
243
255
  if (isNil(get)) return true
244
256
  if (isNil(out)) return false
245
257
  const _get = modGet(get)
246
- if (_get.obj) {
247
- for (const k in out ?? {}) {
248
- if (isNil(out[k])) return false
249
- }
250
- }
258
+ if (_get.obj) for (const k in out ?? {}) if (isNil(out[k])) return false
251
259
  return true
252
260
  }
253
261
 
254
262
  const isCheckComplete = (checks, check) => {
255
263
  let i = 0
256
- for (const v of checks) {
264
+ for (const v of checks || []) {
265
+ if (!v) return false
257
266
  if (
258
267
  isRegExp(check[i]) ||
259
268
  includes(typeof check[i])(["string", "boolean"])
260
269
  ) {
261
270
  if (!v) return false
262
- } else {
263
- for (const k in v) {
264
- if (!v[k]) return false
265
- }
266
- }
271
+ } else for (const k in v) if (!v[k]) return false
267
272
  i++
268
273
  }
269
274
  return true
@@ -534,7 +539,91 @@ const optServer = port => {
534
539
  return { ar: port, mu: port + 2, su: port + 3, cu: port + 4 }
535
540
  }
536
541
 
542
+ const allChecked = (check, res, from) => {
543
+ let checks = []
544
+ let i = 0
545
+ for (let v of check || []) {
546
+ let _checks = checks[i] ?? null
547
+ if (isRegExp(v) || includes(typeof v)(["string", "boolean", "function"])) {
548
+ _checks = isData(v, res)
549
+ } else {
550
+ const _checkVal = (val, data) => {
551
+ if (isRegExp(val)) {
552
+ try {
553
+ if (val.test(data)) return true
554
+ } catch (e) {}
555
+ } else if (typeof val === "function") {
556
+ return val(data)
557
+ } else if (typeof val === "object" && !isNil(val.json)) {
558
+ try {
559
+ data = JSON.parse(data)
560
+ if (typeof val.json === "function") {
561
+ return val.json(data)
562
+ } else if (typeof val.json === "object") {
563
+ if (val.eq) return equals(data, val.json)
564
+ let ok = true
565
+ for (let k in val.json) {
566
+ if (!_checkVal(val.json[k], data[k])) {
567
+ ok = false
568
+ break
569
+ }
570
+ }
571
+ return ok
572
+ } else if (val.json === true) {
573
+ return true
574
+ }
575
+ } catch (e) {
576
+ return false
577
+ }
578
+ } else {
579
+ if (val === true || data === val) return true
580
+ }
581
+ return false
582
+ }
583
+ const checkVal = (res, val, name) => {
584
+ for (let v of res.Messages || []) {
585
+ let data = v.Data
586
+ if (!isNil(name)) {
587
+ const t = tags(v.Tags || [])
588
+ data = t[name]
589
+ }
590
+ if (isNil(data)) return false
591
+ return _checkVal(val, data)
592
+ }
593
+ return false
594
+ }
595
+
596
+ if (typeof v === "object") {
597
+ if (!isNil(v.json)) {
598
+ const _from = v.from
599
+ v = { data: v, from: _from }
600
+ } else if (isNil(v.tags) && isNil(v.data) && isNil(v.from)) {
601
+ v = { tags: v }
602
+ }
603
+ const _from = v.from ?? null
604
+ let checks2 = {}
605
+ if (!isNil(v.from) && v.from !== from) {
606
+ _checks = false
607
+ } else {
608
+ let ok = true
609
+ if (!isNil(v.data)) {
610
+ if (!checkVal(res, v.data)) ok = false
611
+ }
612
+ for (const k in v.tags ?? {}) {
613
+ if (!checkVal(res, v.tags[k], k)) ok = false
614
+ }
615
+ _checks = ok
616
+ }
617
+ }
618
+ }
619
+ checks[i] = _checks
620
+ i++
621
+ }
622
+ return isCheckComplete(checks, check)
623
+ }
624
+
537
625
  export {
626
+ allChecked,
538
627
  optAO,
539
628
  optServer,
540
629
  toGraphObj,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "wao",
3
- "version": "0.8.4",
3
+ "version": "0.8.5",
4
4
  "bin": {
5
5
  "wao": "./cjs/cli.js",
6
6
  "wao-esm": "./esm/cli.js"