wao 0.29.0 → 0.29.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/encode.js CHANGED
@@ -1162,11 +1162,11 @@ function setFinalHeaders(headers, boundary, contentDigest, byteLength) {
1162
1162
  }
1163
1163
  headers["content-length"] = String(byteLength);
1164
1164
  }
1165
- function encode() {
1166
- return _encode.apply(this, arguments);
1165
+ function enc() {
1166
+ return _enc.apply(this, arguments);
1167
1167
  }
1168
- function _encode() {
1169
- _encode = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee8() {
1168
+ function _enc() {
1169
+ _enc = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee8() {
1170
1170
  var obj,
1171
1171
  processedObj,
1172
1172
  emptyResult,
@@ -1334,25 +1334,5 @@ function _encode() {
1334
1334
  }
1335
1335
  }, _callee8);
1336
1336
  }));
1337
- return _encode.apply(this, arguments);
1338
- }
1339
- function enc(_x11) {
1340
- return _enc.apply(this, arguments);
1341
- }
1342
- function _enc() {
1343
- _enc = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee9(fields) {
1344
- return _regeneratorRuntime().wrap(function _callee9$(_context9) {
1345
- while (1) switch (_context9.prev = _context9.next) {
1346
- case 0:
1347
- _context9.next = 2;
1348
- return encode(fields);
1349
- case 2:
1350
- return _context9.abrupt("return", _context9.sent);
1351
- case 3:
1352
- case "end":
1353
- return _context9.stop();
1354
- }
1355
- }, _callee9);
1356
- }));
1357
1337
  return _enc.apply(this, arguments);
1358
1338
  }
package/cjs/hb.js CHANGED
@@ -1561,9 +1561,7 @@ var HB = /*#__PURE__*/function () {
1561
1561
  body: _context38.t1,
1562
1562
  status: _context38.t2
1563
1563
  };
1564
- return _context38.abrupt("return", _objectSpread({
1565
- out: (0, _httpsig.from)(http)
1566
- }, http));
1564
+ return _context38.abrupt("return", _objectSpread(_objectSpread({}, (0, _httpsig.from)(http)), http));
1567
1565
  case 19:
1568
1566
  case "end":
1569
1567
  return _context38.stop();
package/cjs/httpsig.js CHANGED
@@ -7,21 +7,22 @@ exports.verifyContentDigest = exports.toBuffer = exports.hasValidSignature = exp
7
7
  var _ramda = require("ramda");
8
8
  var _signerUtils = require("./signer-utils.js");
9
9
  var _base64url = _interopRequireDefault(require("base64url"));
10
+ var _utils = require("./utils.js");
10
11
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { "default": e }; }
11
12
  function _toConsumableArray(r) { return _arrayWithoutHoles(r) || _iterableToArray(r) || _unsupportedIterableToArray(r) || _nonIterableSpread(); }
12
13
  function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
13
14
  function _iterableToArray(r) { if ("undefined" != typeof Symbol && null != r[Symbol.iterator] || null != r["@@iterator"]) return Array.from(r); }
14
15
  function _arrayWithoutHoles(r) { if (Array.isArray(r)) return _arrayLikeToArray(r); }
15
- function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); }
16
- function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
17
- function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t["return"] && (u = t["return"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }
18
- function _arrayWithHoles(r) { if (Array.isArray(r)) return r; }
19
16
  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; }
20
17
  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; }
21
18
  function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
22
19
  function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; }
23
20
  function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
24
21
  function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
22
+ function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); }
23
+ function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
24
+ function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t["return"] && (u = t["return"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }
25
+ function _arrayWithHoles(r) { if (Array.isArray(r)) return r; }
25
26
  function _createForOfIteratorHelper(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t["return"] || t["return"](); } finally { if (u) throw o; } } }; }
26
27
  function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
27
28
  function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
@@ -70,6 +71,17 @@ var extract = function extract(http, components) {
70
71
  extracted["ao-types"] = aoTypes;
71
72
  }
72
73
  }
74
+
75
+ // Extract ao-ids if it's signed
76
+ var hasAoIds = components.some(function (c) {
77
+ return c.replace(/"/g, "").toLowerCase() === "ao-ids";
78
+ });
79
+ if (hasAoIds) {
80
+ var aoIds = http.headers["ao-ids"] || http.headers["Ao-Ids"];
81
+ if (aoIds) {
82
+ extracted["ao-ids"] = aoIds;
83
+ }
84
+ }
73
85
  var _iterator2 = _createForOfIteratorHelper(components),
74
86
  _step2;
75
87
  try {
@@ -172,6 +184,27 @@ var toBuffer = exports.toBuffer = function toBuffer(body) {
172
184
  throw new Error("Unsupported body type");
173
185
  };
174
186
 
187
+ /**
188
+ * Parse ao-ids dictionary
189
+ * @param {string} aoIds - The ao-ids header value
190
+ * @returns {Object} Parsed ID mappings
191
+ */
192
+ var parseAoIds = function parseAoIds(aoIds) {
193
+ var result = {};
194
+
195
+ // Match pattern: ID="value"
196
+ var regex = /([A-Za-z0-9_-]{43})="([^"]*)"/g;
197
+ var match;
198
+ while ((match = regex.exec(aoIds)) !== null) {
199
+ var _match = match,
200
+ _match2 = _slicedToArray(_match, 3),
201
+ id = _match2[1],
202
+ value = _match2[2];
203
+ result[id] = value;
204
+ }
205
+ return result;
206
+ };
207
+
175
208
  /**
176
209
  * Convert message to JSON with proper type conversions
177
210
  * Following the logic from dev_codec_structured, dev_codec_httpsig_conv, and dev_codec_flat
@@ -184,6 +217,14 @@ var _toJSON = function toJSON(msg) {
184
217
  }
185
218
  var result = _objectSpread({}, msg);
186
219
 
220
+ // Handle ao-ids parsing
221
+ if (result["ao-ids"]) {
222
+ var parsedIds = parseAoIds(result["ao-ids"]);
223
+ // Remove the ao-ids header and merge the parsed IDs
224
+ delete result["ao-ids"];
225
+ result = _objectSpread(_objectSpread({}, result), parsedIds);
226
+ }
227
+
187
228
  // First, handle the multipart body if present
188
229
  var contentType = result["content-type"];
189
230
  var body = result.body;
@@ -349,7 +390,9 @@ var _toJSON = function toJSON(msg) {
349
390
  _value2 = _Object$entries7$_i[1];
350
391
  // Skip internal keys and headers we don't want in the final result
351
392
  if (_key5.startsWith("__")) continue;
352
- if (_key5.startsWith("@")) continue; // Skip all @ fields
393
+
394
+ // Skip @ fields EXCEPT @path which we want to include
395
+ if (_key5.startsWith("@") && _key5 !== "@path") continue;
353
396
  if (_key5 === "ao-types") continue;
354
397
  if (_key5 === "content-type") continue;
355
398
  if (_key5 === "content-digest") continue;
@@ -870,12 +913,6 @@ var stringToBuffer = function stringToBuffer(str) {
870
913
  }
871
914
  return buffer;
872
915
  };
873
-
874
- /**
875
- * Original from function - extracts and converts only signed components
876
- * @param {Object} http - HTTP message object with headers, body, and status
877
- * @returns {Object|null} Converted signed components or null if not signed
878
- */
879
916
  var from = exports.from = function from(http) {
880
917
  var input = http.headers["signature-input"] || http.headers["Signature-Input"];
881
918
  if (!input) {
@@ -884,34 +921,71 @@ var from = exports.from = function from(http) {
884
921
 
885
922
  // Decode signature inputs
886
923
  var inputs = (0, _signerUtils.decodeSigInput)(input);
887
-
888
924
  // Process the first signature (following the original logic)
889
925
  for (var k in inputs) {
926
+ var _sigData$params$tag, _sigData$params;
890
927
  var sigData = inputs[k];
891
-
892
928
  // Extract only the signed components
893
929
  var extractedComponents = extract(http, sigData.components);
930
+ var ret = {
931
+ hashpath: (_sigData$params$tag = sigData === null || sigData === void 0 || (_sigData$params = sigData.params) === null || _sigData$params === void 0 ? void 0 : _sigData$params.tag) !== null && _sigData$params$tag !== void 0 ? _sigData$params$tag : null
932
+ };
933
+ try {
934
+ ret.signer = (0, _utils.toAddr)(sigData.params.keyid);
935
+ } catch (e) {}
936
+
937
+ // Check if @path was in the signed components
938
+ var hasPathComponent = sigData.components.some(function (c) {
939
+ return c.replace(/"/g, "") === "@path";
940
+ });
941
+
942
+ // If @path is signed, add the path header to extracted components
943
+ if (hasPathComponent) {
944
+ extractedComponents["path"] = http.headers.path;
945
+ }
894
946
 
895
- // Check if ao-result header is present and points to body
947
+ // Check if ao-result header is present
896
948
  var aoResult = http.headers["ao-result"] || http.headers["Ao-Result"];
897
- if (aoResult === "body" && extractedComponents.body) {
949
+
950
+ // Handle ao-result pointing to body
951
+ if (aoResult === "body") {
952
+ // Handle empty body case
953
+ if (!extractedComponents.body) {
954
+ return _objectSpread({
955
+ out: ""
956
+ }, ret); // Return empty string for empty body
957
+ }
898
958
  // Check if body is binary data
899
959
  if (isBinaryString(extractedComponents.body)) {
900
- return stringToBuffer(extractedComponents.body);
960
+ return _objectSpread({
961
+ out: stringToBuffer(extractedComponents.body)
962
+ }, ret);
901
963
  }
964
+ // Return body as-is if it's not binary
965
+ return _objectSpread({
966
+ out: extractedComponents.body
967
+ }, ret);
902
968
  }
903
969
 
904
970
  // Convert the extracted components to JSON format
905
971
  var result = _toJSON(extractedComponents);
906
972
 
907
- // Handle ao-result if present
908
- if (aoResult && result[aoResult] !== undefined) {
973
+ // Handle ao-result if present and pointing to other fields
974
+ if (aoResult && aoResult !== "body") {
909
975
  // Return the value of the key specified by ao-result
910
- return result[aoResult];
976
+ // If the key doesn't exist, return undefined (or could return null/empty string)
977
+ return _objectSpread({
978
+ out: result[aoResult] !== undefined ? result[aoResult] : ""
979
+ }, ret);
911
980
  }
912
- return result;
981
+ return _objectSpread({
982
+ out: result
983
+ }, ret);
913
984
  }
914
- return null;
985
+ return {
986
+ out: null,
987
+ hashpath: null
988
+ };
915
989
  };
916
990
 
917
991
  /**
@@ -1034,9 +1108,9 @@ var verifyContentDigest = exports.verifyContentDigest = function verifyContentDi
1034
1108
  error: "Invalid content-digest format"
1035
1109
  };
1036
1110
  }
1037
- var _match = _slicedToArray(match, 3),
1038
- algorithm = _match[1],
1039
- expectedDigest = _match[2];
1111
+ var _match3 = _slicedToArray(match, 3),
1112
+ algorithm = _match3[1],
1113
+ expectedDigest = _match3[2];
1040
1114
  try {
1041
1115
  // Convert body to Buffer if needed
1042
1116
  var bodyBuffer = typeof body === "string" ? Buffer.from(body, "utf-8") : body;
package/cjs/send.js CHANGED
@@ -48,8 +48,6 @@ function _send() {
48
48
  while (1) switch (_context2.prev = _context2.next) {
49
49
  case 0:
50
50
  fetchImpl = _args2.length > 1 && _args2[1] !== undefined ? _args2[1] : fetch;
51
- // IMPORTANT: Use the URL from signedMsg.url, NOT from any path header
52
- // This ensures we send to the correct URL even if path header is different
53
51
  fetchOptions = {
54
52
  method: signedMsg.method,
55
53
  headers: signedMsg.headers,
@@ -58,8 +56,6 @@ function _send() {
58
56
  if (signedMsg.body !== undefined && signedMsg.method !== "GET" && signedMsg.method !== "HEAD") {
59
57
  fetchOptions.body = signedMsg.body;
60
58
  }
61
-
62
- // Use the URL as provided, ignoring any path header
63
59
  _context2.next = 5;
64
60
  return fetchImpl(signedMsg.url, fetchOptions);
65
61
  case 5:
@@ -94,9 +90,7 @@ function _send() {
94
90
  body: _context2.t5,
95
91
  status: _context2.t6
96
92
  };
97
- return _context2.abrupt("return", _objectSpread({
98
- out: (0, _httpsig.from)(http)
99
- }, http));
93
+ return _context2.abrupt("return", _objectSpread(_objectSpread({}, (0, _httpsig.from)(http)), http));
100
94
  case 23:
101
95
  case "end":
102
96
  return _context2.stop();
package/cjs/signer.js CHANGED
@@ -4,22 +4,20 @@ function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" ==
4
4
  Object.defineProperty(exports, "__esModule", {
5
5
  value: true
6
6
  });
7
+ exports.sign = sign;
7
8
  exports.signer = signer;
8
9
  var _send = require("./send.js");
9
10
  var _encode = require("./encode.js");
10
- var _excluded = ["path", "method"];
11
- function _regeneratorRuntime() { "use strict"; /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */ _regeneratorRuntime = function _regeneratorRuntime() { return e; }; var t, e = {}, r = Object.prototype, n = r.hasOwnProperty, o = Object.defineProperty || function (t, e, r) { t[e] = r.value; }, i = "function" == typeof Symbol ? Symbol : {}, a = i.iterator || "@@iterator", c = i.asyncIterator || "@@asyncIterator", u = i.toStringTag || "@@toStringTag"; function define(t, e, r) { return Object.defineProperty(t, e, { value: r, enumerable: !0, configurable: !0, writable: !0 }), t[e]; } try { define({}, ""); } catch (t) { define = function define(t, e, r) { return t[e] = r; }; } function wrap(t, e, r, n) { var i = e && e.prototype instanceof Generator ? e : Generator, a = Object.create(i.prototype), c = new Context(n || []); return o(a, "_invoke", { value: makeInvokeMethod(t, r, c) }), a; } function tryCatch(t, e, r) { try { return { type: "normal", arg: t.call(e, r) }; } catch (t) { return { type: "throw", arg: t }; } } e.wrap = wrap; var h = "suspendedStart", l = "suspendedYield", f = "executing", s = "completed", y = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} var p = {}; define(p, a, function () { return this; }); var d = Object.getPrototypeOf, v = d && d(d(values([]))); v && v !== r && n.call(v, a) && (p = v); var g = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(p); function defineIteratorMethods(t) { ["next", "throw", "return"].forEach(function (e) { define(t, e, function (t) { return this._invoke(e, t); }); }); } function AsyncIterator(t, e) { function invoke(r, o, i, a) { var c = tryCatch(t[r], t, o); if ("throw" !== c.type) { var u = c.arg, h = u.value; return h && "object" == _typeof(h) && n.call(h, "__await") ? e.resolve(h.__await).then(function (t) { invoke("next", t, i, a); }, function (t) { invoke("throw", t, i, a); }) : e.resolve(h).then(function (t) { u.value = t, i(u); }, function (t) { return invoke("throw", t, i, a); }); } a(c.arg); } var r; o(this, "_invoke", { value: function value(t, n) { function callInvokeWithMethodAndArg() { return new e(function (e, r) { invoke(t, n, e, r); }); } return r = r ? r.then(callInvokeWithMethodAndArg, callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg(); } }); } function makeInvokeMethod(e, r, n) { var o = h; return function (i, a) { if (o === f) throw Error("Generator is already running"); if (o === s) { if ("throw" === i) throw a; return { value: t, done: !0 }; } for (n.method = i, n.arg = a;;) { var c = n.delegate; if (c) { var u = maybeInvokeDelegate(c, n); if (u) { if (u === y) continue; return u; } } if ("next" === n.method) n.sent = n._sent = n.arg;else if ("throw" === n.method) { if (o === h) throw o = s, n.arg; n.dispatchException(n.arg); } else "return" === n.method && n.abrupt("return", n.arg); o = f; var p = tryCatch(e, r, n); if ("normal" === p.type) { if (o = n.done ? s : l, p.arg === y) continue; return { value: p.arg, done: n.done }; } "throw" === p.type && (o = s, n.method = "throw", n.arg = p.arg); } }; } function maybeInvokeDelegate(e, r) { var n = r.method, o = e.iterator[n]; if (o === t) return r.delegate = null, "throw" === n && e.iterator["return"] && (r.method = "return", r.arg = t, maybeInvokeDelegate(e, r), "throw" === r.method) || "return" !== n && (r.method = "throw", r.arg = new TypeError("The iterator does not provide a '" + n + "' method")), y; var i = tryCatch(o, e.iterator, r.arg); if ("throw" === i.type) return r.method = "throw", r.arg = i.arg, r.delegate = null, y; var a = i.arg; return a ? a.done ? (r[e.resultName] = a.value, r.next = e.nextLoc, "return" !== r.method && (r.method = "next", r.arg = t), r.delegate = null, y) : a : (r.method = "throw", r.arg = new TypeError("iterator result is not an object"), r.delegate = null, y); } function pushTryEntry(t) { var e = { tryLoc: t[0] }; 1 in t && (e.catchLoc = t[1]), 2 in t && (e.finallyLoc = t[2], e.afterLoc = t[3]), this.tryEntries.push(e); } function resetTryEntry(t) { var e = t.completion || {}; e.type = "normal", delete e.arg, t.completion = e; } function Context(t) { this.tryEntries = [{ tryLoc: "root" }], t.forEach(pushTryEntry, this), this.reset(!0); } function values(e) { if (e || "" === e) { var r = e[a]; if (r) return r.call(e); if ("function" == typeof e.next) return e; if (!isNaN(e.length)) { var o = -1, i = function next() { for (; ++o < e.length;) if (n.call(e, o)) return next.value = e[o], next.done = !1, next; return next.value = t, next.done = !0, next; }; return i.next = i; } } throw new TypeError(_typeof(e) + " is not iterable"); } return GeneratorFunction.prototype = GeneratorFunctionPrototype, o(g, "constructor", { value: GeneratorFunctionPrototype, configurable: !0 }), o(GeneratorFunctionPrototype, "constructor", { value: GeneratorFunction, configurable: !0 }), GeneratorFunction.displayName = define(GeneratorFunctionPrototype, u, "GeneratorFunction"), e.isGeneratorFunction = function (t) { var e = "function" == typeof t && t.constructor; return !!e && (e === GeneratorFunction || "GeneratorFunction" === (e.displayName || e.name)); }, e.mark = function (t) { return Object.setPrototypeOf ? Object.setPrototypeOf(t, GeneratorFunctionPrototype) : (t.__proto__ = GeneratorFunctionPrototype, define(t, u, "GeneratorFunction")), t.prototype = Object.create(g), t; }, e.awrap = function (t) { return { __await: t }; }, defineIteratorMethods(AsyncIterator.prototype), define(AsyncIterator.prototype, c, function () { return this; }), e.AsyncIterator = AsyncIterator, e.async = function (t, r, n, o, i) { void 0 === i && (i = Promise); var a = new AsyncIterator(wrap(t, r, n, o), i); return e.isGeneratorFunction(r) ? a : a.next().then(function (t) { return t.done ? t.value : a.next(); }); }, defineIteratorMethods(g), define(g, u, "Generator"), define(g, a, function () { return this; }), define(g, "toString", function () { return "[object Generator]"; }), e.keys = function (t) { var e = Object(t), r = []; for (var n in e) r.push(n); return r.reverse(), function next() { for (; r.length;) { var t = r.pop(); if (t in e) return next.value = t, next.done = !1, next; } return next.done = !0, next; }; }, e.values = values, Context.prototype = { constructor: Context, reset: function reset(e) { if (this.prev = 0, this.next = 0, this.sent = this._sent = t, this.done = !1, this.delegate = null, this.method = "next", this.arg = t, this.tryEntries.forEach(resetTryEntry), !e) for (var r in this) "t" === r.charAt(0) && n.call(this, r) && !isNaN(+r.slice(1)) && (this[r] = t); }, stop: function stop() { this.done = !0; var t = this.tryEntries[0].completion; if ("throw" === t.type) throw t.arg; return this.rval; }, dispatchException: function dispatchException(e) { if (this.done) throw e; var r = this; function handle(n, o) { return a.type = "throw", a.arg = e, r.next = n, o && (r.method = "next", r.arg = t), !!o; } for (var o = this.tryEntries.length - 1; o >= 0; --o) { var i = this.tryEntries[o], a = i.completion; if ("root" === i.tryLoc) return handle("end"); if (i.tryLoc <= this.prev) { var c = n.call(i, "catchLoc"), u = n.call(i, "finallyLoc"); if (c && u) { if (this.prev < i.catchLoc) return handle(i.catchLoc, !0); if (this.prev < i.finallyLoc) return handle(i.finallyLoc); } else if (c) { if (this.prev < i.catchLoc) return handle(i.catchLoc, !0); } else { if (!u) throw Error("try statement without catch or finally"); if (this.prev < i.finallyLoc) return handle(i.finallyLoc); } } } }, abrupt: function abrupt(t, e) { for (var r = this.tryEntries.length - 1; r >= 0; --r) { var o = this.tryEntries[r]; if (o.tryLoc <= this.prev && n.call(o, "finallyLoc") && this.prev < o.finallyLoc) { var i = o; break; } } i && ("break" === t || "continue" === t) && i.tryLoc <= e && e <= i.finallyLoc && (i = null); var a = i ? i.completion : {}; return a.type = t, a.arg = e, i ? (this.method = "next", this.next = i.finallyLoc, y) : this.complete(a); }, complete: function complete(t, e) { if ("throw" === t.type) throw t.arg; return "break" === t.type || "continue" === t.type ? this.next = t.arg : "return" === t.type ? (this.rval = this.arg = t.arg, this.method = "return", this.next = "end") : "normal" === t.type && e && (this.next = e), y; }, finish: function finish(t) { for (var e = this.tryEntries.length - 1; e >= 0; --e) { var r = this.tryEntries[e]; if (r.finallyLoc === t) return this.complete(r.completion, r.afterLoc), resetTryEntry(r), y; } }, "catch": function _catch(t) { for (var e = this.tryEntries.length - 1; e >= 0; --e) { var r = this.tryEntries[e]; if (r.tryLoc === t) { var n = r.completion; if ("throw" === n.type) { var o = n.arg; resetTryEntry(r); } return o; } } throw Error("illegal catch attempt"); }, delegateYield: function delegateYield(e, r, n) { return this.delegate = { iterator: values(e), resultName: r, nextLoc: n }, "next" === this.method && (this.arg = t), y; } }, e; }
11
+ var _aoconnect = require("@permaweb/aoconnect");
12
+ var _excluded = ["path", "method"],
13
+ _excluded2 = ["body"];
12
14
  function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); }
13
15
  function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
14
16
  function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
15
17
  function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
16
18
  function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t["return"] && (u = t["return"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }
17
19
  function _arrayWithHoles(r) { if (Array.isArray(r)) return r; }
18
- 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; }
19
- 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; }
20
- function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
21
- function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; }
22
- function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
20
+ function _regeneratorRuntime() { "use strict"; /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */ _regeneratorRuntime = function _regeneratorRuntime() { return e; }; var t, e = {}, r = Object.prototype, n = r.hasOwnProperty, o = Object.defineProperty || function (t, e, r) { t[e] = r.value; }, i = "function" == typeof Symbol ? Symbol : {}, a = i.iterator || "@@iterator", c = i.asyncIterator || "@@asyncIterator", u = i.toStringTag || "@@toStringTag"; function define(t, e, r) { return Object.defineProperty(t, e, { value: r, enumerable: !0, configurable: !0, writable: !0 }), t[e]; } try { define({}, ""); } catch (t) { define = function define(t, e, r) { return t[e] = r; }; } function wrap(t, e, r, n) { var i = e && e.prototype instanceof Generator ? e : Generator, a = Object.create(i.prototype), c = new Context(n || []); return o(a, "_invoke", { value: makeInvokeMethod(t, r, c) }), a; } function tryCatch(t, e, r) { try { return { type: "normal", arg: t.call(e, r) }; } catch (t) { return { type: "throw", arg: t }; } } e.wrap = wrap; var h = "suspendedStart", l = "suspendedYield", f = "executing", s = "completed", y = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} var p = {}; define(p, a, function () { return this; }); var d = Object.getPrototypeOf, v = d && d(d(values([]))); v && v !== r && n.call(v, a) && (p = v); var g = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(p); function defineIteratorMethods(t) { ["next", "throw", "return"].forEach(function (e) { define(t, e, function (t) { return this._invoke(e, t); }); }); } function AsyncIterator(t, e) { function invoke(r, o, i, a) { var c = tryCatch(t[r], t, o); if ("throw" !== c.type) { var u = c.arg, h = u.value; return h && "object" == _typeof(h) && n.call(h, "__await") ? e.resolve(h.__await).then(function (t) { invoke("next", t, i, a); }, function (t) { invoke("throw", t, i, a); }) : e.resolve(h).then(function (t) { u.value = t, i(u); }, function (t) { return invoke("throw", t, i, a); }); } a(c.arg); } var r; o(this, "_invoke", { value: function value(t, n) { function callInvokeWithMethodAndArg() { return new e(function (e, r) { invoke(t, n, e, r); }); } return r = r ? r.then(callInvokeWithMethodAndArg, callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg(); } }); } function makeInvokeMethod(e, r, n) { var o = h; return function (i, a) { if (o === f) throw Error("Generator is already running"); if (o === s) { if ("throw" === i) throw a; return { value: t, done: !0 }; } for (n.method = i, n.arg = a;;) { var c = n.delegate; if (c) { var u = maybeInvokeDelegate(c, n); if (u) { if (u === y) continue; return u; } } if ("next" === n.method) n.sent = n._sent = n.arg;else if ("throw" === n.method) { if (o === h) throw o = s, n.arg; n.dispatchException(n.arg); } else "return" === n.method && n.abrupt("return", n.arg); o = f; var p = tryCatch(e, r, n); if ("normal" === p.type) { if (o = n.done ? s : l, p.arg === y) continue; return { value: p.arg, done: n.done }; } "throw" === p.type && (o = s, n.method = "throw", n.arg = p.arg); } }; } function maybeInvokeDelegate(e, r) { var n = r.method, o = e.iterator[n]; if (o === t) return r.delegate = null, "throw" === n && e.iterator["return"] && (r.method = "return", r.arg = t, maybeInvokeDelegate(e, r), "throw" === r.method) || "return" !== n && (r.method = "throw", r.arg = new TypeError("The iterator does not provide a '" + n + "' method")), y; var i = tryCatch(o, e.iterator, r.arg); if ("throw" === i.type) return r.method = "throw", r.arg = i.arg, r.delegate = null, y; var a = i.arg; return a ? a.done ? (r[e.resultName] = a.value, r.next = e.nextLoc, "return" !== r.method && (r.method = "next", r.arg = t), r.delegate = null, y) : a : (r.method = "throw", r.arg = new TypeError("iterator result is not an object"), r.delegate = null, y); } function pushTryEntry(t) { var e = { tryLoc: t[0] }; 1 in t && (e.catchLoc = t[1]), 2 in t && (e.finallyLoc = t[2], e.afterLoc = t[3]), this.tryEntries.push(e); } function resetTryEntry(t) { var e = t.completion || {}; e.type = "normal", delete e.arg, t.completion = e; } function Context(t) { this.tryEntries = [{ tryLoc: "root" }], t.forEach(pushTryEntry, this), this.reset(!0); } function values(e) { if (e || "" === e) { var r = e[a]; if (r) return r.call(e); if ("function" == typeof e.next) return e; if (!isNaN(e.length)) { var o = -1, i = function next() { for (; ++o < e.length;) if (n.call(e, o)) return next.value = e[o], next.done = !1, next; return next.value = t, next.done = !0, next; }; return i.next = i; } } throw new TypeError(_typeof(e) + " is not iterable"); } return GeneratorFunction.prototype = GeneratorFunctionPrototype, o(g, "constructor", { value: GeneratorFunctionPrototype, configurable: !0 }), o(GeneratorFunctionPrototype, "constructor", { value: GeneratorFunction, configurable: !0 }), GeneratorFunction.displayName = define(GeneratorFunctionPrototype, u, "GeneratorFunction"), e.isGeneratorFunction = function (t) { var e = "function" == typeof t && t.constructor; return !!e && (e === GeneratorFunction || "GeneratorFunction" === (e.displayName || e.name)); }, e.mark = function (t) { return Object.setPrototypeOf ? Object.setPrototypeOf(t, GeneratorFunctionPrototype) : (t.__proto__ = GeneratorFunctionPrototype, define(t, u, "GeneratorFunction")), t.prototype = Object.create(g), t; }, e.awrap = function (t) { return { __await: t }; }, defineIteratorMethods(AsyncIterator.prototype), define(AsyncIterator.prototype, c, function () { return this; }), e.AsyncIterator = AsyncIterator, e.async = function (t, r, n, o, i) { void 0 === i && (i = Promise); var a = new AsyncIterator(wrap(t, r, n, o), i); return e.isGeneratorFunction(r) ? a : a.next().then(function (t) { return t.done ? t.value : a.next(); }); }, defineIteratorMethods(g), define(g, u, "Generator"), define(g, a, function () { return this; }), define(g, "toString", function () { return "[object Generator]"; }), e.keys = function (t) { var e = Object(t), r = []; for (var n in e) r.push(n); return r.reverse(), function next() { for (; r.length;) { var t = r.pop(); if (t in e) return next.value = t, next.done = !1, next; } return next.done = !0, next; }; }, e.values = values, Context.prototype = { constructor: Context, reset: function reset(e) { if (this.prev = 0, this.next = 0, this.sent = this._sent = t, this.done = !1, this.delegate = null, this.method = "next", this.arg = t, this.tryEntries.forEach(resetTryEntry), !e) for (var r in this) "t" === r.charAt(0) && n.call(this, r) && !isNaN(+r.slice(1)) && (this[r] = t); }, stop: function stop() { this.done = !0; var t = this.tryEntries[0].completion; if ("throw" === t.type) throw t.arg; return this.rval; }, dispatchException: function dispatchException(e) { if (this.done) throw e; var r = this; function handle(n, o) { return a.type = "throw", a.arg = e, r.next = n, o && (r.method = "next", r.arg = t), !!o; } for (var o = this.tryEntries.length - 1; o >= 0; --o) { var i = this.tryEntries[o], a = i.completion; if ("root" === i.tryLoc) return handle("end"); if (i.tryLoc <= this.prev) { var c = n.call(i, "catchLoc"), u = n.call(i, "finallyLoc"); if (c && u) { if (this.prev < i.catchLoc) return handle(i.catchLoc, !0); if (this.prev < i.finallyLoc) return handle(i.finallyLoc); } else if (c) { if (this.prev < i.catchLoc) return handle(i.catchLoc, !0); } else { if (!u) throw Error("try statement without catch or finally"); if (this.prev < i.finallyLoc) return handle(i.finallyLoc); } } } }, abrupt: function abrupt(t, e) { for (var r = this.tryEntries.length - 1; r >= 0; --r) { var o = this.tryEntries[r]; if (o.tryLoc <= this.prev && n.call(o, "finallyLoc") && this.prev < o.finallyLoc) { var i = o; break; } } i && ("break" === t || "continue" === t) && i.tryLoc <= e && e <= i.finallyLoc && (i = null); var a = i ? i.completion : {}; return a.type = t, a.arg = e, i ? (this.method = "next", this.next = i.finallyLoc, y) : this.complete(a); }, complete: function complete(t, e) { if ("throw" === t.type) throw t.arg; return "break" === t.type || "continue" === t.type ? this.next = t.arg : "return" === t.type ? (this.rval = this.arg = t.arg, this.method = "return", this.next = "end") : "normal" === t.type && e && (this.next = e), y; }, finish: function finish(t) { for (var e = this.tryEntries.length - 1; e >= 0; --e) { var r = this.tryEntries[e]; if (r.finallyLoc === t) return this.complete(r.completion, r.afterLoc), resetTryEntry(r), y; } }, "catch": function _catch(t) { for (var e = this.tryEntries.length - 1; e >= 0; --e) { var r = this.tryEntries[e]; if (r.tryLoc === t) { var n = r.completion; if ("throw" === n.type) { var o = n.arg; resetTryEntry(r); } return o; } } throw Error("illegal catch attempt"); }, delegateYield: function delegateYield(e, r, n) { return this.delegate = { iterator: values(e), resultName: r, nextLoc: n }, "next" === this.method && (this.arg = t), y; } }, e; }
23
21
  function _objectWithoutProperties(e, t) { if (null == e) return {}; var o, r, i = _objectWithoutPropertiesLoose(e, t); if (Object.getOwnPropertySymbols) { var s = Object.getOwnPropertySymbols(e); for (r = 0; r < s.length; r++) o = s[r], t.includes(o) || {}.propertyIsEnumerable.call(e, o) && (i[o] = e[o]); } return i; }
24
22
  function _objectWithoutPropertiesLoose(r, e) { if (null == r) return {}; var t = {}; for (var n in r) if ({}.hasOwnProperty.call(r, n)) { if (e.includes(n)) continue; t[n] = r[n]; } return t; }
25
23
  function asyncGeneratorStep(n, t, e, r, o, a, c) { try { var i = n[a](c), u = i.value; } catch (n) { return void e(n); } i.done ? t(u) : Promise.resolve(u).then(r, o); }
@@ -27,140 +25,174 @@ function _asyncToGenerator(n) { return function () { var t = this, e = arguments
27
25
  var joinUrl = function joinUrl(_ref) {
28
26
  var url = _ref.url,
29
27
  path = _ref.path;
30
- if (path.startsWith("http://") || path.startsWith("https://")) {
31
- return path;
32
- }
33
- // Ensure path starts with /
28
+ if (path.startsWith("http://") || path.startsWith("https://")) return path;
34
29
  var normalizedPath = path.startsWith("/") ? path : "/" + path;
35
30
  return url.endsWith("/") ? url.slice(0, -1) + normalizedPath : url + normalizedPath;
36
31
  };
32
+ function sign(_x) {
33
+ return _sign2.apply(this, arguments);
34
+ }
35
+ function _sign2() {
36
+ _sign2 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee2(_ref2) {
37
+ var url, path, encoded, jwk, _ref2$signPath, signPath, signer, _encoded$body, body, headers, _enc;
38
+ return _regeneratorRuntime().wrap(function _callee2$(_context2) {
39
+ while (1) switch (_context2.prev = _context2.next) {
40
+ case 0:
41
+ url = _ref2.url, path = _ref2.path, encoded = _ref2.msg, jwk = _ref2.jwk, _ref2$signPath = _ref2.signPath, signPath = _ref2$signPath === void 0 ? false : _ref2$signPath;
42
+ signer = (0, _aoconnect.createSigner)(jwk, url);
43
+ _encoded$body = encoded.body, body = _encoded$body === void 0 ? null : _encoded$body, headers = _objectWithoutProperties(encoded, _excluded2);
44
+ _enc = {
45
+ headers: headers
46
+ };
47
+ if (body) _enc.body = new Blob([body]);
48
+ _context2.next = 7;
49
+ return _sign({
50
+ signer: signer,
51
+ encoded: _enc,
52
+ url: url,
53
+ path: path,
54
+ _path: signPath
55
+ });
56
+ case 7:
57
+ return _context2.abrupt("return", _context2.sent);
58
+ case 8:
59
+ case "end":
60
+ return _context2.stop();
61
+ }
62
+ }, _callee2);
63
+ }));
64
+ return _sign2.apply(this, arguments);
65
+ }
66
+ function _sign(_x2) {
67
+ return _sign3.apply(this, arguments);
68
+ }
69
+ function _sign3() {
70
+ _sign3 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee3(_ref3) {
71
+ var encoded, signer, path, url, _ref3$method, method, _ref3$_path, _path, headersObj, body, _url, bodySize, lowercaseHeaders, _i, _Object$entries, _Object$entries$_i, key, value, bodyKeys, signingFields, signedRequest, finalHeaders, _i2, _Object$entries2, _Object$entries2$_i, _key, _value, result;
72
+ return _regeneratorRuntime().wrap(function _callee3$(_context3) {
73
+ while (1) switch (_context3.prev = _context3.next) {
74
+ case 0:
75
+ encoded = _ref3.encoded, signer = _ref3.signer, path = _ref3.path, url = _ref3.url, _ref3$method = _ref3.method, method = _ref3$method === void 0 ? "POST" : _ref3$method, _ref3$_path = _ref3._path, _path = _ref3$_path === void 0 ? false : _ref3$_path;
76
+ headersObj = encoded ? encoded.headers : {};
77
+ body = encoded ? encoded.body : undefined;
78
+ _url = joinUrl({
79
+ url: url,
80
+ path: path
81
+ });
82
+ headersObj["path"] = path;
83
+ if (body && !headersObj["content-length"]) {
84
+ bodySize = body.size || body.byteLength || 0;
85
+ if (bodySize > 0) headersObj["content-length"] = String(bodySize);
86
+ }
87
+ lowercaseHeaders = {};
88
+ for (_i = 0, _Object$entries = Object.entries(headersObj); _i < _Object$entries.length; _i++) {
89
+ _Object$entries$_i = _slicedToArray(_Object$entries[_i], 2), key = _Object$entries$_i[0], value = _Object$entries$_i[1];
90
+ lowercaseHeaders[key.toLowerCase()] = value;
91
+ }
92
+ bodyKeys = headersObj["body-keys"] ? headersObj["body-keys"].replace(/"/g, "").split(",").map(function (k) {
93
+ return k.trim();
94
+ }) : [];
95
+ signingFields = Object.keys(lowercaseHeaders).filter(function (key) {
96
+ return key !== "body-keys" && key !== "path" && !bodyKeys.includes(key);
97
+ });
98
+ if (_path) signingFields.push("path");
99
+ if (signingFields.length === 0 && !body) {
100
+ lowercaseHeaders["content-length"] = "0";
101
+ signingFields.push("content-length");
102
+ }
103
+ _context3.next = 14;
104
+ return (0, _send.toHttpSigner)(signer)({
105
+ request: {
106
+ url: _url,
107
+ method: method,
108
+ headers: lowercaseHeaders
109
+ },
110
+ fields: signingFields
111
+ });
112
+ case 14:
113
+ signedRequest = _context3.sent;
114
+ finalHeaders = {};
115
+ for (_i2 = 0, _Object$entries2 = Object.entries(headersObj); _i2 < _Object$entries2.length; _i2++) {
116
+ _Object$entries2$_i = _slicedToArray(_Object$entries2[_i2], 2), _key = _Object$entries2$_i[0], _value = _Object$entries2$_i[1];
117
+ finalHeaders[_key] = _value;
118
+ }
119
+ finalHeaders["signature"] = signedRequest.headers["signature"];
120
+ finalHeaders["signature-input"] = signedRequest.headers["signature-input"];
121
+ if (headersObj["body-keys"]) {
122
+ finalHeaders["body-keys"] = headersObj["body-keys"];
123
+ }
124
+ result = {
125
+ url: _url,
126
+ method: method,
127
+ headers: finalHeaders
128
+ };
129
+ if (body) result.body = body;
130
+ return _context3.abrupt("return", result);
131
+ case 23:
132
+ case "end":
133
+ return _context3.stop();
134
+ }
135
+ }, _callee3);
136
+ }));
137
+ return _sign3.apply(this, arguments);
138
+ }
37
139
  function signer(config) {
38
140
  var signer = config.signer,
39
141
  _config$url = config.url,
40
142
  url = _config$url === void 0 ? "http://localhost:10001" : _config$url;
41
- if (!signer) {
42
- throw new Error("Signer is required for mainnet mode");
43
- }
143
+ if (!signer) throw new Error("Signer is required for mainnet mode");
44
144
  return /*#__PURE__*/function () {
45
- var _sign = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee(fields) {
46
- var _ref2,
47
- _ref2$path,
145
+ var _ref4 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee(fields) {
146
+ var _ref5,
147
+ _ref5$encoded,
148
+ _encoded,
149
+ _ref5$path,
48
150
  _path,
49
151
  _fields$path,
50
152
  path,
51
153
  _fields$method,
52
154
  method,
53
- restFields,
54
155
  aoFields,
55
156
  encoded,
56
- headersObj,
57
- body,
58
- _url,
59
- bodySize,
60
- lowercaseHeaders,
61
- _i,
62
- _Object$entries,
63
- _Object$entries$_i,
64
- key,
65
- value,
66
- bodyKeys,
67
- signingFields,
68
- signedRequest,
69
- finalHeaders,
70
- _i2,
71
- _Object$entries2,
72
- _Object$entries2$_i,
73
- _key,
74
- _value,
75
- result,
76
157
  _args = arguments;
77
158
  return _regeneratorRuntime().wrap(function _callee$(_context) {
78
159
  while (1) switch (_context.prev = _context.next) {
79
160
  case 0:
80
- _ref2 = _args.length > 1 && _args[1] !== undefined ? _args[1] : {}, _ref2$path = _ref2.path, _path = _ref2$path === void 0 ? false : _ref2$path;
81
- _fields$path = fields.path, path = _fields$path === void 0 ? "/relay/process" : _fields$path, _fields$method = fields.method, method = _fields$method === void 0 ? "POST" : _fields$method, restFields = _objectWithoutProperties(fields, _excluded);
82
- aoFields = _objectSpread({}, restFields);
83
- _context.next = 5;
161
+ _ref5 = _args.length > 1 && _args[1] !== undefined ? _args[1] : {}, _ref5$encoded = _ref5.encoded, _encoded = _ref5$encoded === void 0 ? false : _ref5$encoded, _ref5$path = _ref5.path, _path = _ref5$path === void 0 ? false : _ref5$path;
162
+ _fields$path = fields.path, path = _fields$path === void 0 ? "/relay/process" : _fields$path, _fields$method = fields.method, method = _fields$method === void 0 ? "POST" : _fields$method, aoFields = _objectWithoutProperties(fields, _excluded);
163
+ if (!_encoded) {
164
+ _context.next = 6;
165
+ break;
166
+ }
167
+ _context.t0 = aoFields;
168
+ _context.next = 9;
169
+ break;
170
+ case 6:
171
+ _context.next = 8;
84
172
  return (0, _encode.enc)(aoFields);
85
- case 5:
86
- encoded = _context.sent;
87
- headersObj = encoded ? encoded.headers : {};
88
- body = encoded ? encoded.body : undefined;
89
- _url = joinUrl({
173
+ case 8:
174
+ _context.t0 = _context.sent;
175
+ case 9:
176
+ encoded = _context.t0;
177
+ _context.next = 12;
178
+ return _sign({
90
179
  url: url,
91
- path: path
92
- });
93
- headersObj["path"] = path;
94
- if (body && !headersObj["content-length"]) {
95
- bodySize = body.size || body.byteLength || 0;
96
- if (bodySize > 0) {
97
- headersObj["content-length"] = String(bodySize);
98
- }
99
- }
100
- lowercaseHeaders = {};
101
- for (_i = 0, _Object$entries = Object.entries(headersObj); _i < _Object$entries.length; _i++) {
102
- _Object$entries$_i = _slicedToArray(_Object$entries[_i], 2), key = _Object$entries$_i[0], value = _Object$entries$_i[1];
103
- lowercaseHeaders[key.toLowerCase()] = value;
104
- }
105
- if (lowercaseHeaders.path && /^\//.test(lowercaseHeaders.path)) {
106
- //const sp = lowercaseHeaders.path.split("/")
107
- //lowercaseHeaders.path = sp.slice(sp.length - 1).join("/")
108
- }
109
- // Parse body-keys if present
110
- bodyKeys = headersObj["body-keys"] ? headersObj["body-keys"].replace(/"/g, "").split(",").map(function (k) {
111
- return k.trim();
112
- }) : []; // Collect fields to sign from headers
113
- signingFields = Object.keys(lowercaseHeaders).filter(function (key) {
114
- return key !== "body-keys" && key !== "path" && !bodyKeys.includes(key);
115
- } // Also exclude fields that are in body-keys
116
- ); // Always include @path in the signature
117
- //if (!signingFields.includes("path")) signingFields.push("path")
118
-
119
- if (_path) signingFields.push("path");
120
- // Ensure we have at least one field to sign
121
- if (signingFields.length === 0 && !body) {
122
- lowercaseHeaders["content-length"] = "0";
123
- signingFields.push("content-length");
124
- }
125
- _context.next = 20;
126
- return (0, _send.toHttpSigner)(signer)({
127
- request: {
128
- url: _url,
129
- method: method,
130
- headers: lowercaseHeaders
131
- },
132
- fields: signingFields
133
- });
134
- case 20:
135
- signedRequest = _context.sent;
136
- finalHeaders = {};
137
- for (_i2 = 0, _Object$entries2 = Object.entries(headersObj); _i2 < _Object$entries2.length; _i2++) {
138
- _Object$entries2$_i = _slicedToArray(_Object$entries2[_i2], 2), _key = _Object$entries2$_i[0], _value = _Object$entries2$_i[1];
139
- finalHeaders[_key] = _value;
140
- }
141
- finalHeaders["signature"] = signedRequest.headers["signature"];
142
- finalHeaders["signature-input"] = signedRequest.headers["signature-input"];
143
- if (headersObj["body-keys"]) {
144
- finalHeaders["body-keys"] = headersObj["body-keys"];
145
- }
146
- result = {
147
- url: _url,
148
180
  method: method,
149
- headers: finalHeaders
150
- };
151
- if (body) result.body = body;
152
- return _context.abrupt("return", result);
153
- case 29:
181
+ path: path,
182
+ _path: _path,
183
+ encoded: encoded,
184
+ signer: signer
185
+ });
186
+ case 12:
187
+ return _context.abrupt("return", _context.sent);
188
+ case 13:
154
189
  case "end":
155
190
  return _context.stop();
156
191
  }
157
192
  }, _callee);
158
193
  }));
159
- function sign(_x) {
160
- return _sign.apply(this, arguments);
161
- }
162
- return sign;
194
+ return function (_x3) {
195
+ return _ref4.apply(this, arguments);
196
+ };
163
197
  }();
164
- }
165
-
166
- // stack / simple-pay / patch / hyperbeam / hyperbeam-aos / scheduler / cron
198
+ }
package/esm/encode.js CHANGED
@@ -14,6 +14,7 @@ import {
14
14
  isBytes,
15
15
  isPojo,
16
16
  } from "./encode-utils.js"
17
+
17
18
  import encodeArrayItem from "./encode-array-item.js"
18
19
  import collectBodyKeys from "./collect-body-keys.js"
19
20
  const MAX_HEADER_LENGTH = 4096
@@ -1100,7 +1101,7 @@ function setFinalHeaders(headers, boundary, contentDigest, byteLength) {
1100
1101
  headers["content-length"] = String(byteLength)
1101
1102
  }
1102
1103
 
1103
- async function encode(obj = {}) {
1104
+ export async function enc(obj = {}) {
1104
1105
  // Step 1: Process and normalize input values
1105
1106
  const processedObj = processInputValues(obj)
1106
1107
 
@@ -1213,7 +1214,3 @@ async function encode(obj = {}) {
1213
1214
  // Step 18: Return result
1214
1215
  return { headers, body }
1215
1216
  }
1216
-
1217
- export async function enc(fields) {
1218
- return await encode(fields)
1219
- }
package/esm/hb.js CHANGED
@@ -460,7 +460,7 @@ class HB {
460
460
  status: response.status,
461
461
  }
462
462
  return {
463
- out: from(http),
463
+ ...from(http),
464
464
  ...http,
465
465
  }
466
466
  }
package/esm/httpsig.js CHANGED
@@ -1,7 +1,7 @@
1
1
  import { trim } from "ramda"
2
2
  import { decodeSigInput } from "./signer-utils.js"
3
3
  import base64url from "base64url"
4
-
4
+ import { toAddr } from "./utils.js"
5
5
  /**
6
6
  * Get multipart boundary from content-type header
7
7
  */
@@ -39,6 +39,17 @@ const extract = (http, components) => {
39
39
  }
40
40
  }
41
41
 
42
+ // Extract ao-ids if it's signed
43
+ const hasAoIds = components.some(
44
+ c => c.replace(/"/g, "").toLowerCase() === "ao-ids"
45
+ )
46
+ if (hasAoIds) {
47
+ const aoIds = http.headers["ao-ids"] || http.headers["Ao-Ids"]
48
+ if (aoIds) {
49
+ extracted["ao-ids"] = aoIds
50
+ }
51
+ }
52
+
42
53
  for (const component of components) {
43
54
  const cleanComponent = component.replace(/"/g, "")
44
55
 
@@ -139,6 +150,26 @@ export const toBuffer = body => {
139
150
  throw new Error("Unsupported body type")
140
151
  }
141
152
 
153
+ /**
154
+ * Parse ao-ids dictionary
155
+ * @param {string} aoIds - The ao-ids header value
156
+ * @returns {Object} Parsed ID mappings
157
+ */
158
+ const parseAoIds = aoIds => {
159
+ const result = {}
160
+
161
+ // Match pattern: ID="value"
162
+ const regex = /([A-Za-z0-9_-]{43})="([^"]*)"/g
163
+ let match
164
+
165
+ while ((match = regex.exec(aoIds)) !== null) {
166
+ const [, id, value] = match
167
+ result[id] = value
168
+ }
169
+
170
+ return result
171
+ }
172
+
142
173
  /**
143
174
  * Convert message to JSON with proper type conversions
144
175
  * Following the logic from dev_codec_structured, dev_codec_httpsig_conv, and dev_codec_flat
@@ -152,6 +183,14 @@ const toJSON = msg => {
152
183
 
153
184
  let result = { ...msg }
154
185
 
186
+ // Handle ao-ids parsing
187
+ if (result["ao-ids"]) {
188
+ const parsedIds = parseAoIds(result["ao-ids"])
189
+ // Remove the ao-ids header and merge the parsed IDs
190
+ delete result["ao-ids"]
191
+ result = { ...result, ...parsedIds }
192
+ }
193
+
155
194
  // First, handle the multipart body if present
156
195
  const contentType = result["content-type"]
157
196
  const body = result.body
@@ -280,7 +319,10 @@ const toJSON = msg => {
280
319
  for (const [key, value] of Object.entries(result)) {
281
320
  // Skip internal keys and headers we don't want in the final result
282
321
  if (key.startsWith("__")) continue
283
- if (key.startsWith("@")) continue // Skip all @ fields
322
+
323
+ // Skip @ fields EXCEPT @path which we want to include
324
+ if (key.startsWith("@") && key !== "@path") continue
325
+
284
326
  if (key === "ao-types") continue
285
327
  if (key === "content-type") continue
286
328
  if (key === "content-digest") continue
@@ -814,11 +856,6 @@ const stringToBuffer = str => {
814
856
  return buffer
815
857
  }
816
858
 
817
- /**
818
- * Original from function - extracts and converts only signed components
819
- * @param {Object} http - HTTP message object with headers, body, and status
820
- * @returns {Object|null} Converted signed components or null if not signed
821
- */
822
859
  export const from = http => {
823
860
  const input =
824
861
  http.headers["signature-input"] || http.headers["Signature-Input"]
@@ -828,36 +865,60 @@ export const from = http => {
828
865
 
829
866
  // Decode signature inputs
830
867
  const inputs = decodeSigInput(input)
831
-
832
868
  // Process the first signature (following the original logic)
833
869
  for (const k in inputs) {
834
870
  const sigData = inputs[k]
835
-
836
871
  // Extract only the signed components
837
872
  const extractedComponents = extract(http, sigData.components)
873
+ let ret = { hashpath: sigData?.params?.tag ?? null }
874
+ try {
875
+ ret.signer = toAddr(sigData.params.keyid)
876
+ } catch (e) {}
877
+
878
+ // Check if @path was in the signed components
879
+ const hasPathComponent = sigData.components.some(
880
+ c => c.replace(/"/g, "") === "@path"
881
+ )
882
+
883
+ // If @path is signed, add the path header to extracted components
884
+ if (hasPathComponent) {
885
+ extractedComponents["path"] = http.headers.path
886
+ }
838
887
 
839
- // Check if ao-result header is present and points to body
888
+ // Check if ao-result header is present
840
889
  const aoResult = http.headers["ao-result"] || http.headers["Ao-Result"]
841
- if (aoResult === "body" && extractedComponents.body) {
890
+
891
+ // Handle ao-result pointing to body
892
+ if (aoResult === "body") {
893
+ // Handle empty body case
894
+ if (!extractedComponents.body) {
895
+ return { out: "", ...ret } // Return empty string for empty body
896
+ }
842
897
  // Check if body is binary data
843
898
  if (isBinaryString(extractedComponents.body)) {
844
- return stringToBuffer(extractedComponents.body)
899
+ return { out: stringToBuffer(extractedComponents.body), ...ret }
845
900
  }
901
+ // Return body as-is if it's not binary
902
+ return { out: extractedComponents.body, ...ret }
846
903
  }
847
904
 
848
905
  // Convert the extracted components to JSON format
849
906
  const result = toJSON(extractedComponents)
850
907
 
851
- // Handle ao-result if present
852
- if (aoResult && result[aoResult] !== undefined) {
908
+ // Handle ao-result if present and pointing to other fields
909
+ if (aoResult && aoResult !== "body") {
853
910
  // Return the value of the key specified by ao-result
854
- return result[aoResult]
911
+ // If the key doesn't exist, return undefined (or could return null/empty string)
912
+ return {
913
+ out: result[aoResult] !== undefined ? result[aoResult] : "",
914
+ ...ret,
915
+ }
855
916
  }
856
917
 
857
- return result
918
+ return { out: result, ...ret }
858
919
  }
859
920
 
860
- return null
921
+ return { out: null, hashpath: null }
861
922
  }
862
923
 
863
924
  /**
package/esm/send.js CHANGED
@@ -10,8 +10,6 @@ const {
10
10
  import { from } from "./httpsig.js"
11
11
 
12
12
  export async function send(signedMsg, fetchImpl = fetch) {
13
- // IMPORTANT: Use the URL from signedMsg.url, NOT from any path header
14
- // This ensures we send to the correct URL even if path header is different
15
13
  const fetchOptions = {
16
14
  method: signedMsg.method,
17
15
  headers: signedMsg.headers,
@@ -25,7 +23,6 @@ export async function send(signedMsg, fetchImpl = fetch) {
25
23
  fetchOptions.body = signedMsg.body
26
24
  }
27
25
 
28
- // Use the URL as provided, ignoring any path header
29
26
  const response = await fetchImpl(signedMsg.url, fetchOptions)
30
27
  if (response.status >= 400) {
31
28
  throw new Error(`${response.status}: ${await response.text()}`)
@@ -36,10 +33,7 @@ export async function send(signedMsg, fetchImpl = fetch) {
36
33
  response.headers.forEach((v, k) => (headers[k] = v))
37
34
  } else headers = response.headers
38
35
  const http = { headers, body: await response.text(), status: response.status }
39
- return {
40
- out: from(http),
41
- ...http,
42
- }
36
+ return { ...from(http), ...http }
43
37
  }
44
38
 
45
39
  const httpSigName = address => {
package/esm/signer.js CHANGED
@@ -1,97 +1,93 @@
1
1
  import { toHttpSigner } from "./send.js"
2
2
  import { enc } from "./encode.js"
3
+ import { createSigner } from "@permaweb/aoconnect"
3
4
 
4
5
  const joinUrl = ({ url, path }) => {
5
- if (path.startsWith("http://") || path.startsWith("https://")) {
6
- return path
7
- }
8
- // Ensure path starts with /
6
+ if (path.startsWith("http://") || path.startsWith("https://")) return path
9
7
  const normalizedPath = path.startsWith("/") ? path : "/" + path
10
8
  return url.endsWith("/")
11
9
  ? url.slice(0, -1) + normalizedPath
12
10
  : url + normalizedPath
13
11
  }
14
12
 
15
- export function signer(config) {
16
- const { signer, url = "http://localhost:10001" } = config
13
+ export async function sign({ url, path, msg: encoded, jwk, signPath = false }) {
14
+ const signer = createSigner(jwk, url)
15
+ const { body = null, ...headers } = encoded
16
+ let _enc = { headers }
17
+ if (body) _enc.body = new Blob([body])
18
+ return await _sign({ signer, encoded: _enc, url, path, _path: signPath })
19
+ }
17
20
 
18
- if (!signer) {
19
- throw new Error("Signer is required for mainnet mode")
21
+ async function _sign({
22
+ encoded,
23
+ signer,
24
+ path,
25
+ url,
26
+ method = "POST",
27
+ _path = false,
28
+ }) {
29
+ const headersObj = encoded ? encoded.headers : {}
30
+ const body = encoded ? encoded.body : undefined
31
+ const _url = joinUrl({ url, path })
32
+ headersObj["path"] = path
33
+ if (body && !headersObj["content-length"]) {
34
+ const bodySize = body.size || body.byteLength || 0
35
+ if (bodySize > 0) headersObj["content-length"] = String(bodySize)
36
+ }
37
+ const lowercaseHeaders = {}
38
+ for (const [key, value] of Object.entries(headersObj)) {
39
+ lowercaseHeaders[key.toLowerCase()] = value
40
+ }
41
+ const bodyKeys = headersObj["body-keys"]
42
+ ? headersObj["body-keys"]
43
+ .replace(/"/g, "")
44
+ .split(",")
45
+ .map(k => k.trim())
46
+ : []
47
+
48
+ const signingFields = Object.keys(lowercaseHeaders).filter(
49
+ key => key !== "body-keys" && key !== "path" && !bodyKeys.includes(key)
50
+ )
51
+
52
+ if (_path) signingFields.push("path")
53
+
54
+ if (signingFields.length === 0 && !body) {
55
+ lowercaseHeaders["content-length"] = "0"
56
+ signingFields.push("content-length")
20
57
  }
21
58
 
22
- return async function sign(fields, { path: _path = false } = {}) {
23
- const { path = "/relay/process", method = "POST", ...restFields } = fields
24
- const aoFields = { ...restFields }
25
- const encoded = await enc(aoFields)
26
- const headersObj = encoded ? encoded.headers : {}
27
- const body = encoded ? encoded.body : undefined
28
-
29
- const _url = joinUrl({ url, path })
30
-
31
- headersObj["path"] = path
32
-
33
- if (body && !headersObj["content-length"]) {
34
- const bodySize = body.size || body.byteLength || 0
35
- if (bodySize > 0) {
36
- headersObj["content-length"] = String(bodySize)
37
- }
38
- }
39
-
40
- const lowercaseHeaders = {}
41
- for (const [key, value] of Object.entries(headersObj)) {
42
- lowercaseHeaders[key.toLowerCase()] = value
43
- }
44
- if (lowercaseHeaders.path && /^\//.test(lowercaseHeaders.path)) {
45
- //const sp = lowercaseHeaders.path.split("/")
46
- //lowercaseHeaders.path = sp.slice(sp.length - 1).join("/")
47
- }
48
- // Parse body-keys if present
49
- const bodyKeys = headersObj["body-keys"]
50
- ? headersObj["body-keys"]
51
- .replace(/"/g, "")
52
- .split(",")
53
- .map(k => k.trim())
54
- : []
55
-
56
- // Collect fields to sign from headers
57
- const signingFields = Object.keys(lowercaseHeaders).filter(
58
- key => key !== "body-keys" && key !== "path" && !bodyKeys.includes(key) // Also exclude fields that are in body-keys
59
- )
60
- // Always include @path in the signature
61
- //if (!signingFields.includes("path")) signingFields.push("path")
62
- if (_path) signingFields.push("path")
63
- // Ensure we have at least one field to sign
64
- if (signingFields.length === 0 && !body) {
65
- lowercaseHeaders["content-length"] = "0"
66
- signingFields.push("content-length")
67
- }
59
+ const signedRequest = await toHttpSigner(signer)({
60
+ request: { url: _url, method, headers: lowercaseHeaders },
61
+ fields: signingFields,
62
+ })
68
63
 
69
- const signedRequest = await toHttpSigner(signer)({
70
- request: {
71
- url: _url,
72
- method,
73
- headers: lowercaseHeaders,
74
- },
75
- fields: signingFields,
76
- })
77
- const finalHeaders = {}
64
+ const finalHeaders = {}
78
65
 
79
- for (const [key, value] of Object.entries(headersObj)) {
80
- finalHeaders[key] = value
81
- }
66
+ for (const [key, value] of Object.entries(headersObj)) {
67
+ finalHeaders[key] = value
68
+ }
82
69
 
83
- finalHeaders["signature"] = signedRequest.headers["signature"]
84
- finalHeaders["signature-input"] = signedRequest.headers["signature-input"]
70
+ finalHeaders["signature"] = signedRequest.headers["signature"]
71
+ finalHeaders["signature-input"] = signedRequest.headers["signature-input"]
85
72
 
86
- if (headersObj["body-keys"]) {
87
- finalHeaders["body-keys"] = headersObj["body-keys"]
88
- }
89
- const result = { url: _url, method, headers: finalHeaders }
73
+ if (headersObj["body-keys"]) {
74
+ finalHeaders["body-keys"] = headersObj["body-keys"]
75
+ }
76
+ const result = { url: _url, method, headers: finalHeaders }
90
77
 
91
- if (body) result.body = body
78
+ if (body) result.body = body
92
79
 
93
- return result
80
+ return result
81
+ }
82
+ export function signer(config) {
83
+ const { signer, url = "http://localhost:10001" } = config
84
+ if (!signer) throw new Error("Signer is required for mainnet mode")
85
+ return async (
86
+ fields,
87
+ { encoded: _encoded = false, path: _path = false } = {}
88
+ ) => {
89
+ const { path = "/relay/process", method = "POST", ...aoFields } = fields
90
+ const encoded = _encoded ? aoFields : await enc(aoFields)
91
+ return await _sign({ url, method, path, _path, encoded, signer })
94
92
  }
95
93
  }
96
-
97
- // stack / simple-pay / patch / hyperbeam / hyperbeam-aos / scheduler / cron
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "wao",
3
- "version": "0.29.0",
3
+ "version": "0.29.2",
4
4
  "bin": {
5
5
  "wao": "./cjs/cli.js",
6
6
  "wao-esm": "./esm/cli.js"