wao 0.13.0 → 0.13.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/cjs/server.js CHANGED
@@ -6,6 +6,7 @@ Object.defineProperty(exports, "__esModule", {
6
6
  });
7
7
  exports["default"] = void 0;
8
8
  var _crypto = _interopRequireDefault(require("crypto"));
9
+ var _hb = _interopRequireDefault(require("./hb.js"));
9
10
  var _express = _interopRequireDefault(require("express"));
10
11
  var _cors = _interopRequireDefault(require("cors"));
11
12
  var _base64url = _interopRequireDefault(require("base64url"));
@@ -98,6 +99,7 @@ var Server = /*#__PURE__*/function () {
98
99
  su = _ref$su === void 0 ? 4003 : _ref$su,
99
100
  _ref$cu = _ref.cu,
100
101
  cu = _ref$cu === void 0 ? 4004 : _ref$cu,
102
+ hb_url = _ref.hb_url,
101
103
  aoconnect = _ref.aoconnect,
102
104
  _ref$log = _ref.log,
103
105
  log = _ref$log === void 0 ? false : _ref$log,
@@ -112,9 +114,14 @@ var Server = /*#__PURE__*/function () {
112
114
  cu = port + 4;
113
115
  aoconnect = (0, _utils.optAO)(5000);
114
116
  }
117
+ var hb = null;
118
+ if (hb_url) hb = new _hb["default"]({
119
+ url: hb_url
120
+ });
115
121
  var _connect = (0, _aoconnect.connect)(aoconnect, {
116
122
  log: log,
117
- cache: db
123
+ cache: db,
124
+ hb: hb
118
125
  }),
119
126
  _ar = _connect.ar,
120
127
  message = _connect.message,
@@ -124,7 +131,9 @@ var Server = /*#__PURE__*/function () {
124
131
  results = _connect.results,
125
132
  mem = _connect.mem,
126
133
  monitor = _connect.monitor,
127
- unmonitor = _connect.unmonitor;
134
+ unmonitor = _connect.unmonitor,
135
+ recover = _connect.recover;
136
+ this.recover = recover;
128
137
  this.monitor = monitor;
129
138
  this.unmonitor = unmonitor;
130
139
  this.spawn = spawn;
@@ -163,7 +172,7 @@ var Server = /*#__PURE__*/function () {
163
172
  }));
164
173
  app.post("/tx", /*#__PURE__*/function () {
165
174
  var _ref2 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee(req, res) {
166
- var lines, sigs, currentKey, _iterator, _step, line, trimmed, headerMatch, _key, value, input, key, verifier, isValid, item, _iterator2, _step2, v, _res2, _res3;
175
+ var lines, sigs, currentKey, _iterator, _step, line, trimmed, headerMatch, _key, value, input, key, verifier, id, isValid, item, _iterator2, _step2, v, _res2, _iterator3, _step3, _v, _res3;
167
176
  return _regeneratorRuntime().wrap(function _callee$(_context) {
168
177
  while (1) switch (_context.prev = _context.next) {
169
178
  case 0:
@@ -228,8 +237,9 @@ var Server = /*#__PURE__*/function () {
228
237
  key: key,
229
238
  format: "jwk"
230
239
  }), "rsa-pss-sha512");
231
- _context.prev = 32;
232
- _context.next = 35;
240
+ id = null;
241
+ _context.prev = 33;
242
+ _context.next = 36;
233
243
  return verifyMessage({
234
244
  keyLookup: function keyLookup(params) {
235
245
  return {
@@ -241,11 +251,11 @@ var Server = /*#__PURE__*/function () {
241
251
  headers: req.headers,
242
252
  url: "http://ao.com".concat(req.headers.path)
243
253
  });
244
- case 35:
254
+ case 36:
245
255
  isValid = _context.sent;
246
256
  item = toANS104Request(sigs).item;
247
257
  if (!(sigs.slot === "0" || sigs.type === "Process")) {
248
- _context.next = 45;
258
+ _context.next = 46;
249
259
  break;
250
260
  }
251
261
  _iterator2 = _createForOfIteratorHelper(item.tags);
@@ -259,43 +269,54 @@ var Server = /*#__PURE__*/function () {
259
269
  } finally {
260
270
  _iterator2.f();
261
271
  }
262
- _context.next = 42;
272
+ _context.next = 43;
263
273
  return _this.spawn({
264
274
  http_msg: item,
265
275
  module: sigs.module,
266
276
  scheduler: sigs.scheduler
267
277
  });
268
- case 42:
278
+ case 43:
269
279
  _res2 = _context.sent;
270
- _context.next = 49;
280
+ _context.next = 52;
271
281
  break;
272
- case 45:
282
+ case 46:
273
283
  if (!(sigs.type === "Message")) {
274
- _context.next = 49;
284
+ _context.next = 52;
275
285
  break;
276
286
  }
277
- _context.next = 48;
287
+ _iterator3 = _createForOfIteratorHelper(item.tags);
288
+ try {
289
+ for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
290
+ _v = _step3.value;
291
+ if (_v.name === "id") id = _v.value;
292
+ }
293
+ } catch (err) {
294
+ _iterator3.e(err);
295
+ } finally {
296
+ _iterator3.f();
297
+ }
298
+ _context.next = 51;
278
299
  return _this.message({
300
+ slot: sigs.slot,
279
301
  http_msg: item,
280
302
  process: sigs.target
281
303
  });
282
- case 48:
304
+ case 51:
283
305
  _res3 = _context.sent;
284
- case 49:
285
- _context.next = 54;
306
+ case 52:
307
+ _context.next = 57;
286
308
  break;
287
- case 51:
288
- _context.prev = 51;
289
- _context.t1 = _context["catch"](32);
290
- console.log(_context.t1, req.originalUrl);
291
309
  case 54:
292
- console.log("bundler success [pid]", sigs.target, "[slot]", sigs.slot);
310
+ _context.prev = 54;
311
+ _context.t1 = _context["catch"](33);
312
+ console.log(_context.t1, req.originalUrl);
313
+ case 57:
293
314
  return _context.abrupt("return", res.status(200).send("Success"));
294
- case 56:
315
+ case 58:
295
316
  case "end":
296
317
  return _context.stop();
297
318
  }
298
- }, _callee, null, [[7, 21, 24, 27], [32, 51]]);
319
+ }, _callee, null, [[7, 21, 24, 27], [33, 54]]);
299
320
  }));
300
321
  return function (_x, _x2) {
301
322
  return _ref2.apply(this, arguments);
@@ -792,14 +813,23 @@ var Server = /*#__PURE__*/function () {
792
813
  });
793
814
  var result = /*#__PURE__*/function () {
794
815
  var _ref14 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee13(req, res) {
795
- var message, process, _this5$mem$env$proces, res2;
816
+ var message, process, _yield$_this5$recover, success, _this5$mem$env$proces, res2;
796
817
  return _regeneratorRuntime().wrap(function _callee13$(_context13) {
797
818
  while (1) switch (_context13.prev = _context13.next) {
798
819
  case 0:
799
820
  message = req.params.mid;
800
- process = req.query["process-id"];
821
+ process = req.query["process-id"]; // check if recovery is ongoing and
801
822
  if (!(0, _ramda.isNil)(_this5.mem.env[process])) {
802
- _context13.next = 8;
823
+ _context13.next = 12;
824
+ break;
825
+ }
826
+ _context13.next = 5;
827
+ return _this5.recover(process);
828
+ case 5:
829
+ _yield$_this5$recover = _context13.sent;
830
+ success = _yield$_this5$recover.success;
831
+ if (success) {
832
+ _context13.next = 12;
803
833
  break;
804
834
  }
805
835
  console.log("process not found:", req.query["process-id"]);
@@ -807,16 +837,13 @@ var Server = /*#__PURE__*/function () {
807
837
  res.json({
808
838
  error: "not found"
809
839
  });
810
- setTimeout(function () {
811
- console.log(_this5.mem.env);
812
- }, 1000);
813
840
  return _context13.abrupt("return");
814
- case 8:
841
+ case 12:
815
842
  if (!/^--[0-9a-zA-Z_-]{43,44}$/.test(message)) {
816
843
  message = (_this5$mem$env$proces = _this5.mem.env[process]) === null || _this5$mem$env$proces === void 0 || (_this5$mem$env$proces = _this5$mem$env$proces.results) === null || _this5$mem$env$proces === void 0 ? void 0 : _this5$mem$env$proces[message];
817
844
  }
818
845
  if (!(0, _ramda.isNil)(message)) {
819
- _context13.next = 14;
846
+ _context13.next = 18;
820
847
  break;
821
848
  }
822
849
  console.log("message not found", message, req.params);
@@ -825,16 +852,16 @@ var Server = /*#__PURE__*/function () {
825
852
  error: "Not Found"
826
853
  });
827
854
  return _context13.abrupt("return");
828
- case 14:
829
- _context13.next = 16;
855
+ case 18:
856
+ _context13.next = 20;
830
857
  return _this5.result({
831
858
  message: message,
832
859
  process: process
833
860
  });
834
- case 16:
861
+ case 20:
835
862
  res2 = _context13.sent;
836
863
  res.json(res2);
837
- case 18:
864
+ case 22:
838
865
  case "end":
839
866
  return _context13.stop();
840
867
  }
@@ -913,7 +940,7 @@ var Server = /*#__PURE__*/function () {
913
940
  app.get("/results/:pid", /*#__PURE__*/function () {
914
941
  var _ref17 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee16(req, res) {
915
942
  var _this5$mem$env$pid$re, _this5$mem$env$pid2;
916
- var pid, _req$query, _req$query$from, from, _req$query$to, to, _req$query$sort, sort, _req$query$limit, limit, results, _res, i, count, started, _iterator3, _step3, v, _this5$mem$msgs$v;
943
+ var pid, _req$query, _req$query$from, from, _req$query$to, to, _req$query$sort, sort, _req$query$limit, limit, results, _res, i, count, started, _iterator4, _step4, v, _this5$mem$msgs$v;
917
944
  return _regeneratorRuntime().wrap(function _callee16$(_context16) {
918
945
  while (1) switch (_context16.prev = _context16.next) {
919
946
  case 0:
@@ -925,15 +952,15 @@ var Server = /*#__PURE__*/function () {
925
952
  i = 1;
926
953
  count = 0;
927
954
  started = (0, _ramda.isNil)(from);
928
- _iterator3 = _createForOfIteratorHelper(results);
955
+ _iterator4 = _createForOfIteratorHelper(results);
929
956
  _context16.prev = 9;
930
- _iterator3.s();
957
+ _iterator4.s();
931
958
  case 11:
932
- if ((_step3 = _iterator3.n()).done) {
959
+ if ((_step4 = _iterator4.n()).done) {
933
960
  _context16.next = 26;
934
961
  break;
935
962
  }
936
- v = _step3.value;
963
+ v = _step4.value;
937
964
  if (!started) {
938
965
  _context16.next = 22;
939
966
  break;
@@ -970,10 +997,10 @@ var Server = /*#__PURE__*/function () {
970
997
  case 28:
971
998
  _context16.prev = 28;
972
999
  _context16.t0 = _context16["catch"](9);
973
- _iterator3.e(_context16.t0);
1000
+ _iterator4.e(_context16.t0);
974
1001
  case 31:
975
1002
  _context16.prev = 31;
976
- _iterator3.f();
1003
+ _iterator4.f();
977
1004
  return _context16.finish(31);
978
1005
  case 34:
979
1006
  res.json({
@@ -1000,11 +1027,11 @@ var Server = /*#__PURE__*/function () {
1000
1027
  var _this6 = this;
1001
1028
  return new Promise(function (res) {
1002
1029
  var count = 0;
1003
- var _iterator4 = _createForOfIteratorHelper(_this6.servers),
1004
- _step4;
1030
+ var _iterator5 = _createForOfIteratorHelper(_this6.servers),
1031
+ _step5;
1005
1032
  try {
1006
- for (_iterator4.s(); !(_step4 = _iterator4.n()).done;) {
1007
- var v = _step4.value;
1033
+ for (_iterator5.s(); !(_step5 = _iterator5.n()).done;) {
1034
+ var v = _step5.value;
1008
1035
  v.close(function () {
1009
1036
  count += 1;
1010
1037
  if (count >= 4) {
@@ -1014,9 +1041,9 @@ var Server = /*#__PURE__*/function () {
1014
1041
  });
1015
1042
  }
1016
1043
  } catch (err) {
1017
- _iterator4.e(err);
1044
+ _iterator5.e(err);
1018
1045
  } finally {
1019
- _iterator4.f();
1046
+ _iterator5.f();
1020
1047
  }
1021
1048
  });
1022
1049
  }
package/cjs/tao.js CHANGED
@@ -8,6 +8,7 @@ exports["default"] = void 0;
8
8
  var _bao = _interopRequireDefault(require("./bao.js"));
9
9
  var _aoconnect = require("./aoconnect.js");
10
10
  var _tar = _interopRequireDefault(require("./tar.js"));
11
+ var _hb = _interopRequireDefault(require("./hb.js"));
11
12
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { "default": e }; }
12
13
  function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
13
14
  function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
@@ -28,6 +29,9 @@ var AO = /*#__PURE__*/function (_BAO) {
28
29
  function AO() {
29
30
  var opt = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
30
31
  _classCallCheck(this, AO);
32
+ if (opt.hb_url) opt.hb = new _hb["default"]({
33
+ url: opt.hb_url
34
+ });
31
35
  return _callSuper(this, AO, [_objectSpread(_objectSpread({}, opt), {}, {
32
36
  connect: _aoconnect.connect,
33
37
  AR: _tar["default"]
@@ -3,7 +3,7 @@ const pkg = WarpArBundles.default ?? WarpArBundles
3
3
  const { DataItem } = pkg
4
4
  import crypto from "crypto"
5
5
  import base64url from "base64url"
6
-
6
+ import { wait } from "../src/utils.js"
7
7
  import {
8
8
  tags,
9
9
  action,
@@ -25,9 +25,10 @@ import {
25
25
  o,
26
26
  reverse,
27
27
  } from "ramda"
28
- let count = 0
28
+
29
+ let onRecovery = {}
29
30
  export default ({ AR, scheduler, mu, su, cu, acc, AoLoader, ArMem } = {}) => {
30
- return (mem, { cache, log = false, extensions = {} } = {}) => {
31
+ return (mem, { cache, log = false, extensions = {}, hb } = {}) => {
31
32
  const isMem = mem?.__type__ === "mem"
32
33
  if (!isMem) {
33
34
  let args = { cache }
@@ -367,21 +368,30 @@ export default ({ AR, scheduler, mu, su, cu, acc, AoLoader, ArMem } = {}) => {
367
368
  }
368
369
  return null
369
370
  }
370
-
371
371
  const message = async opt => {
372
- const p = await mem.get("env", opt.process)
373
- if (!p) return null
374
372
  let id = ""
375
373
  let owner = ""
376
374
  let item = null
377
375
  if (ar.isHttpMsg(opt.http_msg)) {
378
- ;({ owner, item } = await ar.httpmsg(opt.http_msg))
379
- id = opt.http_msg.target
376
+ ;({ id, owner, item } = await ar.httpmsg(opt.http_msg))
377
+ // check if process exists, and recover if necessary
378
+ const p = await mem.get("env", opt.process)
379
+ const new_slot = opt.slot * 1
380
+ const last_slot = !p ? -1 : p.results.length - 1
381
+ if (last_slot + 1 !== new_slot) {
382
+ console.log("need process recovery from HB:", opt.process)
383
+ if (!hb || opt.recovery) return null
384
+ await recover(opt.process)
385
+ }
380
386
  } else {
381
387
  let id = opt?.item?.id ?? ""
382
388
  let owner = opt.owner ?? ""
383
389
  let item = opt.item
384
390
  }
391
+
392
+ const p = await mem.get("env", opt.process)
393
+ if (!p) return null
394
+
385
395
  if (!opt.item && opt.signer) {
386
396
  opt.tags = buildTags(
387
397
  null,
@@ -456,6 +466,77 @@ export default ({ AR, scheduler, mu, su, cu, acc, AoLoader, ArMem } = {}) => {
456
466
  }
457
467
  return id
458
468
  }
469
+ const recover = async (pid, next) => {
470
+ let count = 0
471
+ let success = false
472
+ if (hb) {
473
+ if (onRecovery[pid]) {
474
+ let success = false
475
+ let i = 0
476
+ while (true) {
477
+ await wait(1000)
478
+ if (!onRecovery[pid]) {
479
+ success = true
480
+ break
481
+ }
482
+ if (i > 10) break
483
+ i++
484
+ }
485
+ return { success }
486
+ } else {
487
+ onRecovery[pid] = true
488
+ try {
489
+ const p = await mem.get("env", pid)
490
+ const from = p ? p.results.length : 0
491
+ const msgs = next
492
+ ? await next()
493
+ : await hb.messages({ target: pid, from })
494
+ for (let v of msgs.edges) {
495
+ let item = {}
496
+ for (let k in v.node.message) {
497
+ item[k.toLowerCase()] = v.node.message[k]
498
+ }
499
+
500
+ item.tags.push({ name: "signature-input", value: "http-sig-" })
501
+ item.tags.push({
502
+ name: "siot",
503
+ value: Number(v.cursor).toString(),
504
+ })
505
+ item.tags.push({ name: "Owner", value: v.node.message.Owner })
506
+ // todo: why all the ids from Hyperbeam are the same?
507
+ item.tags.push({ name: "id", value: v.node.message.Id })
508
+ item.target = pid
509
+
510
+ let _tags = tags(item.tags)
511
+ if (_tags.Type === "Process") {
512
+ await spawn({
513
+ http_msg: item,
514
+ scheduler: _tags.Scheduler,
515
+ module: _tags.Module,
516
+ slot: v.cursor,
517
+ recovery: true,
518
+ })
519
+ } else {
520
+ await message({
521
+ process: pid,
522
+ http_msg: item,
523
+ slot: v.cursor,
524
+ recovery: true,
525
+ })
526
+ }
527
+ count++
528
+ }
529
+ if (msgs.next) await recover(pid, msgs.next)
530
+ } catch (e) {
531
+ console.log(e)
532
+ }
533
+ delete onRecovery[pid]
534
+ }
535
+ success = true
536
+ }
537
+ return { recovered: count, pid, success }
538
+ }
539
+
459
540
  const result = async opt => (await mem.get("msgs", opt.message))?.res
460
541
  return {
461
542
  message,
@@ -552,6 +633,7 @@ export default ({ AR, scheduler, mu, su, cu, acc, AoLoader, ArMem } = {}) => {
552
633
  }
553
634
  return null
554
635
  },
636
+ recover,
555
637
  mem,
556
638
  }
557
639
  }
package/esm/bao.js CHANGED
@@ -51,6 +51,7 @@ class AO extends MAO {
51
51
  super({ ...opt, in_memory: true })
52
52
  this.in_memory = true
53
53
  this.createDataItemSigner = opt.createDataItemSigner ?? createDataItemSigner
54
+ this.hb = opt.hb
54
55
  const {
55
56
  modules,
56
57
  results,
@@ -61,12 +62,15 @@ class AO extends MAO {
61
62
  dryrun,
62
63
  monitor,
63
64
  unmonitor,
65
+ recover,
64
66
  mem,
65
67
  } = opt.connect(opt.mem, {
66
68
  extensions: opt.extensions,
67
69
  cache: opt.cache,
68
70
  reset: opt.reset,
71
+ hb: this.hb,
69
72
  })
73
+ this.recover = recover
70
74
  this.assign = assign
71
75
  this.result = async (...opt) => {
72
76
  const res = await result(...opt)
@@ -95,6 +99,7 @@ class AO extends MAO {
95
99
  async init(jwk) {
96
100
  if (!jwk && this.acc[0]) jwk = this.acc[0].jwk
97
101
  await this.ar.init(jwk)
102
+ if (this.hb) await this.hb.init(jwk)
98
103
  return this
99
104
  }
100
105
 
package/esm/bar.js CHANGED
@@ -37,8 +37,13 @@ class AR extends MAR {
37
37
  }
38
38
  async httpmsg(msg) {
39
39
  const tags = t(msg.tags)
40
- const { keyid: n } = parseSignatureInput(tags["signature-input"])
41
- const owner = await this.arweave.wallets.jwkToAddress({ n })
40
+ let owner = null
41
+ try {
42
+ const { keyid: n } = parseSignatureInput(tags["signature-input"])
43
+ owner = await this.arweave.wallets.jwkToAddress({ n })
44
+ } catch (e) {
45
+ owner = tags.Owner ?? null
46
+ }
42
47
  await this.mem.set(msg, "txs", msg.id)
43
48
  return { item: msg, id: tags.id, tags, owner }
44
49
  }
@@ -65,6 +70,7 @@ class AR extends MAR {
65
70
  for (const v of buildTags(null, tags)) tx.addTag(v.name, v.value)
66
71
  return await this.postTx(tx, jwk)
67
72
  }
73
+
68
74
  async postItems(items, jwk) {
69
75
  let err = null
70
76
  ;({ err, jwk } = await this.checkWallet({ jwk }))
package/esm/hb.js CHANGED
@@ -1,14 +1,17 @@
1
1
  import { connect, createSigner } from "aoconnect-wao"
2
- import { mergeLeft } from "ramda"
2
+ import { last, isNotNil, mergeLeft } from "ramda"
3
3
  import { randomBytes } from "node:crypto"
4
4
  import { buildTags } from "./utils.js"
5
+
5
6
  class HB {
6
7
  constructor({ url = "http://localhost:10000" } = {}) {
7
8
  this.url = url
8
9
  }
9
10
 
10
11
  async metrics() {
11
- const txt = await fetch(`${this.url}/metrics`).then(r => r.text())
12
+ const txt = await fetch(`${this.url}/~hyperbuddy@1.0/metrics`).then(r =>
13
+ r.text()
14
+ )
12
15
  const parts = txt.split(/\r?\n/)
13
16
  let index = 0
14
17
  let _metrics = {}
@@ -59,7 +62,24 @@ class HB {
59
62
  return this
60
63
  }
61
64
 
62
- async process({ tags = {}, data = "1984" } = {}) {
65
+ async messages({ target, from, to, limit } = {}) {
66
+ let params = `target=${target}`
67
+ if (isNotNil(from)) params += `&from=${from}`
68
+ if (isNotNil(to)) params += `&to=${to}`
69
+ params += `&accept=application/aos-2`
70
+ let res = await fetch(`${this.url}/~scheduler@1.0/schedule?${params}`).then(
71
+ r => r.json()
72
+ )
73
+ if (res.page_info.has_next_page) {
74
+ res.next = async () => {
75
+ const from2 = last(res.edges).cursor + 1
76
+ return await this.message({ target, from2, to })
77
+ }
78
+ }
79
+ return res
80
+ }
81
+
82
+ async process({ tags = {}, data } = {}) {
63
83
  tags = mergeLeft(tags, {
64
84
  data,
65
85
  Type: "Process",
@@ -74,7 +94,8 @@ class HB {
74
94
  "scheduler-device": "scheduler@1.0",
75
95
  "execution-device": "genesis-wasm@1.0",
76
96
  })
77
- return await this.post({ tags })
97
+ const res = await this.post({ tags })
98
+ return await res.process.text()
78
99
  }
79
100
 
80
101
  async schedule({ tags = {}, data, process, action = "Eval" } = {}) {
@@ -96,10 +117,12 @@ class HB {
96
117
  })
97
118
  }
98
119
 
99
- async dryrun({ tags = {}, process, action } = {}) {
120
+ async dryrun({ tags = {}, process, action, data } = {}) {
100
121
  if (typeof action === "string") tags.Action = action
122
+ let json = { Tags: buildTags(tags) }
123
+ if (data) json.Data = data
101
124
  return await fetch(
102
- `${this.url}/~relay@1.0/call?relay-method=POST&relay-path=/dry-run?process-id=${process}/&content-type=application/json&body=${JSON.stringify({ Tags: buildTags(tags) })}`
125
+ `${this.url}/~relay@1.0/call?relay-method=POST&relay-path=/dry-run?process-id=${process}/&content-type=application/json&body=${JSON.stringify(json)}`
103
126
  ).then(r => r.json())
104
127
  }
105
128
 
package/esm/run.js CHANGED
@@ -8,6 +8,7 @@ let {
8
8
  memory = false,
9
9
  port = 4000,
10
10
  db = ".cache",
11
+ hb,
11
12
  } = yargs(process.argv.slice(2)).argv
12
13
  db = memory ? null : resolve(process.cwd(), db)
13
14
  if (reset) {
@@ -15,6 +16,6 @@ if (reset) {
15
16
  unlinkSync(db)
16
17
  } catch (e) {}
17
18
  }
18
- const main = async () => new Server({ log: true, port, db })
19
+ const main = async () => new Server({ log: true, port, db, hb_url: hb })
19
20
 
20
21
  main()