@tier0/sdk-v2 0.1.0 → 0.2.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -21
- package/README.md +13 -11
- package/dist/cjs/app-identity-contract.generated.js.map +1 -1
- package/dist/cjs/capabilities.js.map +1 -1
- package/dist/cjs/cloud-server.js.map +1 -1
- package/dist/cjs/cloud-transport.d.ts +21 -0
- package/dist/cjs/cloud-transport.js +81 -1
- package/dist/cjs/cloud-transport.js.map +1 -1
- package/dist/cjs/controls.js.map +1 -1
- package/dist/cjs/data/bootstrap.d.ts +4 -0
- package/dist/cjs/data/bootstrap.js +15 -6
- package/dist/cjs/data/bootstrap.js.map +1 -1
- package/dist/cjs/data/call.d.ts +26 -9
- package/dist/cjs/data/call.js +179 -14
- package/dist/cjs/data/call.js.map +1 -1
- package/dist/cjs/data/client.d.ts +44 -2
- package/dist/cjs/data/client.js +87 -4
- package/dist/cjs/data/client.js.map +1 -1
- package/dist/cjs/data/collection.d.ts +151 -14
- package/dist/cjs/data/collection.js +213 -50
- package/dist/cjs/data/collection.js.map +1 -1
- package/dist/cjs/data/context.d.ts +4 -2
- package/dist/cjs/data/context.js +14 -3
- package/dist/cjs/data/context.js.map +1 -1
- package/dist/cjs/data/define.d.ts +9 -1
- package/dist/cjs/data/define.js.map +1 -1
- package/dist/cjs/data/error.d.ts +30 -12
- package/dist/cjs/data/error.js +61 -63
- package/dist/cjs/data/error.js.map +1 -1
- package/dist/cjs/data/index.d.ts +6 -3
- package/dist/cjs/data/index.js +7 -1
- package/dist/cjs/data/index.js.map +1 -1
- package/dist/cjs/data/schema.d.ts +7 -1
- package/dist/cjs/data/schema.js +54 -4
- package/dist/cjs/data/schema.js.map +1 -1
- package/dist/cjs/data/subscribe.d.ts +108 -0
- package/dist/cjs/data/subscribe.js +270 -0
- package/dist/cjs/data/subscribe.js.map +1 -0
- package/dist/cjs/mq/broker.js.map +1 -1
- package/dist/cjs/mq/client.js.map +1 -1
- package/dist/cjs/mq/index.js.map +1 -1
- package/dist/cjs/mq/types.js.map +1 -1
- package/dist/cjs/runtime-context.js.map +1 -1
- package/dist/cjs/runtime-env.js.map +1 -1
- package/dist/cjs/uns-v2/client.d.ts +90 -12
- package/dist/cjs/uns-v2/client.js +238 -63
- package/dist/cjs/uns-v2/client.js.map +1 -1
- package/dist/cjs/uns-v2/codec.js.map +1 -1
- package/dist/cjs/uns-v2/generated.d.ts +9619 -6923
- package/dist/cjs/uns-v2/generated.js +124 -119
- package/dist/cjs/uns-v2/generated.js.map +1 -1
- package/dist/cjs/uns-v2/index.js.map +1 -1
- package/dist/cjs/uns-v2/sse.d.ts +20 -0
- package/dist/cjs/uns-v2/sse.js +65 -0
- package/dist/cjs/uns-v2/sse.js.map +1 -0
- package/dist/esm/app-identity-contract.generated.js.map +1 -1
- package/dist/esm/capabilities.js.map +1 -1
- package/dist/esm/cloud-server.js.map +1 -1
- package/dist/esm/cloud-transport.d.ts +21 -0
- package/dist/esm/cloud-transport.js +81 -1
- package/dist/esm/cloud-transport.js.map +1 -1
- package/dist/esm/controls.js.map +1 -1
- package/dist/esm/data/bootstrap.d.ts +4 -0
- package/dist/esm/data/bootstrap.js +14 -5
- package/dist/esm/data/bootstrap.js.map +1 -1
- package/dist/esm/data/call.d.ts +26 -9
- package/dist/esm/data/call.js +177 -13
- package/dist/esm/data/call.js.map +1 -1
- package/dist/esm/data/client.d.ts +44 -2
- package/dist/esm/data/client.js +89 -7
- package/dist/esm/data/client.js.map +1 -1
- package/dist/esm/data/collection.d.ts +151 -14
- package/dist/esm/data/collection.js +212 -49
- package/dist/esm/data/collection.js.map +1 -1
- package/dist/esm/data/context.d.ts +4 -2
- package/dist/esm/data/context.js +13 -3
- package/dist/esm/data/context.js.map +1 -1
- package/dist/esm/data/define.d.ts +9 -1
- package/dist/esm/data/define.js.map +1 -1
- package/dist/esm/data/error.d.ts +30 -12
- package/dist/esm/data/error.js +61 -63
- package/dist/esm/data/error.js.map +1 -1
- package/dist/esm/data/index.d.ts +6 -3
- package/dist/esm/data/index.js +3 -1
- package/dist/esm/data/index.js.map +1 -1
- package/dist/esm/data/schema.d.ts +7 -1
- package/dist/esm/data/schema.js +54 -4
- package/dist/esm/data/schema.js.map +1 -1
- package/dist/esm/data/subscribe.d.ts +108 -0
- package/dist/esm/data/subscribe.js +265 -0
- package/dist/esm/data/subscribe.js.map +1 -0
- package/dist/esm/mq/broker.js.map +1 -1
- package/dist/esm/mq/client.js.map +1 -1
- package/dist/esm/mq/index.js.map +1 -1
- package/dist/esm/mq/types.js.map +1 -1
- package/dist/esm/runtime-context.js.map +1 -1
- package/dist/esm/runtime-env.js.map +1 -1
- package/dist/esm/uns-v2/client.d.ts +90 -12
- package/dist/esm/uns-v2/client.js +236 -63
- package/dist/esm/uns-v2/client.js.map +1 -1
- package/dist/esm/uns-v2/codec.js.map +1 -1
- package/dist/esm/uns-v2/generated.d.ts +9619 -6923
- package/dist/esm/uns-v2/generated.js +123 -118
- package/dist/esm/uns-v2/generated.js.map +1 -1
- package/dist/esm/uns-v2/index.js.map +1 -1
- package/dist/esm/uns-v2/sse.d.ts +20 -0
- package/dist/esm/uns-v2/sse.js +60 -0
- package/dist/esm/uns-v2/sse.js.map +1 -0
- package/package.json +29 -16
- package/skills/tier0-sdk-v2/SKILL.md +14 -14
- package/skills/{tier0-sdk-v2-data → tier0-sdk-v2/tier0-sdk-v2-data}/SKILL.md +3 -2
- package/skills/{tier0-sdk-v2-data → tier0-sdk-v2/tier0-sdk-v2-data}/references/consistency.md +3 -3
- package/skills/{tier0-sdk-v2-data → tier0-sdk-v2/tier0-sdk-v2-data}/references/errors.md +23 -10
- package/skills/{tier0-sdk-v2-data → tier0-sdk-v2/tier0-sdk-v2-data}/references/modeling.md +36 -0
- package/skills/tier0-sdk-v2/tier0-sdk-v2-data/references/read-write.md +172 -0
- package/skills/{tier0-sdk-v2-mq → tier0-sdk-v2/tier0-sdk-v2-mq}/references/quickstart.md +1 -1
- package/skills/{tier0-sdk-v2-source → tier0-sdk-v2/tier0-sdk-v2-source}/SKILL.md +3 -3
- package/skills/{tier0-sdk-v2-source → tier0-sdk-v2/tier0-sdk-v2-source}/references/create.md +3 -6
- package/skills/tier0-sdk-v2/tier0-sdk-v2-source/references/delete.md +39 -0
- package/skills/tier0-sdk-v2/tier0-sdk-v2-source/references/state.md +36 -0
- package/skills/tier0-sdk-v2/tier0-sdk-v2-source/references/update.md +80 -0
- package/skills/{tier0-sdk-v2-stream → tier0-sdk-v2/tier0-sdk-v2-stream}/SKILL.md +6 -6
- package/skills/{tier0-sdk-v2-stream → tier0-sdk-v2/tier0-sdk-v2-stream}/references/create.md +15 -14
- package/skills/{tier0-sdk-v2-stream → tier0-sdk-v2/tier0-sdk-v2-stream}/references/deploy.md +11 -9
- package/skills/{tier0-sdk-v2-stream → tier0-sdk-v2/tier0-sdk-v2-stream}/references/lifecycle.md +2 -1
- package/skills/{tier0-sdk-v2-stream → tier0-sdk-v2/tier0-sdk-v2-stream}/references/update.md +5 -6
- package/skills/tier0-sdk-v2/tier0-sdk-v2-uns/SKILL.md +55 -0
- package/skills/tier0-sdk-v2/tier0-sdk-v2-uns/references/create.md +57 -0
- package/skills/{tier0-sdk-v2-uns → tier0-sdk-v2/tier0-sdk-v2-uns}/references/data-workflows.md +3 -7
- package/skills/tier0-sdk-v2/tier0-sdk-v2-uns/references/delete.md +53 -0
- package/skills/tier0-sdk-v2/tier0-sdk-v2-uns/references/namespace.md +38 -0
- package/skills/tier0-sdk-v2/tier0-sdk-v2-uns/references/read.md +34 -0
- package/skills/tier0-sdk-v2/tier0-sdk-v2-uns/references/restore.md +39 -0
- package/skills/tier0-sdk-v2/tier0-sdk-v2-uns/references/update.md +62 -0
- package/skills/tier0-sdk-v2-data/references/read-write.md +0 -72
- package/skills/tier0-sdk-v2-source/references/delete.md +0 -47
- package/skills/tier0-sdk-v2-source/references/state.md +0 -37
- package/skills/tier0-sdk-v2-source/references/update.md +0 -61
- package/skills/tier0-sdk-v2-uns/SKILL.md +0 -53
- package/skills/tier0-sdk-v2-uns/references/create.md +0 -85
- package/skills/tier0-sdk-v2-uns/references/delete.md +0 -69
- package/skills/tier0-sdk-v2-uns/references/namespace.md +0 -75
- package/skills/tier0-sdk-v2-uns/references/read.md +0 -32
- package/skills/tier0-sdk-v2-uns/references/restore.md +0 -41
- package/skills/tier0-sdk-v2-uns/references/update.md +0 -86
- /package/skills/{tier0-sdk-v2-agent → tier0-sdk-v2/tier0-sdk-v2-agent}/SKILL.md +0 -0
- /package/skills/{tier0-sdk-v2-agent → tier0-sdk-v2/tier0-sdk-v2-agent}/references/results.md +0 -0
- /package/skills/{tier0-sdk-v2-controls → tier0-sdk-v2/tier0-sdk-v2-controls}/SKILL.md +0 -0
- /package/skills/{tier0-sdk-v2-data → tier0-sdk-v2/tier0-sdk-v2-data}/references/schema-evolution.md +0 -0
- /package/skills/{tier0-sdk-v2-files → tier0-sdk-v2/tier0-sdk-v2-files}/SKILL.md +0 -0
- /package/skills/{tier0-sdk-v2-files → tier0-sdk-v2/tier0-sdk-v2-files}/references/delete.md +0 -0
- /package/skills/{tier0-sdk-v2-files → tier0-sdk-v2/tier0-sdk-v2-files}/references/download.md +0 -0
- /package/skills/{tier0-sdk-v2-files → tier0-sdk-v2/tier0-sdk-v2-files}/references/multipart.md +0 -0
- /package/skills/{tier0-sdk-v2-files → tier0-sdk-v2/tier0-sdk-v2-files}/references/upload.md +0 -0
- /package/skills/{tier0-sdk-v2-files → tier0-sdk-v2/tier0-sdk-v2-files}/references/url.md +0 -0
- /package/skills/{tier0-sdk-v2-members → tier0-sdk-v2/tier0-sdk-v2-members}/SKILL.md +0 -0
- /package/skills/{tier0-sdk-v2-members → tier0-sdk-v2/tier0-sdk-v2-members}/references/app-members.md +0 -0
- /package/skills/{tier0-sdk-v2-members → tier0-sdk-v2/tier0-sdk-v2-members}/references/platform-members.md +0 -0
- /package/skills/{tier0-sdk-v2-mq → tier0-sdk-v2/tier0-sdk-v2-mq}/SKILL.md +0 -0
- /package/skills/{tier0-sdk-v2-notifications → tier0-sdk-v2/tier0-sdk-v2-notifications}/SKILL.md +0 -0
- /package/skills/{tier0-sdk-v2-notifications → tier0-sdk-v2/tier0-sdk-v2-notifications}/references/get.md +0 -0
- /package/skills/{tier0-sdk-v2-notifications → tier0-sdk-v2/tier0-sdk-v2-notifications}/references/send.md +0 -0
- /package/skills/{tier0-sdk-v2-source → tier0-sdk-v2/tier0-sdk-v2-source}/references/changes.md +0 -0
- /package/skills/{tier0-sdk-v2-source → tier0-sdk-v2/tier0-sdk-v2-source}/references/protocols.md +0 -0
- /package/skills/{tier0-sdk-v2-source → tier0-sdk-v2/tier0-sdk-v2-source}/references/read.md +0 -0
- /package/skills/{tier0-sdk-v2-stream → tier0-sdk-v2/tier0-sdk-v2-stream}/references/delete.md +0 -0
- /package/skills/{tier0-sdk-v2-stream → tier0-sdk-v2/tier0-sdk-v2-stream}/references/read.md +0 -0
- /package/skills/{tier0-sdk-v2-system → tier0-sdk-v2/tier0-sdk-v2-system}/SKILL.md +0 -0
- /package/skills/{tier0-sdk-v2-system → tier0-sdk-v2/tier0-sdk-v2-system}/references/info.md +0 -0
- /package/skills/{tier0-sdk-v2-system → tier0-sdk-v2/tier0-sdk-v2-system}/references/whoami.md +0 -0
|
@@ -1,15 +1,27 @@
|
|
|
1
1
|
import { type CloudTransportConfig } from '../cloud-transport.js';
|
|
2
2
|
import { type HttpClient, type RequestOptions } from '../openapi/client.js';
|
|
3
|
-
import { type
|
|
3
|
+
import { type CloudRecordSubscribeReq, type UnsV2OperationName, type UnsV2StreamOperationName, type UnsV2Operations, type UnsV2Request, type UnsV2Response } from './generated.js';
|
|
4
4
|
type RecordValue = Record<string, unknown>;
|
|
5
|
+
/**
|
|
6
|
+
* How far a failed request got. `unknown` only for a mutation whose commit
|
|
7
|
+
* cannot be confirmed; a read is never `unknown`.
|
|
8
|
+
*/
|
|
9
|
+
export type UnsV2Execution = 'notStarted' | 'rolledBack' | 'committed' | 'unknown';
|
|
10
|
+
export declare const UNS_V2_EXECUTIONS: readonly UnsV2Execution[];
|
|
11
|
+
/** Whether the identical request (same idempotency key) may be sent again, and after how long. */
|
|
12
|
+
export interface UnsV2Retry {
|
|
13
|
+
safe: boolean;
|
|
14
|
+
afterMs?: number;
|
|
15
|
+
}
|
|
16
|
+
/** Generated POST operations, or a GET event stream such as `recordSubscribe`. */
|
|
17
|
+
export type UnsV2ErrorOperation = UnsV2OperationName | UnsV2StreamOperationName;
|
|
5
18
|
export interface UnsV2ErrorInfo {
|
|
6
19
|
status?: number;
|
|
7
|
-
operation:
|
|
20
|
+
operation: UnsV2ErrorOperation;
|
|
8
21
|
code: string;
|
|
9
22
|
requestId?: string;
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
rolledBack?: boolean;
|
|
23
|
+
execution: UnsV2Execution;
|
|
24
|
+
retry: UnsV2Retry;
|
|
13
25
|
opId?: string;
|
|
14
26
|
path?: string;
|
|
15
27
|
details?: RecordValue[];
|
|
@@ -19,15 +31,19 @@ export interface UnsV2ErrorInfo {
|
|
|
19
31
|
/** The error envelope's `data`, verbatim; stable access codes such as `data.reason` live here. */
|
|
20
32
|
data?: unknown;
|
|
21
33
|
}
|
|
22
|
-
/**
|
|
34
|
+
/**
|
|
35
|
+
* A failed UNS v2 call. `execution` and `retry` come from the error body; for
|
|
36
|
+
* failures without one (timeout, network, invalid response) the SDK fills them
|
|
37
|
+
* like the gateway does: a read `rolledBack` and safe to resend, a mutation
|
|
38
|
+
* `unknown` and not safe. This client never retries; it exposes the advice.
|
|
39
|
+
*/
|
|
23
40
|
export declare class UnsV2Error extends Error implements UnsV2ErrorInfo {
|
|
24
41
|
readonly status?: number;
|
|
25
|
-
readonly operation:
|
|
42
|
+
readonly operation: UnsV2ErrorOperation;
|
|
26
43
|
readonly code: string;
|
|
27
44
|
readonly requestId?: string;
|
|
28
|
-
readonly
|
|
29
|
-
readonly
|
|
30
|
-
readonly rolledBack?: boolean;
|
|
45
|
+
readonly execution: UnsV2Execution;
|
|
46
|
+
readonly retry: UnsV2Retry;
|
|
31
47
|
readonly opId?: string;
|
|
32
48
|
readonly path?: string;
|
|
33
49
|
readonly details?: RecordValue[];
|
|
@@ -36,16 +52,78 @@ export declare class UnsV2Error extends Error implements UnsV2ErrorInfo {
|
|
|
36
52
|
readonly queryId?: string;
|
|
37
53
|
readonly data?: unknown;
|
|
38
54
|
constructor(message: string, info: UnsV2ErrorInfo);
|
|
55
|
+
get outcomeUnknown(): boolean;
|
|
39
56
|
}
|
|
40
|
-
/**
|
|
57
|
+
/**
|
|
58
|
+
* `execution: "unknown"`: a mutation may have committed. Reconcile (read back,
|
|
59
|
+
* or replay with the same idempotency key when `retry.safe`) before acting again.
|
|
60
|
+
*/
|
|
41
61
|
export declare class UnsV2OutcomeUnknownError extends UnsV2Error {
|
|
42
|
-
readonly outcomeUnknown = true;
|
|
43
62
|
constructor(message: string, info: UnsV2ErrorInfo);
|
|
44
63
|
}
|
|
64
|
+
/** The wire error object (an envelope's `error`, a batch item's `error`); undefined when it is not one. */
|
|
65
|
+
export declare function parseUnsV2Fault(value: unknown): Omit<UnsV2ErrorInfo, 'status' | 'operation' | 'requestId' | 'data'> | undefined;
|
|
66
|
+
/** Contract limits of one `records:subscribe` stream. */
|
|
67
|
+
export declare const UNS_V2_SUBSCRIBE_MAX_COLLECTIONS = 64;
|
|
68
|
+
export declare const UNS_V2_SUBSCRIBE_MAX_RECORD_IDS = 100;
|
|
69
|
+
/**
|
|
70
|
+
* Rejects a resume position that cannot be an event id (1–8192 visible ASCII
|
|
71
|
+
* characters), such as a `Last-Event-ID` with CR/LF taken from a browser:
|
|
72
|
+
* sent as a header it would fail every connection.
|
|
73
|
+
*/
|
|
74
|
+
export declare function assertEventId(value: string): void;
|
|
75
|
+
/**
|
|
76
|
+
* Query of `records:subscribe`; the resume position travels as `lastEventId`
|
|
77
|
+
* (the `Last-Event-ID` header). Without `collectionIds` the stream covers every
|
|
78
|
+
* collection the caller may read (an App key: every collection granted to the App).
|
|
79
|
+
*/
|
|
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
|
+
*/
|
|
86
|
+
export interface UnsV2RecordChangeEvent {
|
|
87
|
+
type: 'change';
|
|
88
|
+
/** Stream position (also the frame id); resume after it with `lastEventId`. */
|
|
89
|
+
eventId: string;
|
|
90
|
+
collectionId: string;
|
|
91
|
+
recordId: string;
|
|
92
|
+
revision: number;
|
|
93
|
+
change: 'record' | 'delete';
|
|
94
|
+
occurredAt: number;
|
|
95
|
+
restricted: boolean;
|
|
96
|
+
}
|
|
97
|
+
export type UnsV2SubscriptionEvent = UnsV2RecordChangeEvent
|
|
98
|
+
/** Sent on connect and every 15 s; `eventId` is the current position, resumable like a change's. */
|
|
99
|
+
| {
|
|
100
|
+
type: 'heartbeat';
|
|
101
|
+
eventId?: string;
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* The server closes the stream after it. `CURSOR_EXPIRED`: the position is
|
|
105
|
+
* outside the 24 h retention; `SCOPE_CHANGED`: access narrowed. Reload, then
|
|
106
|
+
* subscribe again without `lastEventId`.
|
|
107
|
+
*/
|
|
108
|
+
| {
|
|
109
|
+
type: 'reset';
|
|
110
|
+
reason: string;
|
|
111
|
+
message?: string;
|
|
112
|
+
};
|
|
45
113
|
export declare class UnsV2ClientCore {
|
|
46
114
|
private readonly transport;
|
|
47
115
|
constructor(resolveClient?: () => HttpClient, config?: CloudTransportConfig);
|
|
48
116
|
call<Name extends UnsV2OperationName>(name: Name, request: UnsV2Request<Name>, options?: RequestOptions): Promise<UnsV2Response<Name>>;
|
|
117
|
+
/**
|
|
118
|
+
* Opens one `records:subscribe` event stream and yields its events until
|
|
119
|
+
* the server ends it or `signal` aborts (the generator then returns). It
|
|
120
|
+
* neither reconnects nor watches heartbeats; `data.subscribe` does. A
|
|
121
|
+
* refused or broken connection throws UnsV2Error (operation
|
|
122
|
+
* `recordSubscribe`, a read: `retry.safe` says whether to reconnect).
|
|
123
|
+
*/
|
|
124
|
+
subscribeRecords(request: UnsV2RecordSubscribeRequest, options?: RequestOptions & {
|
|
125
|
+
lastEventId?: string;
|
|
126
|
+
}): AsyncGenerator<UnsV2SubscriptionEvent>;
|
|
49
127
|
}
|
|
50
128
|
export type UnsV2Client = UnsV2ClientCore & UnsV2Operations;
|
|
51
129
|
export declare function createUnsV2Client(resolveClient?: () => HttpClient, config?: CloudTransportConfig): UnsV2Client;
|
|
@@ -1,16 +1,22 @@
|
|
|
1
1
|
import { CloudTransport, CloudTransportError, UNS_V2_MAX_REQUEST_BYTES, } from '../cloud-transport.js';
|
|
2
2
|
import { getClient } from '../openapi/client.js';
|
|
3
3
|
import { decodeUnsV2JSON, encodeUnsV2JSON } from './codec.js';
|
|
4
|
-
import {
|
|
5
|
-
|
|
4
|
+
import { parseServerSentEvents, ServerSentEventsError } from './sse.js';
|
|
5
|
+
import { UNS_V2_OPERATIONS, UNS_V2_STREAM_OPERATIONS, } from './generated.js';
|
|
6
|
+
export const UNS_V2_EXECUTIONS = ['notStarted', 'rolledBack', 'committed', 'unknown'];
|
|
7
|
+
/**
|
|
8
|
+
* A failed UNS v2 call. `execution` and `retry` come from the error body; for
|
|
9
|
+
* failures without one (timeout, network, invalid response) the SDK fills them
|
|
10
|
+
* like the gateway does: a read `rolledBack` and safe to resend, a mutation
|
|
11
|
+
* `unknown` and not safe. This client never retries; it exposes the advice.
|
|
12
|
+
*/
|
|
6
13
|
export class UnsV2Error extends Error {
|
|
7
14
|
status;
|
|
8
15
|
operation;
|
|
9
16
|
code;
|
|
10
17
|
requestId;
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
rolledBack;
|
|
18
|
+
execution;
|
|
19
|
+
retry;
|
|
14
20
|
opId;
|
|
15
21
|
path;
|
|
16
22
|
details;
|
|
@@ -25,12 +31,18 @@ export class UnsV2Error extends Error {
|
|
|
25
31
|
this.status = info.status;
|
|
26
32
|
this.operation = info.operation;
|
|
27
33
|
this.code = info.code;
|
|
28
|
-
this.
|
|
34
|
+
this.execution = info.execution;
|
|
35
|
+
this.retry = info.retry;
|
|
36
|
+
}
|
|
37
|
+
get outcomeUnknown() {
|
|
38
|
+
return this.execution === 'unknown';
|
|
29
39
|
}
|
|
30
40
|
}
|
|
31
|
-
/**
|
|
41
|
+
/**
|
|
42
|
+
* `execution: "unknown"`: a mutation may have committed. Reconcile (read back,
|
|
43
|
+
* or replay with the same idempotency key when `retry.safe`) before acting again.
|
|
44
|
+
*/
|
|
32
45
|
export class UnsV2OutcomeUnknownError extends UnsV2Error {
|
|
33
|
-
outcomeUnknown = true;
|
|
34
46
|
constructor(message, info) {
|
|
35
47
|
super(message, info);
|
|
36
48
|
this.name = 'UnsV2OutcomeUnknownError';
|
|
@@ -51,32 +63,105 @@ function resourcePath(operation, request) {
|
|
|
51
63
|
}
|
|
52
64
|
return path;
|
|
53
65
|
}
|
|
66
|
+
function afterMs(value) {
|
|
67
|
+
return typeof value === 'number' && Number.isSafeInteger(value) && value >= 0 ? value : undefined;
|
|
68
|
+
}
|
|
69
|
+
/** The wire error object (an envelope's `error`, a batch item's `error`); undefined when it is not one. */
|
|
70
|
+
export function parseUnsV2Fault(value) {
|
|
71
|
+
if (!record(value) || typeof value.code !== 'string' || !Array.isArray(value.details) ||
|
|
72
|
+
!UNS_V2_EXECUTIONS.includes(value.execution) ||
|
|
73
|
+
!record(value.retry) || typeof value.retry.safe !== 'boolean')
|
|
74
|
+
return undefined;
|
|
75
|
+
const wait = afterMs(value.retry.afterMs);
|
|
76
|
+
return {
|
|
77
|
+
code: value.code,
|
|
78
|
+
execution: value.execution,
|
|
79
|
+
retry: { safe: value.retry.safe, ...(wait === undefined ? {} : { afterMs: wait }) },
|
|
80
|
+
opId: typeof value.opId === 'string' ? value.opId : undefined,
|
|
81
|
+
path: typeof value.path === 'string' ? value.path : undefined,
|
|
82
|
+
details: value.details.every(record) ? value.details : undefined,
|
|
83
|
+
repair: typeof value.repair === 'string' ? value.repair : undefined,
|
|
84
|
+
reason: typeof value.reason === 'string' ? value.reason : undefined,
|
|
85
|
+
queryId: typeof value.queryId === 'string' ? value.queryId : undefined,
|
|
86
|
+
};
|
|
87
|
+
}
|
|
54
88
|
function errorInfo(value, status, operation) {
|
|
55
|
-
if (!record(value)
|
|
56
|
-
typeof value.error.retryable !== 'boolean' || !Array.isArray(value.error.details) ||
|
|
57
|
-
!record(value.error.retryAdvice))
|
|
89
|
+
if (!record(value))
|
|
58
90
|
return undefined;
|
|
59
|
-
const
|
|
60
|
-
if (
|
|
61
|
-
typeof advice.keepIdempotencyKey !== 'boolean')
|
|
91
|
+
const fault = parseUnsV2Fault(value.error);
|
|
92
|
+
if (!fault)
|
|
62
93
|
return undefined;
|
|
63
94
|
return {
|
|
95
|
+
...fault,
|
|
64
96
|
status,
|
|
65
97
|
operation,
|
|
66
|
-
code: value.error.code,
|
|
67
98
|
requestId: typeof value.requestId === 'string' ? value.requestId : undefined,
|
|
68
|
-
retryable: value.error.retryable,
|
|
69
|
-
retryAdvice: advice,
|
|
70
|
-
rolledBack: typeof value.error.rolledBack === 'boolean' ? value.error.rolledBack : undefined,
|
|
71
|
-
opId: typeof value.error.opId === 'string' ? value.error.opId : undefined,
|
|
72
|
-
path: typeof value.error.path === 'string' ? value.error.path : undefined,
|
|
73
|
-
details: value.error.details.every(record) ? value.error.details : undefined,
|
|
74
|
-
repair: typeof value.error.repair === 'string' ? value.error.repair : undefined,
|
|
75
|
-
reason: typeof value.error.reason === 'string' ? value.error.reason : undefined,
|
|
76
|
-
queryId: typeof value.error.queryId === 'string' ? value.error.queryId : undefined,
|
|
77
99
|
data: value.data ?? undefined,
|
|
78
100
|
};
|
|
79
101
|
}
|
|
102
|
+
/**
|
|
103
|
+
* Builds the error for a failure without a UNS error body. The gateway's rule
|
|
104
|
+
* applies: a read is `rolledBack` (safe to resend when `safeRead`), a mutation
|
|
105
|
+
* `unknown` and not safe. `notStarted` overrides both for answers that prove
|
|
106
|
+
* the request never reached UNS.
|
|
107
|
+
*/
|
|
108
|
+
function localError(message, operation, mutation, code, status, safeRead = true, extra = {}) {
|
|
109
|
+
const info = {
|
|
110
|
+
status,
|
|
111
|
+
operation,
|
|
112
|
+
code,
|
|
113
|
+
execution: extra.notStarted ? 'notStarted' : mutation ? 'unknown' : 'rolledBack',
|
|
114
|
+
retry: { safe: !mutation && safeRead, ...(extra.afterMs === undefined || mutation ? {} : { afterMs: extra.afterMs }) },
|
|
115
|
+
};
|
|
116
|
+
return info.execution === 'unknown' ? new UnsV2OutcomeUnknownError(message, info) : new UnsV2Error(message, info);
|
|
117
|
+
}
|
|
118
|
+
/** `Retry-After` as delay-seconds or an HTTP date, in milliseconds from now. */
|
|
119
|
+
function retryAfterMs(value) {
|
|
120
|
+
if (value === undefined)
|
|
121
|
+
return undefined;
|
|
122
|
+
if (/^\d+$/.test(value.trim()))
|
|
123
|
+
return Number(value.trim()) * 1000;
|
|
124
|
+
const at = Date.parse(value);
|
|
125
|
+
return Number.isNaN(at) ? undefined : Math.max(0, at - Date.now());
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* UNS v2 routes answer every error with the envelope, so a 4xx whose body is
|
|
129
|
+
* no envelope at all comes from an intermediary (edge 401 / 413 page) that
|
|
130
|
+
* never forwarded the request; 408 is the exception, the request may have
|
|
131
|
+
* been forwarded.
|
|
132
|
+
*/
|
|
133
|
+
const rejectedBeforeUns = (status) => status >= 400 && status < 500 && status !== 408;
|
|
134
|
+
/** Contract limits of one `records:subscribe` stream. */
|
|
135
|
+
export const UNS_V2_SUBSCRIBE_MAX_COLLECTIONS = 64;
|
|
136
|
+
export const UNS_V2_SUBSCRIBE_MAX_RECORD_IDS = 100;
|
|
137
|
+
const EVENT_ID_MAX_LENGTH = 8192;
|
|
138
|
+
/**
|
|
139
|
+
* Rejects a resume position that cannot be an event id (1–8192 visible ASCII
|
|
140
|
+
* characters), such as a `Last-Event-ID` with CR/LF taken from a browser:
|
|
141
|
+
* sent as a header it would fail every connection.
|
|
142
|
+
*/
|
|
143
|
+
export function assertEventId(value) {
|
|
144
|
+
if (typeof value !== 'string' || value.length < 1 || value.length > EVENT_ID_MAX_LENGTH || !/^[\x21-\x7e]+$/.test(value)) {
|
|
145
|
+
throw new TypeError(`Tier0 SDK: lastEventId must be 1–${EVENT_ID_MAX_LENGTH} visible ASCII characters.`);
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
function changeEvent(value) {
|
|
149
|
+
if (!record(value) || typeof value.eventId !== 'string' || typeof value.collectionId !== 'string' ||
|
|
150
|
+
typeof value.recordId !== 'string' || typeof value.revision !== 'number' || !Number.isSafeInteger(value.revision) ||
|
|
151
|
+
(value.change !== 'record' && value.change !== 'delete') || typeof value.occurredAt !== 'number' ||
|
|
152
|
+
typeof value.restricted !== 'boolean')
|
|
153
|
+
return undefined;
|
|
154
|
+
return {
|
|
155
|
+
type: 'change',
|
|
156
|
+
eventId: value.eventId,
|
|
157
|
+
collectionId: value.collectionId,
|
|
158
|
+
recordId: value.recordId,
|
|
159
|
+
revision: value.revision,
|
|
160
|
+
change: value.change,
|
|
161
|
+
occurredAt: value.occurredAt,
|
|
162
|
+
restricted: value.restricted,
|
|
163
|
+
};
|
|
164
|
+
}
|
|
80
165
|
export class UnsV2ClientCore {
|
|
81
166
|
transport;
|
|
82
167
|
constructor(resolveClient = getClient, config = {}) {
|
|
@@ -101,64 +186,152 @@ export class UnsV2ClientCore {
|
|
|
101
186
|
catch (error) {
|
|
102
187
|
if (!(error instanceof CloudTransportError))
|
|
103
188
|
throw error;
|
|
104
|
-
const info = {
|
|
105
|
-
status: error.status,
|
|
106
|
-
operation: name,
|
|
107
|
-
code: `UNS_V2_${error.kind}`,
|
|
108
|
-
retryable: false,
|
|
109
|
-
};
|
|
110
189
|
const message = error.kind === 'TRANSPORT_TIMEOUT'
|
|
111
190
|
? 'UNS v2 HTTP transport deadline exceeded.'
|
|
112
|
-
: error.kind === 'PROTOCOL_ERROR' ? 'Invalid UNS v2 HTTP response.'
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
throw
|
|
191
|
+
: error.kind === 'PROTOCOL_ERROR' ? 'Invalid UNS v2 HTTP response.'
|
|
192
|
+
: error.kind === 'TRANSPORT_ABORTED' ? 'UNS v2 request aborted.' : 'UNS v2 transport failed.';
|
|
193
|
+
const resendable = error.kind === 'TRANSPORT_TIMEOUT' || error.kind === 'TRANSPORT_ERROR';
|
|
194
|
+
throw localError(message, name, mutation, `UNS_V2_${error.kind}`, error.status, resendable);
|
|
116
195
|
}
|
|
196
|
+
// An ingress answers 502/503/504 without the UNS envelope during rollouts and restarts.
|
|
197
|
+
const unavailable = response.status === 502 || response.status === 503 || response.status === 504;
|
|
198
|
+
// `enveloped`: the body looks like a UNS envelope, so UNS may have answered it.
|
|
199
|
+
const invalid = (message, enveloped) => localError(message, name, mutation, 'UNS_V2_PROTOCOL_ERROR', response.status, unavailable, {
|
|
200
|
+
notStarted: !enveloped && rejectedBeforeUns(response.status),
|
|
201
|
+
afterMs: unavailable ? retryAfterMs(response.retryAfter) : undefined,
|
|
202
|
+
});
|
|
117
203
|
let value;
|
|
118
204
|
try {
|
|
119
205
|
value = decodeUnsV2JSON(response.text, response.status === 200 ? operation.response : 'UnsV2ErrorResponse');
|
|
120
206
|
}
|
|
121
207
|
catch {
|
|
122
|
-
|
|
123
|
-
status: response.status,
|
|
124
|
-
operation: name,
|
|
125
|
-
code: 'UNS_V2_PROTOCOL_ERROR',
|
|
126
|
-
retryable: false,
|
|
127
|
-
};
|
|
128
|
-
if (mutation)
|
|
129
|
-
throw new UnsV2OutcomeUnknownError('Invalid UNS v2 response.', info);
|
|
130
|
-
throw new UnsV2Error('Invalid UNS v2 response.', info);
|
|
208
|
+
throw invalid('Invalid UNS v2 response.', false);
|
|
131
209
|
}
|
|
132
210
|
if (response.status !== 200) {
|
|
133
211
|
const info = errorInfo(value, response.status, name);
|
|
134
212
|
if (!info || !record(value) || value.code !== response.status) {
|
|
135
|
-
|
|
136
|
-
status: response.status,
|
|
137
|
-
operation: name,
|
|
138
|
-
code: 'UNS_V2_PROTOCOL_ERROR',
|
|
139
|
-
retryable: false,
|
|
140
|
-
};
|
|
141
|
-
if (mutation)
|
|
142
|
-
throw new UnsV2OutcomeUnknownError('Invalid UNS v2 error response.', invalid);
|
|
143
|
-
throw new UnsV2Error('Invalid UNS v2 error response.', invalid);
|
|
213
|
+
throw invalid('Invalid UNS v2 error response.', record(value) && typeof value.code === 'number');
|
|
144
214
|
}
|
|
145
|
-
|
|
146
|
-
|
|
215
|
+
// A read never has an unknown outcome; hold UNS to the rule it states for itself.
|
|
216
|
+
if (!mutation && info.execution === 'unknown')
|
|
217
|
+
info.execution = 'rolledBack';
|
|
218
|
+
const message = typeof value.msg === 'string' ? value.msg : info.code;
|
|
219
|
+
throw info.execution === 'unknown' ? new UnsV2OutcomeUnknownError(message, info) : new UnsV2Error(message, info);
|
|
147
220
|
}
|
|
148
221
|
if (!record(value) || value.code !== 200 || typeof value.msg !== 'string' ||
|
|
149
222
|
typeof value.requestId !== 'string' || !Object.prototype.hasOwnProperty.call(value, 'data')) {
|
|
150
|
-
|
|
151
|
-
status: response.status,
|
|
152
|
-
operation: name,
|
|
153
|
-
code: 'UNS_V2_PROTOCOL_ERROR',
|
|
154
|
-
retryable: false,
|
|
155
|
-
};
|
|
156
|
-
if (mutation)
|
|
157
|
-
throw new UnsV2OutcomeUnknownError('Invalid UNS v2 success envelope.', info);
|
|
158
|
-
throw new UnsV2Error('Invalid UNS v2 success envelope.', info);
|
|
223
|
+
throw localError('Invalid UNS v2 success envelope.', name, mutation, 'UNS_V2_PROTOCOL_ERROR', response.status, false);
|
|
159
224
|
}
|
|
160
225
|
return value;
|
|
161
226
|
}
|
|
227
|
+
/**
|
|
228
|
+
* Opens one `records:subscribe` event stream and yields its events until
|
|
229
|
+
* the server ends it or `signal` aborts (the generator then returns). It
|
|
230
|
+
* neither reconnects nor watches heartbeats; `data.subscribe` does. A
|
|
231
|
+
* refused or broken connection throws UnsV2Error (operation
|
|
232
|
+
* `recordSubscribe`, a read: `retry.safe` says whether to reconnect).
|
|
233
|
+
*/
|
|
234
|
+
async *subscribeRecords(request, options = {}) {
|
|
235
|
+
const name = 'recordSubscribe';
|
|
236
|
+
const { collectionIds, recordIds } = request;
|
|
237
|
+
if (collectionIds !== undefined && (!Array.isArray(collectionIds) || collectionIds.length < 1 || collectionIds.length > UNS_V2_SUBSCRIBE_MAX_COLLECTIONS)) {
|
|
238
|
+
throw new TypeError(`Tier0 SDK: records:subscribe lists 1–${UNS_V2_SUBSCRIBE_MAX_COLLECTIONS} collections, or none for all.`);
|
|
239
|
+
}
|
|
240
|
+
if (recordIds !== undefined && (recordIds.length < 1 || recordIds.length > UNS_V2_SUBSCRIBE_MAX_RECORD_IDS || collectionIds?.length !== 1)) {
|
|
241
|
+
throw new TypeError(`Tier0 SDK: records:subscribe takes 1–${UNS_V2_SUBSCRIBE_MAX_RECORD_IDS} recordIds of exactly one collection.`);
|
|
242
|
+
}
|
|
243
|
+
if (options.lastEventId !== undefined)
|
|
244
|
+
assertEventId(options.lastEventId);
|
|
245
|
+
// Repeated query parameters, as the contract specifies.
|
|
246
|
+
const query = new URLSearchParams();
|
|
247
|
+
for (const id of collectionIds ?? [])
|
|
248
|
+
query.append('collectionIds', id);
|
|
249
|
+
for (const id of recordIds ?? [])
|
|
250
|
+
query.append('recordIds', id);
|
|
251
|
+
const path = UNS_V2_STREAM_OPERATIONS.recordSubscribe.path + (query.size ? `?${query}` : '');
|
|
252
|
+
let opened;
|
|
253
|
+
try {
|
|
254
|
+
opened = await this.transport.getEventStream(path, options);
|
|
255
|
+
}
|
|
256
|
+
catch (error) {
|
|
257
|
+
if (!(error instanceof CloudTransportError))
|
|
258
|
+
throw error;
|
|
259
|
+
if (error.kind === 'TRANSPORT_ABORTED')
|
|
260
|
+
return;
|
|
261
|
+
const resendable = error.kind === 'TRANSPORT_TIMEOUT' || error.kind === 'TRANSPORT_ERROR';
|
|
262
|
+
throw localError('UNS v2 event stream could not be opened.', name, false, `UNS_V2_${error.kind}`, error.status, resendable);
|
|
263
|
+
}
|
|
264
|
+
if ('text' in opened) {
|
|
265
|
+
const unavailable = opened.status === 502 || opened.status === 503 || opened.status === 504;
|
|
266
|
+
const invalid = (enveloped) => localError('Invalid UNS v2 event stream response.', name, false, 'UNS_V2_PROTOCOL_ERROR', opened.status, unavailable, {
|
|
267
|
+
notStarted: !enveloped && rejectedBeforeUns(opened.status),
|
|
268
|
+
});
|
|
269
|
+
let value;
|
|
270
|
+
try {
|
|
271
|
+
value = decodeUnsV2JSON(opened.text, 'UnsV2ErrorResponse');
|
|
272
|
+
}
|
|
273
|
+
catch {
|
|
274
|
+
throw invalid(false);
|
|
275
|
+
}
|
|
276
|
+
const info = opened.status === 200 ? undefined : errorInfo(value, opened.status, name);
|
|
277
|
+
if (!info || !record(value) || value.code !== opened.status)
|
|
278
|
+
throw invalid(record(value) && typeof value.code === 'number');
|
|
279
|
+
// A subscription is a read: never an unknown outcome.
|
|
280
|
+
if (info.execution === 'unknown')
|
|
281
|
+
info.execution = 'rolledBack';
|
|
282
|
+
throw new UnsV2Error(typeof value.msg === 'string' ? value.msg : info.code, info);
|
|
283
|
+
}
|
|
284
|
+
try {
|
|
285
|
+
for await (const event of parseServerSentEvents(opened.stream)) {
|
|
286
|
+
// A keep-alive comment counts as a heartbeat too.
|
|
287
|
+
if ('comment' in event) {
|
|
288
|
+
yield { type: 'heartbeat' };
|
|
289
|
+
}
|
|
290
|
+
else if (event.event === 'heartbeat') {
|
|
291
|
+
yield event.id === undefined ? { type: 'heartbeat' } : { type: 'heartbeat', eventId: event.id };
|
|
292
|
+
}
|
|
293
|
+
else if (event.event === 'reset') {
|
|
294
|
+
let body;
|
|
295
|
+
try {
|
|
296
|
+
body = JSON.parse(event.data);
|
|
297
|
+
}
|
|
298
|
+
catch {
|
|
299
|
+
body = undefined;
|
|
300
|
+
}
|
|
301
|
+
if (!record(body) || typeof body.reason !== 'string') {
|
|
302
|
+
throw localError('Invalid UNS v2 reset event.', name, false, 'UNS_V2_PROTOCOL_ERROR', 200, true);
|
|
303
|
+
}
|
|
304
|
+
yield typeof body.message === 'string'
|
|
305
|
+
? { type: 'reset', reason: body.reason, message: body.message }
|
|
306
|
+
: { type: 'reset', reason: body.reason };
|
|
307
|
+
}
|
|
308
|
+
else if (event.event === 'change') {
|
|
309
|
+
let parsed;
|
|
310
|
+
try {
|
|
311
|
+
parsed = changeEvent(JSON.parse(event.data));
|
|
312
|
+
}
|
|
313
|
+
catch {
|
|
314
|
+
parsed = undefined;
|
|
315
|
+
}
|
|
316
|
+
if (!parsed)
|
|
317
|
+
throw localError('Invalid UNS v2 change event.', name, false, 'UNS_V2_PROTOCOL_ERROR', 200, true);
|
|
318
|
+
yield parsed;
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
catch (error) {
|
|
323
|
+
if (options.signal?.aborted)
|
|
324
|
+
return;
|
|
325
|
+
if (error instanceof UnsV2Error)
|
|
326
|
+
throw error;
|
|
327
|
+
if (error instanceof ServerSentEventsError)
|
|
328
|
+
throw localError(error.message, name, false, 'UNS_V2_PROTOCOL_ERROR', 200, true);
|
|
329
|
+
throw localError('UNS v2 event stream broke.', name, false, 'UNS_V2_TRANSPORT_ERROR', 200, true);
|
|
330
|
+
}
|
|
331
|
+
finally {
|
|
332
|
+
opened.close();
|
|
333
|
+
}
|
|
334
|
+
}
|
|
162
335
|
}
|
|
163
336
|
export function createUnsV2Client(resolveClient = getClient, config = {}) {
|
|
164
337
|
const core = new UnsV2ClientCore(resolveClient, config);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../../src/uns-v2/client.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n CloudTransport,\n CloudTransportError,\n UNS_V2_MAX_REQUEST_BYTES,\n type CloudTransportConfig,\n} from '../cloud-transport.js';\nimport { getClient, type HttpClient, type RequestOptions } from '../openapi/client.js';\nimport { decodeUnsV2JSON, encodeUnsV2JSON } from './codec.js';\nimport {\n UNS_V2_OPERATIONS,\n type RetryAdvice,\n type UnsV2OperationName,\n type UnsV2Operations,\n type UnsV2Request,\n type UnsV2Response,\n} from './generated.js';\n\ntype RecordValue = Record<string, unknown>;\n\nexport interface UnsV2ErrorInfo {\n status?: number;\n operation: UnsV2OperationName;\n code: string;\n requestId?: string;\n retryable: boolean;\n retryAdvice?: RetryAdvice;\n rolledBack?: boolean;\n opId?: string;\n path?: string;\n details?: RecordValue[];\n repair?: string;\n reason?: string;\n queryId?: string;\n /** The error envelope's `data`, verbatim; stable access codes such as `data.reason` live here. */\n data?: unknown;\n}\n\n/** Server advice is exposed verbatim. The SDK never acts on it or retries a request. */\nexport class UnsV2Error extends Error implements UnsV2ErrorInfo {\n readonly status?: number;\n readonly operation: UnsV2OperationName;\n readonly code: string;\n readonly requestId?: string;\n readonly retryable: boolean;\n readonly retryAdvice?: RetryAdvice;\n readonly rolledBack?: boolean;\n readonly opId?: string;\n readonly path?: string;\n readonly details?: RecordValue[];\n readonly repair?: string;\n readonly reason?: string;\n readonly queryId?: string;\n readonly data?: unknown;\n\n constructor(message: string, info: UnsV2ErrorInfo) {\n super(message);\n this.name = 'UnsV2Error';\n Object.assign(this, info);\n this.status = info.status;\n this.operation = info.operation;\n this.code = info.code;\n this.retryable = info.retryable;\n }\n}\n\n/** A mutating request may have reached the service. Reconcile before any deliberate replay. */\nexport class UnsV2OutcomeUnknownError extends UnsV2Error {\n readonly outcomeUnknown = true;\n constructor(message: string, info: UnsV2ErrorInfo) {\n super(message, info);\n this.name = 'UnsV2OutcomeUnknownError';\n }\n}\n\nfunction record(value: unknown): value is RecordValue {\n return value !== null && typeof value === 'object' && !Array.isArray(value);\n}\n\nfunction resourcePath(operation: { path: string; readonly pathParams: readonly string[] }, request: unknown): string {\n let path = operation.path;\n for (const key of operation.pathParams) {\n const value = record(request) && Object.prototype.hasOwnProperty.call(request, key) ? request[key] : undefined;\n if (typeof value !== 'string' || value.length < 1 || value.length > 128 ||\n value === '.' || value === '..' || /[/\\\\\\u0000-\\u001f\\u007f]/.test(value)) {\n throw new TypeError(`Tier0 SDK: invalid UNS v2 path identity ${key}.`);\n }\n path = path.replace(`:${key}`, encodeURIComponent(value));\n }\n return path;\n}\n\nfunction errorInfo(value: unknown, status: number, operation: UnsV2OperationName): UnsV2ErrorInfo | undefined {\n if (!record(value) || !record(value.error) || typeof value.error.code !== 'string' ||\n typeof value.error.retryable !== 'boolean' || !Array.isArray(value.error.details) ||\n !record(value.error.retryAdvice)) return undefined;\n const advice = value.error.retryAdvice;\n if (typeof advice.recommendedAction !== 'string' || typeof advice.canRetrySameRequest !== 'boolean' ||\n typeof advice.keepIdempotencyKey !== 'boolean') return undefined;\n return {\n status,\n operation,\n code: value.error.code,\n requestId: typeof value.requestId === 'string' ? value.requestId : undefined,\n retryable: value.error.retryable,\n retryAdvice: advice as unknown as RetryAdvice,\n rolledBack: typeof value.error.rolledBack === 'boolean' ? value.error.rolledBack : undefined,\n opId: typeof value.error.opId === 'string' ? value.error.opId : undefined,\n path: typeof value.error.path === 'string' ? value.error.path : undefined,\n details: value.error.details.every(record) ? value.error.details : undefined,\n repair: typeof value.error.repair === 'string' ? value.error.repair : undefined,\n reason: typeof value.error.reason === 'string' ? value.error.reason : undefined,\n queryId: typeof value.error.queryId === 'string' ? value.error.queryId : undefined,\n data: value.data ?? undefined,\n };\n}\n\nexport class UnsV2ClientCore {\n private readonly transport: CloudTransport;\n\n constructor(resolveClient: () => HttpClient = getClient, config: CloudTransportConfig = {}) {\n this.transport = new CloudTransport(resolveClient, config);\n }\n\n async call<Name extends UnsV2OperationName>(name: Name, request: UnsV2Request<Name>, options: RequestOptions = {}): Promise<UnsV2Response<Name>> {\n options.signal?.throwIfAborted();\n if (typeof name !== 'string' || !Object.prototype.hasOwnProperty.call(UNS_V2_OPERATIONS, name)) {\n throw new TypeError('Tier0 SDK: unknown UNS v2 operation.');\n }\n const operation = UNS_V2_OPERATIONS[name];\n const mutation = operation.mutation;\n const path = resourcePath(operation, request);\n const body = encodeUnsV2JSON(request, operation.request);\n if (new TextEncoder().encode(body).byteLength > UNS_V2_MAX_REQUEST_BYTES) {\n throw new TypeError('Tier0 SDK: UNS v2 request body exceeds the 16777216-byte contract limit.');\n }\n let response: Awaited<ReturnType<CloudTransport['postText']>>;\n try {\n response = await this.transport.postText(path, body, options);\n } catch (error) {\n if (!(error instanceof CloudTransportError)) throw error;\n const info: UnsV2ErrorInfo = {\n status: error.status,\n operation: name,\n code: `UNS_V2_${error.kind}`,\n retryable: false,\n };\n const message = error.kind === 'TRANSPORT_TIMEOUT'\n ? 'UNS v2 HTTP transport deadline exceeded.'\n : error.kind === 'PROTOCOL_ERROR' ? 'Invalid UNS v2 HTTP response.' : 'UNS v2 transport failed.';\n if (mutation) throw new UnsV2OutcomeUnknownError(message, info);\n throw new UnsV2Error(message, info);\n }\n\n let value: unknown;\n try {\n value = decodeUnsV2JSON(response.text, response.status === 200 ? operation.response : 'UnsV2ErrorResponse');\n } catch {\n const info: UnsV2ErrorInfo = {\n status: response.status,\n operation: name,\n code: 'UNS_V2_PROTOCOL_ERROR',\n retryable: false,\n };\n if (mutation) throw new UnsV2OutcomeUnknownError('Invalid UNS v2 response.', info);\n throw new UnsV2Error('Invalid UNS v2 response.', info);\n }\n\n if (response.status !== 200) {\n const info = errorInfo(value, response.status, name);\n if (!info || !record(value) || value.code !== response.status) {\n const invalid: UnsV2ErrorInfo = {\n status: response.status,\n operation: name,\n code: 'UNS_V2_PROTOCOL_ERROR',\n retryable: false,\n };\n if (mutation) throw new UnsV2OutcomeUnknownError('Invalid UNS v2 error response.', invalid);\n throw new UnsV2Error('Invalid UNS v2 error response.', invalid);\n }\n const message = record(value) && typeof value.msg === 'string' ? value.msg : info.code;\n throw new UnsV2Error(message, info);\n }\n\n if (!record(value) || value.code !== 200 || typeof value.msg !== 'string' ||\n typeof value.requestId !== 'string' || !Object.prototype.hasOwnProperty.call(value, 'data')) {\n const info: UnsV2ErrorInfo = {\n status: response.status,\n operation: name,\n code: 'UNS_V2_PROTOCOL_ERROR',\n retryable: false,\n };\n if (mutation) throw new UnsV2OutcomeUnknownError('Invalid UNS v2 success envelope.', info);\n throw new UnsV2Error('Invalid UNS v2 success envelope.', info);\n }\n return value as UnsV2Response<Name>;\n }\n}\n\nexport type UnsV2Client = UnsV2ClientCore & UnsV2Operations;\n\nexport function createUnsV2Client(resolveClient: () => HttpClient = getClient, config: CloudTransportConfig = {}): UnsV2Client {\n const core = new UnsV2ClientCore(resolveClient, config);\n const methods = Object.fromEntries(Object.keys(UNS_V2_OPERATIONS).map(name => [name, (request: unknown, options?: RequestOptions) =>\n core.call(name as UnsV2OperationName, request as UnsV2Request<UnsV2OperationName>, options)]));\n return Object.assign(core, methods) as unknown as UnsV2Client;\n}\n\n/** Uses configureClient()/TIER0_API_HOST/TIER0_API_KEY and does not imply v2 readiness. */\nexport const unsV2 = createUnsV2Client();\n"]}
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../../src/uns-v2/client.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n CloudTransport,\n CloudTransportError,\n UNS_V2_MAX_REQUEST_BYTES,\n type CloudTransportConfig,\n} from '../cloud-transport.js';\nimport { getClient, type HttpClient, type RequestOptions } from '../openapi/client.js';\nimport { decodeUnsV2JSON, encodeUnsV2JSON } from './codec.js';\nimport { parseServerSentEvents, ServerSentEventsError } from './sse.js';\nimport {\n UNS_V2_OPERATIONS,\n UNS_V2_STREAM_OPERATIONS,\n type CloudRecordSubscribeReq,\n type UnsV2OperationName,\n type UnsV2StreamOperationName,\n type UnsV2Operations,\n type UnsV2Request,\n type UnsV2Response,\n} from './generated.js';\n\ntype RecordValue = Record<string, unknown>;\n\n/**\n * How far a failed request got. `unknown` only for a mutation whose commit\n * cannot be confirmed; a read is never `unknown`.\n */\nexport type UnsV2Execution = 'notStarted' | 'rolledBack' | 'committed' | 'unknown';\nexport const UNS_V2_EXECUTIONS: readonly UnsV2Execution[] = ['notStarted', 'rolledBack', 'committed', 'unknown'];\n\n/** Whether the identical request (same idempotency key) may be sent again, and after how long. */\nexport interface UnsV2Retry {\n safe: boolean;\n afterMs?: number;\n}\n\n/** Generated POST operations, or a GET event stream such as `recordSubscribe`. */\nexport type UnsV2ErrorOperation = UnsV2OperationName | UnsV2StreamOperationName;\n\nexport interface UnsV2ErrorInfo {\n status?: number;\n operation: UnsV2ErrorOperation;\n code: string;\n requestId?: string;\n execution: UnsV2Execution;\n retry: UnsV2Retry;\n opId?: string;\n path?: string;\n details?: RecordValue[];\n repair?: string;\n reason?: string;\n queryId?: string;\n /** The error envelope's `data`, verbatim; stable access codes such as `data.reason` live here. */\n data?: unknown;\n}\n\n/**\n * A failed UNS v2 call. `execution` and `retry` come from the error body; for\n * failures without one (timeout, network, invalid response) the SDK fills them\n * like the gateway does: a read `rolledBack` and safe to resend, a mutation\n * `unknown` and not safe. This client never retries; it exposes the advice.\n */\nexport class UnsV2Error extends Error implements UnsV2ErrorInfo {\n readonly status?: number;\n readonly operation: UnsV2ErrorOperation;\n readonly code: string;\n readonly requestId?: string;\n readonly execution: UnsV2Execution;\n readonly retry: UnsV2Retry;\n readonly opId?: string;\n readonly path?: string;\n readonly details?: RecordValue[];\n readonly repair?: string;\n readonly reason?: string;\n readonly queryId?: string;\n readonly data?: unknown;\n\n constructor(message: string, info: UnsV2ErrorInfo) {\n super(message);\n this.name = 'UnsV2Error';\n Object.assign(this, info);\n this.status = info.status;\n this.operation = info.operation;\n this.code = info.code;\n this.execution = info.execution;\n this.retry = info.retry;\n }\n\n get outcomeUnknown(): boolean {\n return this.execution === 'unknown';\n }\n}\n\n/**\n * `execution: \"unknown\"`: a mutation may have committed. Reconcile (read back,\n * or replay with the same idempotency key when `retry.safe`) before acting again.\n */\nexport class UnsV2OutcomeUnknownError extends UnsV2Error {\n constructor(message: string, info: UnsV2ErrorInfo) {\n super(message, info);\n this.name = 'UnsV2OutcomeUnknownError';\n }\n}\n\nfunction record(value: unknown): value is RecordValue {\n return value !== null && typeof value === 'object' && !Array.isArray(value);\n}\n\nfunction resourcePath(operation: { path: string; readonly pathParams: readonly string[] }, request: unknown): string {\n let path = operation.path;\n for (const key of operation.pathParams) {\n const value = record(request) && Object.prototype.hasOwnProperty.call(request, key) ? request[key] : undefined;\n if (typeof value !== 'string' || value.length < 1 || value.length > 128 ||\n value === '.' || value === '..' || /[/\\\\\\u0000-\\u001f\\u007f]/.test(value)) {\n throw new TypeError(`Tier0 SDK: invalid UNS v2 path identity ${key}.`);\n }\n path = path.replace(`:${key}`, encodeURIComponent(value));\n }\n return path;\n}\n\nfunction afterMs(value: unknown): number | undefined {\n return typeof value === 'number' && Number.isSafeInteger(value) && value >= 0 ? value : undefined;\n}\n\n/** The wire error object (an envelope's `error`, a batch item's `error`); undefined when it is not one. */\nexport function parseUnsV2Fault(value: unknown): Omit<UnsV2ErrorInfo, 'status' | 'operation' | 'requestId' | 'data'> | undefined {\n if (!record(value) || typeof value.code !== 'string' || !Array.isArray(value.details) ||\n !UNS_V2_EXECUTIONS.includes(value.execution as UnsV2Execution) ||\n !record(value.retry) || typeof value.retry.safe !== 'boolean') return undefined;\n const wait = afterMs(value.retry.afterMs);\n return {\n code: value.code,\n execution: value.execution as UnsV2Execution,\n retry: { safe: value.retry.safe, ...(wait === undefined ? {} : { afterMs: wait }) },\n opId: typeof value.opId === 'string' ? value.opId : undefined,\n path: typeof value.path === 'string' ? value.path : undefined,\n details: value.details.every(record) ? value.details : undefined,\n repair: typeof value.repair === 'string' ? value.repair : undefined,\n reason: typeof value.reason === 'string' ? value.reason : undefined,\n queryId: typeof value.queryId === 'string' ? value.queryId : undefined,\n };\n}\n\nfunction errorInfo(value: unknown, status: number, operation: UnsV2ErrorOperation): UnsV2ErrorInfo | undefined {\n if (!record(value)) return undefined;\n const fault = parseUnsV2Fault(value.error);\n if (!fault) return undefined;\n return {\n ...fault,\n status,\n operation,\n requestId: typeof value.requestId === 'string' ? value.requestId : undefined,\n data: value.data ?? undefined,\n };\n}\n\n/**\n * Builds the error for a failure without a UNS error body. The gateway's rule\n * applies: a read is `rolledBack` (safe to resend when `safeRead`), a mutation\n * `unknown` and not safe. `notStarted` overrides both for answers that prove\n * the request never reached UNS.\n */\nfunction localError(\n message: string,\n operation: UnsV2ErrorOperation,\n mutation: boolean,\n code: string,\n status?: number,\n safeRead = true,\n extra: { notStarted?: boolean; afterMs?: number } = {},\n): UnsV2Error {\n const info: UnsV2ErrorInfo = {\n status,\n operation,\n code,\n execution: extra.notStarted ? 'notStarted' : mutation ? 'unknown' : 'rolledBack',\n retry: { safe: !mutation && safeRead, ...(extra.afterMs === undefined || mutation ? {} : { afterMs: extra.afterMs }) },\n };\n return info.execution === 'unknown' ? new UnsV2OutcomeUnknownError(message, info) : new UnsV2Error(message, info);\n}\n\n/** `Retry-After` as delay-seconds or an HTTP date, in milliseconds from now. */\nfunction retryAfterMs(value: string | undefined): number | undefined {\n if (value === undefined) return undefined;\n if (/^\\d+$/.test(value.trim())) return Number(value.trim()) * 1000;\n const at = Date.parse(value);\n return Number.isNaN(at) ? undefined : Math.max(0, at - Date.now());\n}\n\n/**\n * UNS v2 routes answer every error with the envelope, so a 4xx whose body is\n * no envelope at all comes from an intermediary (edge 401 / 413 page) that\n * never forwarded the request; 408 is the exception, the request may have\n * been forwarded.\n */\nconst rejectedBeforeUns = (status: number) => status >= 400 && status < 500 && status !== 408;\n\n/** Contract limits of one `records:subscribe` stream. */\nexport const UNS_V2_SUBSCRIBE_MAX_COLLECTIONS = 64;\nexport const UNS_V2_SUBSCRIBE_MAX_RECORD_IDS = 100;\nconst EVENT_ID_MAX_LENGTH = 8192;\n\n/**\n * Rejects a resume position that cannot be an event id (1–8192 visible ASCII\n * characters), such as a `Last-Event-ID` with CR/LF taken from a browser:\n * sent as a header it would fail every connection.\n */\nexport function assertEventId(value: string): void {\n if (typeof value !== 'string' || value.length < 1 || value.length > EVENT_ID_MAX_LENGTH || !/^[\\x21-\\x7e]+$/.test(value)) {\n throw new TypeError(`Tier0 SDK: lastEventId must be 1–${EVENT_ID_MAX_LENGTH} visible ASCII characters.`);\n }\n}\n\n/**\n * Query of `records:subscribe`; the resume position travels as `lastEventId`\n * (the `Last-Event-ID` header). Without `collectionIds` the stream covers every\n * collection the caller may read (an App key: every collection granted to the App).\n */\nexport type UnsV2RecordSubscribeRequest = Pick<CloudRecordSubscribeReq, 'collectionIds' | 'recordIds'>;\n\n/**\n * A committed record change. Events carry identities only: read the record to\n * see its data. `restricted`: the collection has employee data rules, so who\n * may see this record depends on the employee (see `data.subscribe`).\n */\nexport interface UnsV2RecordChangeEvent {\n type: 'change';\n /** Stream position (also the frame id); resume after it with `lastEventId`. */\n eventId: string;\n collectionId: string;\n recordId: string;\n revision: number;\n change: 'record' | 'delete';\n occurredAt: number;\n restricted: boolean;\n}\n\nexport type UnsV2SubscriptionEvent =\n | UnsV2RecordChangeEvent\n /** Sent on connect and every 15 s; `eventId` is the current position, resumable like a change's. */\n | { type: 'heartbeat'; eventId?: string }\n /**\n * The server closes the stream after it. `CURSOR_EXPIRED`: the position is\n * outside the 24 h retention; `SCOPE_CHANGED`: access narrowed. Reload, then\n * subscribe again without `lastEventId`.\n */\n | { type: 'reset'; reason: string; message?: string };\n\nfunction changeEvent(value: unknown): UnsV2RecordChangeEvent | undefined {\n if (!record(value) || typeof value.eventId !== 'string' || typeof value.collectionId !== 'string' ||\n typeof value.recordId !== 'string' || typeof value.revision !== 'number' || !Number.isSafeInteger(value.revision) ||\n (value.change !== 'record' && value.change !== 'delete') || typeof value.occurredAt !== 'number' ||\n typeof value.restricted !== 'boolean') return undefined;\n return {\n type: 'change',\n eventId: value.eventId,\n collectionId: value.collectionId,\n recordId: value.recordId,\n revision: value.revision,\n change: value.change,\n occurredAt: value.occurredAt,\n restricted: value.restricted,\n };\n}\n\nexport class UnsV2ClientCore {\n private readonly transport: CloudTransport;\n\n constructor(resolveClient: () => HttpClient = getClient, config: CloudTransportConfig = {}) {\n this.transport = new CloudTransport(resolveClient, config);\n }\n\n async call<Name extends UnsV2OperationName>(name: Name, request: UnsV2Request<Name>, options: RequestOptions = {}): Promise<UnsV2Response<Name>> {\n options.signal?.throwIfAborted();\n if (typeof name !== 'string' || !Object.prototype.hasOwnProperty.call(UNS_V2_OPERATIONS, name)) {\n throw new TypeError('Tier0 SDK: unknown UNS v2 operation.');\n }\n const operation = UNS_V2_OPERATIONS[name];\n const mutation = operation.mutation;\n const path = resourcePath(operation, request);\n const body = encodeUnsV2JSON(request, operation.request);\n if (new TextEncoder().encode(body).byteLength > UNS_V2_MAX_REQUEST_BYTES) {\n throw new TypeError('Tier0 SDK: UNS v2 request body exceeds the 16777216-byte contract limit.');\n }\n let response: Awaited<ReturnType<CloudTransport['postText']>>;\n try {\n response = await this.transport.postText(path, body, options);\n } catch (error) {\n if (!(error instanceof CloudTransportError)) throw error;\n const message = error.kind === 'TRANSPORT_TIMEOUT'\n ? 'UNS v2 HTTP transport deadline exceeded.'\n : error.kind === 'PROTOCOL_ERROR' ? 'Invalid UNS v2 HTTP response.'\n : error.kind === 'TRANSPORT_ABORTED' ? 'UNS v2 request aborted.' : 'UNS v2 transport failed.';\n const resendable = error.kind === 'TRANSPORT_TIMEOUT' || error.kind === 'TRANSPORT_ERROR';\n throw localError(message, name, mutation, `UNS_V2_${error.kind}`, error.status, resendable);\n }\n\n // An ingress answers 502/503/504 without the UNS envelope during rollouts and restarts.\n const unavailable = response.status === 502 || response.status === 503 || response.status === 504;\n // `enveloped`: the body looks like a UNS envelope, so UNS may have answered it.\n const invalid = (message: string, enveloped: boolean) => localError(message, name, mutation, 'UNS_V2_PROTOCOL_ERROR', response.status, unavailable, {\n notStarted: !enveloped && rejectedBeforeUns(response.status),\n afterMs: unavailable ? retryAfterMs(response.retryAfter) : undefined,\n });\n let value: unknown;\n try {\n value = decodeUnsV2JSON(response.text, response.status === 200 ? operation.response : 'UnsV2ErrorResponse');\n } catch {\n throw invalid('Invalid UNS v2 response.', false);\n }\n\n if (response.status !== 200) {\n const info = errorInfo(value, response.status, name);\n if (!info || !record(value) || value.code !== response.status) {\n throw invalid('Invalid UNS v2 error response.', record(value) && typeof value.code === 'number');\n }\n // A read never has an unknown outcome; hold UNS to the rule it states for itself.\n if (!mutation && info.execution === 'unknown') info.execution = 'rolledBack';\n const message = typeof value.msg === 'string' ? value.msg : info.code;\n throw info.execution === 'unknown' ? new UnsV2OutcomeUnknownError(message, info) : new UnsV2Error(message, info);\n }\n\n if (!record(value) || value.code !== 200 || typeof value.msg !== 'string' ||\n typeof value.requestId !== 'string' || !Object.prototype.hasOwnProperty.call(value, 'data')) {\n throw localError('Invalid UNS v2 success envelope.', name, mutation, 'UNS_V2_PROTOCOL_ERROR', response.status, false);\n }\n return value as UnsV2Response<Name>;\n }\n\n /**\n * Opens one `records:subscribe` event stream and yields its events until\n * the server ends it or `signal` aborts (the generator then returns). It\n * neither reconnects nor watches heartbeats; `data.subscribe` does. A\n * refused or broken connection throws UnsV2Error (operation\n * `recordSubscribe`, a read: `retry.safe` says whether to reconnect).\n */\n async *subscribeRecords(request: UnsV2RecordSubscribeRequest, options: RequestOptions & { lastEventId?: string } = {}): AsyncGenerator<UnsV2SubscriptionEvent> {\n const name = 'recordSubscribe';\n const { collectionIds, recordIds } = request;\n if (collectionIds !== undefined && (!Array.isArray(collectionIds) || collectionIds.length < 1 || collectionIds.length > UNS_V2_SUBSCRIBE_MAX_COLLECTIONS)) {\n throw new TypeError(`Tier0 SDK: records:subscribe lists 1–${UNS_V2_SUBSCRIBE_MAX_COLLECTIONS} collections, or none for all.`);\n }\n if (recordIds !== undefined && (recordIds.length < 1 || recordIds.length > UNS_V2_SUBSCRIBE_MAX_RECORD_IDS || collectionIds?.length !== 1)) {\n throw new TypeError(`Tier0 SDK: records:subscribe takes 1–${UNS_V2_SUBSCRIBE_MAX_RECORD_IDS} recordIds of exactly one collection.`);\n }\n if (options.lastEventId !== undefined) assertEventId(options.lastEventId);\n // Repeated query parameters, as the contract specifies.\n const query = new URLSearchParams();\n for (const id of collectionIds ?? []) query.append('collectionIds', id);\n for (const id of recordIds ?? []) query.append('recordIds', id);\n const path = UNS_V2_STREAM_OPERATIONS.recordSubscribe.path + (query.size ? `?${query}` : '');\n let opened: Awaited<ReturnType<CloudTransport['getEventStream']>>;\n try {\n opened = await this.transport.getEventStream(path, options);\n } catch (error) {\n if (!(error instanceof CloudTransportError)) throw error;\n if (error.kind === 'TRANSPORT_ABORTED') return;\n const resendable = error.kind === 'TRANSPORT_TIMEOUT' || error.kind === 'TRANSPORT_ERROR';\n throw localError('UNS v2 event stream could not be opened.', name, false, `UNS_V2_${error.kind}`, error.status, resendable);\n }\n if ('text' in opened) {\n const unavailable = opened.status === 502 || opened.status === 503 || opened.status === 504;\n const invalid = (enveloped: boolean) => localError('Invalid UNS v2 event stream response.', name, false, 'UNS_V2_PROTOCOL_ERROR', opened.status, unavailable, {\n notStarted: !enveloped && rejectedBeforeUns(opened.status),\n });\n let value: unknown;\n try {\n value = decodeUnsV2JSON(opened.text, 'UnsV2ErrorResponse');\n } catch {\n throw invalid(false);\n }\n const info = opened.status === 200 ? undefined : errorInfo(value, opened.status, name);\n if (!info || !record(value) || value.code !== opened.status) throw invalid(record(value) && typeof value.code === 'number');\n // A subscription is a read: never an unknown outcome.\n if (info.execution === 'unknown') info.execution = 'rolledBack';\n throw new UnsV2Error(typeof value.msg === 'string' ? value.msg : info.code, info);\n }\n try {\n for await (const event of parseServerSentEvents(opened.stream)) {\n // A keep-alive comment counts as a heartbeat too.\n if ('comment' in event) {\n yield { type: 'heartbeat' };\n } else if (event.event === 'heartbeat') {\n yield event.id === undefined ? { type: 'heartbeat' } : { type: 'heartbeat', eventId: event.id };\n } else if (event.event === 'reset') {\n let body: unknown;\n try { body = JSON.parse(event.data); } catch { body = undefined; }\n if (!record(body) || typeof body.reason !== 'string') {\n throw localError('Invalid UNS v2 reset event.', name, false, 'UNS_V2_PROTOCOL_ERROR', 200, true);\n }\n yield typeof body.message === 'string'\n ? { type: 'reset', reason: body.reason, message: body.message }\n : { type: 'reset', reason: body.reason };\n } else if (event.event === 'change') {\n let parsed: UnsV2RecordChangeEvent | undefined;\n try { parsed = changeEvent(JSON.parse(event.data)); } catch { parsed = undefined; }\n if (!parsed) throw localError('Invalid UNS v2 change event.', name, false, 'UNS_V2_PROTOCOL_ERROR', 200, true);\n yield parsed;\n }\n }\n } catch (error) {\n if (options.signal?.aborted) return;\n if (error instanceof UnsV2Error) throw error;\n if (error instanceof ServerSentEventsError) throw localError(error.message, name, false, 'UNS_V2_PROTOCOL_ERROR', 200, true);\n throw localError('UNS v2 event stream broke.', name, false, 'UNS_V2_TRANSPORT_ERROR', 200, true);\n } finally {\n opened.close();\n }\n }\n}\n\nexport type UnsV2Client = UnsV2ClientCore & UnsV2Operations;\n\nexport function createUnsV2Client(resolveClient: () => HttpClient = getClient, config: CloudTransportConfig = {}): UnsV2Client {\n const core = new UnsV2ClientCore(resolveClient, config);\n const methods = Object.fromEntries(Object.keys(UNS_V2_OPERATIONS).map(name => [name, (request: unknown, options?: RequestOptions) =>\n core.call(name as UnsV2OperationName, request as UnsV2Request<UnsV2OperationName>, options)]));\n return Object.assign(core, methods) as unknown as UnsV2Client;\n}\n\n/** Uses configureClient()/TIER0_API_HOST/TIER0_API_KEY and does not imply v2 readiness. */\nexport const unsV2 = createUnsV2Client();\n"]}
|