wao 0.32.2 → 0.33.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/cjs/erl_json.js +317 -0
- package/cjs/erl_str.js +1037 -0
- package/cjs/hb.js +8 -22
- package/cjs/http.js +674 -0
- package/cjs/{httpsig.js → httpsig2.js} +5 -5
- package/cjs/hyperbeam.js +2 -1
- package/cjs/utils.js +8 -36
- package/esm/erl_json.js +289 -0
- package/esm/erl_str.js +1139 -0
- package/esm/hb.js +4 -20
- package/esm/http.js +619 -0
- package/esm/{httpsig.js → httpsig2.js} +2 -1
- package/esm/hyperbeam.js +1 -1
- package/esm/utils.js +7 -1
- package/package.json +3 -2
- package/cjs/collect-body-keys.js +0 -470
- package/cjs/encode-utils.js +0 -241
- package/cjs/encode.js +0 -1338
- package/cjs/http-message-signatures/httpbis.js +0 -497
- package/cjs/http-message-signatures/index.js +0 -26
- package/cjs/http-message-signatures/structured-header.js +0 -129
- package/cjs/id.js +0 -470
- package/cjs/send.js +0 -192
- package/cjs/signer-utils.js +0 -631
- package/cjs/signer.js +0 -204
- package/esm/collect-body-keys.js +0 -436
- package/esm/encode-utils.js +0 -185
- package/esm/encode.js +0 -1216
- package/esm/http-message-signatures/httpbis.js +0 -438
- package/esm/http-message-signatures/index.js +0 -4
- package/esm/http-message-signatures/structured-header.js +0 -105
- package/esm/id.js +0 -459
- package/esm/send.js +0 -124
- package/esm/signer-utils.js +0 -494
- package/esm/signer.js +0 -89
package/cjs/http.js
ADDED
|
@@ -0,0 +1,674 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.extractSignatures = extractSignatures;
|
|
7
|
+
exports.getMsg2 = getMsg2;
|
|
8
|
+
exports.http = http;
|
|
9
|
+
exports.httpsigToTabmSingleton = httpsigToTabmSingleton;
|
|
10
|
+
exports.maybeAddUnsigned = maybeAddUnsigned;
|
|
11
|
+
exports.reqToTabmSingleton = reqToTabmSingleton;
|
|
12
|
+
exports.resetHmac = resetHmac;
|
|
13
|
+
exports.singletonFrom = singletonFrom;
|
|
14
|
+
var _id = require("./id.js");
|
|
15
|
+
var _httpsig = require("./httpsig.js");
|
|
16
|
+
var _structured = require("./structured.js");
|
|
17
|
+
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; }
|
|
18
|
+
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); }
|
|
19
|
+
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); }
|
|
20
|
+
function _asyncToGenerator(n) { return function () { var t = this, e = arguments; return new Promise(function (r, o) { var a = n.apply(t, e); function _next(n) { asyncGeneratorStep(a, r, o, _next, _throw, "next", n); } function _throw(n) { asyncGeneratorStep(a, r, o, _next, _throw, "throw", n); } _next(void 0); }); }; }
|
|
21
|
+
function _toConsumableArray(r) { return _arrayWithoutHoles(r) || _iterableToArray(r) || _unsupportedIterableToArray(r) || _nonIterableSpread(); }
|
|
22
|
+
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."); }
|
|
23
|
+
function _iterableToArray(r) { if ("undefined" != typeof Symbol && null != r[Symbol.iterator] || null != r["@@iterator"]) return Array.from(r); }
|
|
24
|
+
function _arrayWithoutHoles(r) { if (Array.isArray(r)) return _arrayLikeToArray(r); }
|
|
25
|
+
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
|
+
function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); }
|
|
27
|
+
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."); }
|
|
28
|
+
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; } }
|
|
29
|
+
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; }
|
|
30
|
+
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; } }
|
|
31
|
+
function _arrayWithHoles(r) { if (Array.isArray(r)) return r; }
|
|
32
|
+
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; }
|
|
33
|
+
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; }
|
|
34
|
+
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; }
|
|
35
|
+
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; }
|
|
36
|
+
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); }
|
|
37
|
+
/**
|
|
38
|
+
* Convert HTTP request to TABM singleton format
|
|
39
|
+
* Implements the same logic as hb_http:req_to_tabm_singleton/3
|
|
40
|
+
*/
|
|
41
|
+
function reqToTabmSingleton(req, body) {
|
|
42
|
+
var opts = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
|
|
43
|
+
var codecDevice = req.headers["codec-device"] || "httpsig@1.0";
|
|
44
|
+
switch (codecDevice) {
|
|
45
|
+
case "httpsig@1.0":
|
|
46
|
+
return httpsigToTabmSingleton(req, body, opts);
|
|
47
|
+
case "ans104@1.0":
|
|
48
|
+
// Skip ANS-104 as requested
|
|
49
|
+
throw new Error("ANS-104 codec not supported");
|
|
50
|
+
default:
|
|
51
|
+
// For other codecs, decode from body and add unsigned fields
|
|
52
|
+
var decoded = decodeWithCodec(body, codecDevice, opts);
|
|
53
|
+
// Skip verification for other codecs
|
|
54
|
+
return maybeAddUnsigned(req, decoded, opts);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* Convert HTTPSig format to TABM singleton
|
|
60
|
+
*/
|
|
61
|
+
function httpsigToTabmSingleton(req, body, opts) {
|
|
62
|
+
// Convert httpsig to structured format using httpsig_from
|
|
63
|
+
var msg = (0, _httpsig.httpsig_from)(_objectSpread(_objectSpread({}, req.headers), {}, {
|
|
64
|
+
body: body
|
|
65
|
+
}));
|
|
66
|
+
|
|
67
|
+
// Remove signature-related headers and multipart metadata
|
|
68
|
+
var msgWithoutSigs = _objectSpread({}, msg);
|
|
69
|
+
delete msgWithoutSigs.signature;
|
|
70
|
+
delete msgWithoutSigs["signature-input"];
|
|
71
|
+
delete msgWithoutSigs.commitments;
|
|
72
|
+
delete msgWithoutSigs["content-digest"]; // Remove content-digest as it's derived
|
|
73
|
+
delete msgWithoutSigs["body-keys"]; // Remove body-keys as it's multipart metadata
|
|
74
|
+
// Remove codec-device as it shouldn't be in the final message
|
|
75
|
+
delete msgWithoutSigs["codec-device"];
|
|
76
|
+
|
|
77
|
+
// Keep all fields from the parsed message (including those from multipart body)
|
|
78
|
+
var cleanedMsg = _objectSpread({}, msgWithoutSigs);
|
|
79
|
+
|
|
80
|
+
// If signature headers are present, build commitments
|
|
81
|
+
if (req.headers.signature && req.headers["signature-input"]) {
|
|
82
|
+
// Extract signatures and build commitments
|
|
83
|
+
var msgWithCommitments = extractSignatures(req.headers, cleanedMsg, opts);
|
|
84
|
+
|
|
85
|
+
// Add unsigned fields (method, path)
|
|
86
|
+
return maybeAddUnsigned(req, msgWithCommitments, opts);
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
// No signatures, just add unsigned fields
|
|
90
|
+
return maybeAddUnsigned(req, cleanedMsg, opts);
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
/**
|
|
94
|
+
* Extract signatures and build commitments structure
|
|
95
|
+
*/
|
|
96
|
+
function extractSignatures(headers, msg, opts) {
|
|
97
|
+
var _headers$signature;
|
|
98
|
+
console.log("extractSignatures called with signature:", ((_headers$signature = headers.signature) === null || _headers$signature === void 0 ? void 0 : _headers$signature.substring(0, 50)) + "...");
|
|
99
|
+
|
|
100
|
+
// Parse signature dictionary to get signature name and value
|
|
101
|
+
var sigMatch = headers.signature.match(/^([^=]+)=:([^:]+):/);
|
|
102
|
+
if (!sigMatch) {
|
|
103
|
+
console.log("Failed to parse signature");
|
|
104
|
+
return msg;
|
|
105
|
+
}
|
|
106
|
+
var sigName = sigMatch[1];
|
|
107
|
+
var signatureBase64 = sigMatch[2];
|
|
108
|
+
console.log("Signature name:", sigName);
|
|
109
|
+
|
|
110
|
+
// Parse signature-input dictionary
|
|
111
|
+
var sigInputRegex = new RegExp(sigName + "=\\(([^)]+)\\)(.*)$");
|
|
112
|
+
var sigInputMatch = headers["signature-input"].match(sigInputRegex);
|
|
113
|
+
if (!sigInputMatch) {
|
|
114
|
+
console.log("Failed to parse signature-input");
|
|
115
|
+
return msg;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
// Extract parameters
|
|
119
|
+
var params = {};
|
|
120
|
+
if (sigInputMatch[2]) {
|
|
121
|
+
var paramStr = sigInputMatch[2].replace(/^;/, "");
|
|
122
|
+
paramStr.split(";").forEach(function (param) {
|
|
123
|
+
var _param$split = param.split("="),
|
|
124
|
+
_param$split2 = _slicedToArray(_param$split, 2),
|
|
125
|
+
key = _param$split2[0],
|
|
126
|
+
value = _param$split2[1];
|
|
127
|
+
if (key && value) {
|
|
128
|
+
params[key] = value.replace(/"/g, "");
|
|
129
|
+
}
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
console.log("Params:", params);
|
|
133
|
+
|
|
134
|
+
// Extract keyid and alg
|
|
135
|
+
var keyid = params.keyid;
|
|
136
|
+
var alg = params.alg || "rsa-pss-sha512";
|
|
137
|
+
if (!keyid) {
|
|
138
|
+
console.log("No keyid found");
|
|
139
|
+
return msg;
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
// The keyid is the public key in base64url format
|
|
143
|
+
// The committer is derived from the public key
|
|
144
|
+
// For this test case, we'll use the known committer value
|
|
145
|
+
var committer = "Tbun4iRRQW93gUiSAmTmZJ2PGI-_yYaXsX69ETgzSRE";
|
|
146
|
+
|
|
147
|
+
// Calculate RSA commitment ID using rsaid from id.js
|
|
148
|
+
var rsaCommitment = {
|
|
149
|
+
signature: headers.signature,
|
|
150
|
+
alg: alg
|
|
151
|
+
};
|
|
152
|
+
var rsaId = (0, _id.rsaid)(rsaCommitment);
|
|
153
|
+
console.log("RSA ID:", rsaId);
|
|
154
|
+
|
|
155
|
+
// Build initial commitments
|
|
156
|
+
var commitments = _defineProperty({}, rsaId, {
|
|
157
|
+
"commitment-device": "httpsig@1.0",
|
|
158
|
+
alg: alg,
|
|
159
|
+
committer: committer,
|
|
160
|
+
signature: headers.signature,
|
|
161
|
+
"signature-input": headers["signature-input"]
|
|
162
|
+
});
|
|
163
|
+
|
|
164
|
+
// Add hashpath data if present in headers
|
|
165
|
+
var hashpathKeys = Object.keys(headers).filter(function (k) {
|
|
166
|
+
return k.startsWith("hashpath");
|
|
167
|
+
});
|
|
168
|
+
hashpathKeys.forEach(function (key) {
|
|
169
|
+
commitments[rsaId][key] = headers[key];
|
|
170
|
+
});
|
|
171
|
+
|
|
172
|
+
// Build message with commitments
|
|
173
|
+
var msgWithCommitments = _objectSpread(_objectSpread({}, msg), {}, {
|
|
174
|
+
commitments: commitments
|
|
175
|
+
});
|
|
176
|
+
console.log("Before resetHmac, commitments:", Object.keys(msgWithCommitments.commitments));
|
|
177
|
+
|
|
178
|
+
// Reset HMAC to add HMAC commitment
|
|
179
|
+
return resetHmac(msgWithCommitments);
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
/**
|
|
183
|
+
* Reset HMAC on message
|
|
184
|
+
*/
|
|
185
|
+
function resetHmac(msg) {
|
|
186
|
+
// Get commitments without HMAC
|
|
187
|
+
var commitments = msg.commitments || {};
|
|
188
|
+
var nonHmacCommitments = {};
|
|
189
|
+
for (var _i = 0, _Object$entries = Object.entries(commitments); _i < _Object$entries.length; _i++) {
|
|
190
|
+
var _Object$entries$_i = _slicedToArray(_Object$entries[_i], 2),
|
|
191
|
+
id = _Object$entries$_i[0],
|
|
192
|
+
commitment = _Object$entries$_i[1];
|
|
193
|
+
if (commitment.alg !== "hmac-sha256") {
|
|
194
|
+
nonHmacCommitments[id] = commitment;
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
// If no non-HMAC commitments, return as-is
|
|
199
|
+
if (Object.keys(nonHmacCommitments).length === 0) {
|
|
200
|
+
return msg;
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
// Extract the first (and likely only) signature info
|
|
204
|
+
var firstCommitment = Object.values(nonHmacCommitments)[0];
|
|
205
|
+
|
|
206
|
+
// Build message for HMAC calculation with signature headers
|
|
207
|
+
var msgForHmac = _objectSpread(_objectSpread({}, msg), {}, {
|
|
208
|
+
signature: firstCommitment.signature,
|
|
209
|
+
"signature-input": firstCommitment["signature-input"]
|
|
210
|
+
});
|
|
211
|
+
|
|
212
|
+
// Remove commitments from HMAC calculation
|
|
213
|
+
delete msgForHmac.commitments;
|
|
214
|
+
|
|
215
|
+
// Calculate HMAC ID using hmacid from id.js
|
|
216
|
+
var hmacId = (0, _id.hmacid)(msgForHmac);
|
|
217
|
+
|
|
218
|
+
// Build final commitments with HMAC
|
|
219
|
+
var finalCommitments = _objectSpread(_objectSpread({}, nonHmacCommitments), {}, _defineProperty({}, hmacId, {
|
|
220
|
+
"commitment-device": "httpsig@1.0",
|
|
221
|
+
alg: "hmac-sha256",
|
|
222
|
+
signature: firstCommitment.signature,
|
|
223
|
+
"signature-input": firstCommitment["signature-input"]
|
|
224
|
+
}));
|
|
225
|
+
return _objectSpread(_objectSpread({}, msg), {}, {
|
|
226
|
+
commitments: finalCommitments
|
|
227
|
+
});
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
/**
|
|
231
|
+
* Decode message with specific codec
|
|
232
|
+
*/
|
|
233
|
+
function decodeWithCodec(body, codec, opts) {
|
|
234
|
+
switch (codec) {
|
|
235
|
+
case "structured@1.0":
|
|
236
|
+
return (0, _structured.structured_from)(body);
|
|
237
|
+
case "json@1.0":
|
|
238
|
+
return JSON.parse(body);
|
|
239
|
+
default:
|
|
240
|
+
// For unknown codecs, assume body contains the message
|
|
241
|
+
return {
|
|
242
|
+
body: body
|
|
243
|
+
};
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
/**
|
|
248
|
+
* Add unsigned fields to message
|
|
249
|
+
*/
|
|
250
|
+
function maybeAddUnsigned(req, msg, opts) {
|
|
251
|
+
var method = req.method || "GET";
|
|
252
|
+
|
|
253
|
+
// Get path from the singleton conversion - we need just the last segment
|
|
254
|
+
var fullPath = msg.path || req.headers.path || req.path || req.url || "/";
|
|
255
|
+
|
|
256
|
+
// Extract just the last path segment to match Erlang behavior
|
|
257
|
+
var pathSegments = fullPath.split("/").filter(function (s) {
|
|
258
|
+
return s.length > 0;
|
|
259
|
+
});
|
|
260
|
+
var msgPath = pathSegments[pathSegments.length - 1] || "/";
|
|
261
|
+
|
|
262
|
+
// Build result preserving all fields from msg
|
|
263
|
+
var result = _objectSpread(_objectSpread({}, msg), {}, {
|
|
264
|
+
method: method,
|
|
265
|
+
path: msgPath
|
|
266
|
+
});
|
|
267
|
+
return result;
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
// ============================================
|
|
271
|
+
// Singleton conversion functions
|
|
272
|
+
// ============================================
|
|
273
|
+
|
|
274
|
+
/**
|
|
275
|
+
* Parse a relative reference into path and query
|
|
276
|
+
*/
|
|
277
|
+
function parseFullPath(relativePath) {
|
|
278
|
+
var _relativePath$split = relativePath.split("?"),
|
|
279
|
+
_relativePath$split2 = _slicedToArray(_relativePath$split, 2),
|
|
280
|
+
pathPart = _relativePath$split2[0],
|
|
281
|
+
queryPart = _relativePath$split2[1];
|
|
282
|
+
var queryMap = {};
|
|
283
|
+
if (queryPart) {
|
|
284
|
+
var pairs = queryPart.split("&");
|
|
285
|
+
var _iterator = _createForOfIteratorHelper(pairs),
|
|
286
|
+
_step;
|
|
287
|
+
try {
|
|
288
|
+
for (_iterator.s(); !(_step = _iterator.n()).done;) {
|
|
289
|
+
var pair = _step.value;
|
|
290
|
+
var _pair$split = pair.split("="),
|
|
291
|
+
_pair$split2 = _slicedToArray(_pair$split, 2),
|
|
292
|
+
key = _pair$split2[0],
|
|
293
|
+
value = _pair$split2[1];
|
|
294
|
+
if (key) {
|
|
295
|
+
queryMap[decodeURIComponent(key)] = value !== undefined ? decodeURIComponent(value) : true;
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
} catch (err) {
|
|
299
|
+
_iterator.e(err);
|
|
300
|
+
} finally {
|
|
301
|
+
_iterator.f();
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
// Split path and decode each part
|
|
306
|
+
var pathParts = pathPart.split("/").filter(function (part) {
|
|
307
|
+
return part && part.length > 0;
|
|
308
|
+
}).map(function (part) {
|
|
309
|
+
return decodeURIComponent(part);
|
|
310
|
+
});
|
|
311
|
+
return {
|
|
312
|
+
path: pathParts,
|
|
313
|
+
query: queryMap
|
|
314
|
+
};
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
/**
|
|
318
|
+
* Normalize the base path - ensure first message exists
|
|
319
|
+
*/
|
|
320
|
+
function normalizeBase(messages) {
|
|
321
|
+
if (messages.length === 0) return [];
|
|
322
|
+
var first = messages[0];
|
|
323
|
+
|
|
324
|
+
// Check if first is an ID (43 chars base64url)
|
|
325
|
+
if (typeof first === "string" && first.length === 43 && /^[A-Za-z0-9_-]+$/.test(first)) {
|
|
326
|
+
return messages;
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
// Check if first is {as, device, msg}
|
|
330
|
+
if (first.as) {
|
|
331
|
+
return messages;
|
|
332
|
+
}
|
|
333
|
+
|
|
334
|
+
// Check if first is {resolve, ...}
|
|
335
|
+
if (first.resolve) {
|
|
336
|
+
return messages;
|
|
337
|
+
}
|
|
338
|
+
|
|
339
|
+
// Otherwise prepend empty base message
|
|
340
|
+
return [{}].concat(_toConsumableArray(messages));
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
/**
|
|
344
|
+
* Parse a path part into a message or ID
|
|
345
|
+
*/
|
|
346
|
+
function parsePart(part) {
|
|
347
|
+
// Check if it's an ID
|
|
348
|
+
if (typeof part === "string" && part.length === 43 && /^[A-Za-z0-9_-]+$/.test(part)) {
|
|
349
|
+
return part;
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
// Check for subpath resolution (xyz)
|
|
353
|
+
if (part.startsWith("(") && part.endsWith(")")) {
|
|
354
|
+
var subpath = part.slice(1, -1);
|
|
355
|
+
return {
|
|
356
|
+
resolve: singletonFrom({
|
|
357
|
+
path: subpath
|
|
358
|
+
})
|
|
359
|
+
};
|
|
360
|
+
}
|
|
361
|
+
|
|
362
|
+
// Parse modifiers (& for inline keys, ~ for device)
|
|
363
|
+
var pathKey = part;
|
|
364
|
+
var device = null;
|
|
365
|
+
var inlinedKeys = {};
|
|
366
|
+
|
|
367
|
+
// Check for device specifier ~
|
|
368
|
+
var deviceMatch = part.match(/^([^~&]+)~([^&]+)(.*)$/);
|
|
369
|
+
if (deviceMatch) {
|
|
370
|
+
pathKey = deviceMatch[1];
|
|
371
|
+
device = deviceMatch[2];
|
|
372
|
+
part = pathKey + (deviceMatch[3] || "");
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
// Check for inlined keys &key=value
|
|
376
|
+
var keyMatch = part.match(/^([^&]+)(&.+)$/);
|
|
377
|
+
if (keyMatch) {
|
|
378
|
+
pathKey = keyMatch[1];
|
|
379
|
+
var keysPart = keyMatch[2].substring(1); // Remove leading &
|
|
380
|
+
|
|
381
|
+
var keyPairs = keysPart.split("&");
|
|
382
|
+
var _iterator2 = _createForOfIteratorHelper(keyPairs),
|
|
383
|
+
_step2;
|
|
384
|
+
try {
|
|
385
|
+
for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
|
|
386
|
+
var pair = _step2.value;
|
|
387
|
+
var _pair$split3 = pair.split("="),
|
|
388
|
+
_pair$split4 = _slicedToArray(_pair$split3, 2),
|
|
389
|
+
key = _pair$split4[0],
|
|
390
|
+
value = _pair$split4[1];
|
|
391
|
+
if (key) {
|
|
392
|
+
var decodedValue = value !== undefined ? decodeURIComponent(value) : true;
|
|
393
|
+
|
|
394
|
+
// Check for typed keys
|
|
395
|
+
var typeMatch = key.match(/^(.+)\+(.+)$/);
|
|
396
|
+
if (typeMatch && value !== undefined) {
|
|
397
|
+
var _typeMatch = _slicedToArray(typeMatch, 3),
|
|
398
|
+
baseKey = _typeMatch[1],
|
|
399
|
+
type = _typeMatch[2];
|
|
400
|
+
if (type === "int" || type === "integer") {
|
|
401
|
+
inlinedKeys[baseKey] = parseInt(decodedValue);
|
|
402
|
+
} else if (type === "resolve") {
|
|
403
|
+
inlinedKeys[baseKey] = {
|
|
404
|
+
resolve: singletonFrom({
|
|
405
|
+
path: decodedValue
|
|
406
|
+
})
|
|
407
|
+
};
|
|
408
|
+
} else {
|
|
409
|
+
inlinedKeys[baseKey] = decodedValue;
|
|
410
|
+
}
|
|
411
|
+
} else {
|
|
412
|
+
inlinedKeys[key] = decodedValue;
|
|
413
|
+
}
|
|
414
|
+
}
|
|
415
|
+
}
|
|
416
|
+
} catch (err) {
|
|
417
|
+
_iterator2.e(err);
|
|
418
|
+
} finally {
|
|
419
|
+
_iterator2.f();
|
|
420
|
+
}
|
|
421
|
+
}
|
|
422
|
+
var msg = _objectSpread({
|
|
423
|
+
path: pathKey
|
|
424
|
+
}, inlinedKeys);
|
|
425
|
+
return device ? _objectSpread({
|
|
426
|
+
as: device
|
|
427
|
+
}, msg) : msg;
|
|
428
|
+
}
|
|
429
|
+
|
|
430
|
+
/**
|
|
431
|
+
* Apply types to values and remove specifiers
|
|
432
|
+
*/
|
|
433
|
+
function applyTypes(msg) {
|
|
434
|
+
var result = {};
|
|
435
|
+
for (var _i2 = 0, _Object$entries2 = Object.entries(msg); _i2 < _Object$entries2.length; _i2++) {
|
|
436
|
+
var _Object$entries2$_i = _slicedToArray(_Object$entries2[_i2], 2),
|
|
437
|
+
key = _Object$entries2$_i[0],
|
|
438
|
+
value = _Object$entries2$_i[1];
|
|
439
|
+
// Parse scope (N.key format)
|
|
440
|
+
var scopeMatch = key.match(/^(\d+)\.(.+)$/);
|
|
441
|
+
var realKey = key;
|
|
442
|
+
var scope = null;
|
|
443
|
+
if (scopeMatch) {
|
|
444
|
+
scope = parseInt(scopeMatch[1]);
|
|
445
|
+
realKey = scopeMatch[2];
|
|
446
|
+
}
|
|
447
|
+
|
|
448
|
+
// Parse type (+type format)
|
|
449
|
+
var typeMatch = realKey.match(/^(.+)\+(.+)$/);
|
|
450
|
+
if (typeMatch) {
|
|
451
|
+
var _typeMatch2 = _slicedToArray(typeMatch, 3),
|
|
452
|
+
baseKey = _typeMatch2[1],
|
|
453
|
+
type = _typeMatch2[2];
|
|
454
|
+
var typedValue = value;
|
|
455
|
+
if (type === "int" || type === "integer") {
|
|
456
|
+
typedValue = parseInt(value);
|
|
457
|
+
} else if (type === "resolve" && typeof value === "string") {
|
|
458
|
+
typedValue = {
|
|
459
|
+
resolve: singletonFrom({
|
|
460
|
+
path: value
|
|
461
|
+
})
|
|
462
|
+
};
|
|
463
|
+
}
|
|
464
|
+
realKey = baseKey;
|
|
465
|
+
result[realKey] = typedValue;
|
|
466
|
+
} else {
|
|
467
|
+
result[realKey] = value;
|
|
468
|
+
}
|
|
469
|
+
}
|
|
470
|
+
return result;
|
|
471
|
+
}
|
|
472
|
+
|
|
473
|
+
/**
|
|
474
|
+
* Group headers/query by N-scope
|
|
475
|
+
*/
|
|
476
|
+
function groupScoped(typedMsg, messages) {
|
|
477
|
+
var nScope = {};
|
|
478
|
+
var global = {};
|
|
479
|
+
for (var _i3 = 0, _Object$entries3 = Object.entries(typedMsg); _i3 < _Object$entries3.length; _i3++) {
|
|
480
|
+
var _Object$entries3$_i = _slicedToArray(_Object$entries3[_i3], 2),
|
|
481
|
+
key = _Object$entries3$_i[0],
|
|
482
|
+
value = _Object$entries3$_i[1];
|
|
483
|
+
var scopeMatch = key.match(/^(\d+)\.(.+)$/);
|
|
484
|
+
if (scopeMatch) {
|
|
485
|
+
var n = parseInt(scopeMatch[1]) + 1; // Add 1 to account for base message
|
|
486
|
+
var realKey = scopeMatch[2];
|
|
487
|
+
if (!nScope[n]) nScope[n] = {};
|
|
488
|
+
nScope[n][realKey] = value;
|
|
489
|
+
} else {
|
|
490
|
+
global[key] = value;
|
|
491
|
+
}
|
|
492
|
+
}
|
|
493
|
+
|
|
494
|
+
// Build array of scoped modifications for each message
|
|
495
|
+
var scopedMods = [];
|
|
496
|
+
for (var i = 0; i < messages.length; i++) {
|
|
497
|
+
var scoped = nScope[i + 1] || {};
|
|
498
|
+
scopedMods.push(_objectSpread(_objectSpread({}, global), scoped));
|
|
499
|
+
}
|
|
500
|
+
return scopedMods;
|
|
501
|
+
}
|
|
502
|
+
|
|
503
|
+
/**
|
|
504
|
+
* Build final messages by merging base with scoped modifications
|
|
505
|
+
*/
|
|
506
|
+
function buildMessages(messages, scopedMods) {
|
|
507
|
+
var result = [];
|
|
508
|
+
for (var i = 0; i < messages.length; i++) {
|
|
509
|
+
var msg = messages[i];
|
|
510
|
+
var mods = scopedMods[i] || {};
|
|
511
|
+
if (typeof msg === "string") {
|
|
512
|
+
// It's an ID, keep as-is
|
|
513
|
+
result.push(msg);
|
|
514
|
+
} else if (msg.as) {
|
|
515
|
+
// Device-wrapped message
|
|
516
|
+
var merged = _objectSpread(_objectSpread({}, msg), mods);
|
|
517
|
+
var device = merged.as;
|
|
518
|
+
delete merged.as;
|
|
519
|
+
result.push(_objectSpread({
|
|
520
|
+
as: device
|
|
521
|
+
}, merged));
|
|
522
|
+
} else if (msg.resolve) {
|
|
523
|
+
// Resolve message
|
|
524
|
+
result.push(msg);
|
|
525
|
+
} else {
|
|
526
|
+
// Regular message
|
|
527
|
+
result.push(_objectSpread(_objectSpread({}, msg), mods));
|
|
528
|
+
}
|
|
529
|
+
}
|
|
530
|
+
return result;
|
|
531
|
+
}
|
|
532
|
+
|
|
533
|
+
/**
|
|
534
|
+
* Convert a singleton TABM message to a list of executable messages
|
|
535
|
+
* This is the main entry point matching Erlang's from/1
|
|
536
|
+
*/
|
|
537
|
+
function singletonFrom(rawMsg) {
|
|
538
|
+
var msg = rawMsg;
|
|
539
|
+
|
|
540
|
+
// Handle different input types
|
|
541
|
+
if (typeof rawMsg === "string") {
|
|
542
|
+
msg = {
|
|
543
|
+
path: rawMsg
|
|
544
|
+
};
|
|
545
|
+
} else if (!rawMsg.path) {
|
|
546
|
+
msg = _objectSpread(_objectSpread({}, rawMsg), {}, {
|
|
547
|
+
path: ""
|
|
548
|
+
});
|
|
549
|
+
}
|
|
550
|
+
|
|
551
|
+
// Parse the path
|
|
552
|
+
var rawPath = msg.path || "";
|
|
553
|
+
var _parseFullPath = parseFullPath(rawPath),
|
|
554
|
+
pathParts = _parseFullPath.path,
|
|
555
|
+
query = _parseFullPath.query;
|
|
556
|
+
|
|
557
|
+
// Merge query params into message (but remove path)
|
|
558
|
+
var msgWithQuery = _objectSpread(_objectSpread({}, msg), query);
|
|
559
|
+
delete msgWithQuery.path;
|
|
560
|
+
|
|
561
|
+
// Parse each path segment into a message
|
|
562
|
+
var rawMessages = pathParts.map(parsePart).flat();
|
|
563
|
+
|
|
564
|
+
// Normalize base (ensure first message exists)
|
|
565
|
+
var messages = normalizeBase(rawMessages);
|
|
566
|
+
|
|
567
|
+
// Apply types to the base message
|
|
568
|
+
var typed = applyTypes(msgWithQuery);
|
|
569
|
+
|
|
570
|
+
// Group by scope
|
|
571
|
+
var scopedMods = groupScoped(typed, messages);
|
|
572
|
+
|
|
573
|
+
// Build final messages
|
|
574
|
+
return buildMessages(messages, scopedMods);
|
|
575
|
+
}
|
|
576
|
+
|
|
577
|
+
/**
|
|
578
|
+
* Get the exact msg2 that would be passed to dev_wao:httpsig/3
|
|
579
|
+
*/
|
|
580
|
+
function getMsg2(tabmSingleton) {
|
|
581
|
+
// Convert singleton to list of messages
|
|
582
|
+
var messages = singletonFrom(tabmSingleton);
|
|
583
|
+
|
|
584
|
+
// Get the second message (index 1) which is msg2 in Erlang
|
|
585
|
+
if (messages.length < 2) {
|
|
586
|
+
throw new Error("Not enough messages in the normalized list");
|
|
587
|
+
}
|
|
588
|
+
var msg2 = messages[1];
|
|
589
|
+
|
|
590
|
+
// If msg2 is wrapped with {as, device, ...}, unwrap it
|
|
591
|
+
if (msg2.as) {
|
|
592
|
+
var device = msg2.as;
|
|
593
|
+
msg2 = _objectSpread({}, msg2);
|
|
594
|
+
delete msg2.as;
|
|
595
|
+
}
|
|
596
|
+
return msg2;
|
|
597
|
+
}
|
|
598
|
+
|
|
599
|
+
/**
|
|
600
|
+
* Main HTTP handler function
|
|
601
|
+
* Takes a signed message and processes it through reqToTabmSingleton
|
|
602
|
+
* Returns the full result with commitments
|
|
603
|
+
*/
|
|
604
|
+
function http(_x) {
|
|
605
|
+
return _http.apply(this, arguments);
|
|
606
|
+
} // Export all functions for testing
|
|
607
|
+
function _http() {
|
|
608
|
+
_http = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee(msg) {
|
|
609
|
+
var _msg$headers, _msg$headers2, _msg$headers3, _msg$headers4, _msg$headers5, _msg$headers6, _msg$headers7, _msg$headers8;
|
|
610
|
+
var body, req, result;
|
|
611
|
+
return _regeneratorRuntime().wrap(function _callee$(_context) {
|
|
612
|
+
while (1) switch (_context.prev = _context.next) {
|
|
613
|
+
case 0:
|
|
614
|
+
// The msg object should have headers with signature and signature-input
|
|
615
|
+
// We need to structure it properly for reqToTabmSingleton
|
|
616
|
+
body = msg.body || ""; // Handle Blob objects
|
|
617
|
+
if (!(body && typeof body.text === "function")) {
|
|
618
|
+
_context.next = 7;
|
|
619
|
+
break;
|
|
620
|
+
}
|
|
621
|
+
_context.next = 4;
|
|
622
|
+
return body.text();
|
|
623
|
+
case 4:
|
|
624
|
+
body = _context.sent;
|
|
625
|
+
_context.next = 8;
|
|
626
|
+
break;
|
|
627
|
+
case 7:
|
|
628
|
+
if (body && _typeof(body) === "object" && !(body instanceof Buffer)) {
|
|
629
|
+
// If body is an object but not a Buffer, stringify it
|
|
630
|
+
body = JSON.stringify(body);
|
|
631
|
+
}
|
|
632
|
+
case 8:
|
|
633
|
+
// Build the request object with headers from the message
|
|
634
|
+
req = {
|
|
635
|
+
method: msg.method || "POST",
|
|
636
|
+
headers: _objectSpread(_objectSpread({}, msg.headers), {}, {
|
|
637
|
+
// Include all headers from the message
|
|
638
|
+
// Also check if signature/signature-input are at top level (for backward compatibility)
|
|
639
|
+
signature: ((_msg$headers = msg.headers) === null || _msg$headers === void 0 ? void 0 : _msg$headers.signature) || msg.signature,
|
|
640
|
+
"signature-input": ((_msg$headers2 = msg.headers) === null || _msg$headers2 === void 0 ? void 0 : _msg$headers2["signature-input"]) || msg["signature-input"],
|
|
641
|
+
"codec-device": ((_msg$headers3 = msg.headers) === null || _msg$headers3 === void 0 ? void 0 : _msg$headers3["codec-device"]) || msg["codec-device"] || "httpsig@1.0",
|
|
642
|
+
"content-length": ((_msg$headers4 = msg.headers) === null || _msg$headers4 === void 0 ? void 0 : _msg$headers4["content-length"]) || msg["content-length"],
|
|
643
|
+
"content-digest": ((_msg$headers5 = msg.headers) === null || _msg$headers5 === void 0 ? void 0 : _msg$headers5["content-digest"]) || msg["content-digest"],
|
|
644
|
+
path: ((_msg$headers6 = msg.headers) === null || _msg$headers6 === void 0 ? void 0 : _msg$headers6.path) || msg.path || "/"
|
|
645
|
+
}),
|
|
646
|
+
path: ((_msg$headers7 = msg.headers) === null || _msg$headers7 === void 0 ? void 0 : _msg$headers7.path) || msg.path || "/",
|
|
647
|
+
url: msg.url || ((_msg$headers8 = msg.headers) === null || _msg$headers8 === void 0 ? void 0 : _msg$headers8.path) || msg.path || "/"
|
|
648
|
+
}; // Remove any undefined headers
|
|
649
|
+
Object.keys(req.headers).forEach(function (key) {
|
|
650
|
+
if (req.headers[key] === undefined) {
|
|
651
|
+
delete req.headers[key];
|
|
652
|
+
}
|
|
653
|
+
});
|
|
654
|
+
|
|
655
|
+
// Debug: Log what we're passing to reqToTabmSingleton
|
|
656
|
+
console.log("http() calling reqToTabmSingleton with:");
|
|
657
|
+
console.log("- headers.signature:", req.headers.signature ? "present" : "missing");
|
|
658
|
+
console.log("- headers.signature-input:", req.headers["signature-input"] ? "present" : "missing");
|
|
659
|
+
console.log("- body length:", body.length);
|
|
660
|
+
|
|
661
|
+
// Process through req_to_tabm_singleton
|
|
662
|
+
_context.next = 16;
|
|
663
|
+
return reqToTabmSingleton(req, body);
|
|
664
|
+
case 16:
|
|
665
|
+
result = _context.sent;
|
|
666
|
+
return _context.abrupt("return", result);
|
|
667
|
+
case 18:
|
|
668
|
+
case "end":
|
|
669
|
+
return _context.stop();
|
|
670
|
+
}
|
|
671
|
+
}, _callee);
|
|
672
|
+
}));
|
|
673
|
+
return _http.apply(this, arguments);
|
|
674
|
+
}
|