@meshline/sdk 0.0.0-stage → 0.1.0-alpha.1
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/LICENSE +21 -0
- package/README.md +43 -2
- package/dist/channels/repository.d.ts +73 -0
- package/dist/channels/repository.d.ts.map +1 -0
- package/dist/channels/repository.js +367 -0
- package/dist/channels/repository.js.map +1 -0
- package/dist/client/account-operations.d.ts +41 -0
- package/dist/client/account-operations.d.ts.map +1 -0
- package/dist/client/account-operations.js +304 -0
- package/dist/client/account-operations.js.map +1 -0
- package/dist/client/conversations.d.ts +36 -0
- package/dist/client/conversations.d.ts.map +1 -0
- package/dist/client/conversations.js +144 -0
- package/dist/client/conversations.js.map +1 -0
- package/dist/client.d.ts +53 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +162 -0
- package/dist/client.js.map +1 -0
- package/dist/components/account.d.ts +38 -0
- package/dist/components/account.d.ts.map +1 -0
- package/dist/components/account.js +243 -0
- package/dist/components/account.js.map +1 -0
- package/dist/components/channel.d.ts +78 -0
- package/dist/components/channel.d.ts.map +1 -0
- package/dist/components/channel.js +475 -0
- package/dist/components/channel.js.map +1 -0
- package/dist/components/component.d.ts +49 -0
- package/dist/components/component.d.ts.map +1 -0
- package/dist/components/component.js +194 -0
- package/dist/components/component.js.map +1 -0
- package/dist/components/device.d.ts +60 -0
- package/dist/components/device.d.ts.map +1 -0
- package/dist/components/device.js +648 -0
- package/dist/components/device.js.map +1 -0
- package/dist/components/group.d.ts +141 -0
- package/dist/components/group.d.ts.map +1 -0
- package/dist/components/group.js +933 -0
- package/dist/components/group.js.map +1 -0
- package/dist/components/message.d.ts +63 -0
- package/dist/components/message.d.ts.map +1 -0
- package/dist/components/message.js +439 -0
- package/dist/components/message.js.map +1 -0
- package/dist/components/profile.d.ts +37 -0
- package/dist/components/profile.d.ts.map +1 -0
- package/dist/components/profile.js +232 -0
- package/dist/components/profile.js.map +1 -0
- package/dist/crypto/groups.d.ts +56 -0
- package/dist/crypto/groups.d.ts.map +1 -0
- package/dist/crypto/groups.js +163 -0
- package/dist/crypto/groups.js.map +1 -0
- package/dist/crypto/messages.d.ts +52 -0
- package/dist/crypto/messages.d.ts.map +1 -0
- package/dist/crypto/messages.js +180 -0
- package/dist/crypto/messages.js.map +1 -0
- package/dist/crypto/primitives.d.ts +30 -0
- package/dist/crypto/primitives.d.ts.map +1 -0
- package/dist/crypto/primitives.js +102 -0
- package/dist/crypto/primitives.js.map +1 -0
- package/dist/errors.d.ts +11 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +14 -0
- package/dist/errors.js.map +1 -0
- package/dist/groups/account-sync.d.ts +28 -0
- package/dist/groups/account-sync.d.ts.map +1 -0
- package/dist/groups/account-sync.js +235 -0
- package/dist/groups/account-sync.js.map +1 -0
- package/dist/groups/messages.d.ts +39 -0
- package/dist/groups/messages.d.ts.map +1 -0
- package/dist/groups/messages.js +141 -0
- package/dist/groups/messages.js.map +1 -0
- package/dist/groups/operations.d.ts +57 -0
- package/dist/groups/operations.d.ts.map +1 -0
- package/dist/groups/operations.js +225 -0
- package/dist/groups/operations.js.map +1 -0
- package/dist/groups/repository.d.ts +56 -0
- package/dist/groups/repository.d.ts.map +1 -0
- package/dist/groups/repository.js +254 -0
- package/dist/groups/repository.js.map +1 -0
- package/dist/groups/secrets.d.ts +67 -0
- package/dist/groups/secrets.d.ts.map +1 -0
- package/dist/groups/secrets.js +452 -0
- package/dist/groups/secrets.js.map +1 -0
- package/dist/groups/state.d.ts +39 -0
- package/dist/groups/state.d.ts.map +1 -0
- package/dist/groups/state.js +201 -0
- package/dist/groups/state.js.map +1 -0
- package/dist/identity/identifiers.d.ts +9 -0
- package/dist/identity/identifiers.d.ts.map +1 -0
- package/dist/identity/identifiers.js +37 -0
- package/dist/identity/identifiers.js.map +1 -0
- package/dist/identity/neo.d.ts +11 -0
- package/dist/identity/neo.d.ts.map +1 -0
- package/dist/identity/neo.js +77 -0
- package/dist/identity/neo.js.map +1 -0
- package/dist/index.d.ts +53 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +46 -0
- package/dist/index.js.map +1 -0
- package/dist/interactions.d.ts +31 -0
- package/dist/interactions.d.ts.map +1 -0
- package/dist/interactions.js +2 -0
- package/dist/interactions.js.map +1 -0
- package/dist/messages/account-sender.d.ts +9 -0
- package/dist/messages/account-sender.d.ts.map +1 -0
- package/dist/messages/account-sender.js +46 -0
- package/dist/messages/account-sender.js.map +1 -0
- package/dist/messages/contacts.d.ts +103 -0
- package/dist/messages/contacts.d.ts.map +1 -0
- package/dist/messages/contacts.js +525 -0
- package/dist/messages/contacts.js.map +1 -0
- package/dist/messages/outbox.d.ts +66 -0
- package/dist/messages/outbox.d.ts.map +1 -0
- package/dist/messages/outbox.js +167 -0
- package/dist/messages/outbox.js.map +1 -0
- package/dist/messages/receiver.d.ts +35 -0
- package/dist/messages/receiver.d.ts.map +1 -0
- package/dist/messages/receiver.js +113 -0
- package/dist/messages/receiver.js.map +1 -0
- package/dist/messages/repository.d.ts +89 -0
- package/dist/messages/repository.d.ts.map +1 -0
- package/dist/messages/repository.js +295 -0
- package/dist/messages/repository.js.map +1 -0
- package/dist/models/authentication.d.ts +37 -0
- package/dist/models/authentication.d.ts.map +1 -0
- package/dist/models/authentication.js +53 -0
- package/dist/models/authentication.js.map +1 -0
- package/dist/models/channels.d.ts +141 -0
- package/dist/models/channels.d.ts.map +1 -0
- package/dist/models/channels.js +258 -0
- package/dist/models/channels.js.map +1 -0
- package/dist/models/contacts.d.ts +68 -0
- package/dist/models/contacts.d.ts.map +1 -0
- package/dist/models/contacts.js +186 -0
- package/dist/models/contacts.js.map +1 -0
- package/dist/models/content.d.ts +37 -0
- package/dist/models/content.d.ts.map +1 -0
- package/dist/models/content.js +137 -0
- package/dist/models/content.js.map +1 -0
- package/dist/models/device-state.d.ts +8 -0
- package/dist/models/device-state.d.ts.map +1 -0
- package/dist/models/device-state.js +22 -0
- package/dist/models/device-state.js.map +1 -0
- package/dist/models/group-admission.d.ts +111 -0
- package/dist/models/group-admission.d.ts.map +1 -0
- package/dist/models/group-admission.js +153 -0
- package/dist/models/group-admission.js.map +1 -0
- package/dist/models/group-keys.d.ts +30 -0
- package/dist/models/group-keys.d.ts.map +1 -0
- package/dist/models/group-keys.js +52 -0
- package/dist/models/group-keys.js.map +1 -0
- package/dist/models/group-management.d.ts +190 -0
- package/dist/models/group-management.d.ts.map +1 -0
- package/dist/models/group-management.js +263 -0
- package/dist/models/group-management.js.map +1 -0
- package/dist/models/groups.d.ts +81 -0
- package/dist/models/groups.d.ts.map +1 -0
- package/dist/models/groups.js +127 -0
- package/dist/models/groups.js.map +1 -0
- package/dist/models/identity.d.ts +47 -0
- package/dist/models/identity.d.ts.map +1 -0
- package/dist/models/identity.js +136 -0
- package/dist/models/identity.js.map +1 -0
- package/dist/models/messages.d.ts +104 -0
- package/dist/models/messages.d.ts.map +1 -0
- package/dist/models/messages.js +168 -0
- package/dist/models/messages.js.map +1 -0
- package/dist/models/profile.d.ts +24 -0
- package/dist/models/profile.d.ts.map +1 -0
- package/dist/models/profile.js +47 -0
- package/dist/models/profile.js.map +1 -0
- package/dist/models/relay.d.ts +39 -0
- package/dist/models/relay.d.ts.map +1 -0
- package/dist/models/relay.js +160 -0
- package/dist/models/relay.js.map +1 -0
- package/dist/protocol/codec.d.ts +36 -0
- package/dist/protocol/codec.d.ts.map +1 -0
- package/dist/protocol/codec.js +144 -0
- package/dist/protocol/codec.js.map +1 -0
- package/dist/protocol/context.d.ts +14 -0
- package/dist/protocol/context.d.ts.map +1 -0
- package/dist/protocol/context.js +43 -0
- package/dist/protocol/context.js.map +1 -0
- package/dist/protocol/encoding.d.ts +15 -0
- package/dist/protocol/encoding.d.ts.map +1 -0
- package/dist/protocol/encoding.js +133 -0
- package/dist/protocol/encoding.js.map +1 -0
- package/dist/protocol/json.d.ts +16 -0
- package/dist/protocol/json.d.ts.map +1 -0
- package/dist/protocol/json.js +172 -0
- package/dist/protocol/json.js.map +1 -0
- package/dist/protocol/validation.d.ts +4 -0
- package/dist/protocol/validation.d.ts.map +1 -0
- package/dist/protocol/validation.js +18 -0
- package/dist/protocol/validation.js.map +1 -0
- package/dist/runtime/abort.d.ts +6 -0
- package/dist/runtime/abort.d.ts.map +1 -0
- package/dist/runtime/abort.js +32 -0
- package/dist/runtime/abort.js.map +1 -0
- package/dist/runtime/async-gate.d.ts +6 -0
- package/dist/runtime/async-gate.d.ts.map +1 -0
- package/dist/runtime/async-gate.js +15 -0
- package/dist/runtime/async-gate.js.map +1 -0
- package/dist/runtime/async-pulse.d.ts +7 -0
- package/dist/runtime/async-pulse.d.ts.map +1 -0
- package/dist/runtime/async-pulse.js +23 -0
- package/dist/runtime/async-pulse.js.map +1 -0
- package/dist/runtime/clock.d.ts +16 -0
- package/dist/runtime/clock.d.ts.map +1 -0
- package/dist/runtime/clock.js +62 -0
- package/dist/runtime/clock.js.map +1 -0
- package/dist/runtime/events.d.ts +11 -0
- package/dist/runtime/events.d.ts.map +1 -0
- package/dist/runtime/events.js +45 -0
- package/dist/runtime/events.js.map +1 -0
- package/dist/runtime/url.d.ts +3 -0
- package/dist/runtime/url.d.ts.map +1 -0
- package/dist/runtime/url.js +23 -0
- package/dist/runtime/url.js.map +1 -0
- package/dist/storage/signed-request.d.ts +14 -0
- package/dist/storage/signed-request.d.ts.map +1 -0
- package/dist/storage/signed-request.js +26 -0
- package/dist/storage/signed-request.js.map +1 -0
- package/dist/storage/store.d.ts +58 -0
- package/dist/storage/store.d.ts.map +1 -0
- package/dist/storage/store.js +52 -0
- package/dist/storage/store.js.map +1 -0
- package/dist/storage/transaction.d.ts +7 -0
- package/dist/storage/transaction.d.ts.map +1 -0
- package/dist/storage/transaction.js +22 -0
- package/dist/storage/transaction.js.map +1 -0
- package/dist/transport/client.d.ts +61 -0
- package/dist/transport/client.d.ts.map +1 -0
- package/dist/transport/client.js +392 -0
- package/dist/transport/client.js.map +1 -0
- package/dist/transport/discovery.d.ts +19 -0
- package/dist/transport/discovery.d.ts.map +1 -0
- package/dist/transport/discovery.js +75 -0
- package/dist/transport/discovery.js.map +1 -0
- package/dist/transport/endpoint.d.ts +6 -0
- package/dist/transport/endpoint.d.ts.map +1 -0
- package/dist/transport/endpoint.js +35 -0
- package/dist/transport/endpoint.js.map +1 -0
- package/dist/transport/http.d.ts +52 -0
- package/dist/transport/http.d.ts.map +1 -0
- package/dist/transport/http.js +128 -0
- package/dist/transport/http.js.map +1 -0
- package/dist/transport/pool.d.ts +31 -0
- package/dist/transport/pool.d.ts.map +1 -0
- package/dist/transport/pool.js +137 -0
- package/dist/transport/pool.js.map +1 -0
- package/dist/transport/relay-error.d.ts +23 -0
- package/dist/transport/relay-error.d.ts.map +1 -0
- package/dist/transport/relay-error.js +47 -0
- package/dist/transport/relay-error.js.map +1 -0
- package/dist/transport/rpc.d.ts +31 -0
- package/dist/transport/rpc.d.ts.map +1 -0
- package/dist/transport/rpc.js +56 -0
- package/dist/transport/rpc.js.map +1 -0
- package/dist/transport/session.d.ts +49 -0
- package/dist/transport/session.d.ts.map +1 -0
- package/dist/transport/session.js +169 -0
- package/dist/transport/session.js.map +1 -0
- package/dist/transport/socket.d.ts +55 -0
- package/dist/transport/socket.d.ts.map +1 -0
- package/dist/transport/socket.js +266 -0
- package/dist/transport/socket.js.map +1 -0
- package/dist/transport/subscription.d.ts +36 -0
- package/dist/transport/subscription.d.ts.map +1 -0
- package/dist/transport/subscription.js +169 -0
- package/dist/transport/subscription.js.map +1 -0
- package/package.json +35 -4
- package/src/channels/repository.ts +244 -0
- package/src/client/account-operations.ts +183 -0
- package/src/client/conversations.ts +95 -0
- package/src/client.ts +108 -0
- package/src/components/account.ts +206 -0
- package/src/components/channel.ts +253 -0
- package/src/components/component.ts +151 -0
- package/src/components/device.ts +455 -0
- package/src/components/group.ts +546 -0
- package/src/components/message.ts +253 -0
- package/src/components/profile.ts +179 -0
- package/src/crypto/groups.ts +107 -0
- package/src/crypto/messages.ts +129 -0
- package/src/crypto/primitives.ts +103 -0
- package/src/errors.ts +13 -0
- package/src/groups/account-sync.ts +144 -0
- package/src/groups/messages.ts +89 -0
- package/src/groups/operations.ts +145 -0
- package/src/groups/repository.ts +161 -0
- package/src/groups/secrets.ts +256 -0
- package/src/groups/state.ts +138 -0
- package/src/identity/identifiers.ts +41 -0
- package/src/identity/neo.ts +72 -0
- package/src/index.ts +52 -0
- package/src/interactions.ts +35 -0
- package/src/messages/account-sender.ts +33 -0
- package/src/messages/contacts.ts +379 -0
- package/src/messages/outbox.ts +152 -0
- package/src/messages/receiver.ts +86 -0
- package/src/messages/repository.ts +230 -0
- package/src/models/authentication.ts +63 -0
- package/src/models/channels.ts +155 -0
- package/src/models/contacts.ts +141 -0
- package/src/models/content.ts +105 -0
- package/src/models/device-state.ts +18 -0
- package/src/models/group-admission.ts +110 -0
- package/src/models/group-keys.ts +34 -0
- package/src/models/group-management.ts +182 -0
- package/src/models/groups.ts +100 -0
- package/src/models/identity.ts +164 -0
- package/src/models/messages.ts +139 -0
- package/src/models/profile.ts +46 -0
- package/src/models/relay.ts +151 -0
- package/src/protocol/codec.ts +144 -0
- package/src/protocol/context.ts +39 -0
- package/src/protocol/encoding.ts +106 -0
- package/src/protocol/json.ts +140 -0
- package/src/protocol/validation.ts +13 -0
- package/src/runtime/abort.ts +27 -0
- package/src/runtime/async-gate.ts +16 -0
- package/src/runtime/async-pulse.ts +20 -0
- package/src/runtime/clock.ts +63 -0
- package/src/runtime/events.ts +31 -0
- package/src/runtime/url.ts +17 -0
- package/src/storage/signed-request.ts +26 -0
- package/src/storage/store.ts +90 -0
- package/src/storage/transaction.ts +17 -0
- package/src/transport/client.ts +328 -0
- package/src/transport/discovery.ts +64 -0
- package/src/transport/endpoint.ts +32 -0
- package/src/transport/http.ts +129 -0
- package/src/transport/pool.ts +115 -0
- package/src/transport/relay-error.ts +46 -0
- package/src/transport/rpc.ts +56 -0
- package/src/transport/session.ts +154 -0
- package/src/transport/socket.ts +248 -0
- package/src/transport/subscription.ts +117 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../src/transport/http.ts"],"names":[],"mappings":"AAGA,OAAO,EAA2C,KAAK,UAAU,EAAE,KAAK,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAC/G,OAAO,EAA2C,KAAK,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAEjG,OAAO,EAAuE,KAAK,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAE1H,MAAM,MAAM,UAAU,GAAG,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,OAAO,GAAG,QAAQ,CAAC;AACrE,MAAM,WAAW,cAAc;IAC3B,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAC;IAC5B,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IACnD,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;IAC7B,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC;IAC3B,QAAQ,CAAC,cAAc,EAAE,aAAa,CAAC;CAC1C;AACD,MAAM,WAAW,kBAAkB;IAC/B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,UAAU,CAAC,EAAE,OAAO,CAAC;IAC9B,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,OAAO,EAAE;QAAE,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC;IACvD,QAAQ,CAAC,IAAI,CAAC,EAAE;QAAE,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;KAAE,GAAG,IAAI,CAAC;IACnD,WAAW,IAAI,OAAO,CAAC,WAAW,CAAC,CAAC;CACvC;AACD,iHAAiH;AACjH,MAAM,MAAM,UAAU,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,cAAc,KAAK,OAAO,CAAC,kBAAkB,CAAC,CAAC;AAE5F,yGAAyG;AACzG,qBAAa,YAAY;;IAET,QAAQ,CAAC,KAAK,EAAE,YAAY;IAAxC,YAAqB,KAAK,GAAE,YAA0B,EAAI;IAC1D,KAAK,CAAC,OAAO,EAAE,YAAY,GAAG,IAAI,CAEjC;IACK,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAO9C;CACJ;AAED,mFAAmF;AACnF,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAclE;AAMD,MAAM,WAAW,yBAAyB;IAAG,QAAQ,CAAC,KAAK,CAAC,EAAE,UAAU,CAAC;IAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,YAAY,CAAC;IAAC,QAAQ,CAAC,0BAA0B,CAAC,EAAE,MAAM,CAAA;CAAE;AAEzJ,qBAAa,kBAAkB;;IAI3B,QAAQ,CAAC,OAAO,EAAE,YAAY,CAAC;IAC/B,YAAY,OAAO,GAAE,yBAA8B,EAKlD;IAEK,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,UAAU,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,SAAS,GAAG,SAAS,CAAC,CA0C/J;IAED,6DAA6D;IAC7D,OAAO,IAAI,IAAI,CAAoG;CACtH"}
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
import { createAbortController } from '../runtime/abort.js';
|
|
2
|
+
import { ProtocolError } from '../errors.js';
|
|
3
|
+
import { validateAuthToken } from '../models/authentication.js';
|
|
4
|
+
import { canonicalJson, parseJson, requireObject } from '../protocol/json.js';
|
|
5
|
+
import { abortScope, systemClock, throwIfAborted } from '../runtime/clock.js';
|
|
6
|
+
import { validateMethodName, webEndpoint } from './endpoint.js';
|
|
7
|
+
import { RelayError, relayFailureCodec, retryAfter, validateRetryAfterHeader } from './relay-error.js';
|
|
8
|
+
/** Share between HTTP and WebSocket for one relay. A rejected request is never automatically retried. */
|
|
9
|
+
export class RelayBackoff {
|
|
10
|
+
clock;
|
|
11
|
+
#until = 0;
|
|
12
|
+
constructor(clock = systemClock) {
|
|
13
|
+
this.clock = clock;
|
|
14
|
+
}
|
|
15
|
+
apply(failure) {
|
|
16
|
+
if (failure.code === 'rate_limited')
|
|
17
|
+
this.#until = Math.max(this.#until, this.clock.monotonicMilliseconds() + Math.max(1, retryAfter(failure) ?? 1) * 1000);
|
|
18
|
+
}
|
|
19
|
+
async wait(signal) {
|
|
20
|
+
for (;;) {
|
|
21
|
+
throwIfAborted(signal);
|
|
22
|
+
const remaining = this.#until - this.clock.monotonicMilliseconds();
|
|
23
|
+
if (remaining <= 0)
|
|
24
|
+
return;
|
|
25
|
+
await this.clock.delay(Math.min(remaining, 60_000), signal);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
/** Strict media-type parsing avoids accepting a second hidden non-UTF8 charset. */
|
|
30
|
+
export function validateJsonContentType(value) {
|
|
31
|
+
if (value === null)
|
|
32
|
+
throw new ProtocolError('invalid_content_type', 'Relay responses require application/json with UTF-8 encoding.');
|
|
33
|
+
const token = "[!#$%&'*+.^_`|~0-9a-z-]+";
|
|
34
|
+
const match = /^\s*application\/json\s*/i.exec(value);
|
|
35
|
+
if (!match)
|
|
36
|
+
throw new ProtocolError('invalid_content_type', 'Relay responses require application/json with UTF-8 encoding.');
|
|
37
|
+
let rest = value.slice(match[0].length);
|
|
38
|
+
const parameter = new RegExp(`^;\\s*(${token})\\s*=\\s*(${token}|"(?:[^"\\\\\\r\\n]|\\\\[^\\r\\n])*")\\s*`, 'i');
|
|
39
|
+
while (rest.length !== 0) {
|
|
40
|
+
const part = parameter.exec(rest);
|
|
41
|
+
if (!part)
|
|
42
|
+
throw new ProtocolError('invalid_content_type', 'Malformed relay content type.');
|
|
43
|
+
const parameterValue = part[2].startsWith('"') ? part[2].slice(1, -1).replace(/\\(.)/g, '$1') : part[2];
|
|
44
|
+
if (part[1].toLowerCase() === 'charset' && parameterValue.toLowerCase() !== 'utf-8')
|
|
45
|
+
throw new ProtocolError('invalid_content_type', 'Relay response charset must be UTF-8.');
|
|
46
|
+
rest = rest.slice(part[0].length);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
function escapeQuery(value) {
|
|
50
|
+
return encodeURIComponent(value).replace(/[!'()*]/g, character => `%${character.charCodeAt(0).toString(16).toUpperCase()}`);
|
|
51
|
+
}
|
|
52
|
+
export class HttpRelayTransport {
|
|
53
|
+
#fetch;
|
|
54
|
+
#lifetime = createAbortController();
|
|
55
|
+
#timeout;
|
|
56
|
+
backoff;
|
|
57
|
+
constructor(options = {}) {
|
|
58
|
+
this.#fetch = options.fetch ?? ((url, init) => fetch(url, init));
|
|
59
|
+
this.backoff = options.backoff ?? new RelayBackoff();
|
|
60
|
+
this.#timeout = options.requestTimeoutMilliseconds ?? 60_000;
|
|
61
|
+
if (!Number.isSafeInteger(this.#timeout) || this.#timeout < 1 || this.#timeout > 2_147_483_647)
|
|
62
|
+
throw new RangeError('Invalid relay request timeout.');
|
|
63
|
+
}
|
|
64
|
+
async request(endpoint, method, name, parameters, token, signal) {
|
|
65
|
+
validateMethodName(name);
|
|
66
|
+
if (!['GET', 'POST', 'PUT', 'PATCH', 'DELETE'].includes(method))
|
|
67
|
+
throw new ProtocolError('invalid_method', 'Unsupported HTTP method.');
|
|
68
|
+
let address = webEndpoint(endpoint, 'https:').href.replace(/\/+$/, '') + '/' + name.replaceAll('.', '/');
|
|
69
|
+
let body = parameters === undefined ? undefined : canonicalJson(requireObject(parameters));
|
|
70
|
+
if (method === 'GET' && parameters !== undefined) {
|
|
71
|
+
address += '?' + Object.entries(parameters).map(([key, value]) => {
|
|
72
|
+
if (typeof value !== 'string' && typeof value !== 'number' && typeof value !== 'boolean')
|
|
73
|
+
throw new ProtocolError('invalid_query', 'GET parameters must be non-null scalars.');
|
|
74
|
+
return `${escapeQuery(key)}=${escapeQuery(String(value))}`;
|
|
75
|
+
}).join('&');
|
|
76
|
+
body = undefined;
|
|
77
|
+
}
|
|
78
|
+
const headers = { Accept: 'application/json' };
|
|
79
|
+
if (token !== undefined) {
|
|
80
|
+
validateAuthToken(token);
|
|
81
|
+
headers['X-Meshline-Session'] = token;
|
|
82
|
+
}
|
|
83
|
+
if (body !== undefined)
|
|
84
|
+
headers['Content-Type'] = 'application/json; charset=utf-8';
|
|
85
|
+
const lifetime = abortScope([signal, this.#lifetime.signal]);
|
|
86
|
+
let deadline;
|
|
87
|
+
try {
|
|
88
|
+
await this.backoff.wait(lifetime.signal);
|
|
89
|
+
deadline = abortScope([lifetime.signal], this.#timeout);
|
|
90
|
+
throwIfAborted(deadline.signal);
|
|
91
|
+
const response = await this.#fetch(address, { method, headers, ...(body === undefined ? {} : { body }), signal: deadline.signal,
|
|
92
|
+
redirect: 'error', credentials: 'omit', cache: 'no-store', referrerPolicy: 'no-referrer' });
|
|
93
|
+
if (response.redirected || response.type === 'opaqueredirect' || response.status >= 300 && response.status < 400) {
|
|
94
|
+
await response.body?.cancel();
|
|
95
|
+
throw new ProtocolError('redirect_rejected', 'Relay redirects are not permitted.');
|
|
96
|
+
}
|
|
97
|
+
if (response.status === 204) {
|
|
98
|
+
await response.body?.cancel();
|
|
99
|
+
return undefined;
|
|
100
|
+
}
|
|
101
|
+
try {
|
|
102
|
+
validateJsonContentType(response.headers.get('content-type'));
|
|
103
|
+
}
|
|
104
|
+
catch (error) {
|
|
105
|
+
await response.body?.cancel();
|
|
106
|
+
throw error;
|
|
107
|
+
}
|
|
108
|
+
const value = parseJson(new Uint8Array(await response.arrayBuffer()));
|
|
109
|
+
throwIfAborted(deadline.signal);
|
|
110
|
+
if (response.status < 200 || response.status >= 300) {
|
|
111
|
+
const failure = relayFailureCodec.decode(value);
|
|
112
|
+
validateRetryAfterHeader(failure, response.status, response.headers.get('retry-after'));
|
|
113
|
+
this.backoff.apply(failure);
|
|
114
|
+
throw new RelayError(failure, response.status);
|
|
115
|
+
}
|
|
116
|
+
if (response.status !== 200)
|
|
117
|
+
throw new ProtocolError('invalid_http_status', 'A method returning a result must return HTTP 200.');
|
|
118
|
+
return value;
|
|
119
|
+
}
|
|
120
|
+
finally {
|
|
121
|
+
deadline?.dispose();
|
|
122
|
+
lifetime.dispose();
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
/** Cancels active requests and makes later requests fail. */
|
|
126
|
+
dispose() { this.#lifetime.abort(new DOMException('The HTTP relay transport was disposed.', 'AbortError')); }
|
|
127
|
+
}
|
|
128
|
+
//# sourceMappingURL=http.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http.js","sourceRoot":"","sources":["../../src/transport/http.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { RelayRegistry } from '../interactions.js';
|
|
2
|
+
import type { NetworkContext } from '../protocol/context.js';
|
|
3
|
+
import { type EventListener } from '../runtime/events.js';
|
|
4
|
+
import { RelayClient, type RelayTransportOptions } from './client.js';
|
|
5
|
+
import { type AuthenticationIdentity } from './session.js';
|
|
6
|
+
export interface RelayClientPoolOptions extends RelayTransportOptions {
|
|
7
|
+
readonly context: NetworkContext;
|
|
8
|
+
readonly accountId: string;
|
|
9
|
+
}
|
|
10
|
+
export interface RelayPoolEvents {
|
|
11
|
+
readonly poolChanged: readonly RelayClient[];
|
|
12
|
+
readonly relayChanged: RelayClient;
|
|
13
|
+
readonly errorOccurred: unknown;
|
|
14
|
+
}
|
|
15
|
+
/** Owns account/device sessions separately; a pool binds to one network, account and device. */
|
|
16
|
+
export declare class RelayClientPool {
|
|
17
|
+
#private;
|
|
18
|
+
readonly registry: RelayRegistry;
|
|
19
|
+
readonly context: NetworkContext;
|
|
20
|
+
readonly accountId: string;
|
|
21
|
+
constructor(options: RelayClientPoolOptions, registry: RelayRegistry);
|
|
22
|
+
get clients(): readonly RelayClient[];
|
|
23
|
+
/** Last application observer failure; transport failures remain on each relay client's state. */
|
|
24
|
+
get lastError(): unknown;
|
|
25
|
+
on<K extends keyof RelayPoolEvents>(event: K, listener: EventListener<RelayPoolEvents[K]>): () => void;
|
|
26
|
+
get(relayId: string, identity?: AuthenticationIdentity, signal?: AbortSignal): Promise<RelayClient>;
|
|
27
|
+
/** Device registration/key changes require new device sessions; account sessions remain independent. */
|
|
28
|
+
invalidateDevice(): Promise<void>;
|
|
29
|
+
dispose(): Promise<void>;
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=pool.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pool.d.ts","sourceRoot":"","sources":["../../src/transport/pool.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAExD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAE7D,OAAO,EAAY,KAAK,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACpE,OAAO,EAAE,WAAW,EAAE,KAAK,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACtE,OAAO,EAAsB,KAAK,sBAAsB,EAAE,MAAM,cAAc,CAAC;AAE/E,MAAM,WAAW,sBAAuB,SAAQ,qBAAqB;IAAG,QAAQ,CAAC,OAAO,EAAE,cAAc,CAAC;IAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;CAAE;AACtI,MAAM,WAAW,eAAe;IAAG,QAAQ,CAAC,WAAW,EAAE,SAAS,WAAW,EAAE,CAAC;IAAC,QAAQ,CAAC,YAAY,EAAE,WAAW,CAAC;IAAC,QAAQ,CAAC,aAAa,EAAE,OAAO,CAAA;CAAE;AAGtJ,gGAAgG;AAChG,qBAAa,eAAe;;IAWqB,QAAQ,CAAC,QAAQ,EAAE,aAAa;IAF7E,QAAQ,CAAC,OAAO,EAAE,cAAc,CAAC;IACjC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,YAAY,OAAO,EAAE,sBAAsB,EAAW,QAAQ,EAAE,aAAa,EAI5E;IACD,IAAI,OAAO,IAAI,SAAS,WAAW,EAAE,CAA8G;IACnJ,iGAAiG;IACjG,IAAI,SAAS,IAAI,OAAO,CAA4B;IACpD,EAAE,CAAC,CAAC,SAAS,MAAM,eAAe,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,aAAa,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,IAAI,CAA6C;IAU7I,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,sBAAsB,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC,CAmCxG;IAcD,wGAAwG;IAClG,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC,CAKtC;IAOD,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAMvB;CACJ"}
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
import { createAbortController } from '../runtime/abort.js';
|
|
2
|
+
import { ProtocolError } from '../errors.js';
|
|
3
|
+
import { validateAccountId, validateRelayId } from '../identity/neo.js';
|
|
4
|
+
import { certificateId } from '../models/identity.js';
|
|
5
|
+
import { awaitWithSignal, throwIfAborted } from '../runtime/clock.js';
|
|
6
|
+
import { EventHub } from '../runtime/events.js';
|
|
7
|
+
import { RelayClient } from './client.js';
|
|
8
|
+
import { RelayAuthenticator } from './session.js';
|
|
9
|
+
/** Owns account/device sessions separately; a pool binds to one network, account and device. */
|
|
10
|
+
export class RelayClientPool {
|
|
11
|
+
registry;
|
|
12
|
+
#events = new EventHub();
|
|
13
|
+
#entries = new Map();
|
|
14
|
+
#retirements = new Set();
|
|
15
|
+
#lifetime = createAbortController();
|
|
16
|
+
#options;
|
|
17
|
+
#deviceId;
|
|
18
|
+
#disposal;
|
|
19
|
+
#lastError;
|
|
20
|
+
context;
|
|
21
|
+
accountId;
|
|
22
|
+
constructor(options, registry) {
|
|
23
|
+
this.registry = registry;
|
|
24
|
+
validateAccountId(options.accountId);
|
|
25
|
+
if (options.context.toString() !== registry.context.toString())
|
|
26
|
+
throw new ProtocolError('invalid_context', 'Registry and client network contexts differ.');
|
|
27
|
+
this.context = options.context;
|
|
28
|
+
this.accountId = options.accountId;
|
|
29
|
+
this.#options = { ...options };
|
|
30
|
+
}
|
|
31
|
+
get clients() { return Object.freeze([...this.#entries.values()].flatMap(entries => entries.map(entry => entry.client))); }
|
|
32
|
+
/** Last application observer failure; transport failures remain on each relay client's state. */
|
|
33
|
+
get lastError() { return this.#lastError; }
|
|
34
|
+
on(event, listener) { return this.#events.on(event, listener); }
|
|
35
|
+
#notify(event, value) {
|
|
36
|
+
this.#events.notify(event, value, error => {
|
|
37
|
+
this.#lastError = error;
|
|
38
|
+
this.#events.notify('errorOccurred', error, observerError => {
|
|
39
|
+
this.#lastError = new AggregateError([error, observerError], 'Pool observer and error observer failed.');
|
|
40
|
+
});
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
async get(relayId, identity, signal) {
|
|
44
|
+
throwIfAborted(signal);
|
|
45
|
+
throwIfAborted(this.#lifetime.signal);
|
|
46
|
+
validateRelayId(relayId);
|
|
47
|
+
if (this.registry.context.toString() !== this.context.toString())
|
|
48
|
+
throw new ProtocolError('context_changed', 'Registry network context changed.');
|
|
49
|
+
if (identity) {
|
|
50
|
+
const account = identity.mode === 'account' ? identity.signer.accountId : identity.signer.certificate.account;
|
|
51
|
+
if (account !== this.accountId)
|
|
52
|
+
throw new ProtocolError('invalid_identity', 'Signer belongs to another account.');
|
|
53
|
+
if (identity.mode === 'device') {
|
|
54
|
+
const device = certificateId(identity.signer.certificate, this.context);
|
|
55
|
+
if (this.#deviceId !== undefined && this.#deviceId !== device)
|
|
56
|
+
throw new ProtocolError('invalid_identity', 'Pool is already bound to another device.');
|
|
57
|
+
this.#deviceId = device;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
let entries = this.#entries.get(relayId);
|
|
61
|
+
let entry = identity ? entries?.find(entry => entry.mode === identity.mode) : entries?.[0];
|
|
62
|
+
if (!entry) {
|
|
63
|
+
const authenticator = identity === undefined ? undefined : new RelayAuthenticator(relayId, this.context, identity, this.#options.clock);
|
|
64
|
+
const client = new RelayClient(relayId, this.registry, this.#options, authenticator);
|
|
65
|
+
entry = { client, mode: identity?.mode, retired: false, ready: Promise.resolve() };
|
|
66
|
+
if (!entries) {
|
|
67
|
+
entries = [];
|
|
68
|
+
this.#entries.set(relayId, entries);
|
|
69
|
+
}
|
|
70
|
+
entries.push(entry);
|
|
71
|
+
const captured = entry;
|
|
72
|
+
client.on('stateChanged', () => this.#notify('relayChanged', client));
|
|
73
|
+
client.on('faulted', () => { this.#retire(captured); });
|
|
74
|
+
// Publish only after the readiness promise is installed, so a callback
|
|
75
|
+
// acquiring the same relay waits for this authentication too.
|
|
76
|
+
entry.ready = Promise.resolve().then(async () => {
|
|
77
|
+
this.#notify('poolChanged', this.clients);
|
|
78
|
+
if (authenticator)
|
|
79
|
+
await client.authenticate(this.#lifetime.signal);
|
|
80
|
+
});
|
|
81
|
+
entry.ready.then(() => undefined, () => { this.#retire(captured); });
|
|
82
|
+
}
|
|
83
|
+
await awaitWithSignal(entry.ready, signal);
|
|
84
|
+
throwIfAborted(this.#lifetime.signal);
|
|
85
|
+
throwIfAborted(signal);
|
|
86
|
+
if (entry.retired)
|
|
87
|
+
throw new ProtocolError('retired_client', 'Relay client was retired while being acquired.');
|
|
88
|
+
return entry.client;
|
|
89
|
+
}
|
|
90
|
+
#retire(entry) {
|
|
91
|
+
if (entry.retired)
|
|
92
|
+
return;
|
|
93
|
+
entry.retired = true;
|
|
94
|
+
const entries = this.#entries.get(entry.client.relayId);
|
|
95
|
+
entries.splice(entries.indexOf(entry), 1);
|
|
96
|
+
if (entries.length === 0)
|
|
97
|
+
this.#entries.delete(entry.client.relayId);
|
|
98
|
+
const cleanup = (async () => { await entry.client.dispose(); this.#notify('poolChanged', this.clients); })();
|
|
99
|
+
this.#retirements.add(cleanup);
|
|
100
|
+
// Keep failed retirements for dispose/invalidate to surface; successful ones need no retained task.
|
|
101
|
+
cleanup.then(() => this.#retirements.delete(cleanup), () => undefined);
|
|
102
|
+
}
|
|
103
|
+
/** Device registration/key changes require new device sessions; account sessions remain independent. */
|
|
104
|
+
async invalidateDevice() {
|
|
105
|
+
throwIfAborted(this.#lifetime.signal);
|
|
106
|
+
for (const entries of [...this.#entries.values()])
|
|
107
|
+
for (const entry of [...entries])
|
|
108
|
+
if (entry.mode === 'device')
|
|
109
|
+
this.#retire(entry);
|
|
110
|
+
this.#deviceId = undefined;
|
|
111
|
+
await this.#finishRetirements();
|
|
112
|
+
}
|
|
113
|
+
async #finishRetirements() {
|
|
114
|
+
const jobs = [...this.#retirements];
|
|
115
|
+
const results = await Promise.allSettled(jobs);
|
|
116
|
+
for (const job of jobs)
|
|
117
|
+
this.#retirements.delete(job);
|
|
118
|
+
const errors = results.filter((result) => result.status === 'rejected').map(result => result.reason);
|
|
119
|
+
if (errors.length)
|
|
120
|
+
throw new AggregateError(errors, 'Relay client retirement failed.');
|
|
121
|
+
}
|
|
122
|
+
dispose() {
|
|
123
|
+
return this.#disposal ??= (async () => {
|
|
124
|
+
this.#lifetime.abort(new DOMException('Relay client pool was disposed.', 'AbortError'));
|
|
125
|
+
for (const entries of [...this.#entries.values()])
|
|
126
|
+
for (const entry of [...entries])
|
|
127
|
+
this.#retire(entry);
|
|
128
|
+
try {
|
|
129
|
+
await this.#finishRetirements();
|
|
130
|
+
}
|
|
131
|
+
finally {
|
|
132
|
+
this.#events.clear();
|
|
133
|
+
}
|
|
134
|
+
})();
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
//# sourceMappingURL=pool.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pool.js","sourceRoot":"","sources":["../../src/transport/pool.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { type ExtensibleModel } from '../protocol/codec.js';
|
|
2
|
+
import { type JsonObject } from '../protocol/json.js';
|
|
3
|
+
export interface RelayFailure extends ExtensibleModel {
|
|
4
|
+
readonly code: string;
|
|
5
|
+
readonly message: string;
|
|
6
|
+
readonly data?: JsonObject;
|
|
7
|
+
}
|
|
8
|
+
export declare const relayFailureCodec: import("../protocol/codec.js").ProtocolCodec<RelayFailure>;
|
|
9
|
+
export declare const rpcErrorCodes: Readonly<Record<string, number>>;
|
|
10
|
+
export declare function retryAfter(failure: RelayFailure): number | undefined;
|
|
11
|
+
/** Only isDefinitiveRejection proves that a business operation was not accepted. */
|
|
12
|
+
export declare class RelayError extends Error {
|
|
13
|
+
readonly httpStatus?: number | undefined;
|
|
14
|
+
readonly rpcCode?: number | undefined;
|
|
15
|
+
readonly name = "RelayError";
|
|
16
|
+
readonly failure: RelayFailure;
|
|
17
|
+
constructor(failure: RelayFailure, httpStatus?: number | undefined, rpcCode?: number | undefined);
|
|
18
|
+
get code(): string;
|
|
19
|
+
get retryAfter(): number | undefined;
|
|
20
|
+
get isDefinitiveRejection(): boolean;
|
|
21
|
+
}
|
|
22
|
+
export declare function validateRetryAfterHeader(failure: RelayFailure, status: number, header: string | null): void;
|
|
23
|
+
//# sourceMappingURL=relay-error.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"relay-error.d.ts","sourceRoot":"","sources":["../../src/transport/relay-error.ts"],"names":[],"mappings":"AACA,OAAO,EAAqB,KAAK,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAC/E,OAAO,EAAqC,KAAK,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAEzF,MAAM,WAAW,YAAa,SAAQ,eAAe;IAAG,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,UAAU,CAAA;CAAE;AACrI,eAAO,MAAM,iBAAiB,4DAG5B,CAAC;AAEH,eAAO,MAAM,aAAa,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAKzD,CAAC;AAGH,wBAAgB,UAAU,CAAC,OAAO,EAAE,YAAY,GAAG,MAAM,GAAG,SAAS,CAIpE;AAED,oFAAoF;AACpF,qBAAa,UAAW,SAAQ,KAAK;IAGE,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM;IAAE,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM;IAF1F,SAAkB,IAAI,gBAAgB;IACtC,QAAQ,CAAC,OAAO,EAAE,YAAY,CAAC;IAC/B,YAAY,OAAO,EAAE,YAAY,EAAW,UAAU,CAAC,EAAE,MAAM,YAAA,EAAW,OAAO,CAAC,EAAE,MAAM,YAAA,EAIzF;IACD,IAAI,IAAI,IAAI,MAAM,CAA8B;IAChD,IAAI,UAAU,IAAI,MAAM,GAAG,SAAS,CAAqC;IACzE,IAAI,qBAAqB,IAAI,OAAO,CAA2C;CAClF;AAED,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAO3G"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { ProtocolError } from '../errors.js';
|
|
2
|
+
import { defineCodec, text } from '../protocol/codec.js';
|
|
3
|
+
import { requireObject, requireSafeInteger } from '../protocol/json.js';
|
|
4
|
+
export const relayFailureCodec = defineCodec({
|
|
5
|
+
code: { wire: 'code', codec: text }, message: { wire: 'message', codec: text },
|
|
6
|
+
data: { wire: 'data', codec: { decode: requireObject, encode: requireObject }, optional: true },
|
|
7
|
+
});
|
|
8
|
+
export const rpcErrorCodes = Object.freeze({
|
|
9
|
+
bad_request: -32602, method_not_found: -32601, internal_error: -32603, unauthorized: -32001, forbidden: -32003,
|
|
10
|
+
invalid_signature: -32004, device_unknown: -32005, clock_skew: -32006, not_found: -32010, state_conflict: -32011,
|
|
11
|
+
stale_state: -32012, invalid_state: -32013, message_expired: -32014, request_too_large: -32015, target_not_local: -32020,
|
|
12
|
+
route_stale: -32021, route_not_found: -32022, bad_gateway: -32023, rate_limited: -32030, temporarily_unavailable: -32031,
|
|
13
|
+
});
|
|
14
|
+
const definitiveCodes = new Set(Object.keys(rpcErrorCodes).filter(code => !['internal_error', 'bad_gateway', 'temporarily_unavailable'].includes(code)));
|
|
15
|
+
export function retryAfter(failure) {
|
|
16
|
+
if (failure.code !== 'rate_limited' || failure.data?.retry_after === undefined)
|
|
17
|
+
return undefined;
|
|
18
|
+
requireSafeInteger(failure.data.retry_after, 0);
|
|
19
|
+
return failure.data.retry_after;
|
|
20
|
+
}
|
|
21
|
+
/** Only isDefinitiveRejection proves that a business operation was not accepted. */
|
|
22
|
+
export class RelayError extends Error {
|
|
23
|
+
httpStatus;
|
|
24
|
+
rpcCode;
|
|
25
|
+
name = 'RelayError';
|
|
26
|
+
failure;
|
|
27
|
+
constructor(failure, httpStatus, rpcCode) {
|
|
28
|
+
super(failure.message);
|
|
29
|
+
this.httpStatus = httpStatus;
|
|
30
|
+
this.rpcCode = rpcCode;
|
|
31
|
+
this.failure = relayFailureCodec.decode(relayFailureCodec.encode(failure));
|
|
32
|
+
retryAfter(this.failure);
|
|
33
|
+
}
|
|
34
|
+
get code() { return this.failure.code; }
|
|
35
|
+
get retryAfter() { return retryAfter(this.failure); }
|
|
36
|
+
get isDefinitiveRejection() { return definitiveCodes.has(this.code); }
|
|
37
|
+
}
|
|
38
|
+
export function validateRetryAfterHeader(failure, status, header) {
|
|
39
|
+
if (failure.code !== 'rate_limited')
|
|
40
|
+
return;
|
|
41
|
+
const seconds = retryAfter(failure);
|
|
42
|
+
if (header !== null && (seconds === undefined || !/^[0-9]+$/.test(header) || /\s/.test(header)
|
|
43
|
+
|| !Number.isSafeInteger(Number(header)) || Number(header) !== seconds)
|
|
44
|
+
|| status === 429 && seconds !== undefined && header === null)
|
|
45
|
+
throw new ProtocolError('invalid_retry_after', 'Retry-After must match the error retry_after value.');
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=relay-error.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"relay-error.js","sourceRoot":"","sources":["../../src/transport/relay-error.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { ProtocolError } from '../errors.js';
|
|
2
|
+
import { type JsonObject, type JsonValue } from '../protocol/json.js';
|
|
3
|
+
import { RelayError } from './relay-error.js';
|
|
4
|
+
export declare const maxSocketMessageBytes = 1048576;
|
|
5
|
+
export type RpcId = string | number;
|
|
6
|
+
export interface RpcNotification {
|
|
7
|
+
readonly method: string;
|
|
8
|
+
readonly params?: JsonObject;
|
|
9
|
+
}
|
|
10
|
+
export interface RpcFailure {
|
|
11
|
+
readonly code: number;
|
|
12
|
+
readonly message: string;
|
|
13
|
+
readonly data?: JsonObject;
|
|
14
|
+
}
|
|
15
|
+
export type RpcMessage = {
|
|
16
|
+
readonly kind: 'notification';
|
|
17
|
+
readonly notification: RpcNotification;
|
|
18
|
+
} | {
|
|
19
|
+
readonly kind: 'success';
|
|
20
|
+
readonly id: RpcId;
|
|
21
|
+
readonly result: JsonValue;
|
|
22
|
+
} | {
|
|
23
|
+
readonly kind: 'failure';
|
|
24
|
+
readonly id: RpcId | null;
|
|
25
|
+
readonly error: RpcFailure;
|
|
26
|
+
};
|
|
27
|
+
export declare function encodeRpcRequest(id: RpcId, method: string, params?: JsonObject): string;
|
|
28
|
+
/** Parses the whole message before ignoring unknown JSON-RPC wrapper extensions. */
|
|
29
|
+
export declare function decodeRpcMessage(text: string): RpcMessage;
|
|
30
|
+
export declare function rpcFailureError(error: RpcFailure): RelayError | ProtocolError;
|
|
31
|
+
//# sourceMappingURL=rpc.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rpc.d.ts","sourceRoot":"","sources":["../../src/transport/rpc.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAE7C,OAAO,EAA+D,KAAK,UAAU,EAAE,KAAK,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAEnI,OAAO,EAAE,UAAU,EAAiB,MAAM,kBAAkB,CAAC;AAE7D,eAAO,MAAM,qBAAqB,UAAY,CAAC;AAC/C,MAAM,MAAM,KAAK,GAAG,MAAM,GAAG,MAAM,CAAC;AACpC,MAAM,WAAW,eAAe;IAAG,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,UAAU,CAAA;CAAE;AAC1F,MAAM,WAAW,UAAU;IAAG,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,UAAU,CAAA;CAAE;AAC3G,MAAM,MAAM,UAAU,GAAG;IAAE,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAC;IAAC,QAAQ,CAAC,YAAY,EAAE,eAAe,CAAA;CAAE,GAC5F;IAAE,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IAAC,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAA;CAAE,GAC5E;IAAE,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IAAC,QAAQ,CAAC,EAAE,EAAE,KAAK,GAAG,IAAI,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAA;CAAE,CAAC;AAQ1F,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,UAAU,GAAG,MAAM,CAOvF;AAED,oFAAoF;AACpF,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,CAkBzD;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,UAAU,GAAG,UAAU,GAAG,aAAa,CAK7E"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { ProtocolError } from '../errors.js';
|
|
2
|
+
import { encodeUtf8 } from '../protocol/encoding.js';
|
|
3
|
+
import { canonicalJson, parseJson, requireObject, requireSafeInteger } from '../protocol/json.js';
|
|
4
|
+
import { validateMethodName } from './endpoint.js';
|
|
5
|
+
import { RelayError, rpcErrorCodes } from './relay-error.js';
|
|
6
|
+
export const maxSocketMessageBytes = 1_048_576;
|
|
7
|
+
function requireId(value) {
|
|
8
|
+
if (typeof value === 'number') {
|
|
9
|
+
requireSafeInteger(value);
|
|
10
|
+
return value;
|
|
11
|
+
}
|
|
12
|
+
if (typeof value !== 'string' || encodeUtf8(value).length > 128)
|
|
13
|
+
throw new ProtocolError('invalid_rpc_id', 'RPC IDs must be safe integers or strings of at most 128 UTF-8 bytes.');
|
|
14
|
+
return value;
|
|
15
|
+
}
|
|
16
|
+
export function encodeRpcRequest(id, method, params) {
|
|
17
|
+
requireId(id);
|
|
18
|
+
validateMethodName(method);
|
|
19
|
+
const value = { jsonrpc: '2.0', id, method, ...(params === undefined ? {} : { params: requireObject(params) }) };
|
|
20
|
+
const text = canonicalJson(value);
|
|
21
|
+
if (encodeUtf8(text).length > maxSocketMessageBytes)
|
|
22
|
+
throw new ProtocolError('request_too_large', 'A WebSocket request cannot exceed 1 MiB.');
|
|
23
|
+
return text;
|
|
24
|
+
}
|
|
25
|
+
/** Parses the whole message before ignoring unknown JSON-RPC wrapper extensions. */
|
|
26
|
+
export function decodeRpcMessage(text) {
|
|
27
|
+
if (encodeUtf8(text).length > maxSocketMessageBytes)
|
|
28
|
+
throw new ProtocolError('message_too_large', 'A WebSocket message cannot exceed 1 MiB.');
|
|
29
|
+
const value = requireObject(parseJson(text));
|
|
30
|
+
if (value.jsonrpc !== '2.0')
|
|
31
|
+
throw new ProtocolError('invalid_rpc', 'Expected JSON-RPC 2.0.');
|
|
32
|
+
const has = (key) => Object.hasOwn(value, key);
|
|
33
|
+
if (!has('id')) {
|
|
34
|
+
if (typeof value.method !== 'string' || value.method.length === 0)
|
|
35
|
+
throw new ProtocolError('invalid_rpc', 'A notification must have a method and no id.');
|
|
36
|
+
// Future method names are retained. Dispatchers may ignore notifications they do not know.
|
|
37
|
+
return { kind: 'notification', notification: { method: value.method, ...(has('params') ? { params: requireObject(value.params) } : {}) } };
|
|
38
|
+
}
|
|
39
|
+
if (has('result') === has('error'))
|
|
40
|
+
throw new ProtocolError('invalid_rpc', 'A response must contain exactly one of result or error.');
|
|
41
|
+
if (has('result'))
|
|
42
|
+
return { kind: 'success', id: requireId(value.id), result: value.result };
|
|
43
|
+
const error = requireObject(value.error);
|
|
44
|
+
requireSafeInteger(error.code);
|
|
45
|
+
if (typeof error.message !== 'string')
|
|
46
|
+
throw new ProtocolError('invalid_rpc', 'An RPC error must have a string message.');
|
|
47
|
+
return { kind: 'failure', id: value.id === null ? null : requireId(value.id),
|
|
48
|
+
error: { code: error.code, message: error.message, ...(Object.hasOwn(error, 'data') ? { data: requireObject(error.data) } : {}) } };
|
|
49
|
+
}
|
|
50
|
+
export function rpcFailureError(error) {
|
|
51
|
+
const code = Object.keys(rpcErrorCodes).find(key => rpcErrorCodes[key] === error.code);
|
|
52
|
+
return code === undefined
|
|
53
|
+
? new ProtocolError('unknown_rpc_error', `Unmapped JSON-RPC error ${error.code}: ${error.message}`)
|
|
54
|
+
: new RelayError({ code, message: error.message, ...(error.data === undefined ? {} : { data: error.data }) }, undefined, error.code);
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=rpc.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rpc.js","sourceRoot":"","sources":["../../src/transport/rpc.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import type { AccountSigner, DeviceSigner } from '../interactions.js';
|
|
2
|
+
import { type SessionCredentials, type SessionMode } from '../models/authentication.js';
|
|
3
|
+
import { NetworkContext } from '../protocol/context.js';
|
|
4
|
+
import type { JsonObject, JsonValue } from '../protocol/json.js';
|
|
5
|
+
import { type RuntimeClock } from '../runtime/clock.js';
|
|
6
|
+
import type { HttpRelayTransport } from './http.js';
|
|
7
|
+
export type AuthenticationIdentity = {
|
|
8
|
+
readonly mode: 'account';
|
|
9
|
+
readonly signer: AccountSigner;
|
|
10
|
+
} | {
|
|
11
|
+
readonly mode: 'device';
|
|
12
|
+
readonly signer: DeviceSigner;
|
|
13
|
+
};
|
|
14
|
+
export type AuthenticationSender = (method: string, parameters: JsonObject, signal?: AbortSignal) => Promise<JsonValue | undefined>;
|
|
15
|
+
/** Keeps bearer credentials out of ordinary object enumeration and diagnostic serialization. */
|
|
16
|
+
export declare class RelaySession {
|
|
17
|
+
#private;
|
|
18
|
+
readonly origin: string;
|
|
19
|
+
constructor(credentials: SessionCredentials, origin: string, challengeCreatedAt: number, started: number, clock: RuntimeClock);
|
|
20
|
+
get mode(): SessionMode;
|
|
21
|
+
get lifetimeSeconds(): number;
|
|
22
|
+
get remainingSeconds(): number;
|
|
23
|
+
/** Return only for sending a request to origin. Do not log or persist. */
|
|
24
|
+
getToken(endpoint: string): string;
|
|
25
|
+
}
|
|
26
|
+
/** Captures immutable identity at binding time; certificate renewal for the same device is allowed. */
|
|
27
|
+
export declare class RelayAuthenticator {
|
|
28
|
+
#private;
|
|
29
|
+
readonly relayId: string;
|
|
30
|
+
readonly context: NetworkContext;
|
|
31
|
+
readonly clock: RuntimeClock;
|
|
32
|
+
readonly accountId: string;
|
|
33
|
+
readonly deviceId: string | undefined;
|
|
34
|
+
readonly mode: SessionMode;
|
|
35
|
+
constructor(relayId: string, context: NetworkContext, identity: AuthenticationIdentity, clock?: RuntimeClock);
|
|
36
|
+
assertIdentity(): void;
|
|
37
|
+
authenticate(endpoint: string, send: AuthenticationSender, signal?: AbortSignal): Promise<RelaySession>;
|
|
38
|
+
}
|
|
39
|
+
/** Shares only authentication work. Canceling a waiter never cancels another caller's refresh. */
|
|
40
|
+
export declare class HttpRelaySessions {
|
|
41
|
+
#private;
|
|
42
|
+
readonly authenticator: RelayAuthenticator;
|
|
43
|
+
readonly transport: HttpRelayTransport;
|
|
44
|
+
constructor(authenticator: RelayAuthenticator, transport: HttpRelayTransport);
|
|
45
|
+
get(endpoint: string, signal?: AbortSignal): Promise<RelaySession>;
|
|
46
|
+
invalidate(session?: RelaySession): void;
|
|
47
|
+
dispose(): void;
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=session.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/transport/session.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACtE,OAAO,EAGkE,KAAK,kBAAkB,EAAE,KAAK,WAAW,EACjH,MAAM,6BAA6B,CAAC;AAErC,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAExD,OAAO,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AACjE,OAAO,EAA4D,KAAK,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAElH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AAEpD,MAAM,MAAM,sBAAsB,GAAG;IAAE,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAA;CAAE,GAAG;IAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAA;CAAE,CAAC;AAC/J,MAAM,MAAM,oBAAoB,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,CAAC,EAAE,WAAW,KAAK,OAAO,CAAC,SAAS,GAAG,SAAS,CAAC,CAAC;AAEpI,gGAAgG;AAChG,qBAAa,YAAY;;IAKwB,QAAQ,CAAC,MAAM,EAAE,MAAM;IAApE,YAAY,WAAW,EAAE,kBAAkB,EAAW,MAAM,EAAE,MAAM,EAAE,kBAAkB,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,EAKrI;IACD,IAAI,IAAI,IAAI,WAAW,CAAmC;IAC1D,IAAI,eAAe,IAAI,MAAM,CAA8C;IAC3E,IAAI,gBAAgB,IAAI,MAAM,CAAwG;IACtI,0EAA0E;IAC1E,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAIjC;CACJ;AAED,uGAAuG;AACvG,qBAAa,kBAAkB;;IAMf,QAAQ,CAAC,OAAO,EAAE,MAAM;IAAE,QAAQ,CAAC,OAAO,EAAE,cAAc;IAAoC,QAAQ,CAAC,KAAK,EAAE,YAAY;IAHtI,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC;IACtC,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;IAC3B,YAAqB,OAAO,EAAE,MAAM,EAAW,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAE,sBAAsB,EAAW,KAAK,GAAE,YAA0B,EAcnJ;IAED,cAAc,IAAI,IAAI,CAUrB;IAEK,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,oBAAoB,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC,CA4C5G;CACJ;AAED,kGAAkG;AAClG,qBAAa,iBAAiB;;IAId,QAAQ,CAAC,aAAa,EAAE,kBAAkB;IAAE,QAAQ,CAAC,SAAS,EAAE,kBAAkB;IAA9F,YAAqB,aAAa,EAAE,kBAAkB,EAAW,SAAS,EAAE,kBAAkB,EAAI;IAElG,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC,CAgBjE;IAED,UAAU,CAAC,OAAO,CAAC,EAAE,YAAY,GAAG,IAAI,CAAuF;IAC/H,OAAO,IAAI,IAAI,CAAiJ;CACnK"}
|