@toon-protocol/connector 3.20.0 → 3.28.6
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/README.md +6 -6
- package/dist/auth/rfc9421/content-digest.d.ts +16 -0
- package/dist/auth/rfc9421/content-digest.d.ts.map +1 -0
- package/dist/auth/rfc9421/content-digest.js +35 -0
- package/dist/auth/rfc9421/content-digest.js.map +1 -0
- package/dist/auth/rfc9421/index.d.ts +9 -0
- package/dist/auth/rfc9421/index.d.ts.map +1 -0
- package/dist/auth/rfc9421/index.js +24 -0
- package/dist/auth/rfc9421/index.js.map +1 -0
- package/dist/auth/rfc9421/sign.d.ts +20 -0
- package/dist/auth/rfc9421/sign.d.ts.map +1 -0
- package/dist/auth/rfc9421/sign.js +43 -0
- package/dist/auth/rfc9421/sign.js.map +1 -0
- package/dist/auth/rfc9421/signature-base.d.ts +21 -0
- package/dist/auth/rfc9421/signature-base.d.ts.map +1 -0
- package/dist/auth/rfc9421/signature-base.js +57 -0
- package/dist/auth/rfc9421/signature-base.js.map +1 -0
- package/dist/auth/rfc9421/verify.d.ts +19 -0
- package/dist/auth/rfc9421/verify.d.ts.map +1 -0
- package/dist/auth/rfc9421/verify.js +215 -0
- package/dist/auth/rfc9421/verify.js.map +1 -0
- package/dist/btp/btp-client-manager.d.ts +1 -1
- package/dist/btp/btp-client-manager.d.ts.map +1 -1
- package/dist/btp/btp-client.d.ts +2 -2
- package/dist/btp/btp-client.d.ts.map +1 -1
- package/dist/btp/btp-client.js.map +1 -1
- package/dist/cli/admin-client-factory.d.ts +10 -0
- package/dist/cli/admin-client-factory.d.ts.map +1 -0
- package/dist/cli/admin-client-factory.js +33 -0
- package/dist/cli/admin-client-factory.js.map +1 -0
- package/dist/cli/commands/app.d.ts +6 -0
- package/dist/cli/commands/app.d.ts.map +1 -0
- package/dist/cli/commands/app.js +132 -0
- package/dist/cli/commands/app.js.map +1 -0
- package/dist/cli/commands/route.d.ts +3 -0
- package/dist/cli/commands/route.d.ts.map +1 -0
- package/dist/cli/commands/route.js +63 -0
- package/dist/cli/commands/route.js.map +1 -0
- package/dist/cli/commands/up.d.ts +3 -0
- package/dist/cli/commands/up.d.ts.map +1 -0
- package/dist/cli/commands/up.js +27 -0
- package/dist/cli/commands/up.js.map +1 -0
- package/dist/cli/index.js +32 -16
- package/dist/cli/index.js.map +1 -1
- package/dist/client/connector-admin-client.d.ts +17 -12
- package/dist/client/connector-admin-client.d.ts.map +1 -1
- package/dist/client/connector-admin-client.js.map +1 -1
- package/dist/config/config-loader.d.ts +0 -3
- package/dist/config/config-loader.d.ts.map +1 -1
- package/dist/config/config-loader.js +41 -161
- package/dist/config/config-loader.js.map +1 -1
- package/dist/config/environment-validator.js +6 -6
- package/dist/config/environment-validator.js.map +1 -1
- package/dist/config/types.d.ts +47 -17
- package/dist/config/types.d.ts.map +1 -1
- package/dist/config/types.js +93 -1
- package/dist/config/types.js.map +1 -1
- package/dist/core/connector-node.d.ts +13 -1
- package/dist/core/connector-node.d.ts.map +1 -1
- package/dist/core/connector-node.js +279 -171
- package/dist/core/connector-node.js.map +1 -1
- package/dist/core/handlers/http-proxy-handler.d.ts +47 -0
- package/dist/core/handlers/http-proxy-handler.d.ts.map +1 -0
- package/dist/core/handlers/http-proxy-handler.js +223 -0
- package/dist/core/handlers/http-proxy-handler.js.map +1 -0
- package/dist/core/local-delivery-client.js +9 -9
- package/dist/core/local-delivery-client.js.map +1 -1
- package/dist/core/packet-handler.d.ts +7 -0
- package/dist/core/packet-handler.d.ts.map +1 -1
- package/dist/core/packet-handler.js +55 -3
- package/dist/core/packet-handler.js.map +1 -1
- package/dist/core/registry-db-schema.d.ts +2 -1
- package/dist/core/registry-db-schema.d.ts.map +1 -1
- package/dist/core/registry-db-schema.js +9 -0
- package/dist/core/registry-db-schema.js.map +1 -1
- package/dist/core/registry-store.d.ts +1 -0
- package/dist/core/registry-store.d.ts.map +1 -1
- package/dist/core/registry-store.js +6 -4
- package/dist/core/registry-store.js.map +1 -1
- package/dist/core/route-upstream-registry.d.ts +17 -0
- package/dist/core/route-upstream-registry.d.ts.map +1 -0
- package/dist/core/route-upstream-registry.js +51 -0
- package/dist/core/route-upstream-registry.js.map +1 -0
- package/dist/discovery/ilp-peer-info-event.d.ts +22 -0
- package/dist/discovery/ilp-peer-info-event.d.ts.map +1 -0
- package/dist/discovery/ilp-peer-info-event.js +21 -0
- package/dist/discovery/ilp-peer-info-event.js.map +1 -0
- package/dist/discovery/index.d.ts +8 -0
- package/dist/discovery/index.d.ts.map +1 -1
- package/dist/discovery/index.js +16 -1
- package/dist/discovery/index.js.map +1 -1
- package/dist/discovery/self-announce-builder.d.ts +14 -0
- package/dist/discovery/self-announce-builder.d.ts.map +1 -0
- package/dist/discovery/self-announce-builder.js +88 -0
- package/dist/discovery/self-announce-builder.js.map +1 -0
- package/dist/discovery/self-announce-publish.d.ts +17 -0
- package/dist/discovery/self-announce-publish.d.ts.map +1 -0
- package/dist/discovery/self-announce-publish.js +35 -0
- package/dist/discovery/self-announce-publish.js.map +1 -0
- package/dist/discovery/self-announce-service.d.ts +36 -0
- package/dist/discovery/self-announce-service.d.ts.map +1 -0
- package/dist/discovery/self-announce-service.js +118 -0
- package/dist/discovery/self-announce-service.js.map +1 -0
- package/dist/http/admin-api-inventory.d.ts.map +1 -1
- package/dist/http/admin-api-inventory.js +0 -42
- package/dist/http/admin-api-inventory.js.map +1 -1
- package/dist/http/admin-api.d.ts +29 -13
- package/dist/http/admin-api.d.ts.map +1 -1
- package/dist/http/admin-api.js +141 -76
- package/dist/http/admin-api.js.map +1 -1
- package/dist/http/admin-server.d.ts +3 -4
- package/dist/http/admin-server.d.ts.map +1 -1
- package/dist/http/admin-server.js +4 -6
- package/dist/http/admin-server.js.map +1 -1
- package/dist/http/ilp-http-adapter.d.ts +10 -0
- package/dist/http/ilp-http-adapter.d.ts.map +1 -1
- package/dist/http/ilp-http-adapter.js +118 -0
- package/dist/http/ilp-http-adapter.js.map +1 -1
- package/dist/http/types.d.ts +1 -1
- package/dist/http/types.d.ts.map +1 -1
- package/dist/http/x402-greeting.d.ts +46 -0
- package/dist/http/x402-greeting.d.ts.map +1 -0
- package/dist/http/x402-greeting.js +77 -0
- package/dist/http/x402-greeting.js.map +1 -0
- package/dist/lib.d.ts +13 -2
- package/dist/lib.d.ts.map +1 -1
- package/dist/lib.js +41 -1
- package/dist/lib.js.map +1 -1
- package/dist/main.d.ts +3 -1
- package/dist/main.d.ts.map +1 -1
- package/dist/main.js +3 -1
- package/dist/main.js.map +1 -1
- package/dist/settlement/channel-manager.d.ts.map +1 -1
- package/dist/settlement/channel-manager.js +1 -1
- package/dist/settlement/channel-manager.js.map +1 -1
- package/dist/settlement/provider/solana-payment-channel-provider.d.ts.map +1 -1
- package/dist/settlement/provider/solana-payment-channel-provider.js +1 -1
- package/dist/settlement/provider/solana-payment-channel-provider.js.map +1 -1
- package/dist/settlement/solana-payment-channel-sdk.d.ts +1 -1
- package/dist/settlement/solana-payment-channel-sdk.d.ts.map +1 -1
- package/dist/settlement/solana-payment-channel-sdk.js +2 -2
- package/dist/settlement/solana-payment-channel-sdk.js.map +1 -1
- package/dist/transport/http-peer-transport.d.ts +46 -0
- package/dist/transport/http-peer-transport.d.ts.map +1 -0
- package/dist/transport/http-peer-transport.js +185 -0
- package/dist/transport/http-peer-transport.js.map +1 -0
- package/dist/transport/index.d.ts +0 -3
- package/dist/transport/index.d.ts.map +1 -1
- package/dist/transport/index.js +1 -8
- package/dist/transport/index.js.map +1 -1
- package/dist/wallet/mnemonic-keys.d.ts +15 -0
- package/dist/wallet/mnemonic-keys.d.ts.map +1 -0
- package/dist/wallet/mnemonic-keys.js +150 -0
- package/dist/wallet/mnemonic-keys.js.map +1 -0
- package/package.json +11 -8
- package/dist/transport/hs-desc-monitor.d.ts +0 -12
- package/dist/transport/hs-desc-monitor.d.ts.map +0 -1
- package/dist/transport/hs-desc-monitor.js +0 -105
- package/dist/transport/hs-desc-monitor.js.map +0 -1
- package/dist/transport/managed-anon-client.d.ts +0 -93
- package/dist/transport/managed-anon-client.d.ts.map +0 -1
- package/dist/transport/managed-anon-client.js +0 -522
- package/dist/transport/managed-anon-client.js.map +0 -1
- package/dist/transport/socks-transport-provider.d.ts +0 -29
- package/dist/transport/socks-transport-provider.d.ts.map +0 -1
- package/dist/transport/socks-transport-provider.js +0 -136
- package/dist/transport/socks-transport-provider.js.map +0 -1
- package/dist/transport/socks-url.d.ts +0 -6
- package/dist/transport/socks-url.d.ts.map +0 -1
- package/dist/transport/socks-url.js +0 -29
- package/dist/transport/socks-url.js.map +0 -1
- package/dist/transport/socks5-connect.d.ts +0 -12
- package/dist/transport/socks5-connect.d.ts.map +0 -1
- package/dist/transport/socks5-connect.js +0 -89
- package/dist/transport/socks5-connect.js.map +0 -1
package/README.md
CHANGED
|
@@ -35,7 +35,7 @@ The connector supports two deployment modes via `deploymentMode` in config:
|
|
|
35
35
|
| Mode | Value | How packets arrive | How packets are sent |
|
|
36
36
|
| -------------- | -------------- | ----------------------------- | ------------------------------ |
|
|
37
37
|
| **Embedded** | `'embedded'` | `setPacketHandler()` callback | `node.sendPacket()` |
|
|
38
|
-
| **Standalone** | `'standalone'` | HTTP POST to
|
|
38
|
+
| **Standalone** | `'standalone'` | HTTP POST to app `handlerUrl` | HTTP POST to `/admin/ilp/send` |
|
|
39
39
|
|
|
40
40
|
When `deploymentMode` is omitted, it is inferred from `localDelivery` and `adminApi` flags.
|
|
41
41
|
|
|
@@ -107,7 +107,7 @@ environment: production
|
|
|
107
107
|
|
|
108
108
|
localDelivery:
|
|
109
109
|
enabled: true
|
|
110
|
-
handlerUrl: http://my-
|
|
110
|
+
handlerUrl: http://my-app:3100
|
|
111
111
|
timeout: 5000
|
|
112
112
|
|
|
113
113
|
adminApi:
|
|
@@ -147,7 +147,7 @@ const node = new ConnectorNode(config: ConnectorConfig | string, logger: Logger)
|
|
|
147
147
|
| `healthCheckPort` | `number` | `8080` | HTTP health endpoint port |
|
|
148
148
|
| `logLevel` | `string` | `'info'` | `'debug'` \| `'info'` \| `'warn'` \| `'error'` |
|
|
149
149
|
| `adminApi` | `AdminApiConfig` | disabled | Admin REST API settings |
|
|
150
|
-
| `localDelivery` | `LocalDeliveryConfig` | disabled | HTTP forwarding to
|
|
150
|
+
| `localDelivery` | `LocalDeliveryConfig` | disabled | HTTP forwarding to app |
|
|
151
151
|
| `settlement` | `SettlementConfig` | — | TigerBeetle accounting config |
|
|
152
152
|
| `chainProviders` | `ChainProviderConfigEntry[]` | — | Multi-chain settlement providers (EVM, Solana, Mina) |
|
|
153
153
|
| `transport` | `TransportConfig` | direct | Network transport: `direct` or `socks5` (ATOR) |
|
|
@@ -257,19 +257,19 @@ peers:
|
|
|
257
257
|
|
|
258
258
|
## Per-Hop Notification
|
|
259
259
|
|
|
260
|
-
Intermediate connectors can fire non-blocking notifications to
|
|
260
|
+
Intermediate connectors can fire non-blocking notifications to an app for transit packets:
|
|
261
261
|
|
|
262
262
|
```yaml
|
|
263
263
|
localDelivery:
|
|
264
264
|
enabled: true
|
|
265
|
-
handlerUrl: http://my-
|
|
265
|
+
handlerUrl: http://my-app:3100
|
|
266
266
|
perHopNotification: true
|
|
267
267
|
```
|
|
268
268
|
|
|
269
269
|
| | Transit (`isTransit: true`) | Final-Hop (`isTransit` omitted) |
|
|
270
270
|
| ---------------- | --------------------------- | ---------------------------------- |
|
|
271
271
|
| **When** | Packet passing through | Packet addressed to this connector |
|
|
272
|
-
| **
|
|
272
|
+
| **App response** | Ignored (fire-and-forget) | Drives ILP fulfill/reject |
|
|
273
273
|
| **Blocking** | No | Yes |
|
|
274
274
|
| **Use case** | Logging, analytics | Payment acceptance, business logic |
|
|
275
275
|
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export declare const CONTENT_DIGEST_ALG = "sha-256";
|
|
2
|
+
export declare const CONTENT_DIGEST_HEADER = "content-digest";
|
|
3
|
+
export declare function computeContentDigest(rawBody: Uint8Array): string;
|
|
4
|
+
export interface ParsedContentDigest {
|
|
5
|
+
alg: string;
|
|
6
|
+
base64: string;
|
|
7
|
+
}
|
|
8
|
+
export declare function parseContentDigest(value: string): ParsedContentDigest | undefined;
|
|
9
|
+
export type ContentDigestVerifyResult = {
|
|
10
|
+
ok: true;
|
|
11
|
+
} | {
|
|
12
|
+
ok: false;
|
|
13
|
+
reason: 'missing' | 'malformed' | 'unsupported_alg' | 'mismatch';
|
|
14
|
+
};
|
|
15
|
+
export declare function verifyContentDigest(headerValue: string | undefined, rawBody: Uint8Array): ContentDigestVerifyResult;
|
|
16
|
+
//# sourceMappingURL=content-digest.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"content-digest.d.ts","sourceRoot":"","sources":["../../../src/auth/rfc9421/content-digest.ts"],"names":[],"mappings":"AAwBA,eAAO,MAAM,kBAAkB,YAAY,CAAC;AAG5C,eAAO,MAAM,qBAAqB,mBAAmB,CAAC;AAStD,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,UAAU,GAAG,MAAM,CAIhE;AAGD,MAAM,WAAW,mBAAmB;IAElC,GAAG,EAAE,MAAM,CAAC;IAEZ,MAAM,EAAE,MAAM,CAAC;CAChB;AAWD,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,mBAAmB,GAAG,SAAS,CAKjF;AAGD,MAAM,MAAM,yBAAyB,GACjC;IAAE,EAAE,EAAE,IAAI,CAAA;CAAE,GACZ;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,SAAS,GAAG,WAAW,GAAG,iBAAiB,GAAG,UAAU,CAAA;CAAE,CAAC;AAWpF,wBAAgB,mBAAmB,CACjC,WAAW,EAAE,MAAM,GAAG,SAAS,EAC/B,OAAO,EAAE,UAAU,GAClB,yBAAyB,CAW3B"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.CONTENT_DIGEST_HEADER = exports.CONTENT_DIGEST_ALG = void 0;
|
|
4
|
+
exports.computeContentDigest = computeContentDigest;
|
|
5
|
+
exports.parseContentDigest = parseContentDigest;
|
|
6
|
+
exports.verifyContentDigest = verifyContentDigest;
|
|
7
|
+
const sha2_1 = require("@noble/hashes/sha2");
|
|
8
|
+
exports.CONTENT_DIGEST_ALG = 'sha-256';
|
|
9
|
+
exports.CONTENT_DIGEST_HEADER = 'content-digest';
|
|
10
|
+
function computeContentDigest(rawBody) {
|
|
11
|
+
const hash = (0, sha2_1.sha256)(rawBody);
|
|
12
|
+
const b64 = Buffer.from(hash).toString('base64');
|
|
13
|
+
return `${exports.CONTENT_DIGEST_ALG}=:${b64}:`;
|
|
14
|
+
}
|
|
15
|
+
function parseContentDigest(value) {
|
|
16
|
+
const match = /^\s*([A-Za-z0-9-]+)\s*=\s*:([A-Za-z0-9+/]+={0,2}):\s*$/.exec(value);
|
|
17
|
+
if (!match || match[1] === undefined || match[2] === undefined)
|
|
18
|
+
return undefined;
|
|
19
|
+
return { alg: match[1].toLowerCase(), base64: match[2] };
|
|
20
|
+
}
|
|
21
|
+
function verifyContentDigest(headerValue, rawBody) {
|
|
22
|
+
if (headerValue === undefined || headerValue.length === 0) {
|
|
23
|
+
return { ok: false, reason: 'missing' };
|
|
24
|
+
}
|
|
25
|
+
const parsed = parseContentDigest(headerValue);
|
|
26
|
+
if (!parsed)
|
|
27
|
+
return { ok: false, reason: 'malformed' };
|
|
28
|
+
if (parsed.alg !== exports.CONTENT_DIGEST_ALG)
|
|
29
|
+
return { ok: false, reason: 'unsupported_alg' };
|
|
30
|
+
const expected = Buffer.from((0, sha2_1.sha256)(rawBody)).toString('base64');
|
|
31
|
+
if (parsed.base64 !== expected)
|
|
32
|
+
return { ok: false, reason: 'mismatch' };
|
|
33
|
+
return { ok: true };
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=content-digest.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"content-digest.js","sourceRoot":"","sources":["../../../src/auth/rfc9421/content-digest.ts"],"names":[],"mappings":";;;AAoCA,oDAIC;AAmBD,gDAKC;AAgBD,kDAcC;AAzED,6CAA4C;AAG/B,QAAA,kBAAkB,GAAG,SAAS,CAAC;AAG/B,QAAA,qBAAqB,GAAG,gBAAgB,CAAC;AAStD,SAAgB,oBAAoB,CAAC,OAAmB;IACtD,MAAM,IAAI,GAAG,IAAA,aAAM,EAAC,OAAO,CAAC,CAAC;IAC7B,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IACjD,OAAO,GAAG,0BAAkB,KAAK,GAAG,GAAG,CAAC;AAC1C,CAAC;AAmBD,SAAgB,kBAAkB,CAAC,KAAa;IAE9C,MAAM,KAAK,GAAG,wDAAwD,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACnF,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,SAAS,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IACjF,OAAO,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;AAC3D,CAAC;AAgBD,SAAgB,mBAAmB,CACjC,WAA+B,EAC/B,OAAmB;IAEnB,IAAI,WAAW,KAAK,SAAS,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1D,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;IAC1C,CAAC;IACD,MAAM,MAAM,GAAG,kBAAkB,CAAC,WAAW,CAAC,CAAC;IAC/C,IAAI,CAAC,MAAM;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC;IACvD,IAAI,MAAM,CAAC,GAAG,KAAK,0BAAkB;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,iBAAiB,EAAE,CAAC;IAEvF,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,IAAA,aAAM,EAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IACjE,IAAI,MAAM,CAAC,MAAM,KAAK,QAAQ;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC;IACzE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;AACtB,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export { computeContentDigest, verifyContentDigest, parseContentDigest, CONTENT_DIGEST_ALG, CONTENT_DIGEST_HEADER, } from './content-digest';
|
|
2
|
+
export type { ParsedContentDigest, ContentDigestVerifyResult } from './content-digest';
|
|
3
|
+
export { buildSignatureBase, serializeSignatureParams, SignatureBaseError, COVERED_COMPONENTS, PRICE_HEADER, PRICE_HEADER_WIRE, SIGNATURE_ALG, } from './signature-base';
|
|
4
|
+
export type { RequestContext, SignatureParams } from './signature-base';
|
|
5
|
+
export { verify } from './verify';
|
|
6
|
+
export type { VerifyResult, VerifyOptions, VerifyFailureCode } from './verify';
|
|
7
|
+
export { signRequest, publicKeyToKeyid, DEFAULT_SIGNATURE_LABEL } from './sign';
|
|
8
|
+
export type { SignRequestInput, SignedHeaders } from './sign';
|
|
9
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/auth/rfc9421/index.ts"],"names":[],"mappings":"AAWA,OAAO,EACL,oBAAoB,EACpB,mBAAmB,EACnB,kBAAkB,EAClB,kBAAkB,EAClB,qBAAqB,GACtB,MAAM,kBAAkB,CAAC;AAC1B,YAAY,EAAE,mBAAmB,EAAE,yBAAyB,EAAE,MAAM,kBAAkB,CAAC;AAEvF,OAAO,EACL,kBAAkB,EAClB,wBAAwB,EACxB,kBAAkB,EAClB,kBAAkB,EAClB,YAAY,EACZ,iBAAiB,EACjB,aAAa,GACd,MAAM,kBAAkB,CAAC;AAC1B,YAAY,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAExE,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,YAAY,EAAE,YAAY,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAE/E,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,uBAAuB,EAAE,MAAM,QAAQ,CAAC;AAChF,YAAY,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DEFAULT_SIGNATURE_LABEL = exports.publicKeyToKeyid = exports.signRequest = exports.verify = exports.SIGNATURE_ALG = exports.PRICE_HEADER_WIRE = exports.PRICE_HEADER = exports.COVERED_COMPONENTS = exports.SignatureBaseError = exports.serializeSignatureParams = exports.buildSignatureBase = exports.CONTENT_DIGEST_HEADER = exports.CONTENT_DIGEST_ALG = exports.parseContentDigest = exports.verifyContentDigest = exports.computeContentDigest = void 0;
|
|
4
|
+
var content_digest_1 = require("./content-digest");
|
|
5
|
+
Object.defineProperty(exports, "computeContentDigest", { enumerable: true, get: function () { return content_digest_1.computeContentDigest; } });
|
|
6
|
+
Object.defineProperty(exports, "verifyContentDigest", { enumerable: true, get: function () { return content_digest_1.verifyContentDigest; } });
|
|
7
|
+
Object.defineProperty(exports, "parseContentDigest", { enumerable: true, get: function () { return content_digest_1.parseContentDigest; } });
|
|
8
|
+
Object.defineProperty(exports, "CONTENT_DIGEST_ALG", { enumerable: true, get: function () { return content_digest_1.CONTENT_DIGEST_ALG; } });
|
|
9
|
+
Object.defineProperty(exports, "CONTENT_DIGEST_HEADER", { enumerable: true, get: function () { return content_digest_1.CONTENT_DIGEST_HEADER; } });
|
|
10
|
+
var signature_base_1 = require("./signature-base");
|
|
11
|
+
Object.defineProperty(exports, "buildSignatureBase", { enumerable: true, get: function () { return signature_base_1.buildSignatureBase; } });
|
|
12
|
+
Object.defineProperty(exports, "serializeSignatureParams", { enumerable: true, get: function () { return signature_base_1.serializeSignatureParams; } });
|
|
13
|
+
Object.defineProperty(exports, "SignatureBaseError", { enumerable: true, get: function () { return signature_base_1.SignatureBaseError; } });
|
|
14
|
+
Object.defineProperty(exports, "COVERED_COMPONENTS", { enumerable: true, get: function () { return signature_base_1.COVERED_COMPONENTS; } });
|
|
15
|
+
Object.defineProperty(exports, "PRICE_HEADER", { enumerable: true, get: function () { return signature_base_1.PRICE_HEADER; } });
|
|
16
|
+
Object.defineProperty(exports, "PRICE_HEADER_WIRE", { enumerable: true, get: function () { return signature_base_1.PRICE_HEADER_WIRE; } });
|
|
17
|
+
Object.defineProperty(exports, "SIGNATURE_ALG", { enumerable: true, get: function () { return signature_base_1.SIGNATURE_ALG; } });
|
|
18
|
+
var verify_1 = require("./verify");
|
|
19
|
+
Object.defineProperty(exports, "verify", { enumerable: true, get: function () { return verify_1.verify; } });
|
|
20
|
+
var sign_1 = require("./sign");
|
|
21
|
+
Object.defineProperty(exports, "signRequest", { enumerable: true, get: function () { return sign_1.signRequest; } });
|
|
22
|
+
Object.defineProperty(exports, "publicKeyToKeyid", { enumerable: true, get: function () { return sign_1.publicKeyToKeyid; } });
|
|
23
|
+
Object.defineProperty(exports, "DEFAULT_SIGNATURE_LABEL", { enumerable: true, get: function () { return sign_1.DEFAULT_SIGNATURE_LABEL; } });
|
|
24
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/auth/rfc9421/index.ts"],"names":[],"mappings":";;;AAWA,mDAM0B;AALxB,sHAAA,oBAAoB,OAAA;AACpB,qHAAA,mBAAmB,OAAA;AACnB,oHAAA,kBAAkB,OAAA;AAClB,oHAAA,kBAAkB,OAAA;AAClB,uHAAA,qBAAqB,OAAA;AAIvB,mDAQ0B;AAPxB,oHAAA,kBAAkB,OAAA;AAClB,0HAAA,wBAAwB,OAAA;AACxB,oHAAA,kBAAkB,OAAA;AAClB,oHAAA,kBAAkB,OAAA;AAClB,8GAAA,YAAY,OAAA;AACZ,mHAAA,iBAAiB,OAAA;AACjB,+GAAA,aAAa,OAAA;AAIf,mCAAkC;AAAzB,gGAAA,MAAM,OAAA;AAGf,+BAAgF;AAAvE,mGAAA,WAAW,OAAA;AAAE,wGAAA,gBAAgB,OAAA;AAAE,+GAAA,uBAAuB,OAAA"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export declare const DEFAULT_SIGNATURE_LABEL = "sig1";
|
|
2
|
+
export interface SignRequestInput {
|
|
3
|
+
privateKey: Uint8Array;
|
|
4
|
+
method: string;
|
|
5
|
+
path: string;
|
|
6
|
+
body: Uint8Array;
|
|
7
|
+
price: string;
|
|
8
|
+
created?: number;
|
|
9
|
+
expires?: number;
|
|
10
|
+
keyid?: string;
|
|
11
|
+
label?: string;
|
|
12
|
+
}
|
|
13
|
+
export interface SignedHeaders {
|
|
14
|
+
headers: Record<string, string>;
|
|
15
|
+
label: string;
|
|
16
|
+
keyid: string;
|
|
17
|
+
}
|
|
18
|
+
export declare function publicKeyToKeyid(publicKey: Uint8Array): string;
|
|
19
|
+
export declare function signRequest(input: SignRequestInput): SignedHeaders;
|
|
20
|
+
//# sourceMappingURL=sign.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sign.d.ts","sourceRoot":"","sources":["../../../src/auth/rfc9421/sign.ts"],"names":[],"mappings":"AAgCA,eAAO,MAAM,uBAAuB,SAAS,CAAC;AAG9C,MAAM,WAAW,gBAAgB;IAE/B,UAAU,EAAE,UAAU,CAAC;IAEvB,MAAM,EAAE,MAAM,CAAC;IAEf,IAAI,EAAE,MAAM,CAAC;IAEb,IAAI,EAAE,UAAU,CAAC;IAEjB,KAAK,EAAE,MAAM,CAAC;IAEd,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB,OAAO,CAAC,EAAE,MAAM,CAAC;IAMjB,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAGD,MAAM,WAAW,aAAa;IAE5B,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAEhC,KAAK,EAAE,MAAM,CAAC;IAEd,KAAK,EAAE,MAAM,CAAC;CACf;AAGD,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,UAAU,GAAG,MAAM,CAE9D;AASD,wBAAgB,WAAW,CAAC,KAAK,EAAE,gBAAgB,GAAG,aAAa,CAoClE"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DEFAULT_SIGNATURE_LABEL = void 0;
|
|
4
|
+
exports.publicKeyToKeyid = publicKeyToKeyid;
|
|
5
|
+
exports.signRequest = signRequest;
|
|
6
|
+
const ed25519_1 = require("@noble/curves/ed25519");
|
|
7
|
+
const utils_1 = require("@noble/hashes/utils");
|
|
8
|
+
const content_digest_1 = require("./content-digest");
|
|
9
|
+
const signature_base_1 = require("./signature-base");
|
|
10
|
+
exports.DEFAULT_SIGNATURE_LABEL = 'sig1';
|
|
11
|
+
function publicKeyToKeyid(publicKey) {
|
|
12
|
+
return (0, utils_1.bytesToHex)(publicKey);
|
|
13
|
+
}
|
|
14
|
+
function signRequest(input) {
|
|
15
|
+
const label = input.label ?? exports.DEFAULT_SIGNATURE_LABEL;
|
|
16
|
+
const created = input.created ?? Math.floor(Date.now() / 1000);
|
|
17
|
+
const publicKey = ed25519_1.ed25519.getPublicKey(input.privateKey);
|
|
18
|
+
const keyid = input.keyid ?? publicKeyToKeyid(publicKey);
|
|
19
|
+
const contentDigest = (0, content_digest_1.computeContentDigest)(input.body);
|
|
20
|
+
const headers = {
|
|
21
|
+
'content-digest': contentDigest,
|
|
22
|
+
[signature_base_1.PRICE_HEADER]: input.price,
|
|
23
|
+
};
|
|
24
|
+
const req = {
|
|
25
|
+
method: input.method,
|
|
26
|
+
path: input.path,
|
|
27
|
+
headers,
|
|
28
|
+
};
|
|
29
|
+
const params = {
|
|
30
|
+
created,
|
|
31
|
+
keyid,
|
|
32
|
+
alg: signature_base_1.SIGNATURE_ALG,
|
|
33
|
+
expires: input.expires,
|
|
34
|
+
};
|
|
35
|
+
const base = (0, signature_base_1.buildSignatureBase)(req, params, signature_base_1.COVERED_COMPONENTS);
|
|
36
|
+
const signature = ed25519_1.ed25519.sign(new TextEncoder().encode(base), input.privateKey);
|
|
37
|
+
const sigB64 = Buffer.from(signature).toString('base64');
|
|
38
|
+
const sigParamsValue = (0, signature_base_1.serializeSignatureParams)(signature_base_1.COVERED_COMPONENTS, params);
|
|
39
|
+
headers['signature-input'] = `${label}=${sigParamsValue}`;
|
|
40
|
+
headers['signature'] = `${label}=:${sigB64}:`;
|
|
41
|
+
return { headers, label, keyid };
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=sign.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sign.js","sourceRoot":"","sources":["../../../src/auth/rfc9421/sign.ts"],"names":[],"mappings":";;;AAuEA,4CAEC;AASD,kCAoCC;AApGD,mDAAgD;AAChD,+CAAiD;AACjD,qDAAwD;AACxD,qDAQ0B;AAGb,QAAA,uBAAuB,GAAG,MAAM,CAAC;AAuC9C,SAAgB,gBAAgB,CAAC,SAAqB;IACpD,OAAO,IAAA,kBAAU,EAAC,SAAS,CAAC,CAAC;AAC/B,CAAC;AASD,SAAgB,WAAW,CAAC,KAAuB;IACjD,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,IAAI,+BAAuB,CAAC;IACrD,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;IAC/D,MAAM,SAAS,GAAG,iBAAO,CAAC,YAAY,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;IACzD,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,IAAI,gBAAgB,CAAC,SAAS,CAAC,CAAC;IAEzD,MAAM,aAAa,GAAG,IAAA,qCAAoB,EAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAEvD,MAAM,OAAO,GAA2B;QACtC,gBAAgB,EAAE,aAAa;QAC/B,CAAC,6BAAY,CAAC,EAAE,KAAK,CAAC,KAAK;KAC5B,CAAC;IAEF,MAAM,GAAG,GAAmB;QAC1B,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,OAAO;KACR,CAAC;IAEF,MAAM,MAAM,GAAoB;QAC9B,OAAO;QACP,KAAK;QACL,GAAG,EAAE,8BAAa;QAClB,OAAO,EAAE,KAAK,CAAC,OAAO;KACvB,CAAC;IAEF,MAAM,IAAI,GAAG,IAAA,mCAAkB,EAAC,GAAG,EAAE,MAAM,EAAE,mCAAkB,CAAC,CAAC;IACjE,MAAM,SAAS,GAAG,iBAAO,CAAC,IAAI,CAAC,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC;IACjF,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAEzD,MAAM,cAAc,GAAG,IAAA,yCAAwB,EAAC,mCAAkB,EAAE,MAAM,CAAC,CAAC;IAE5E,OAAO,CAAC,iBAAiB,CAAC,GAAG,GAAG,KAAK,IAAI,cAAc,EAAE,CAAC;IAC1D,OAAO,CAAC,WAAW,CAAC,GAAG,GAAG,KAAK,KAAK,MAAM,GAAG,CAAC;IAE9C,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;AACnC,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export declare const PRICE_HEADER = "toon-price";
|
|
2
|
+
export declare const PRICE_HEADER_WIRE = "TOON-Price";
|
|
3
|
+
export declare const SIGNATURE_ALG = "ed25519";
|
|
4
|
+
export declare const COVERED_COMPONENTS: readonly string[];
|
|
5
|
+
export interface RequestContext {
|
|
6
|
+
method: string;
|
|
7
|
+
path: string;
|
|
8
|
+
headers: Record<string, string>;
|
|
9
|
+
}
|
|
10
|
+
export interface SignatureParams {
|
|
11
|
+
created: number;
|
|
12
|
+
keyid: string;
|
|
13
|
+
alg?: string;
|
|
14
|
+
expires?: number;
|
|
15
|
+
}
|
|
16
|
+
export declare class SignatureBaseError extends Error {
|
|
17
|
+
constructor(message: string);
|
|
18
|
+
}
|
|
19
|
+
export declare function serializeSignatureParams(components: readonly string[], params: SignatureParams): string;
|
|
20
|
+
export declare function buildSignatureBase(req: RequestContext, params: SignatureParams, components?: readonly string[]): string;
|
|
21
|
+
//# sourceMappingURL=signature-base.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"signature-base.d.ts","sourceRoot":"","sources":["../../../src/auth/rfc9421/signature-base.ts"],"names":[],"mappings":"AAqCA,eAAO,MAAM,YAAY,eAAe,CAAC;AAGzC,eAAO,MAAM,iBAAiB,eAAe,CAAC;AAG9C,eAAO,MAAM,aAAa,YAAY,CAAC;AAMvC,eAAO,MAAM,kBAAkB,EAAE,SAAS,MAAM,EAKtC,CAAC;AAGX,MAAM,WAAW,cAAc;IAE7B,MAAM,EAAE,MAAM,CAAC;IAEf,IAAI,EAAE,MAAM,CAAC;IAEb,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACjC;AAGD,MAAM,WAAW,eAAe;IAE9B,OAAO,EAAE,MAAM,CAAC;IAEhB,KAAK,EAAE,MAAM,CAAC;IAEd,GAAG,CAAC,EAAE,MAAM,CAAC;IAOb,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AA2BD,qBAAa,kBAAmB,SAAQ,KAAK;gBAC/B,OAAO,EAAE,MAAM;CAI5B;AAWD,wBAAgB,wBAAwB,CACtC,UAAU,EAAE,SAAS,MAAM,EAAE,EAC7B,MAAM,EAAE,eAAe,GACtB,MAAM,CAQR;AAcD,wBAAgB,kBAAkB,CAChC,GAAG,EAAE,cAAc,EACnB,MAAM,EAAE,eAAe,EACvB,UAAU,GAAE,SAAS,MAAM,EAAuB,GACjD,MAAM,CAQR"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SignatureBaseError = exports.COVERED_COMPONENTS = exports.SIGNATURE_ALG = exports.PRICE_HEADER_WIRE = exports.PRICE_HEADER = void 0;
|
|
4
|
+
exports.serializeSignatureParams = serializeSignatureParams;
|
|
5
|
+
exports.buildSignatureBase = buildSignatureBase;
|
|
6
|
+
const content_digest_1 = require("./content-digest");
|
|
7
|
+
exports.PRICE_HEADER = 'toon-price';
|
|
8
|
+
exports.PRICE_HEADER_WIRE = 'TOON-Price';
|
|
9
|
+
exports.SIGNATURE_ALG = 'ed25519';
|
|
10
|
+
exports.COVERED_COMPONENTS = [
|
|
11
|
+
'@method',
|
|
12
|
+
'@path',
|
|
13
|
+
content_digest_1.CONTENT_DIGEST_HEADER,
|
|
14
|
+
exports.PRICE_HEADER,
|
|
15
|
+
];
|
|
16
|
+
function componentValue(id, req) {
|
|
17
|
+
switch (id) {
|
|
18
|
+
case '@method':
|
|
19
|
+
return req.method.toUpperCase();
|
|
20
|
+
case '@path':
|
|
21
|
+
return req.path;
|
|
22
|
+
default: {
|
|
23
|
+
const v = req.headers[id];
|
|
24
|
+
if (v === undefined) {
|
|
25
|
+
throw new SignatureBaseError(`missing covered component: ${id}`);
|
|
26
|
+
}
|
|
27
|
+
return v.trim();
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
class SignatureBaseError extends Error {
|
|
32
|
+
constructor(message) {
|
|
33
|
+
super(message);
|
|
34
|
+
this.name = 'SignatureBaseError';
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
exports.SignatureBaseError = SignatureBaseError;
|
|
38
|
+
function serializeSignatureParams(components, params) {
|
|
39
|
+
const inner = components.map((c) => `"${c}"`).join(' ');
|
|
40
|
+
let out = `(${inner})`;
|
|
41
|
+
out += `;created=${params.created}`;
|
|
42
|
+
if (params.expires !== undefined)
|
|
43
|
+
out += `;expires=${params.expires}`;
|
|
44
|
+
out += `;keyid="${params.keyid}"`;
|
|
45
|
+
out += `;alg="${params.alg ?? exports.SIGNATURE_ALG}"`;
|
|
46
|
+
return out;
|
|
47
|
+
}
|
|
48
|
+
function buildSignatureBase(req, params, components = exports.COVERED_COMPONENTS) {
|
|
49
|
+
const lines = [];
|
|
50
|
+
for (const id of components) {
|
|
51
|
+
lines.push(`"${id}": ${componentValue(id, req)}`);
|
|
52
|
+
}
|
|
53
|
+
const paramsValue = serializeSignatureParams(components, params);
|
|
54
|
+
lines.push(`"@signature-params": ${paramsValue}`);
|
|
55
|
+
return lines.join('\n');
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=signature-base.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"signature-base.js","sourceRoot":"","sources":["../../../src/auth/rfc9421/signature-base.ts"],"names":[],"mappings":";;;AA4HA,4DAWC;AAcD,gDAYC;AA/HD,qDAAyD;AAG5C,QAAA,YAAY,GAAG,YAAY,CAAC;AAG5B,QAAA,iBAAiB,GAAG,YAAY,CAAC;AAGjC,QAAA,aAAa,GAAG,SAAS,CAAC;AAM1B,QAAA,kBAAkB,GAAsB;IACnD,SAAS;IACT,OAAO;IACP,sCAAqB;IACrB,oBAAY;CACJ,CAAC;AAmCX,SAAS,cAAc,CAAC,EAAU,EAAE,GAAmB;IACrD,QAAQ,EAAE,EAAE,CAAC;QACX,KAAK,SAAS;YACZ,OAAO,GAAG,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;QAClC,KAAK,OAAO;YACV,OAAO,GAAG,CAAC,IAAI,CAAC;QAClB,OAAO,CAAC,CAAC,CAAC;YAER,MAAM,CAAC,GAAG,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YAC1B,IAAI,CAAC,KAAK,SAAS,EAAE,CAAC;gBACpB,MAAM,IAAI,kBAAkB,CAAC,8BAA8B,EAAE,EAAE,CAAC,CAAC;YACnE,CAAC;YAED,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;QAClB,CAAC;IACH,CAAC;AACH,CAAC;AAGD,MAAa,kBAAmB,SAAQ,KAAK;IAC3C,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAC;IACnC,CAAC;CACF;AALD,gDAKC;AAWD,SAAgB,wBAAwB,CACtC,UAA6B,EAC7B,MAAuB;IAEvB,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACxD,IAAI,GAAG,GAAG,IAAI,KAAK,GAAG,CAAC;IACvB,GAAG,IAAI,YAAY,MAAM,CAAC,OAAO,EAAE,CAAC;IACpC,IAAI,MAAM,CAAC,OAAO,KAAK,SAAS;QAAE,GAAG,IAAI,YAAY,MAAM,CAAC,OAAO,EAAE,CAAC;IACtE,GAAG,IAAI,WAAW,MAAM,CAAC,KAAK,GAAG,CAAC;IAClC,GAAG,IAAI,SAAS,MAAM,CAAC,GAAG,IAAI,qBAAa,GAAG,CAAC;IAC/C,OAAO,GAAG,CAAC;AACb,CAAC;AAcD,SAAgB,kBAAkB,CAChC,GAAmB,EACnB,MAAuB,EACvB,aAAgC,0BAAkB;IAElD,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,MAAM,EAAE,IAAI,UAAU,EAAE,CAAC;QAC5B,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,cAAc,CAAC,EAAE,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;IACpD,CAAC;IACD,MAAM,WAAW,GAAG,wBAAwB,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;IACjE,KAAK,CAAC,IAAI,CAAC,wBAAwB,WAAW,EAAE,CAAC,CAAC;IAClD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export type VerifyFailureCode = 'missing_signature' | 'malformed_signature' | 'unsupported_alg' | 'covered_components_mismatch' | 'missing_component' | 'digest_mismatch' | 'price_mismatch' | 'keyid_mismatch' | 'signature_invalid';
|
|
2
|
+
export type VerifyResult = {
|
|
3
|
+
ok: true;
|
|
4
|
+
keyid: string;
|
|
5
|
+
price: string;
|
|
6
|
+
created: number;
|
|
7
|
+
} | {
|
|
8
|
+
ok: false;
|
|
9
|
+
code: VerifyFailureCode;
|
|
10
|
+
detail?: string;
|
|
11
|
+
};
|
|
12
|
+
export interface VerifyOptions {
|
|
13
|
+
method: string;
|
|
14
|
+
path: string;
|
|
15
|
+
expectedPrice: string;
|
|
16
|
+
label?: string;
|
|
17
|
+
}
|
|
18
|
+
export declare function verify(headers: Record<string, string>, rawBody: Uint8Array, opts: VerifyOptions): VerifyResult;
|
|
19
|
+
//# sourceMappingURL=verify.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"verify.d.ts","sourceRoot":"","sources":["../../../src/auth/rfc9421/verify.ts"],"names":[],"mappings":"AAyCA,MAAM,MAAM,iBAAiB,GACzB,mBAAmB,GACnB,qBAAqB,GACrB,iBAAiB,GACjB,6BAA6B,GAC7B,mBAAmB,GACnB,iBAAiB,GACjB,gBAAgB,GAChB,gBAAgB,GAChB,mBAAmB,CAAC;AAGxB,MAAM,MAAM,YAAY,GACpB;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAC3D;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,IAAI,EAAE,iBAAiB,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAG5D,MAAM,WAAW,aAAa;IAM5B,MAAM,EAAE,MAAM,CAAC;IAEf,IAAI,EAAE,MAAM,CAAC;IAOb,aAAa,EAAE,MAAM,CAAC;IAMtB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AA6ID,wBAAgB,MAAM,CACpB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC/B,OAAO,EAAE,UAAU,EACnB,IAAI,EAAE,aAAa,GAClB,YAAY,CAmGd"}
|
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.verify = verify;
|
|
4
|
+
const ed25519_1 = require("@noble/curves/ed25519");
|
|
5
|
+
const content_digest_1 = require("./content-digest");
|
|
6
|
+
const signature_base_1 = require("./signature-base");
|
|
7
|
+
function parseSignatureInput(value) {
|
|
8
|
+
const out = new Map();
|
|
9
|
+
for (const member of splitTopLevel(value, ',')) {
|
|
10
|
+
const eq = member.indexOf('=');
|
|
11
|
+
if (eq < 0)
|
|
12
|
+
return undefined;
|
|
13
|
+
const label = member.slice(0, eq).trim();
|
|
14
|
+
const rest = member.slice(eq + 1).trim();
|
|
15
|
+
if (!label || rest[0] !== '(')
|
|
16
|
+
return undefined;
|
|
17
|
+
const close = rest.indexOf(')');
|
|
18
|
+
if (close < 0)
|
|
19
|
+
return undefined;
|
|
20
|
+
const inner = rest.slice(1, close).trim();
|
|
21
|
+
const components = [];
|
|
22
|
+
if (inner.length > 0) {
|
|
23
|
+
for (const tok of inner.split(/\s+/)) {
|
|
24
|
+
const m = /^"([^"]*)"$/.exec(tok);
|
|
25
|
+
if (!m || m[1] === undefined)
|
|
26
|
+
return undefined;
|
|
27
|
+
components.push(m[1]);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
const paramStr = rest.slice(close + 1);
|
|
31
|
+
let created;
|
|
32
|
+
let expires;
|
|
33
|
+
let keyid;
|
|
34
|
+
let alg;
|
|
35
|
+
for (const p of paramStr.split(';')) {
|
|
36
|
+
const t = p.trim();
|
|
37
|
+
if (!t)
|
|
38
|
+
continue;
|
|
39
|
+
const pe = t.indexOf('=');
|
|
40
|
+
if (pe < 0)
|
|
41
|
+
return undefined;
|
|
42
|
+
const k = t.slice(0, pe).trim();
|
|
43
|
+
const v = t.slice(pe + 1).trim();
|
|
44
|
+
switch (k) {
|
|
45
|
+
case 'created':
|
|
46
|
+
created = Number(v);
|
|
47
|
+
if (!Number.isInteger(created))
|
|
48
|
+
return undefined;
|
|
49
|
+
break;
|
|
50
|
+
case 'expires':
|
|
51
|
+
expires = Number(v);
|
|
52
|
+
if (!Number.isInteger(expires))
|
|
53
|
+
return undefined;
|
|
54
|
+
break;
|
|
55
|
+
case 'keyid':
|
|
56
|
+
keyid = stripQuotes(v);
|
|
57
|
+
break;
|
|
58
|
+
case 'alg':
|
|
59
|
+
alg = stripQuotes(v);
|
|
60
|
+
break;
|
|
61
|
+
default:
|
|
62
|
+
break;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
if (created === undefined || keyid === undefined)
|
|
66
|
+
return undefined;
|
|
67
|
+
out.set(label, {
|
|
68
|
+
label,
|
|
69
|
+
components,
|
|
70
|
+
params: { created, expires, keyid, alg },
|
|
71
|
+
raw: rest,
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
return out.size > 0 ? out : undefined;
|
|
75
|
+
}
|
|
76
|
+
function parseSignature(value) {
|
|
77
|
+
const out = new Map();
|
|
78
|
+
for (const member of splitTopLevel(value, ',')) {
|
|
79
|
+
const eq = member.indexOf('=');
|
|
80
|
+
if (eq < 0)
|
|
81
|
+
return undefined;
|
|
82
|
+
const label = member.slice(0, eq).trim();
|
|
83
|
+
const rest = member.slice(eq + 1).trim();
|
|
84
|
+
const m = /^:([A-Za-z0-9+/]+={0,2}):$/.exec(rest);
|
|
85
|
+
if (!label || !m || m[1] === undefined)
|
|
86
|
+
return undefined;
|
|
87
|
+
out.set(label, new Uint8Array(Buffer.from(m[1], 'base64')));
|
|
88
|
+
}
|
|
89
|
+
return out.size > 0 ? out : undefined;
|
|
90
|
+
}
|
|
91
|
+
function splitTopLevel(s, sep) {
|
|
92
|
+
const parts = [];
|
|
93
|
+
let depth = 0;
|
|
94
|
+
let inQuote = false;
|
|
95
|
+
let start = 0;
|
|
96
|
+
for (let i = 0; i < s.length; i++) {
|
|
97
|
+
const ch = s[i];
|
|
98
|
+
if (ch === '"')
|
|
99
|
+
inQuote = !inQuote;
|
|
100
|
+
else if (!inQuote && ch === '(')
|
|
101
|
+
depth++;
|
|
102
|
+
else if (!inQuote && ch === ')')
|
|
103
|
+
depth--;
|
|
104
|
+
else if (!inQuote && depth === 0 && ch === sep) {
|
|
105
|
+
parts.push(s.slice(start, i));
|
|
106
|
+
start = i + 1;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
parts.push(s.slice(start));
|
|
110
|
+
return parts.map((p) => p.trim()).filter((p) => p.length > 0);
|
|
111
|
+
}
|
|
112
|
+
function stripQuotes(v) {
|
|
113
|
+
const m = /^"([\s\S]*)"$/.exec(v);
|
|
114
|
+
return m && m[1] !== undefined ? m[1] : v;
|
|
115
|
+
}
|
|
116
|
+
function sameComponents(a, b) {
|
|
117
|
+
if (a.length !== b.length)
|
|
118
|
+
return false;
|
|
119
|
+
const sa = [...a].sort();
|
|
120
|
+
const sb = [...b].sort();
|
|
121
|
+
return sa.every((v, i) => v === sb[i]);
|
|
122
|
+
}
|
|
123
|
+
function verify(headers, rawBody, opts) {
|
|
124
|
+
const sigInputHeader = headers['signature-input'];
|
|
125
|
+
const sigHeader = headers['signature'];
|
|
126
|
+
if (!sigInputHeader || !sigHeader) {
|
|
127
|
+
return { ok: false, code: 'missing_signature' };
|
|
128
|
+
}
|
|
129
|
+
const inputs = parseSignatureInput(sigInputHeader);
|
|
130
|
+
const sigs = parseSignature(sigHeader);
|
|
131
|
+
if (!inputs || !sigs) {
|
|
132
|
+
return { ok: false, code: 'malformed_signature' };
|
|
133
|
+
}
|
|
134
|
+
let label = opts.label;
|
|
135
|
+
if (!label) {
|
|
136
|
+
if (inputs.size !== 1) {
|
|
137
|
+
return { ok: false, code: 'malformed_signature', detail: 'ambiguous signature label' };
|
|
138
|
+
}
|
|
139
|
+
[label] = inputs.keys();
|
|
140
|
+
}
|
|
141
|
+
if (label === undefined) {
|
|
142
|
+
return { ok: false, code: 'malformed_signature', detail: 'no signature label' };
|
|
143
|
+
}
|
|
144
|
+
const input = inputs.get(label);
|
|
145
|
+
const sigBytes = sigs.get(label);
|
|
146
|
+
if (!input || !sigBytes) {
|
|
147
|
+
return { ok: false, code: 'malformed_signature', detail: `no signature for label ${label}` };
|
|
148
|
+
}
|
|
149
|
+
const alg = input.params.alg ?? signature_base_1.SIGNATURE_ALG;
|
|
150
|
+
if (alg !== signature_base_1.SIGNATURE_ALG) {
|
|
151
|
+
return { ok: false, code: 'unsupported_alg', detail: alg };
|
|
152
|
+
}
|
|
153
|
+
if (!sameComponents(input.components, signature_base_1.COVERED_COMPONENTS)) {
|
|
154
|
+
return { ok: false, code: 'covered_components_mismatch' };
|
|
155
|
+
}
|
|
156
|
+
const digestResult = (0, content_digest_1.verifyContentDigest)(headers['content-digest'], rawBody);
|
|
157
|
+
if (!digestResult.ok) {
|
|
158
|
+
return { ok: false, code: 'digest_mismatch', detail: digestResult.reason };
|
|
159
|
+
}
|
|
160
|
+
const signedPrice = headers[signature_base_1.PRICE_HEADER];
|
|
161
|
+
if (signedPrice === undefined) {
|
|
162
|
+
return { ok: false, code: 'missing_component', detail: signature_base_1.PRICE_HEADER };
|
|
163
|
+
}
|
|
164
|
+
if (signedPrice !== opts.expectedPrice) {
|
|
165
|
+
return { ok: false, code: 'price_mismatch', detail: `signed=${signedPrice}` };
|
|
166
|
+
}
|
|
167
|
+
const req = {
|
|
168
|
+
method: opts.method,
|
|
169
|
+
path: opts.path,
|
|
170
|
+
headers,
|
|
171
|
+
};
|
|
172
|
+
let base;
|
|
173
|
+
try {
|
|
174
|
+
base = (0, signature_base_1.buildSignatureBase)(req, input.params, input.components);
|
|
175
|
+
}
|
|
176
|
+
catch (err) {
|
|
177
|
+
if (err instanceof signature_base_1.SignatureBaseError) {
|
|
178
|
+
return { ok: false, code: 'missing_component', detail: err.message };
|
|
179
|
+
}
|
|
180
|
+
throw err;
|
|
181
|
+
}
|
|
182
|
+
const keyid = input.params.keyid;
|
|
183
|
+
let publicKey;
|
|
184
|
+
try {
|
|
185
|
+
publicKey = hexToBytesStrict(keyid);
|
|
186
|
+
if (publicKey.length !== 32) {
|
|
187
|
+
return { ok: false, code: 'keyid_mismatch', detail: 'keyid is not a 32-byte ed25519 pubkey' };
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
catch {
|
|
191
|
+
return { ok: false, code: 'keyid_mismatch', detail: 'keyid is not valid hex' };
|
|
192
|
+
}
|
|
193
|
+
let valid = false;
|
|
194
|
+
try {
|
|
195
|
+
valid = ed25519_1.ed25519.verify(sigBytes, new TextEncoder().encode(base), publicKey);
|
|
196
|
+
}
|
|
197
|
+
catch {
|
|
198
|
+
valid = false;
|
|
199
|
+
}
|
|
200
|
+
if (!valid) {
|
|
201
|
+
return { ok: false, code: 'signature_invalid' };
|
|
202
|
+
}
|
|
203
|
+
return { ok: true, keyid, price: signedPrice, created: input.params.created };
|
|
204
|
+
}
|
|
205
|
+
function hexToBytesStrict(hex) {
|
|
206
|
+
if (hex.length % 2 !== 0 || !/^[0-9a-fA-F]*$/.test(hex)) {
|
|
207
|
+
throw new Error('invalid hex');
|
|
208
|
+
}
|
|
209
|
+
const out = new Uint8Array(hex.length / 2);
|
|
210
|
+
for (let i = 0; i < out.length; i++) {
|
|
211
|
+
out[i] = parseInt(hex.slice(i * 2, i * 2 + 2), 16);
|
|
212
|
+
}
|
|
213
|
+
return out;
|
|
214
|
+
}
|
|
215
|
+
//# sourceMappingURL=verify.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"verify.js","sourceRoot":"","sources":["../../../src/auth/rfc9421/verify.ts"],"names":[],"mappings":"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"}
|
|
@@ -22,7 +22,7 @@ export declare class BTPClientManager {
|
|
|
22
22
|
getPeerStatus(): Map<string, boolean>;
|
|
23
23
|
getPeerIds(): string[];
|
|
24
24
|
getClientForPeer(peerId: string): BTPClient | undefined;
|
|
25
|
-
getPeerTransport(peerId: string): 'direct' |
|
|
25
|
+
getPeerTransport(peerId: string): 'direct' | undefined;
|
|
26
26
|
isConnected(peerId: string): boolean;
|
|
27
27
|
getConnectedPeerCount(): number;
|
|
28
28
|
getTotalPeerCount(): number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"btp-client-manager.d.ts","sourceRoot":"","sources":["../../src/btp/btp-client-manager.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,IAAI,EAAsB,MAAM,cAAc,CAAC;AACnE,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAC5F,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAO5D,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAqC;IAC9D,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,cAAc,CAA8B;IACpD,OAAO,CAAC,aAAa,CAAyD;gBAOlE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;IAwB1C,eAAe,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI,KAAK,IAAI,CAAC,KAAK,GAAG,SAAS,CAAC,GAAG,IAAI,GAAG,IAAI;IAQ/E,gBAAgB,CAAC,aAAa,EAAE,aAAa,GAAG,IAAI;IAa9C,OAAO,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAiGlC,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAiCzC,UAAU,CACd,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,gBAAgB,EACxB,YAAY,CAAC,EAAE,KAAK,CAAC;QAAE,YAAY,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,GAChF,OAAO,CAAC,gBAAgB,GAAG,eAAe,CAAC;IAiE9C,aAAa,IAAI,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC;IAYrC,UAAU,IAAI,MAAM,EAAE;IAUtB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS;IAWvD,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,QAAQ,GAAG,
|
|
1
|
+
{"version":3,"file":"btp-client-manager.d.ts","sourceRoot":"","sources":["../../src/btp/btp-client-manager.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,IAAI,EAAsB,MAAM,cAAc,CAAC;AACnE,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAC5F,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAO5D,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAqC;IAC9D,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,cAAc,CAA8B;IACpD,OAAO,CAAC,aAAa,CAAyD;gBAOlE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;IAwB1C,eAAe,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI,KAAK,IAAI,CAAC,KAAK,GAAG,SAAS,CAAC,GAAG,IAAI,GAAG,IAAI;IAQ/E,gBAAgB,CAAC,aAAa,EAAE,aAAa,GAAG,IAAI;IAa9C,OAAO,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAiGlC,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAiCzC,UAAU,CACd,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,gBAAgB,EACxB,YAAY,CAAC,EAAE,KAAK,CAAC;QAAE,YAAY,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,GAChF,OAAO,CAAC,gBAAgB,GAAG,eAAe,CAAC;IAiE9C,aAAa,IAAI,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC;IAYrC,UAAU,IAAI,MAAM,EAAE;IAUtB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS;IAWvD,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,QAAQ,GAAG,SAAS;IAUtD,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO;IAUpC,qBAAqB,IAAI,MAAM;IAU/B,iBAAiB,IAAI,MAAM;IAS3B,mBAAmB,IAAI,MAAM;CAQ9B"}
|
package/dist/btp/btp-client.d.ts
CHANGED
|
@@ -9,7 +9,7 @@ export interface Peer {
|
|
|
9
9
|
authToken: string;
|
|
10
10
|
connected: boolean;
|
|
11
11
|
lastSeen: Date;
|
|
12
|
-
transport?: 'direct'
|
|
12
|
+
transport?: 'direct';
|
|
13
13
|
}
|
|
14
14
|
export declare class BTPConnectionError extends Error {
|
|
15
15
|
constructor(message: string);
|
|
@@ -37,7 +37,7 @@ export declare class BTPClient extends EventEmitter {
|
|
|
37
37
|
private readonly _agentFactory?;
|
|
38
38
|
constructor(peer: Peer, nodeId: string, logger: Logger, maxRetries?: number, agentFactory?: (peer: Peer) => http.Agent | undefined);
|
|
39
39
|
get isConnected(): boolean;
|
|
40
|
-
getTransport(): 'direct' |
|
|
40
|
+
getTransport(): 'direct' | undefined;
|
|
41
41
|
sendRawFrameForTesting(frame: Buffer): boolean;
|
|
42
42
|
setPacketHandler(packetHandler: PacketHandler): void;
|
|
43
43
|
connect(): Promise<void>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"btp-client.d.ts","sourceRoot":"","sources":["../../src/btp/btp-client.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAE7B,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAWzC,OAAO,EACL,gBAAgB,EAChB,gBAAgB,EAChB,eAAe,EAEhB,MAAM,uBAAuB,CAAC;AAE/B,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAK5D,MAAM,WAAW,IAAI;IAEnB,EAAE,EAAE,MAAM,CAAC;IAQX,GAAG,EAAE,MAAM,CAAC;IAEZ,SAAS,EAAE,MAAM,CAAC;IAElB,SAAS,EAAE,OAAO,CAAC;IAEnB,QAAQ,EAAE,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"btp-client.d.ts","sourceRoot":"","sources":["../../src/btp/btp-client.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAE7B,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAWzC,OAAO,EACL,gBAAgB,EAChB,gBAAgB,EAChB,eAAe,EAEhB,MAAM,uBAAuB,CAAC;AAE/B,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAK5D,MAAM,WAAW,IAAI;IAEnB,EAAE,EAAE,MAAM,CAAC;IAQX,GAAG,EAAE,MAAM,CAAC;IAEZ,SAAS,EAAE,MAAM,CAAC;IAElB,SAAS,EAAE,OAAO,CAAC;IAEnB,QAAQ,EAAE,IAAI,CAAC;IAIf,SAAS,CAAC,EAAE,QAAQ,CAAC;CACtB;AAUD,qBAAa,kBAAmB,SAAQ,KAAK;gBAC/B,OAAO,EAAE,MAAM;CAK5B;AAKD,qBAAa,sBAAuB,SAAQ,KAAK;gBACnC,OAAO,EAAE,MAAM;CAK5B;AAeD,qBAAa,SAAU,SAAQ,YAAY;IACzC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAO;IAC7B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,GAAG,CAA0B;IACrC,OAAO,CAAC,gBAAgB,CAAmC;IAC3D,OAAO,CAAC,WAAW,CAAK;IACxB,OAAO,CAAC,WAAW,CAAK;IACxB,OAAO,CAAC,iBAAiB,CAAK;IAC9B,OAAO,CAAC,gBAAgB,CAA0C;IAClE,OAAO,CAAC,aAAa,CAA+B;IACpD,OAAO,CAAC,YAAY,CAA+B;IACnD,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAS;IACzC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAS;IACxC,OAAO,CAAC,mBAAmB,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,2BAA2B,CAG1C;IAEF,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,cAAc,CAA8B;IACpD,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAyC;gBAuBtE,IAAI,EAAE,IAAI,EACV,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,UAAU,CAAC,EAAE,MAAM,EACnB,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,IAAI,CAAC,KAAK,GAAG,SAAS;IAevD,IAAI,WAAW,IAAI,OAAO,CAEzB;IASD,YAAY,IAAI,QAAQ,GAAG,SAAS;IA0BpC,sBAAsB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAY9C,gBAAgB,CAAC,aAAa,EAAE,aAAa,GAAG,IAAI;IAQ9C,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IA0GxB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;YA4BnB,aAAa;IAsFrB,UAAU,CACd,MAAM,EAAE,gBAAgB,EACxB,YAAY,CAAC,EAAE,KAAK,CAAC;QAAE,YAAY,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,GAChF,OAAO,CAAC,gBAAgB,GAAG,eAAe,CAAC;IA6ExC,gBAAgB,CAAC,YAAY,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;YAsDhF,cAAc;IA+K5B,OAAO,CAAC,YAAY;YA6BN,MAAM;IAmCpB,OAAO,CAAC,eAAe;IAqBvB,OAAO,CAAC,cAAc;IAgBtB,OAAO,CAAC,WAAW;IAanB,OAAO,CAAC,kBAAkB;CAI3B"}
|