@tier0/sdk-v2 0.9.9 → 0.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +102 -0
- package/LICENSE +21 -21
- package/README.md +165 -27
- package/dist/cjs/client.d.ts +79 -3
- package/dist/cjs/client.js +4 -6
- package/dist/cjs/client.js.map +1 -1
- package/dist/cjs/cloud-server.d.ts +33 -26
- package/dist/cjs/cloud-server.js +102 -100
- package/dist/cjs/cloud-server.js.map +1 -1
- package/dist/cjs/cloud-transport.d.ts +15 -20
- package/dist/cjs/cloud-transport.js +87 -68
- package/dist/cjs/cloud-transport.js.map +1 -1
- package/dist/cjs/connection-diagnostics.d.ts +2 -0
- package/dist/cjs/connection-diagnostics.js +20 -0
- package/dist/cjs/connection-diagnostics.js.map +1 -0
- package/dist/cjs/data/bootstrap.js +3 -4
- package/dist/cjs/data/bootstrap.js.map +1 -1
- package/dist/cjs/data/call.d.ts +1 -3
- package/dist/cjs/data/call.js +8 -12
- package/dist/cjs/data/call.js.map +1 -1
- package/dist/cjs/data/client.d.ts +8 -7
- package/dist/cjs/data/client.js +24 -11
- package/dist/cjs/data/client.js.map +1 -1
- package/dist/cjs/data/collection.d.ts +3 -5
- package/dist/cjs/data/collection.js +3 -4
- package/dist/cjs/data/collection.js.map +1 -1
- package/dist/cjs/data/context.d.ts +5 -11
- package/dist/cjs/data/context.js +21 -36
- package/dist/cjs/data/context.js.map +1 -1
- package/dist/cjs/data/error.d.ts +1 -1
- package/dist/cjs/data/error.js +3 -3
- package/dist/cjs/data/error.js.map +1 -1
- package/dist/cjs/data/index.d.ts +5 -3
- package/dist/cjs/data/index.js +5 -5
- package/dist/cjs/data/index.js.map +1 -1
- package/dist/cjs/data/relay.d.ts +51 -0
- package/dist/cjs/data/relay.js +371 -0
- package/dist/cjs/data/relay.js.map +1 -0
- package/dist/cjs/data/subscribe.d.ts +22 -38
- package/dist/cjs/data/subscribe.js +22 -28
- package/dist/cjs/data/subscribe.js.map +1 -1
- package/dist/cjs/event-stream.d.ts +28 -0
- package/dist/cjs/event-stream.js +222 -0
- package/dist/cjs/event-stream.js.map +1 -0
- package/dist/cjs/mq/client.d.ts +32 -1
- package/dist/cjs/mq/client.js +404 -69
- package/dist/cjs/mq/client.js.map +1 -1
- package/dist/cjs/mq/index.d.ts +1 -0
- package/dist/cjs/mq/index.js +3 -1
- package/dist/cjs/mq/index.js.map +1 -1
- package/dist/cjs/mq/topic.d.ts +29 -0
- package/dist/cjs/mq/topic.js +48 -0
- package/dist/cjs/mq/topic.js.map +1 -0
- package/dist/cjs/mq/types.d.ts +21 -1
- package/dist/cjs/mq/types.js.map +1 -1
- package/dist/cjs/openapi/api.generated.d.ts +20 -0
- package/dist/cjs/openapi/api.generated.js +11 -0
- package/dist/cjs/openapi/api.generated.js.map +1 -1
- package/dist/cjs/openapi/client.d.ts +46 -0
- package/dist/cjs/openapi/client.js +161 -12
- package/dist/cjs/openapi/client.js.map +1 -1
- package/dist/cjs/openapi/codecs.generated.d.ts +74 -0
- package/dist/cjs/openapi/codecs.generated.js +1 -1
- package/dist/cjs/openapi/codecs.generated.js.map +1 -1
- package/dist/cjs/openapi/types.generated.d.ts +205 -1
- package/dist/cjs/openapi/types.generated.js.map +1 -1
- package/dist/cjs/page-runtime.d.ts +48 -0
- package/dist/cjs/page-runtime.js +74 -0
- package/dist/cjs/page-runtime.js.map +1 -0
- package/dist/cjs/platform-proxy.d.ts +17 -0
- package/dist/cjs/platform-proxy.js +52 -0
- package/dist/cjs/platform-proxy.js.map +1 -0
- package/dist/cjs/runtime-context.d.ts +2 -1
- package/dist/cjs/runtime-context.js +6 -2
- package/dist/cjs/runtime-context.js.map +1 -1
- package/dist/cjs/runtime-env.js.map +1 -1
- package/dist/cjs/source.d.ts +19 -1
- package/dist/cjs/source.js +9 -3
- package/dist/cjs/source.js.map +1 -1
- package/dist/cjs/stream.js +3 -2
- package/dist/cjs/stream.js.map +1 -1
- package/dist/cjs/streams/contract.generated.d.ts +7 -1
- package/dist/cjs/streams/contract.generated.js.map +1 -1
- package/dist/cjs/streams/messages.js +1 -10
- package/dist/cjs/streams/messages.js.map +1 -1
- package/dist/cjs/streams/requests.d.ts +3 -0
- package/dist/cjs/streams/requests.js +5 -2
- package/dist/cjs/streams/requests.js.map +1 -1
- package/dist/cjs/streams/transport.d.ts +1 -13
- package/dist/cjs/streams/transport.js +2 -18
- package/dist/cjs/streams/transport.js.map +1 -1
- package/dist/cjs/uns-v2/client.d.ts +1 -6
- package/dist/cjs/uns-v2/client.js +33 -8
- package/dist/cjs/uns-v2/client.js.map +1 -1
- package/dist/cjs/uns-v2/data-client.d.ts +5 -2
- package/dist/cjs/uns-v2/data-client.js +7 -4
- package/dist/cjs/uns-v2/data-client.js.map +1 -1
- package/dist/cjs/uns-v2/generated.d.ts +6783 -4655
- package/dist/cjs/uns-v2/generated.js +221 -65
- package/dist/cjs/uns-v2/generated.js.map +1 -1
- package/dist/cjs/uns-v2/sse.d.ts +7 -1
- package/dist/cjs/uns-v2/sse.js +12 -2
- package/dist/cjs/uns-v2/sse.js.map +1 -1
- package/dist/esm/client.d.ts +79 -3
- package/dist/esm/client.js +5 -7
- package/dist/esm/client.js.map +1 -1
- package/dist/esm/cloud-server.d.ts +33 -26
- package/dist/esm/cloud-server.js +99 -97
- package/dist/esm/cloud-server.js.map +1 -1
- package/dist/esm/cloud-transport.d.ts +15 -20
- package/dist/esm/cloud-transport.js +86 -67
- package/dist/esm/cloud-transport.js.map +1 -1
- package/dist/esm/connection-diagnostics.d.ts +2 -0
- package/dist/esm/connection-diagnostics.js +17 -0
- package/dist/esm/connection-diagnostics.js.map +1 -0
- package/dist/esm/data/bootstrap.js +3 -4
- package/dist/esm/data/bootstrap.js.map +1 -1
- package/dist/esm/data/call.d.ts +1 -3
- package/dist/esm/data/call.js +9 -13
- package/dist/esm/data/call.js.map +1 -1
- package/dist/esm/data/client.d.ts +8 -7
- package/dist/esm/data/client.js +22 -9
- package/dist/esm/data/client.js.map +1 -1
- package/dist/esm/data/collection.d.ts +3 -5
- package/dist/esm/data/collection.js +3 -4
- package/dist/esm/data/collection.js.map +1 -1
- package/dist/esm/data/context.d.ts +5 -11
- package/dist/esm/data/context.js +19 -33
- package/dist/esm/data/context.js.map +1 -1
- package/dist/esm/data/error.d.ts +1 -1
- package/dist/esm/data/error.js +3 -3
- package/dist/esm/data/error.js.map +1 -1
- package/dist/esm/data/index.d.ts +5 -3
- package/dist/esm/data/index.js +3 -2
- package/dist/esm/data/index.js.map +1 -1
- package/dist/esm/data/relay.d.ts +51 -0
- package/dist/esm/data/relay.js +368 -0
- package/dist/esm/data/relay.js.map +1 -0
- package/dist/esm/data/subscribe.d.ts +22 -38
- package/dist/esm/data/subscribe.js +22 -27
- package/dist/esm/data/subscribe.js.map +1 -1
- package/dist/esm/event-stream.d.ts +28 -0
- package/dist/esm/event-stream.js +217 -0
- package/dist/esm/event-stream.js.map +1 -0
- package/dist/esm/mq/client.d.ts +32 -1
- package/dist/esm/mq/client.js +404 -69
- package/dist/esm/mq/client.js.map +1 -1
- package/dist/esm/mq/index.d.ts +1 -0
- package/dist/esm/mq/index.js +1 -0
- package/dist/esm/mq/index.js.map +1 -1
- package/dist/esm/mq/topic.d.ts +29 -0
- package/dist/esm/mq/topic.js +44 -0
- package/dist/esm/mq/topic.js.map +1 -0
- package/dist/esm/mq/types.d.ts +21 -1
- package/dist/esm/mq/types.js.map +1 -1
- package/dist/esm/openapi/api.generated.d.ts +20 -0
- package/dist/esm/openapi/api.generated.js +11 -0
- package/dist/esm/openapi/api.generated.js.map +1 -1
- package/dist/esm/openapi/client.d.ts +46 -0
- package/dist/esm/openapi/client.js +160 -12
- package/dist/esm/openapi/client.js.map +1 -1
- package/dist/esm/openapi/codecs.generated.d.ts +74 -0
- package/dist/esm/openapi/codecs.generated.js +1 -1
- package/dist/esm/openapi/codecs.generated.js.map +1 -1
- package/dist/esm/openapi/types.generated.d.ts +205 -1
- package/dist/esm/openapi/types.generated.js.map +1 -1
- package/dist/esm/page-runtime.d.ts +48 -0
- package/dist/esm/page-runtime.js +65 -0
- package/dist/esm/page-runtime.js.map +1 -0
- package/dist/esm/platform-proxy.d.ts +17 -0
- package/dist/esm/platform-proxy.js +47 -0
- package/dist/esm/platform-proxy.js.map +1 -0
- package/dist/esm/runtime-context.d.ts +2 -1
- package/dist/esm/runtime-context.js +6 -2
- package/dist/esm/runtime-context.js.map +1 -1
- package/dist/esm/runtime-env.js.map +1 -1
- package/dist/esm/source.d.ts +19 -1
- package/dist/esm/source.js +10 -4
- package/dist/esm/source.js.map +1 -1
- package/dist/esm/stream.js +4 -3
- package/dist/esm/stream.js.map +1 -1
- package/dist/esm/streams/contract.generated.d.ts +7 -1
- package/dist/esm/streams/contract.generated.js.map +1 -1
- package/dist/esm/streams/messages.js +1 -10
- package/dist/esm/streams/messages.js.map +1 -1
- package/dist/esm/streams/requests.d.ts +3 -0
- package/dist/esm/streams/requests.js +5 -2
- package/dist/esm/streams/requests.js.map +1 -1
- package/dist/esm/streams/transport.d.ts +1 -13
- package/dist/esm/streams/transport.js +1 -17
- package/dist/esm/streams/transport.js.map +1 -1
- package/dist/esm/uns-v2/client.d.ts +1 -6
- package/dist/esm/uns-v2/client.js +33 -8
- package/dist/esm/uns-v2/client.js.map +1 -1
- package/dist/esm/uns-v2/data-client.d.ts +5 -2
- package/dist/esm/uns-v2/data-client.js +8 -5
- package/dist/esm/uns-v2/data-client.js.map +1 -1
- package/dist/esm/uns-v2/generated.d.ts +6783 -4655
- package/dist/esm/uns-v2/generated.js +221 -65
- package/dist/esm/uns-v2/generated.js.map +1 -1
- package/dist/esm/uns-v2/sse.d.ts +7 -1
- package/dist/esm/uns-v2/sse.js +12 -2
- package/dist/esm/uns-v2/sse.js.map +1 -1
- package/package.json +25 -12
- package/skills/tier0-sdk-v2/SKILL.md +13 -5
- package/skills/tier0-sdk-v2/references/integration.md +14 -24
- package/skills/tier0-sdk-v2/references/local-connection.md +61 -0
- package/skills/tier0-sdk-v2/tier0-sdk-v2-data/SKILL.md +11 -5
- package/skills/tier0-sdk-v2/tier0-sdk-v2-data/references/consistency.md +8 -12
- package/skills/tier0-sdk-v2/tier0-sdk-v2-data/references/errors.md +24 -5
- package/skills/tier0-sdk-v2/tier0-sdk-v2-data/references/modeling.md +3 -1
- package/skills/tier0-sdk-v2/tier0-sdk-v2-data/references/read-write.md +46 -13
- package/skills/tier0-sdk-v2/tier0-sdk-v2-data/references/schema-evolution.md +2 -0
- package/skills/tier0-sdk-v2/tier0-sdk-v2-members/SKILL.md +2 -2
- package/skills/tier0-sdk-v2/tier0-sdk-v2-members/references/app-members.md +5 -1
- package/skills/tier0-sdk-v2/tier0-sdk-v2-mq/SKILL.md +25 -0
- package/skills/tier0-sdk-v2/tier0-sdk-v2-mq/references/quickstart.md +1 -1
- package/skills/tier0-sdk-v2/tier0-sdk-v2-notifications/SKILL.md +3 -3
- package/skills/tier0-sdk-v2/tier0-sdk-v2-notifications/references/send.md +6 -6
- package/skills/tier0-sdk-v2/tier0-sdk-v2-source/SKILL.md +4 -4
- package/skills/tier0-sdk-v2/tier0-sdk-v2-source/references/changes.md +2 -2
- package/skills/tier0-sdk-v2/tier0-sdk-v2-source/references/create.md +26 -36
- package/skills/tier0-sdk-v2/tier0-sdk-v2-source/references/delete.md +9 -23
- package/skills/tier0-sdk-v2/tier0-sdk-v2-source/references/protocols.md +12 -29
- package/skills/tier0-sdk-v2/tier0-sdk-v2-source/references/read.md +4 -5
- package/skills/tier0-sdk-v2/tier0-sdk-v2-source/references/update.md +5 -5
- package/skills/tier0-sdk-v2/tier0-sdk-v2-stream/SKILL.md +3 -3
- package/skills/tier0-sdk-v2/tier0-sdk-v2-stream/references/create.md +23 -9
- package/skills/tier0-sdk-v2/tier0-sdk-v2-stream/references/deploy.md +14 -12
- package/skills/tier0-sdk-v2/tier0-sdk-v2-stream/references/http-server.md +4 -4
- package/skills/tier0-sdk-v2/tier0-sdk-v2-stream/references/read.md +4 -3
- package/skills/tier0-sdk-v2/tier0-sdk-v2-streams/SKILL.md +12 -12
- package/skills/tier0-sdk-v2/tier0-sdk-v2-uns/SKILL.md +3 -2
- package/skills/tier0-sdk-v2/tier0-sdk-v2-uns/references/create.md +2 -2
- package/skills/tier0-sdk-v2/tier0-sdk-v2-uns/references/delete.md +47 -20
- package/skills/tier0-sdk-v2/tier0-sdk-v2-uns/references/namespace.md +3 -3
- package/skills/tier0-sdk-v2/tier0-sdk-v2-uns/references/read.md +11 -6
- package/skills/tier0-sdk-v2/tier0-sdk-v2-uns/references/restore.md +12 -13
- package/dist/cjs/app-identity-contract.generated.d.ts +0 -22
- package/dist/cjs/app-identity-contract.generated.js +0 -51
- package/dist/cjs/app-identity-contract.generated.js.map +0 -1
- package/dist/cjs/runtime.d.ts +0 -13
- package/dist/cjs/runtime.js +0 -51
- package/dist/cjs/runtime.js.map +0 -1
- package/dist/esm/app-identity-contract.generated.d.ts +0 -22
- package/dist/esm/app-identity-contract.generated.js +0 -48
- package/dist/esm/app-identity-contract.generated.js.map +0 -1
- package/dist/esm/runtime.d.ts +0 -13
- package/dist/esm/runtime.js +0 -46
- package/dist/esm/runtime.js.map +0 -1
|
@@ -35,7 +35,6 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
35
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
36
|
exports.StreamMessagesClient = exports.StreamMessageError = void 0;
|
|
37
37
|
const runtime_context_js_1 = require("../runtime-context.js");
|
|
38
|
-
const runtime_js_1 = require("../runtime.js");
|
|
39
38
|
const transport_js_1 = require("./transport.js");
|
|
40
39
|
class StreamMessageError extends Error {
|
|
41
40
|
errorCode;
|
|
@@ -89,7 +88,6 @@ class MessageSession {
|
|
|
89
88
|
remove;
|
|
90
89
|
handler;
|
|
91
90
|
disposed = false;
|
|
92
|
-
runtime;
|
|
93
91
|
connection;
|
|
94
92
|
subscription;
|
|
95
93
|
connecting;
|
|
@@ -105,7 +103,6 @@ class MessageSession {
|
|
|
105
103
|
expiresAt = 0;
|
|
106
104
|
brokerError;
|
|
107
105
|
disposing;
|
|
108
|
-
removeRuntimeListener;
|
|
109
106
|
constructor(transport, topic, mode, report, remove, handler) {
|
|
110
107
|
this.transport = transport;
|
|
111
108
|
this.topic = topic;
|
|
@@ -113,9 +110,6 @@ class MessageSession {
|
|
|
113
110
|
this.report = report;
|
|
114
111
|
this.remove = remove;
|
|
115
112
|
this.handler = handler;
|
|
116
|
-
this.runtime = transport.runtime();
|
|
117
|
-
if (this.runtime)
|
|
118
|
-
this.removeRuntimeListener = (0, runtime_js_1.onAppRuntimeDispose)(this.runtime, () => { void this.dispose(); });
|
|
119
113
|
}
|
|
120
114
|
async ready() {
|
|
121
115
|
if (this.disposed)
|
|
@@ -157,7 +151,7 @@ class MessageSession {
|
|
|
157
151
|
return;
|
|
158
152
|
const connectionKey = createUser();
|
|
159
153
|
key = connectionKey;
|
|
160
|
-
const appId =
|
|
154
|
+
const appId = (0, runtime_context_js_1.getCurrentAppId)();
|
|
161
155
|
const request = {
|
|
162
156
|
appId, topics: [{ topic: this.topic, publish: this.mode === 'publish', subscribe: this.mode === 'subscribe' }],
|
|
163
157
|
clientPublicKey: connectionKey.getPublicKey(),
|
|
@@ -402,7 +396,6 @@ class MessageSession {
|
|
|
402
396
|
this.disposed = true;
|
|
403
397
|
this.connected = false;
|
|
404
398
|
this.abort.abort();
|
|
405
|
-
this.removeRuntimeListener?.();
|
|
406
399
|
clearTimeout(this.reconnectTimer);
|
|
407
400
|
clearTimeout(this.expiryTimer);
|
|
408
401
|
this.subscription?.unsubscribe();
|
|
@@ -480,8 +473,6 @@ class StreamMessagesClient {
|
|
|
480
473
|
if (publisher?.disposed) {
|
|
481
474
|
const previous = publisher;
|
|
482
475
|
await previous.dispose();
|
|
483
|
-
if (previous.runtime !== this.transport.runtime())
|
|
484
|
-
throw fail('DISCONNECTED', 'Stream messages disconnected.');
|
|
485
476
|
if (publisher === previous)
|
|
486
477
|
publisher = undefined;
|
|
487
478
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"messages.js","sourceRoot":"","sources":["../../../src/streams/messages.ts"],"names":[],"mappings":"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","sourcesContent":["import type { NatsConnection, Subscription } from '@nats-io/nats-core';\nimport type { KeyPair } from '@nats-io/nkeys';\nimport { getCurrentAppId } from '../runtime-context.js';\nimport { onAppRuntimeDispose } from '../runtime.js';\nimport type { StreamJSON } from './requests.js';\nimport { StreamTransport } from './transport.js';\nimport type { components } from './contract.generated.js';\n\nexport interface StreamMessage<Payload = StreamJSON> {\n version: 'stream-messages/v1';\n messageId: string;\n correlationId?: string;\n payload: Payload;\n}\nexport interface StreamMessagePublishOptions {\n messageId?: string;\n correlationId?: string;\n}\nexport interface StreamMessageSubscription {\n readonly disposed: boolean;\n dispose(): Promise<void>;\n}\nexport type StreamMessageErrorHandler = (error: StreamMessageError) => void;\nexport interface StreamMessageHandle<Payload = StreamJSON> {\n /** Resolves after broker flush, not after receiver acknowledgement. No retry or offline queue. */\n publish(payload: Payload, options?: StreamMessagePublishOptions): Promise<StreamMessage<Payload>>;\n subscribe(handler: (message: StreamMessage<Payload>) => void | Promise<void>, options?: {\n onError?: StreamMessageErrorHandler;\n }): Promise<StreamMessageSubscription>;\n}\nexport class StreamMessageError extends Error {\n readonly retryable = false;\n constructor(readonly errorCode: string, message: string) {\n super(message);\n this.name = 'StreamMessageError';\n }\n}\n\n// SYS omits the ungranted direction; Swagger currently marks both fields required.\ninterface Permission extends Partial<Omit<components['schemas']['StreamMessageGrantedTopic'], 'topic'>> {\n topic: string;\n}\ninterface Ticket extends Omit<components['schemas']['StreamMessagesConnectResp'], 'contractVersion' | 'permissions'> {\n contractVersion: 'stream-messages/v1';\n url: string;\n userJwt: string;\n expiresAt: string;\n permissions: Permission[];\n maxPayloadBytes: number;\n}\nconst encoder = new TextEncoder();\nconst uuid = /^(?!00000000-0000-0000-0000-000000000000$)[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/;\nconst MAX_PAYLOAD = 60 * 1024;\nconst MAX_ENVELOPE = 64 * 1024;\nconst MAX_FLUSH_TIMEOUT_MS = 10_000;\n\nfunction plain(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === 'object' && !Array.isArray(value) &&\n [Object.prototype, null].includes(Object.getPrototypeOf(value));\n}\nfunction json(value: unknown, seen = new Set<unknown>()): boolean {\n if (value === null || typeof value === 'string' || typeof value === 'boolean') return true;\n if (typeof value === 'number') return Number.isFinite(value);\n if ((!plain(value) && !Array.isArray(value)) || seen.has(value)) return false;\n seen.add(value);\n const valid = (Array.isArray(value) ? Array.from(value) : Object.values(value)).every(v => json(v, seen));\n seen.delete(value);\n return valid;\n}\nfunction fail(code: string, message: string): StreamMessageError {\n return new StreamMessageError(`STREAM_MESSAGE_${code}`, message);\n}\nfunction envelope(value: unknown, maxPayload: number): value is StreamMessage {\n if (!plain(value) || Object.keys(value).some(k => !['version', 'messageId', 'correlationId', 'payload'].includes(k)) ||\n value.version !== 'stream-messages/v1' || typeof value.messageId !== 'string' || !uuid.test(value.messageId) ||\n (value.correlationId !== undefined && (typeof value.correlationId !== 'string' ||\n encoder.encode(value.correlationId).length > 128 || /[\\u0000\\r\\n]/.test(value.correlationId))) ||\n !json(value.payload)) return false;\n return encoder.encode(JSON.stringify(value.payload)).length <= maxPayload;\n}\n\n/** One permission-scoped session. Every connection gets a fresh key and JWT. */\nclass MessageSession implements StreamMessageSubscription {\n disposed = false;\n readonly runtime: ReturnType<StreamTransport['runtime']>;\n private connection?: NatsConnection;\n private subscription?: Subscription;\n private connecting?: Promise<void>;\n private watching?: Promise<void>;\n private abort = new AbortController();\n private reconnectTimer?: ReturnType<typeof setTimeout>;\n private expiryTimer?: ReturnType<typeof setTimeout>;\n private started = false;\n private connected = false;\n private attempts = 0;\n private subject = '';\n private payloadLimit = MAX_PAYLOAD;\n private expiresAt = 0;\n private brokerError?: StreamMessageError;\n private disposing?: Promise<void>;\n private removeRuntimeListener?: () => void;\n\n constructor(\n private transport: StreamTransport,\n private topic: string,\n private mode: 'publish' | 'subscribe',\n private report: StreamMessageErrorHandler,\n private remove: () => void,\n private handler?: (value: StreamMessage) => void | Promise<void>,\n ) {\n this.runtime = transport.runtime();\n if (this.runtime) this.removeRuntimeListener = onAppRuntimeDispose(this.runtime, () => { void this.dispose(); });\n }\n\n async ready(): Promise<void> {\n if (this.disposed) throw fail('DISPOSED', 'Stream messages session disposed.');\n if (this.connected) return;\n if (this.connecting) return this.connecting;\n if (this.started) throw fail('DISCONNECTED', 'Stream messages disconnected.');\n this.started = true;\n try {\n await this.connect();\n if (this.disposed) throw fail('DISPOSED', 'Stream messages session disposed.');\n }\n catch (error) { await this.dispose(); throw error; }\n }\n\n private connect(): Promise<void> {\n const operation = this.open();\n this.connecting = operation;\n return operation.finally(() => { if (this.connecting === operation) this.connecting = undefined; });\n }\n\n private async open(): Promise<void> {\n let nc: NatsConnection | undefined;\n let key: KeyPair | undefined;\n let watched = false;\n try {\n // HTTP-only Cloud Apps must not load broker libraries or require their dependencies.\n const [{ jwtAuthenticator, wsconnect }, { createUser }] = await Promise.all([\n import('@nats-io/nats-core'), import('@nats-io/nkeys'),\n ]);\n if (this.disposed) return;\n const connectionKey = createUser();\n key = connectionKey;\n const appId = this.transport.runtime()?.appId ?? getCurrentAppId();\n const request: components['schemas']['StreamMessagesConnectReq'] = {\n appId, topics: [{ topic: this.topic, publish: this.mode === 'publish', subscribe: this.mode === 'subscribe' }],\n clientPublicKey: connectionKey.getPublicKey(),\n };\n const { value, ok } = await this.transport.post('/openapi/v2/stream-messages/connect', request, this.abort.signal);\n const ticket = this.ticket(value, ok);\n if (this.disposed) return;\n const expiresAt = Date.parse(ticket.expiresAt);\n const permission = ticket.permissions[0];\n this.subject = (this.mode === 'publish' ? permission.publishSubject : permission.subscribeSubject)!;\n this.payloadLimit = ticket.maxPayloadBytes;\n // Disable library reconnection so it cannot buffer writes or reuse expired JWTs.\n nc = await wsconnect({\n servers: [ticket.url], reconnect: false, waitOnFirstConnect: false,\n ignoreClusterUpdates: true, timeout: Math.max(1, Math.min(MAX_FLUSH_TIMEOUT_MS, expiresAt - Date.now())),\n authenticator: jwtAuthenticator(ticket.userJwt, () => connectionKey.getSeed()),\n });\n if (this.disposed) { await nc.close(); return; }\n this.connection = nc;\n this.expiresAt = expiresAt;\n this.brokerError = undefined;\n watched = true;\n this.watching = this.watch(nc, connectionKey);\n // Renewal also bounds the initial handshake; it must not wait for its first PONG.\n const untilExpiry = expiresAt - Date.now();\n this.expiryTimer = setTimeout(() => {\n if (this.connection !== nc) return;\n this.connected = false;\n void nc!.close();\n }, Math.max(1, Math.min(2_147_483_647, untilExpiry - Math.min(5_000, untilExpiry / 10))));\n if (this.mode === 'subscribe') {\n this.subscription = nc.subscribe(this.subject, { callback: (error, msg) => {\n if (this.disposed || this.connection !== nc || Date.now() >= expiresAt) return;\n if (error) { this.report(fail('SUBSCRIBE_FAILED', 'Stream subscription failed.')); return; }\n try {\n if (msg.data.length > MAX_ENVELOPE) throw fail('INVALID_ENVELOPE', 'Stream message envelope exceeds limit.');\n const value: unknown = JSON.parse(new TextDecoder('utf-8', { fatal: true }).decode(msg.data));\n if (!envelope(value, this.payloadLimit)) throw fail('INVALID_ENVELOPE', 'Invalid Stream message envelope.');\n // Identity comes from the authorized physical subject; never accept identity fields in the envelope.\n const prefix = this.subject.slice(0, -1);\n if (!msg.subject.startsWith(prefix) || !/^[^.\\s*>]+$/.test(msg.subject.slice(prefix.length))) {\n throw fail('INVALID_SUBJECT', 'Invalid Stream message subject.');\n }\n let result: void | Promise<void>;\n try { result = this.handler!(value); }\n catch { this.report(fail('HANDLER_FAILED', 'Stream message handler failed.')); return; }\n Promise.resolve(result).catch(() => {\n if (!this.disposed) this.report(fail('HANDLER_FAILED', 'Stream message handler failed.'));\n });\n } catch (error) {\n this.report(error instanceof StreamMessageError ? error : fail('INVALID_ENVELOPE', 'Invalid Stream message envelope.'));\n }\n } });\n }\n await this.flush(nc, false);\n if (this.disposed) return;\n if (nc.isClosed() || this.connection !== nc) throw fail('CONNECT_FAILED', 'Stream messages connection failed.');\n this.connected = true;\n this.attempts = 0;\n } catch (error) {\n if (nc) await nc.close();\n if (this.disposed) return;\n throw error instanceof StreamMessageError ? error : fail('CONNECT_FAILED', 'Stream messages connection failed.');\n } finally {\n // Before a successful handoff, this attempt owns its key, including when\n // the issuer or dial fails. A live connection's watcher owns later wiping.\n if (!watched) {\n await nc?.close();\n key?.clear();\n }\n }\n }\n\n private async flush(nc: NatsConnection, publishing: boolean): Promise<void> {\n const failure = () => publishing\n ? fail('RESULT_UNKNOWN', 'Stream publish result unknown; do not automatically retry.')\n : fail('CONNECT_FAILED', 'Stream messages connection failed.');\n let timer: ReturnType<typeof setTimeout> | undefined;\n let stopped: (() => void) | undefined;\n try {\n if (this.disposed || nc.isClosed() || this.expiresAt <= Date.now()) throw failure();\n const deadline = new Promise<never>((_resolve, reject) => {\n stopped = () => reject(failure());\n this.abort.signal.addEventListener('abort', stopped, { once: true });\n if (this.abort.signal.aborted) stopped();\n timer = setTimeout(stopped, Math.max(1, Math.min(MAX_FLUSH_TIMEOUT_MS, this.expiresAt - Date.now())));\n });\n await Promise.race([nc.flush(), deadline, nc.closed().then(() => { throw failure(); })]);\n } catch {\n const watching = this.connection === nc ? this.watching : undefined;\n if (this.connection === nc) this.connected = false;\n // Stop the transport and wipe its key before reporting a failed/unknown operation.\n await nc.close();\n await watching;\n throw failure();\n } finally {\n clearTimeout(timer);\n if (stopped) this.abort.signal.removeEventListener('abort', stopped);\n }\n }\n\n private ticket(value: unknown, ok: boolean): Ticket {\n if (!ok) throw fail('CONNECT_DENIED', 'Stream messages connection denied.');\n if (!plain(value) || value.contractVersion !== 'stream-messages/v1' ||\n typeof value.url !== 'string' || typeof value.userJwt !== 'string' || !value.userJwt ||\n typeof value.expiresAt !== 'string' || !/^\\d{4}-\\d\\d-\\d\\dT\\d\\d:\\d\\d:\\d\\d(?:\\.\\d+)?(?:Z|[+-]\\d\\d:\\d\\d)$/.test(value.expiresAt) ||\n !(Date.parse(value.expiresAt) > Date.now()) ||\n !Number.isSafeInteger(value.maxPayloadBytes) || (value.maxPayloadBytes as number) < 1 || (value.maxPayloadBytes as number) > MAX_PAYLOAD ||\n !Array.isArray(value.permissions) || value.permissions.length !== 1) {\n throw fail('CONNECT_PROTOCOL_ERROR', 'Invalid Stream messages connection response.');\n }\n const url = new URL(value.url);\n if (url.protocol !== 'wss:' || url.username || url.password || url.hash || url.search) {\n throw fail('CONNECT_PROTOCOL_ERROR', 'Stream messages requires a credential-free WSS URL.');\n }\n const permission: unknown = value.permissions[0];\n if (!plain(permission) || permission.topic !== this.topic) throw fail('CONNECT_PROTOCOL_ERROR', 'Invalid topic permission.');\n // Subject layout belongs to SYS. Only check NATS syntax and requested access.\n const validSubject = (subject: unknown, mode: 'publish' | 'subscribe') => {\n if (typeof subject !== 'string' || !subject) return false;\n if (mode === 'subscribe' && !subject.endsWith('.*')) return false;\n const parts = subject.split('.');\n return parts.every((part, index) => !!part &&\n (mode === 'subscribe' && index === parts.length - 1 && part === '*' || !/[\\s*>]/.test(part)));\n };\n const publish = permission.publishSubject;\n const subscribe = permission.subscribeSubject;\n if ((publish !== undefined && !validSubject(publish, 'publish')) ||\n (subscribe !== undefined && !validSubject(subscribe, 'subscribe')) ||\n (this.mode === 'publish' ? !publish || !!subscribe : !subscribe || !!publish)) {\n throw fail('CONNECT_PROTOCOL_ERROR', 'Invalid scoped topic subjects.');\n }\n return value as unknown as Ticket;\n }\n\n private async watch(nc: NatsConnection, key: KeyPair): Promise<void> {\n try {\n for await (const status of nc.status()) {\n if (this.disposed || this.connection !== nc) break;\n if (status.type === 'disconnect' || status.type === 'close' || status.type === 'staleConnection') this.connected = false;\n if (status.type === 'error' || status.type === 'slowConsumer') {\n this.brokerError = fail(status.type === 'error' ? 'BROKER_ERROR' : 'SLOW_CONSUMER', 'Stream messages asynchronous broker error.');\n this.report(this.brokerError);\n }\n }\n const error = await nc.closed();\n if (error && !this.disposed) this.report(fail('CONNECTION_LOST', 'Stream messages connection lost.'));\n } catch {\n if (!this.disposed) this.report(fail('CONNECTION_LOST', 'Stream messages connection lost.'));\n } finally {\n // Close even if the status iterator failed. A replacement must never be\n // issued while the prior, potentially wider, authenticated socket is live.\n await nc.close();\n key.clear();\n if (this.connection === nc) {\n this.connection = undefined;\n this.connected = false;\n this.subscription = undefined;\n clearTimeout(this.expiryTimer);\n this.scheduleReconnect();\n }\n }\n }\n\n private scheduleReconnect(): void {\n if (this.disposed || this.reconnectTimer) return;\n this.reconnectTimer = setTimeout(() => {\n this.reconnectTimer = undefined;\n if (this.disposed) return;\n void this.connect().catch(error => {\n this.report(error instanceof StreamMessageError ? error : fail('CONNECT_FAILED', 'Stream messages reconnection failed.'));\n this.scheduleReconnect();\n });\n }, Math.min(30_000, 500 * 2 ** Math.min(this.attempts++, 6)));\n }\n\n async publish(value: StreamMessage): Promise<void> {\n // Only the very first publish may establish a connection. Subsequent disconnected writes fail.\n if (!this.started) await this.ready();\n const nc = this.connection;\n if (this.disposed || !this.connected || !nc || nc.isClosed()) throw fail('DISCONNECTED', 'Stream messages disconnected.');\n if (!envelope(value, this.payloadLimit)) throw fail('INVALID_ENVELOPE', 'Invalid Stream message envelope or payload limit exceeded.');\n const bytes = encoder.encode(JSON.stringify(value));\n if (bytes.length > MAX_ENVELOPE) throw fail('PAYLOAD_TOO_LARGE', 'Stream message envelope exceeds limit.');\n this.brokerError = undefined;\n try {\n nc.publish(this.subject, bytes);\n await this.flush(nc, true);\n if (this.brokerError) throw this.brokerError;\n if (!this.connected || this.connection !== nc) throw fail('RESULT_UNKNOWN', 'Stream publish result unknown.');\n } catch (error) {\n throw error instanceof StreamMessageError ? error : fail('RESULT_UNKNOWN', 'Stream publish result unknown; do not automatically retry.');\n }\n }\n\n dispose(): Promise<void> {\n if (this.disposing) return this.disposing;\n this.disposed = true;\n this.connected = false;\n this.abort.abort();\n this.removeRuntimeListener?.();\n clearTimeout(this.reconnectTimer);\n clearTimeout(this.expiryTimer);\n this.subscription?.unsubscribe();\n this.disposing = (async () => {\n await this.connection?.close();\n await this.connecting?.catch(() => undefined);\n await this.watching;\n this.connection = undefined;\n this.remove();\n })();\n return this.disposing;\n }\n}\n\nexport class StreamMessagesClient {\n private sessions = new Set<MessageSession>();\n private listeners = new Set<StreamMessageErrorHandler>();\n private disposed = false;\n private disposing?: Promise<void>;\n constructor(private readonly transport = new StreamTransport()) {}\n\n onError(handler: StreamMessageErrorHandler): () => void {\n if (this.disposed) throw fail('DISPOSED', 'Stream messages client disposed.');\n this.listeners.add(handler);\n return () => { this.listeners.delete(handler); };\n }\n\n use<Payload = StreamJSON>(selector: { topic: string }): StreamMessageHandle<Payload> {\n if (!plain(selector) || Object.keys(selector).some(k => k !== 'topic') ||\n typeof selector.topic !== 'string' || !/^[a-zA-Z0-9][a-zA-Z0-9._/-]{0,127}$/.test(selector.topic)) {\n throw new TypeError('Tier0 SDK: invalid logical Stream topic.');\n }\n const topic = selector.topic;\n let publisher: MessageSession | undefined;\n const session = (mode: 'publish' | 'subscribe', handler?: (value: StreamMessage) => void | Promise<void>, onError?: StreamMessageErrorHandler) => {\n if (this.disposed) throw fail('DISPOSED', 'Stream messages client disposed.');\n const report = (error: StreamMessageError) => {\n const listeners = new Set(this.listeners);\n if (onError) listeners.add(onError);\n if (!listeners.size) console.error(error);\n for (const listener of listeners) {\n try { listener(error); } catch { console.error(fail('ERROR_HANDLER_FAILED', 'Stream messages error handler failed.')); }\n }\n };\n const value = new MessageSession(this.transport, topic, mode, report, () => this.sessions.delete(value), handler);\n this.sessions.add(value);\n return value;\n };\n return {\n publish: async (payload, options = {}) => {\n if (this.disposed) throw fail('DISPOSED', 'Stream messages client disposed.');\n if (!plain(options) || Object.keys(options).some(k => !['messageId', 'correlationId'].includes(k)) ||\n (options.messageId !== undefined && typeof options.messageId !== 'string') ||\n (options.correlationId !== undefined && typeof options.correlationId !== 'string')) {\n throw new TypeError('Tier0 SDK: unsupported Stream publish option.');\n }\n const message: StreamMessage<Payload> = {\n version: 'stream-messages/v1', messageId: options.messageId ?? crypto.randomUUID(),\n ...(options.correlationId === undefined ? {} : { correlationId: options.correlationId }), payload,\n };\n if (!envelope(message, MAX_PAYLOAD)) throw fail('INVALID_ENVELOPE', 'Invalid Stream message envelope.');\n if (encoder.encode(JSON.stringify(message)).length > MAX_ENVELOPE) throw fail('PAYLOAD_TOO_LARGE', 'Stream message envelope exceeds limit.');\n if (publisher?.disposed) {\n const previous = publisher;\n await previous.dispose();\n if (previous.runtime !== this.transport.runtime()) throw fail('DISCONNECTED', 'Stream messages disconnected.');\n if (publisher === previous) publisher = undefined;\n }\n if (!publisher) publisher = session('publish');\n await publisher.publish(message as StreamMessage);\n return message;\n },\n subscribe: async (handler, options = {}) => {\n if (typeof handler !== 'function' || !plain(options) || Object.keys(options).some(k => k !== 'onError') ||\n (options.onError !== undefined && typeof options.onError !== 'function')) throw new TypeError('Tier0 SDK: invalid Stream subscription.');\n const value = session('subscribe', handler as (value: StreamMessage) => void | Promise<void>, options.onError);\n await value.ready();\n return value;\n },\n };\n }\n\n dispose(): Promise<void> {\n if (this.disposing) return this.disposing;\n this.disposed = true;\n this.disposing = Promise.all([...this.sessions].map(session => session.dispose())).then(() => {\n this.listeners.clear();\n });\n return this.disposing;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"messages.js","sourceRoot":"","sources":["../../../src/streams/messages.ts"],"names":[],"mappings":"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","sourcesContent":["import type { NatsConnection, Subscription } from '@nats-io/nats-core';\nimport type { KeyPair } from '@nats-io/nkeys';\nimport { getCurrentAppId } from '../runtime-context.js';\nimport type { StreamJSON } from './requests.js';\nimport { StreamTransport } from './transport.js';\nimport type { components } from './contract.generated.js';\n\nexport interface StreamMessage<Payload = StreamJSON> {\n version: 'stream-messages/v1';\n messageId: string;\n correlationId?: string;\n payload: Payload;\n}\nexport interface StreamMessagePublishOptions {\n messageId?: string;\n correlationId?: string;\n}\nexport interface StreamMessageSubscription {\n readonly disposed: boolean;\n dispose(): Promise<void>;\n}\nexport type StreamMessageErrorHandler = (error: StreamMessageError) => void;\nexport interface StreamMessageHandle<Payload = StreamJSON> {\n /** Resolves after broker flush, not after receiver acknowledgement. No retry or offline queue. */\n publish(payload: Payload, options?: StreamMessagePublishOptions): Promise<StreamMessage<Payload>>;\n subscribe(handler: (message: StreamMessage<Payload>) => void | Promise<void>, options?: {\n onError?: StreamMessageErrorHandler;\n }): Promise<StreamMessageSubscription>;\n}\nexport class StreamMessageError extends Error {\n readonly retryable = false;\n constructor(readonly errorCode: string, message: string) {\n super(message);\n this.name = 'StreamMessageError';\n }\n}\n\n// SYS omits the ungranted direction; Swagger currently marks both fields required.\ninterface Permission extends Partial<Omit<components['schemas']['StreamMessageGrantedTopic'], 'topic'>> {\n topic: string;\n}\ninterface Ticket extends Omit<components['schemas']['StreamMessagesConnectResp'], 'contractVersion' | 'permissions'> {\n contractVersion: 'stream-messages/v1';\n url: string;\n userJwt: string;\n expiresAt: string;\n permissions: Permission[];\n maxPayloadBytes: number;\n}\nconst encoder = new TextEncoder();\nconst uuid = /^(?!00000000-0000-0000-0000-000000000000$)[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/;\nconst MAX_PAYLOAD = 60 * 1024;\nconst MAX_ENVELOPE = 64 * 1024;\nconst MAX_FLUSH_TIMEOUT_MS = 10_000;\n\nfunction plain(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === 'object' && !Array.isArray(value) &&\n [Object.prototype, null].includes(Object.getPrototypeOf(value));\n}\nfunction json(value: unknown, seen = new Set<unknown>()): boolean {\n if (value === null || typeof value === 'string' || typeof value === 'boolean') return true;\n if (typeof value === 'number') return Number.isFinite(value);\n if ((!plain(value) && !Array.isArray(value)) || seen.has(value)) return false;\n seen.add(value);\n const valid = (Array.isArray(value) ? Array.from(value) : Object.values(value)).every(v => json(v, seen));\n seen.delete(value);\n return valid;\n}\nfunction fail(code: string, message: string): StreamMessageError {\n return new StreamMessageError(`STREAM_MESSAGE_${code}`, message);\n}\nfunction envelope(value: unknown, maxPayload: number): value is StreamMessage {\n if (!plain(value) || Object.keys(value).some(k => !['version', 'messageId', 'correlationId', 'payload'].includes(k)) ||\n value.version !== 'stream-messages/v1' || typeof value.messageId !== 'string' || !uuid.test(value.messageId) ||\n (value.correlationId !== undefined && (typeof value.correlationId !== 'string' ||\n encoder.encode(value.correlationId).length > 128 || /[\\u0000\\r\\n]/.test(value.correlationId))) ||\n !json(value.payload)) return false;\n return encoder.encode(JSON.stringify(value.payload)).length <= maxPayload;\n}\n\n/** One permission-scoped session. Every connection gets a fresh key and JWT. */\nclass MessageSession implements StreamMessageSubscription {\n disposed = false;\n private connection?: NatsConnection;\n private subscription?: Subscription;\n private connecting?: Promise<void>;\n private watching?: Promise<void>;\n private abort = new AbortController();\n private reconnectTimer?: ReturnType<typeof setTimeout>;\n private expiryTimer?: ReturnType<typeof setTimeout>;\n private started = false;\n private connected = false;\n private attempts = 0;\n private subject = '';\n private payloadLimit = MAX_PAYLOAD;\n private expiresAt = 0;\n private brokerError?: StreamMessageError;\n private disposing?: Promise<void>;\n\n constructor(\n private transport: StreamTransport,\n private topic: string,\n private mode: 'publish' | 'subscribe',\n private report: StreamMessageErrorHandler,\n private remove: () => void,\n private handler?: (value: StreamMessage) => void | Promise<void>,\n ) {}\n\n async ready(): Promise<void> {\n if (this.disposed) throw fail('DISPOSED', 'Stream messages session disposed.');\n if (this.connected) return;\n if (this.connecting) return this.connecting;\n if (this.started) throw fail('DISCONNECTED', 'Stream messages disconnected.');\n this.started = true;\n try {\n await this.connect();\n if (this.disposed) throw fail('DISPOSED', 'Stream messages session disposed.');\n }\n catch (error) { await this.dispose(); throw error; }\n }\n\n private connect(): Promise<void> {\n const operation = this.open();\n this.connecting = operation;\n return operation.finally(() => { if (this.connecting === operation) this.connecting = undefined; });\n }\n\n private async open(): Promise<void> {\n let nc: NatsConnection | undefined;\n let key: KeyPair | undefined;\n let watched = false;\n try {\n // HTTP-only Cloud Apps must not load broker libraries or require their dependencies.\n const [{ jwtAuthenticator, wsconnect }, { createUser }] = await Promise.all([\n import('@nats-io/nats-core'), import('@nats-io/nkeys'),\n ]);\n if (this.disposed) return;\n const connectionKey = createUser();\n key = connectionKey;\n const appId = getCurrentAppId();\n const request: components['schemas']['StreamMessagesConnectReq'] = {\n appId, topics: [{ topic: this.topic, publish: this.mode === 'publish', subscribe: this.mode === 'subscribe' }],\n clientPublicKey: connectionKey.getPublicKey(),\n };\n const { value, ok } = await this.transport.post('/openapi/v2/stream-messages/connect', request, this.abort.signal);\n const ticket = this.ticket(value, ok);\n if (this.disposed) return;\n const expiresAt = Date.parse(ticket.expiresAt);\n const permission = ticket.permissions[0];\n this.subject = (this.mode === 'publish' ? permission.publishSubject : permission.subscribeSubject)!;\n this.payloadLimit = ticket.maxPayloadBytes;\n // Disable library reconnection so it cannot buffer writes or reuse expired JWTs.\n nc = await wsconnect({\n servers: [ticket.url], reconnect: false, waitOnFirstConnect: false,\n ignoreClusterUpdates: true, timeout: Math.max(1, Math.min(MAX_FLUSH_TIMEOUT_MS, expiresAt - Date.now())),\n authenticator: jwtAuthenticator(ticket.userJwt, () => connectionKey.getSeed()),\n });\n if (this.disposed) { await nc.close(); return; }\n this.connection = nc;\n this.expiresAt = expiresAt;\n this.brokerError = undefined;\n watched = true;\n this.watching = this.watch(nc, connectionKey);\n // Renewal also bounds the initial handshake; it must not wait for its first PONG.\n const untilExpiry = expiresAt - Date.now();\n this.expiryTimer = setTimeout(() => {\n if (this.connection !== nc) return;\n this.connected = false;\n void nc!.close();\n }, Math.max(1, Math.min(2_147_483_647, untilExpiry - Math.min(5_000, untilExpiry / 10))));\n if (this.mode === 'subscribe') {\n this.subscription = nc.subscribe(this.subject, { callback: (error, msg) => {\n if (this.disposed || this.connection !== nc || Date.now() >= expiresAt) return;\n if (error) { this.report(fail('SUBSCRIBE_FAILED', 'Stream subscription failed.')); return; }\n try {\n if (msg.data.length > MAX_ENVELOPE) throw fail('INVALID_ENVELOPE', 'Stream message envelope exceeds limit.');\n const value: unknown = JSON.parse(new TextDecoder('utf-8', { fatal: true }).decode(msg.data));\n if (!envelope(value, this.payloadLimit)) throw fail('INVALID_ENVELOPE', 'Invalid Stream message envelope.');\n // Identity comes from the authorized physical subject; never accept identity fields in the envelope.\n const prefix = this.subject.slice(0, -1);\n if (!msg.subject.startsWith(prefix) || !/^[^.\\s*>]+$/.test(msg.subject.slice(prefix.length))) {\n throw fail('INVALID_SUBJECT', 'Invalid Stream message subject.');\n }\n let result: void | Promise<void>;\n try { result = this.handler!(value); }\n catch { this.report(fail('HANDLER_FAILED', 'Stream message handler failed.')); return; }\n Promise.resolve(result).catch(() => {\n if (!this.disposed) this.report(fail('HANDLER_FAILED', 'Stream message handler failed.'));\n });\n } catch (error) {\n this.report(error instanceof StreamMessageError ? error : fail('INVALID_ENVELOPE', 'Invalid Stream message envelope.'));\n }\n } });\n }\n await this.flush(nc, false);\n if (this.disposed) return;\n if (nc.isClosed() || this.connection !== nc) throw fail('CONNECT_FAILED', 'Stream messages connection failed.');\n this.connected = true;\n this.attempts = 0;\n } catch (error) {\n if (nc) await nc.close();\n if (this.disposed) return;\n throw error instanceof StreamMessageError ? error : fail('CONNECT_FAILED', 'Stream messages connection failed.');\n } finally {\n // Before a successful handoff, this attempt owns its key, including when\n // the issuer or dial fails. A live connection's watcher owns later wiping.\n if (!watched) {\n await nc?.close();\n key?.clear();\n }\n }\n }\n\n private async flush(nc: NatsConnection, publishing: boolean): Promise<void> {\n const failure = () => publishing\n ? fail('RESULT_UNKNOWN', 'Stream publish result unknown; do not automatically retry.')\n : fail('CONNECT_FAILED', 'Stream messages connection failed.');\n let timer: ReturnType<typeof setTimeout> | undefined;\n let stopped: (() => void) | undefined;\n try {\n if (this.disposed || nc.isClosed() || this.expiresAt <= Date.now()) throw failure();\n const deadline = new Promise<never>((_resolve, reject) => {\n stopped = () => reject(failure());\n this.abort.signal.addEventListener('abort', stopped, { once: true });\n if (this.abort.signal.aborted) stopped();\n timer = setTimeout(stopped, Math.max(1, Math.min(MAX_FLUSH_TIMEOUT_MS, this.expiresAt - Date.now())));\n });\n await Promise.race([nc.flush(), deadline, nc.closed().then(() => { throw failure(); })]);\n } catch {\n const watching = this.connection === nc ? this.watching : undefined;\n if (this.connection === nc) this.connected = false;\n // Stop the transport and wipe its key before reporting a failed/unknown operation.\n await nc.close();\n await watching;\n throw failure();\n } finally {\n clearTimeout(timer);\n if (stopped) this.abort.signal.removeEventListener('abort', stopped);\n }\n }\n\n private ticket(value: unknown, ok: boolean): Ticket {\n if (!ok) throw fail('CONNECT_DENIED', 'Stream messages connection denied.');\n if (!plain(value) || value.contractVersion !== 'stream-messages/v1' ||\n typeof value.url !== 'string' || typeof value.userJwt !== 'string' || !value.userJwt ||\n typeof value.expiresAt !== 'string' || !/^\\d{4}-\\d\\d-\\d\\dT\\d\\d:\\d\\d:\\d\\d(?:\\.\\d+)?(?:Z|[+-]\\d\\d:\\d\\d)$/.test(value.expiresAt) ||\n !(Date.parse(value.expiresAt) > Date.now()) ||\n !Number.isSafeInteger(value.maxPayloadBytes) || (value.maxPayloadBytes as number) < 1 || (value.maxPayloadBytes as number) > MAX_PAYLOAD ||\n !Array.isArray(value.permissions) || value.permissions.length !== 1) {\n throw fail('CONNECT_PROTOCOL_ERROR', 'Invalid Stream messages connection response.');\n }\n const url = new URL(value.url);\n if (url.protocol !== 'wss:' || url.username || url.password || url.hash || url.search) {\n throw fail('CONNECT_PROTOCOL_ERROR', 'Stream messages requires a credential-free WSS URL.');\n }\n const permission: unknown = value.permissions[0];\n if (!plain(permission) || permission.topic !== this.topic) throw fail('CONNECT_PROTOCOL_ERROR', 'Invalid topic permission.');\n // Subject layout belongs to SYS. Only check NATS syntax and requested access.\n const validSubject = (subject: unknown, mode: 'publish' | 'subscribe') => {\n if (typeof subject !== 'string' || !subject) return false;\n if (mode === 'subscribe' && !subject.endsWith('.*')) return false;\n const parts = subject.split('.');\n return parts.every((part, index) => !!part &&\n (mode === 'subscribe' && index === parts.length - 1 && part === '*' || !/[\\s*>]/.test(part)));\n };\n const publish = permission.publishSubject;\n const subscribe = permission.subscribeSubject;\n if ((publish !== undefined && !validSubject(publish, 'publish')) ||\n (subscribe !== undefined && !validSubject(subscribe, 'subscribe')) ||\n (this.mode === 'publish' ? !publish || !!subscribe : !subscribe || !!publish)) {\n throw fail('CONNECT_PROTOCOL_ERROR', 'Invalid scoped topic subjects.');\n }\n return value as unknown as Ticket;\n }\n\n private async watch(nc: NatsConnection, key: KeyPair): Promise<void> {\n try {\n for await (const status of nc.status()) {\n if (this.disposed || this.connection !== nc) break;\n if (status.type === 'disconnect' || status.type === 'close' || status.type === 'staleConnection') this.connected = false;\n if (status.type === 'error' || status.type === 'slowConsumer') {\n this.brokerError = fail(status.type === 'error' ? 'BROKER_ERROR' : 'SLOW_CONSUMER', 'Stream messages asynchronous broker error.');\n this.report(this.brokerError);\n }\n }\n const error = await nc.closed();\n if (error && !this.disposed) this.report(fail('CONNECTION_LOST', 'Stream messages connection lost.'));\n } catch {\n if (!this.disposed) this.report(fail('CONNECTION_LOST', 'Stream messages connection lost.'));\n } finally {\n // Close even if the status iterator failed. A replacement must never be\n // issued while the prior, potentially wider, authenticated socket is live.\n await nc.close();\n key.clear();\n if (this.connection === nc) {\n this.connection = undefined;\n this.connected = false;\n this.subscription = undefined;\n clearTimeout(this.expiryTimer);\n this.scheduleReconnect();\n }\n }\n }\n\n private scheduleReconnect(): void {\n if (this.disposed || this.reconnectTimer) return;\n this.reconnectTimer = setTimeout(() => {\n this.reconnectTimer = undefined;\n if (this.disposed) return;\n void this.connect().catch(error => {\n this.report(error instanceof StreamMessageError ? error : fail('CONNECT_FAILED', 'Stream messages reconnection failed.'));\n this.scheduleReconnect();\n });\n }, Math.min(30_000, 500 * 2 ** Math.min(this.attempts++, 6)));\n }\n\n async publish(value: StreamMessage): Promise<void> {\n // Only the very first publish may establish a connection. Subsequent disconnected writes fail.\n if (!this.started) await this.ready();\n const nc = this.connection;\n if (this.disposed || !this.connected || !nc || nc.isClosed()) throw fail('DISCONNECTED', 'Stream messages disconnected.');\n if (!envelope(value, this.payloadLimit)) throw fail('INVALID_ENVELOPE', 'Invalid Stream message envelope or payload limit exceeded.');\n const bytes = encoder.encode(JSON.stringify(value));\n if (bytes.length > MAX_ENVELOPE) throw fail('PAYLOAD_TOO_LARGE', 'Stream message envelope exceeds limit.');\n this.brokerError = undefined;\n try {\n nc.publish(this.subject, bytes);\n await this.flush(nc, true);\n if (this.brokerError) throw this.brokerError;\n if (!this.connected || this.connection !== nc) throw fail('RESULT_UNKNOWN', 'Stream publish result unknown.');\n } catch (error) {\n throw error instanceof StreamMessageError ? error : fail('RESULT_UNKNOWN', 'Stream publish result unknown; do not automatically retry.');\n }\n }\n\n dispose(): Promise<void> {\n if (this.disposing) return this.disposing;\n this.disposed = true;\n this.connected = false;\n this.abort.abort();\n clearTimeout(this.reconnectTimer);\n clearTimeout(this.expiryTimer);\n this.subscription?.unsubscribe();\n this.disposing = (async () => {\n await this.connection?.close();\n await this.connecting?.catch(() => undefined);\n await this.watching;\n this.connection = undefined;\n this.remove();\n })();\n return this.disposing;\n }\n}\n\nexport class StreamMessagesClient {\n private sessions = new Set<MessageSession>();\n private listeners = new Set<StreamMessageErrorHandler>();\n private disposed = false;\n private disposing?: Promise<void>;\n constructor(private readonly transport = new StreamTransport()) {}\n\n onError(handler: StreamMessageErrorHandler): () => void {\n if (this.disposed) throw fail('DISPOSED', 'Stream messages client disposed.');\n this.listeners.add(handler);\n return () => { this.listeners.delete(handler); };\n }\n\n use<Payload = StreamJSON>(selector: { topic: string }): StreamMessageHandle<Payload> {\n if (!plain(selector) || Object.keys(selector).some(k => k !== 'topic') ||\n typeof selector.topic !== 'string' || !/^[a-zA-Z0-9][a-zA-Z0-9._/-]{0,127}$/.test(selector.topic)) {\n throw new TypeError('Tier0 SDK: invalid logical Stream topic.');\n }\n const topic = selector.topic;\n let publisher: MessageSession | undefined;\n const session = (mode: 'publish' | 'subscribe', handler?: (value: StreamMessage) => void | Promise<void>, onError?: StreamMessageErrorHandler) => {\n if (this.disposed) throw fail('DISPOSED', 'Stream messages client disposed.');\n const report = (error: StreamMessageError) => {\n const listeners = new Set(this.listeners);\n if (onError) listeners.add(onError);\n if (!listeners.size) console.error(error);\n for (const listener of listeners) {\n try { listener(error); } catch { console.error(fail('ERROR_HANDLER_FAILED', 'Stream messages error handler failed.')); }\n }\n };\n const value = new MessageSession(this.transport, topic, mode, report, () => this.sessions.delete(value), handler);\n this.sessions.add(value);\n return value;\n };\n return {\n publish: async (payload, options = {}) => {\n if (this.disposed) throw fail('DISPOSED', 'Stream messages client disposed.');\n if (!plain(options) || Object.keys(options).some(k => !['messageId', 'correlationId'].includes(k)) ||\n (options.messageId !== undefined && typeof options.messageId !== 'string') ||\n (options.correlationId !== undefined && typeof options.correlationId !== 'string')) {\n throw new TypeError('Tier0 SDK: unsupported Stream publish option.');\n }\n const message: StreamMessage<Payload> = {\n version: 'stream-messages/v1', messageId: options.messageId ?? crypto.randomUUID(),\n ...(options.correlationId === undefined ? {} : { correlationId: options.correlationId }), payload,\n };\n if (!envelope(message, MAX_PAYLOAD)) throw fail('INVALID_ENVELOPE', 'Invalid Stream message envelope.');\n if (encoder.encode(JSON.stringify(message)).length > MAX_ENVELOPE) throw fail('PAYLOAD_TOO_LARGE', 'Stream message envelope exceeds limit.');\n if (publisher?.disposed) {\n const previous = publisher;\n await previous.dispose();\n if (publisher === previous) publisher = undefined;\n }\n if (!publisher) publisher = session('publish');\n await publisher.publish(message as StreamMessage);\n return message;\n },\n subscribe: async (handler, options = {}) => {\n if (typeof handler !== 'function' || !plain(options) || Object.keys(options).some(k => k !== 'onError') ||\n (options.onError !== undefined && typeof options.onError !== 'function')) throw new TypeError('Tier0 SDK: invalid Stream subscription.');\n const value = session('subscribe', handler as (value: StreamMessage) => void | Promise<void>, options.onError);\n await value.ready();\n return value;\n },\n };\n }\n\n dispose(): Promise<void> {\n if (this.disposing) return this.disposing;\n this.disposed = true;\n this.disposing = Promise.all([...this.sessions].map(session => session.dispose())).then(() => {\n this.listeners.clear();\n });\n return this.disposing;\n }\n}\n"]}
|
|
@@ -53,6 +53,8 @@ export interface StreamRequestErrorInfo {
|
|
|
53
53
|
contractVersion?: string;
|
|
54
54
|
runStatus?: string;
|
|
55
55
|
replayed?: boolean;
|
|
56
|
+
/** Present when the SDK knows the request was not dispatched. */
|
|
57
|
+
execution?: 'notStarted';
|
|
56
58
|
}
|
|
57
59
|
/** No StreamRequest error is automatically retried, including authentication failures. */
|
|
58
60
|
export declare class StreamRequestError extends Error {
|
|
@@ -62,6 +64,7 @@ export declare class StreamRequestError extends Error {
|
|
|
62
64
|
readonly contractVersion?: string;
|
|
63
65
|
readonly runStatus?: string;
|
|
64
66
|
readonly replayed?: boolean;
|
|
67
|
+
readonly execution?: 'notStarted';
|
|
65
68
|
readonly retryable = false;
|
|
66
69
|
readonly outcomeUnknown: boolean;
|
|
67
70
|
constructor(message: string, info: StreamRequestErrorInfo);
|
|
@@ -11,6 +11,7 @@ class StreamRequestError extends Error {
|
|
|
11
11
|
contractVersion;
|
|
12
12
|
runStatus;
|
|
13
13
|
replayed;
|
|
14
|
+
execution;
|
|
14
15
|
retryable = false;
|
|
15
16
|
outcomeUnknown = false;
|
|
16
17
|
constructor(message, info) {
|
|
@@ -22,6 +23,7 @@ class StreamRequestError extends Error {
|
|
|
22
23
|
this.contractVersion = info.contractVersion;
|
|
23
24
|
this.runStatus = info.runStatus;
|
|
24
25
|
this.replayed = info.replayed;
|
|
26
|
+
this.execution = info.execution;
|
|
25
27
|
}
|
|
26
28
|
}
|
|
27
29
|
exports.StreamRequestError = StreamRequestError;
|
|
@@ -89,8 +91,9 @@ class StreamRequestsClient {
|
|
|
89
91
|
catch (error) {
|
|
90
92
|
if (!(error instanceof transport_js_1.StreamTransportError))
|
|
91
93
|
throw error;
|
|
92
|
-
const info = { status: error.status, errorCode: `STREAM_REQUEST_${error.kind}
|
|
93
|
-
|
|
94
|
+
const info = { status: error.status, errorCode: `STREAM_REQUEST_${error.kind}`,
|
|
95
|
+
...(error.notStarted ? { execution: 'notStarted' } : {}) };
|
|
96
|
+
if (invoked && !error.notStarted)
|
|
94
97
|
throw new StreamRequestResultUnknownError(info);
|
|
95
98
|
const message = error.kind === 'TRANSPORT_TIMEOUT' ? 'StreamRequest HTTP transport deadline exceeded.' :
|
|
96
99
|
error.kind === 'PROTOCOL_ERROR' ? 'Invalid StreamRequest response.' : 'StreamRequest transport failed.';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"requests.js","sourceRoot":"","sources":["../../../src/streams/requests.ts"],"names":[],"mappings":"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","sourcesContent":["import { StreamTransport, StreamTransportError, DEFAULT_STREAM_TRANSPORT_TIMEOUT_MS, type StreamTransportConfig } from './transport.js';\nimport type { components } from './contract.generated.js';\n/** Public request contracts do not expose runtime bindings. */\nexport type StreamJSON = null | boolean | number | string | StreamJSON[] | { [key: string]: StreamJSON };\n\nexport interface PublicStreamRequest extends Omit<components['schemas']['PublicStreamRequest'], 'inputSchema' | 'outputSchema' | 'sideEffect' | 'idempotency'> {\n code: string;\n name: string;\n description: string;\n contractVersion: string;\n inputSchema: Record<string, StreamJSON>;\n outputSchema: Record<string, StreamJSON>;\n sideEffect: 'read' | 'write';\n idempotency: 'none' | 'optional' | 'required';\n timeoutMs: number;\n status: string;\n}\n\ntype WireDiscovery = components['schemas']['StreamRequestDiscoverReq'];\nexport interface StreamRequestDiscoverOptions extends WireDiscovery {\n page?: number;\n size?: number;\n search?: string;\n}\n\nexport interface StreamRequestDiscoverResponse {\n total: number;\n list: PublicStreamRequest[];\n}\n\n/** HTTP transport settings do not override server execution semantics. */\nexport interface StreamRequestTransportConfig extends StreamTransportConfig {}\n\nexport const DEFAULT_STREAM_REQUEST_TRANSPORT_TIMEOUT_MS = DEFAULT_STREAM_TRANSPORT_TIMEOUT_MS;\n\nexport interface StreamRequestInvokeOptions {\n /** Stable caller-owned key for one business intent, at most 128 UTF-8 bytes. Never generated or retried by the SDK. */\n idempotencyKey?: string;\n}\n\nexport interface StreamRequestInvokeResponse<Result = StreamJSON> extends Omit<components['schemas']['StreamRequestInvokeResp'], 'result' | 'status'> {\n code: string;\n contractVersion: string;\n result: Result;\n runID: string;\n /** Persisted request ledger success; all other states reject conservatively. */\n status: 'completed';\n /** True only when the server explicitly reports an idempotent replay. */\n replayed: boolean;\n}\n\nexport interface StreamRequestErrorInfo {\n /** HTTP status, absent when no HTTP response was received. */\n status?: number;\n /** Gateway string errorCode, or an SDK-local STREAM_REQUEST_* transport/protocol code. */\n errorCode: string;\n runID?: string;\n contractVersion?: string;\n runStatus?: string;\n replayed?: boolean;\n}\n\n/** No StreamRequest error is automatically retried, including authentication failures. */\nexport class StreamRequestError extends Error {\n readonly status?: number;\n readonly errorCode: string;\n readonly runID?: string;\n readonly contractVersion?: string;\n readonly runStatus?: string;\n readonly replayed?: boolean;\n readonly retryable = false;\n readonly outcomeUnknown: boolean = false;\n\n constructor(message: string, info: StreamRequestErrorInfo) {\n super(message);\n this.name = 'StreamRequestError';\n this.status = info.status;\n this.errorCode = info.errorCode;\n this.runID = info.runID;\n this.contractVersion = info.contractVersion;\n this.runStatus = info.runStatus;\n this.replayed = info.replayed;\n }\n}\n\n/** Execution may have happened. Reconcile run information; any deliberate replay must reuse the same key. */\nexport class StreamRequestResultUnknownError extends StreamRequestError {\n readonly outcomeUnknown = true;\n\n constructor(info: StreamRequestErrorInfo) {\n super('StreamRequest result is unknown; execution may have occurred. Do not automatically retry.', info);\n this.name = 'StreamRequestResultUnknownError';\n }\n}\n\nfunction record(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === 'object' && !Array.isArray(value);\n}\n\nfunction keys(value: unknown, allowed: string[]): void {\n if (!record(value) || Reflect.ownKeys(value).some(key => typeof key !== 'string' || !allowed.includes(key))) {\n throw new TypeError('Tier0 SDK: unsupported StreamRequest option.');\n }\n}\n\nfunction json(value: unknown, seen = new Set<unknown>()): boolean {\n if (value === null || typeof value === 'string' || typeof value === 'boolean') return true;\n if (typeof value === 'number') return Number.isFinite(value);\n if (typeof value !== 'object' || seen.has(value)) return false;\n if (!Array.isArray(value) && Object.getPrototypeOf(value) !== Object.prototype && Object.getPrototypeOf(value) !== null) {\n return false;\n }\n seen.add(value);\n const valid = (Array.isArray(value) ? Array.from(value) : Object.values(value)).every(item => json(item, seen));\n seen.delete(value);\n return valid;\n}\n\nfunction definition(value: unknown): value is PublicStreamRequest {\n if (!record(value)) return false;\n return ['code', 'name', 'description', 'contractVersion', 'status'].every(key => typeof value[key] === 'string') &&\n value.code !== '' && value.contractVersion !== '' && record(value.inputSchema) && record(value.outputSchema) &&\n ['read', 'write'].includes(value.sideEffect as string) &&\n ['none', 'optional', 'required'].includes(value.idempotency as string) &&\n typeof value.timeoutMs === 'number' && Number.isSafeInteger(value.timeoutMs) && value.timeoutMs > 0;\n}\n\nfunction runInfo(value: unknown): Partial<StreamRequestErrorInfo> {\n if (!record(value)) return {};\n return {\n runID: typeof value.runID === 'string' ? value.runID : undefined,\n contractVersion: typeof value.contractVersion === 'string' ? value.contractVersion : undefined,\n runStatus: typeof value.status === 'string' ? value.status : undefined,\n replayed: typeof value.replayed === 'boolean' ? value.replayed : undefined,\n };\n}\n\nexport interface StreamRequestHandle<Input = StreamJSON, Result = StreamJSON> {\n describe(): Promise<PublicStreamRequest>;\n /**\n * One POST only. Input is opaque business JSON, including fields named streamId,\n * entryId, deploymentVersion or timeoutMs. Only the server chooses binding/version/timeout.\n * Generic types are caller assertions; the server validates the contract schemas.\n */\n invoke(input: Input, options?: StreamRequestInvokeOptions): Promise<StreamRequestInvokeResponse<Result>>;\n}\n\nexport class StreamRequestsClient {\n private readonly transport: StreamTransport;\n\n constructor(transport = new StreamTransport()) {\n this.transport = transport;\n }\n\n private async post(path: string, body: unknown, invoked: boolean): Promise<{ value: unknown; status: number }> {\n let response: Awaited<ReturnType<StreamTransport['post']>>;\n try {\n response = await this.transport.post(path, body);\n } catch (error) {\n if (!(error instanceof StreamTransportError)) throw error;\n const info = { status: error.status, errorCode: `STREAM_REQUEST_${error.kind}` };\n if (invoked) throw new StreamRequestResultUnknownError(info);\n const message = error.kind === 'TRANSPORT_TIMEOUT' ? 'StreamRequest HTTP transport deadline exceeded.' :\n error.kind === 'PROTOCOL_ERROR' ? 'Invalid StreamRequest response.' : 'StreamRequest transport failed.';\n throw new StreamRequestError(message, info);\n }\n const { value, status, ok } = response;\n if (!ok) {\n const error = record(value) ? value : {};\n const valid = typeof error.errorCode === 'string' && typeof error.message === 'string';\n const info: StreamRequestErrorInfo = {\n ...runInfo(value), status,\n errorCode: valid ? error.errorCode as string : 'STREAM_REQUEST_PROTOCOL_ERROR',\n };\n if (info.errorCode === 'STREAM_REQUEST_RESULT_UNKNOWN' || (invoked && !valid)) {\n throw new StreamRequestResultUnknownError(info);\n }\n throw new StreamRequestError(valid ? error.message as string : 'Invalid StreamRequest error response.', info);\n }\n return { value, status };\n }\n\n /** Discover visible contracts; defaults and authorization are resolved by the server. */\n async discover(options: StreamRequestDiscoverOptions = {}): Promise<StreamRequestDiscoverResponse> {\n keys(options, ['page', 'size', 'search']);\n if ((options.page !== undefined && (!Number.isSafeInteger(options.page) || options.page < 1)) ||\n (options.size !== undefined && (!Number.isSafeInteger(options.size) || options.size < 1 || options.size > 200)) ||\n (options.search !== undefined && typeof options.search !== 'string')) {\n throw new TypeError('Tier0 SDK: invalid StreamRequest discovery options.');\n }\n const { value, status } = await this.post('/openapi/v2/stream-requests/discover', options, false);\n if (!record(value) || !Number.isSafeInteger(value.total) || (value.total as number) < 0 ||\n !Array.isArray(value.list) || !value.list.every(definition)) {\n throw new StreamRequestError('Invalid StreamRequest discovery response.', { status, errorCode: 'STREAM_REQUEST_PROTOCOL_ERROR' });\n }\n return value as unknown as StreamRequestDiscoverResponse;\n }\n\n use<Input = StreamJSON, Result = StreamJSON>(selector: { code: string }): StreamRequestHandle<Input, Result> {\n keys(selector, ['code']);\n const code = selector.code;\n if (typeof code !== 'string' || code.length > 128 || !/^[a-z][a-z0-9]*(?:[._-][a-z0-9]+)*$/.test(code)) {\n throw new TypeError('Tier0 SDK: invalid StreamRequest code.');\n }\n const path = `/openapi/v2/stream-requests/${encodeURIComponent(code)}`;\n return {\n describe: async () => {\n const { value, status } = await this.post(`${path}/describe`, {}, false);\n if (!definition(value) || value.code !== code) {\n throw new StreamRequestError('Invalid StreamRequest description.', { status, errorCode: 'STREAM_REQUEST_PROTOCOL_ERROR' });\n }\n return value;\n },\n invoke: async (input, options = {}) => {\n keys(options, ['idempotencyKey']);\n const key = options.idempotencyKey;\n if (key !== undefined && (typeof key !== 'string' || !key || key.trim() !== key || new TextEncoder().encode(key).length > 128)) {\n throw new TypeError('Tier0 SDK: invalid StreamRequest idempotency key.');\n }\n if (!json(input)) throw new TypeError('Tier0 SDK: StreamRequest input must be JSON.');\n const { value, status } = await this.post(`${path}/invoke`, {\n input, ...(key === undefined ? {} : { idempotencyKey: key }),\n }, true);\n if (!record(value) || value.code !== code || typeof value.contractVersion !== 'string' || !value.contractVersion ||\n !Object.prototype.hasOwnProperty.call(value, 'result') || typeof value.runID !== 'string' || !value.runID ||\n value.status !== 'completed' ||\n typeof value.replayed !== 'boolean') {\n throw new StreamRequestResultUnknownError({ ...runInfo(value), status, errorCode: 'STREAM_REQUEST_PROTOCOL_ERROR' });\n }\n return value as unknown as StreamRequestInvokeResponse<Result>;\n },\n };\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"requests.js","sourceRoot":"","sources":["../../../src/streams/requests.ts"],"names":[],"mappings":"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","sourcesContent":["import { StreamTransport, StreamTransportError, DEFAULT_STREAM_TRANSPORT_TIMEOUT_MS, type StreamTransportConfig } from './transport.js';\nimport type { components } from './contract.generated.js';\n/** Public request contracts do not expose runtime bindings. */\nexport type StreamJSON = null | boolean | number | string | StreamJSON[] | { [key: string]: StreamJSON };\n\nexport interface PublicStreamRequest extends Omit<components['schemas']['PublicStreamRequest'], 'inputSchema' | 'outputSchema' | 'sideEffect' | 'idempotency'> {\n code: string;\n name: string;\n description: string;\n contractVersion: string;\n inputSchema: Record<string, StreamJSON>;\n outputSchema: Record<string, StreamJSON>;\n sideEffect: 'read' | 'write';\n idempotency: 'none' | 'optional' | 'required';\n timeoutMs: number;\n status: string;\n}\n\ntype WireDiscovery = components['schemas']['StreamRequestDiscoverReq'];\nexport interface StreamRequestDiscoverOptions extends WireDiscovery {\n page?: number;\n size?: number;\n search?: string;\n}\n\nexport interface StreamRequestDiscoverResponse {\n total: number;\n list: PublicStreamRequest[];\n}\n\n/** HTTP transport settings do not override server execution semantics. */\nexport interface StreamRequestTransportConfig extends StreamTransportConfig {}\n\nexport const DEFAULT_STREAM_REQUEST_TRANSPORT_TIMEOUT_MS = DEFAULT_STREAM_TRANSPORT_TIMEOUT_MS;\n\nexport interface StreamRequestInvokeOptions {\n /** Stable caller-owned key for one business intent, at most 128 UTF-8 bytes. Never generated or retried by the SDK. */\n idempotencyKey?: string;\n}\n\nexport interface StreamRequestInvokeResponse<Result = StreamJSON> extends Omit<components['schemas']['StreamRequestInvokeResp'], 'result' | 'status'> {\n code: string;\n contractVersion: string;\n result: Result;\n runID: string;\n /** Persisted request ledger success; all other states reject conservatively. */\n status: 'completed';\n /** True only when the server explicitly reports an idempotent replay. */\n replayed: boolean;\n}\n\nexport interface StreamRequestErrorInfo {\n /** HTTP status, absent when no HTTP response was received. */\n status?: number;\n /** Gateway string errorCode, or an SDK-local STREAM_REQUEST_* transport/protocol code. */\n errorCode: string;\n runID?: string;\n contractVersion?: string;\n runStatus?: string;\n replayed?: boolean;\n /** Present when the SDK knows the request was not dispatched. */\n execution?: 'notStarted';\n}\n\n/** No StreamRequest error is automatically retried, including authentication failures. */\nexport class StreamRequestError extends Error {\n readonly status?: number;\n readonly errorCode: string;\n readonly runID?: string;\n readonly contractVersion?: string;\n readonly runStatus?: string;\n readonly replayed?: boolean;\n readonly execution?: 'notStarted';\n readonly retryable = false;\n readonly outcomeUnknown: boolean = false;\n\n constructor(message: string, info: StreamRequestErrorInfo) {\n super(message);\n this.name = 'StreamRequestError';\n this.status = info.status;\n this.errorCode = info.errorCode;\n this.runID = info.runID;\n this.contractVersion = info.contractVersion;\n this.runStatus = info.runStatus;\n this.replayed = info.replayed;\n this.execution = info.execution;\n }\n}\n\n/** Execution may have happened. Reconcile run information; any deliberate replay must reuse the same key. */\nexport class StreamRequestResultUnknownError extends StreamRequestError {\n readonly outcomeUnknown = true;\n\n constructor(info: StreamRequestErrorInfo) {\n super('StreamRequest result is unknown; execution may have occurred. Do not automatically retry.', info);\n this.name = 'StreamRequestResultUnknownError';\n }\n}\n\nfunction record(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === 'object' && !Array.isArray(value);\n}\n\nfunction keys(value: unknown, allowed: string[]): void {\n if (!record(value) || Reflect.ownKeys(value).some(key => typeof key !== 'string' || !allowed.includes(key))) {\n throw new TypeError('Tier0 SDK: unsupported StreamRequest option.');\n }\n}\n\nfunction json(value: unknown, seen = new Set<unknown>()): boolean {\n if (value === null || typeof value === 'string' || typeof value === 'boolean') return true;\n if (typeof value === 'number') return Number.isFinite(value);\n if (typeof value !== 'object' || seen.has(value)) return false;\n if (!Array.isArray(value) && Object.getPrototypeOf(value) !== Object.prototype && Object.getPrototypeOf(value) !== null) {\n return false;\n }\n seen.add(value);\n const valid = (Array.isArray(value) ? Array.from(value) : Object.values(value)).every(item => json(item, seen));\n seen.delete(value);\n return valid;\n}\n\nfunction definition(value: unknown): value is PublicStreamRequest {\n if (!record(value)) return false;\n return ['code', 'name', 'description', 'contractVersion', 'status'].every(key => typeof value[key] === 'string') &&\n value.code !== '' && value.contractVersion !== '' && record(value.inputSchema) && record(value.outputSchema) &&\n ['read', 'write'].includes(value.sideEffect as string) &&\n ['none', 'optional', 'required'].includes(value.idempotency as string) &&\n typeof value.timeoutMs === 'number' && Number.isSafeInteger(value.timeoutMs) && value.timeoutMs > 0;\n}\n\nfunction runInfo(value: unknown): Partial<StreamRequestErrorInfo> {\n if (!record(value)) return {};\n return {\n runID: typeof value.runID === 'string' ? value.runID : undefined,\n contractVersion: typeof value.contractVersion === 'string' ? value.contractVersion : undefined,\n runStatus: typeof value.status === 'string' ? value.status : undefined,\n replayed: typeof value.replayed === 'boolean' ? value.replayed : undefined,\n };\n}\n\nexport interface StreamRequestHandle<Input = StreamJSON, Result = StreamJSON> {\n describe(): Promise<PublicStreamRequest>;\n /**\n * One POST only. Input is opaque business JSON, including fields named streamId,\n * entryId, deploymentVersion or timeoutMs. Only the server chooses binding/version/timeout.\n * Generic types are caller assertions; the server validates the contract schemas.\n */\n invoke(input: Input, options?: StreamRequestInvokeOptions): Promise<StreamRequestInvokeResponse<Result>>;\n}\n\nexport class StreamRequestsClient {\n private readonly transport: StreamTransport;\n\n constructor(transport = new StreamTransport()) {\n this.transport = transport;\n }\n\n private async post(path: string, body: unknown, invoked: boolean): Promise<{ value: unknown; status: number }> {\n let response: Awaited<ReturnType<StreamTransport['post']>>;\n try {\n response = await this.transport.post(path, body);\n } catch (error) {\n if (!(error instanceof StreamTransportError)) throw error;\n const info: StreamRequestErrorInfo = { status: error.status, errorCode: `STREAM_REQUEST_${error.kind}`,\n ...(error.notStarted ? { execution: 'notStarted' } : {}) };\n if (invoked && !error.notStarted) throw new StreamRequestResultUnknownError(info);\n const message = error.kind === 'TRANSPORT_TIMEOUT' ? 'StreamRequest HTTP transport deadline exceeded.' :\n error.kind === 'PROTOCOL_ERROR' ? 'Invalid StreamRequest response.' : 'StreamRequest transport failed.';\n throw new StreamRequestError(message, info);\n }\n const { value, status, ok } = response;\n if (!ok) {\n const error = record(value) ? value : {};\n const valid = typeof error.errorCode === 'string' && typeof error.message === 'string';\n const info: StreamRequestErrorInfo = {\n ...runInfo(value), status,\n errorCode: valid ? error.errorCode as string : 'STREAM_REQUEST_PROTOCOL_ERROR',\n };\n if (info.errorCode === 'STREAM_REQUEST_RESULT_UNKNOWN' || (invoked && !valid)) {\n throw new StreamRequestResultUnknownError(info);\n }\n throw new StreamRequestError(valid ? error.message as string : 'Invalid StreamRequest error response.', info);\n }\n return { value, status };\n }\n\n /** Discover visible contracts; defaults and authorization are resolved by the server. */\n async discover(options: StreamRequestDiscoverOptions = {}): Promise<StreamRequestDiscoverResponse> {\n keys(options, ['page', 'size', 'search']);\n if ((options.page !== undefined && (!Number.isSafeInteger(options.page) || options.page < 1)) ||\n (options.size !== undefined && (!Number.isSafeInteger(options.size) || options.size < 1 || options.size > 200)) ||\n (options.search !== undefined && typeof options.search !== 'string')) {\n throw new TypeError('Tier0 SDK: invalid StreamRequest discovery options.');\n }\n const { value, status } = await this.post('/openapi/v2/stream-requests/discover', options, false);\n if (!record(value) || !Number.isSafeInteger(value.total) || (value.total as number) < 0 ||\n !Array.isArray(value.list) || !value.list.every(definition)) {\n throw new StreamRequestError('Invalid StreamRequest discovery response.', { status, errorCode: 'STREAM_REQUEST_PROTOCOL_ERROR' });\n }\n return value as unknown as StreamRequestDiscoverResponse;\n }\n\n use<Input = StreamJSON, Result = StreamJSON>(selector: { code: string }): StreamRequestHandle<Input, Result> {\n keys(selector, ['code']);\n const code = selector.code;\n if (typeof code !== 'string' || code.length > 128 || !/^[a-z][a-z0-9]*(?:[._-][a-z0-9]+)*$/.test(code)) {\n throw new TypeError('Tier0 SDK: invalid StreamRequest code.');\n }\n const path = `/openapi/v2/stream-requests/${encodeURIComponent(code)}`;\n return {\n describe: async () => {\n const { value, status } = await this.post(`${path}/describe`, {}, false);\n if (!definition(value) || value.code !== code) {\n throw new StreamRequestError('Invalid StreamRequest description.', { status, errorCode: 'STREAM_REQUEST_PROTOCOL_ERROR' });\n }\n return value;\n },\n invoke: async (input, options = {}) => {\n keys(options, ['idempotencyKey']);\n const key = options.idempotencyKey;\n if (key !== undefined && (typeof key !== 'string' || !key || key.trim() !== key || new TextEncoder().encode(key).length > 128)) {\n throw new TypeError('Tier0 SDK: invalid StreamRequest idempotency key.');\n }\n if (!json(input)) throw new TypeError('Tier0 SDK: StreamRequest input must be JSON.');\n const { value, status } = await this.post(`${path}/invoke`, {\n input, ...(key === undefined ? {} : { idempotencyKey: key }),\n }, true);\n if (!record(value) || value.code !== code || typeof value.contractVersion !== 'string' || !value.contractVersion ||\n !Object.prototype.hasOwnProperty.call(value, 'result') || typeof value.runID !== 'string' || !value.runID ||\n value.status !== 'completed' ||\n typeof value.replayed !== 'boolean') {\n throw new StreamRequestResultUnknownError({ ...runInfo(value), status, errorCode: 'STREAM_REQUEST_PROTOCOL_ERROR' });\n }\n return value as unknown as StreamRequestInvokeResponse<Result>;\n },\n };\n }\n}\n"]}
|
|
@@ -1,16 +1,4 @@
|
|
|
1
|
-
import { type HttpClient } from '../openapi/client.js';
|
|
2
|
-
import { type AppRuntime } from '../runtime.js';
|
|
3
1
|
import { CloudTransport, CloudTransportError, type CloudTransportConfig } from '../cloud-transport.js';
|
|
4
2
|
export type StreamTransportConfig = Pick<CloudTransportConfig, 'transportTimeoutMs'>;
|
|
5
3
|
export declare const DEFAULT_STREAM_TRANSPORT_TIMEOUT_MS = 60000;
|
|
6
|
-
export { CloudTransportError as StreamTransportError };
|
|
7
|
-
/** Add the trusted App bridge to the existing single-attempt Cloud transport. */
|
|
8
|
-
export declare class StreamTransport extends CloudTransport {
|
|
9
|
-
readonly runtime: () => AppRuntime | undefined;
|
|
10
|
-
constructor(resolveClient?: () => HttpClient, config?: StreamTransportConfig, runtime?: () => AppRuntime | undefined);
|
|
11
|
-
post(path: string, body: unknown, signal?: AbortSignal): Promise<{
|
|
12
|
-
value: unknown;
|
|
13
|
-
status: number;
|
|
14
|
-
ok: boolean;
|
|
15
|
-
}>;
|
|
16
|
-
}
|
|
4
|
+
export { CloudTransport as StreamTransport, CloudTransportError as StreamTransportError };
|
|
@@ -1,24 +1,8 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
4
|
-
const client_js_1 = require("../openapi/client.js");
|
|
5
|
-
const runtime_js_1 = require("../runtime.js");
|
|
3
|
+
exports.StreamTransportError = exports.StreamTransport = exports.DEFAULT_STREAM_TRANSPORT_TIMEOUT_MS = void 0;
|
|
6
4
|
const cloud_transport_js_1 = require("../cloud-transport.js");
|
|
5
|
+
Object.defineProperty(exports, "StreamTransport", { enumerable: true, get: function () { return cloud_transport_js_1.CloudTransport; } });
|
|
7
6
|
Object.defineProperty(exports, "StreamTransportError", { enumerable: true, get: function () { return cloud_transport_js_1.CloudTransportError; } });
|
|
8
7
|
exports.DEFAULT_STREAM_TRANSPORT_TIMEOUT_MS = cloud_transport_js_1.DEFAULT_CLOUD_TRANSPORT_TIMEOUT_MS;
|
|
9
|
-
/** Add the trusted App bridge to the existing single-attempt Cloud transport. */
|
|
10
|
-
class StreamTransport extends cloud_transport_js_1.CloudTransport {
|
|
11
|
-
runtime;
|
|
12
|
-
constructor(resolveClient = client_js_1.getClient, config = {}, runtime = runtime_js_1.getAppRuntime) {
|
|
13
|
-
super(resolveClient, config);
|
|
14
|
-
this.runtime = runtime;
|
|
15
|
-
}
|
|
16
|
-
async post(path, body, signal) {
|
|
17
|
-
const runtime = this.runtime();
|
|
18
|
-
if (!runtime && typeof window !== 'undefined')
|
|
19
|
-
throw new cloud_transport_js_1.CloudTransportError('TRANSPORT_ERROR');
|
|
20
|
-
return super.post(path, body, signal, runtime);
|
|
21
|
-
}
|
|
22
|
-
}
|
|
23
|
-
exports.StreamTransport = StreamTransport;
|
|
24
8
|
//# sourceMappingURL=transport.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transport.js","sourceRoot":"","sources":["../../../src/streams/transport.ts"],"names":[],"mappings":";;;AAAA,
|
|
1
|
+
{"version":3,"file":"transport.js","sourceRoot":"","sources":["../../../src/streams/transport.ts"],"names":[],"mappings":";;;AAAA,8DAA2I;AAIhH,gGAJlB,mCAAc,OAImB;AAAyB,qGAJ1C,wCAAmB,OAI2C;AAD1E,QAAA,mCAAmC,GAAG,uDAAkC,CAAC","sourcesContent":["import { CloudTransport, CloudTransportError, DEFAULT_CLOUD_TRANSPORT_TIMEOUT_MS, type CloudTransportConfig } from '../cloud-transport.js';\n\nexport type StreamTransportConfig = Pick<CloudTransportConfig, 'transportTimeoutMs'>;\nexport const DEFAULT_STREAM_TRANSPORT_TIMEOUT_MS = DEFAULT_CLOUD_TRANSPORT_TIMEOUT_MS;\nexport { CloudTransport as StreamTransport, CloudTransportError as StreamTransportError };\n"]}
|
|
@@ -78,11 +78,7 @@ export declare function assertEventId(value: string): void;
|
|
|
78
78
|
* collection the caller may read (an App key: every collection granted to the App).
|
|
79
79
|
*/
|
|
80
80
|
export type UnsV2RecordSubscribeRequest = Pick<CloudRecordSubscribeReq, 'collectionIds' | 'recordIds'>;
|
|
81
|
-
/**
|
|
82
|
-
* A committed record change. Events carry identities only: read the record to
|
|
83
|
-
* see its data. `restricted`: the collection has employee data rules, so who
|
|
84
|
-
* may see this record depends on the employee (see `data.subscribe`).
|
|
85
|
-
*/
|
|
81
|
+
/** A committed record change. Events carry identities only: read the record to see its data. */
|
|
86
82
|
export interface UnsV2RecordChangeEvent {
|
|
87
83
|
type: 'change';
|
|
88
84
|
/** Stream position (also the frame id); resume after it with `lastEventId`. */
|
|
@@ -92,7 +88,6 @@ export interface UnsV2RecordChangeEvent {
|
|
|
92
88
|
revision: number;
|
|
93
89
|
change: 'record' | 'delete';
|
|
94
90
|
occurredAt: number;
|
|
95
|
-
restricted: boolean;
|
|
96
91
|
}
|
|
97
92
|
export type UnsV2SubscriptionEvent = UnsV2RecordChangeEvent
|
|
98
93
|
/** Sent on connect and every 15 s; `eventId` is the current position, resumable like a change's. */
|
|
@@ -6,6 +6,7 @@ exports.assertEventId = assertEventId;
|
|
|
6
6
|
exports.createUnsV2Client = createUnsV2Client;
|
|
7
7
|
const cloud_transport_js_1 = require("../cloud-transport.js");
|
|
8
8
|
const client_js_1 = require("../openapi/client.js");
|
|
9
|
+
const connection_diagnostics_js_1 = require("../connection-diagnostics.js");
|
|
9
10
|
const codec_js_1 = require("./codec.js");
|
|
10
11
|
const sse_js_1 = require("./sse.js");
|
|
11
12
|
const generated_js_1 = require("./generated.js");
|
|
@@ -139,6 +140,25 @@ function retryAfterMs(value) {
|
|
|
139
140
|
* been forwarded.
|
|
140
141
|
*/
|
|
141
142
|
const rejectedBeforeUns = (status) => status >= 400 && status < 500 && status !== 408;
|
|
143
|
+
/**
|
|
144
|
+
* An answer of the node proxy (design 21.28, `X-Tier0-Proxy: not-forwarded`):
|
|
145
|
+
* `{code: "sbx_proxy_*", message, retry_after_ms?}`. UNS never saw the request,
|
|
146
|
+
* so it is `notStarted`, a write included. The HTTP client already resent a
|
|
147
|
+
* 503 or 429 three times; `retry.safe` is false so that no caller multiplies
|
|
148
|
+
* those resends.
|
|
149
|
+
*/
|
|
150
|
+
function proxyError(text, status, operation) {
|
|
151
|
+
let value;
|
|
152
|
+
try {
|
|
153
|
+
value = JSON.parse(text);
|
|
154
|
+
}
|
|
155
|
+
catch {
|
|
156
|
+
value = undefined;
|
|
157
|
+
}
|
|
158
|
+
const code = record(value) && typeof value.code === 'string' && /^sbx_proxy_[a-z_]+$/.test(value.code) ? value.code : 'UNS_V2_PROTOCOL_ERROR';
|
|
159
|
+
const message = record(value) && typeof value.message === 'string' ? value.message : 'Rejected by the Tier0 node proxy.';
|
|
160
|
+
return localError(message, operation, false, code, status, false, { notStarted: true });
|
|
161
|
+
}
|
|
142
162
|
/** Contract limits of one `records:subscribe` stream. */
|
|
143
163
|
exports.UNS_V2_SUBSCRIBE_MAX_COLLECTIONS = 64;
|
|
144
164
|
exports.UNS_V2_SUBSCRIBE_MAX_RECORD_IDS = 100;
|
|
@@ -156,8 +176,7 @@ function assertEventId(value) {
|
|
|
156
176
|
function changeEvent(value) {
|
|
157
177
|
if (!record(value) || typeof value.eventId !== 'string' || typeof value.collectionId !== 'string' ||
|
|
158
178
|
typeof value.recordId !== 'string' || typeof value.revision !== 'number' || !Number.isSafeInteger(value.revision) ||
|
|
159
|
-
(value.change !== 'record' && value.change !== 'delete') || typeof value.occurredAt !== 'number'
|
|
160
|
-
typeof value.restricted !== 'boolean')
|
|
179
|
+
(value.change !== 'record' && value.change !== 'delete') || typeof value.occurredAt !== 'number')
|
|
161
180
|
return undefined;
|
|
162
181
|
return {
|
|
163
182
|
type: 'change',
|
|
@@ -167,7 +186,6 @@ function changeEvent(value) {
|
|
|
167
186
|
revision: value.revision,
|
|
168
187
|
change: value.change,
|
|
169
188
|
occurredAt: value.occurredAt,
|
|
170
|
-
restricted: value.restricted,
|
|
171
189
|
};
|
|
172
190
|
}
|
|
173
191
|
class UnsV2ClientCore {
|
|
@@ -189,7 +207,7 @@ class UnsV2ClientCore {
|
|
|
189
207
|
}
|
|
190
208
|
let response;
|
|
191
209
|
try {
|
|
192
|
-
response = await this.transport.postText(path, body, options
|
|
210
|
+
response = await this.transport.postText(path, body, options);
|
|
193
211
|
}
|
|
194
212
|
catch (error) {
|
|
195
213
|
if (!(error instanceof cloud_transport_js_1.CloudTransportError))
|
|
@@ -199,8 +217,10 @@ class UnsV2ClientCore {
|
|
|
199
217
|
: error.kind === 'PROTOCOL_ERROR' ? 'Invalid UNS v2 HTTP response.'
|
|
200
218
|
: error.kind === 'TRANSPORT_ABORTED' ? 'UNS v2 request aborted.' : 'UNS v2 transport failed.';
|
|
201
219
|
const resendable = error.kind === 'TRANSPORT_TIMEOUT' || error.kind === 'TRANSPORT_ERROR';
|
|
202
|
-
throw localError(message, name, mutation, `UNS_V2_${error.kind}`, error.status, resendable);
|
|
220
|
+
throw localError(message, name, mutation, `UNS_V2_${error.kind}`, error.status, resendable, { notStarted: error.notStarted });
|
|
203
221
|
}
|
|
222
|
+
if (response.notForwarded)
|
|
223
|
+
throw proxyError(response.text, response.status, name);
|
|
204
224
|
// An ingress answers 502/503/504 without the UNS envelope during rollouts and restarts.
|
|
205
225
|
const unavailable = response.status === 502 || response.status === 503 || response.status === 504;
|
|
206
226
|
// `enveloped`: the body looks like a UNS envelope, so UNS may have answered it.
|
|
@@ -213,7 +233,7 @@ class UnsV2ClientCore {
|
|
|
213
233
|
value = (0, codec_js_1.decodeUnsV2JSON)(response.text, response.status === 200 ? operation.response : 'UnsV2ErrorResponse');
|
|
214
234
|
}
|
|
215
235
|
catch {
|
|
216
|
-
throw invalid(
|
|
236
|
+
throw invalid(`Invalid UNS v2 response. ${(0, connection_diagnostics_js_1.invalidResponseHint)(response.status)}`, false);
|
|
217
237
|
}
|
|
218
238
|
if (response.status !== 200) {
|
|
219
239
|
const info = errorInfo(value, response.status, name);
|
|
@@ -259,7 +279,7 @@ class UnsV2ClientCore {
|
|
|
259
279
|
const path = generated_js_1.UNS_V2_STREAM_OPERATIONS.recordSubscribe.path + (query.size ? `?${query}` : '');
|
|
260
280
|
let opened;
|
|
261
281
|
try {
|
|
262
|
-
opened = await this.transport.getEventStream(path, options
|
|
282
|
+
opened = await this.transport.getEventStream(path, options);
|
|
263
283
|
}
|
|
264
284
|
catch (error) {
|
|
265
285
|
if (!(error instanceof cloud_transport_js_1.CloudTransportError))
|
|
@@ -270,8 +290,10 @@ class UnsV2ClientCore {
|
|
|
270
290
|
throw localError('UNS v2 event stream could not be opened.', name, false, `UNS_V2_${error.kind}`, error.status, resendable);
|
|
271
291
|
}
|
|
272
292
|
if ('text' in opened) {
|
|
293
|
+
if (opened.notForwarded)
|
|
294
|
+
throw proxyError(opened.text, opened.status, name);
|
|
273
295
|
const unavailable = opened.status === 502 || opened.status === 503 || opened.status === 504;
|
|
274
|
-
const invalid = (enveloped) => localError(
|
|
296
|
+
const invalid = (enveloped) => localError(`Invalid UNS v2 event stream response. ${(0, connection_diagnostics_js_1.invalidResponseHint)(opened.status)}`, name, false, 'UNS_V2_PROTOCOL_ERROR', opened.status, unavailable, {
|
|
275
297
|
notStarted: !enveloped && rejectedBeforeUns(opened.status),
|
|
276
298
|
});
|
|
277
299
|
let value;
|
|
@@ -295,6 +317,9 @@ class UnsV2ClientCore {
|
|
|
295
317
|
if ('comment' in event) {
|
|
296
318
|
yield { type: 'heartbeat' };
|
|
297
319
|
}
|
|
320
|
+
else if (!('event' in event)) {
|
|
321
|
+
continue;
|
|
322
|
+
}
|
|
298
323
|
else if (event.event === 'heartbeat') {
|
|
299
324
|
yield event.id === undefined ? { type: 'heartbeat' } : { type: 'heartbeat', eventId: event.id };
|
|
300
325
|
}
|