@tier0/sdk-v2 0.0.0-stage → 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/NOTICE.md +7 -0
- package/README.md +201 -2
- package/dist/cjs/app-identity-contract.generated.d.ts +22 -0
- package/dist/cjs/app-identity-contract.generated.js +51 -0
- package/dist/cjs/app-identity-contract.generated.js.map +1 -0
- package/dist/cjs/capabilities.d.ts +54 -0
- package/dist/cjs/capabilities.js +134 -0
- package/dist/cjs/capabilities.js.map +1 -0
- package/dist/cjs/client.d.ts +604 -0
- package/dist/cjs/client.js +35 -0
- package/dist/cjs/client.js.map +1 -0
- package/dist/cjs/cloud-server.d.ts +31 -0
- package/dist/cjs/cloud-server.js +114 -0
- package/dist/cjs/cloud-server.js.map +1 -0
- package/dist/cjs/cloud-transport.d.ts +67 -0
- package/dist/cjs/cloud-transport.js +272 -0
- package/dist/cjs/cloud-transport.js.map +1 -0
- package/dist/cjs/controls.d.ts +93 -0
- package/dist/cjs/controls.js +169 -0
- package/dist/cjs/controls.js.map +1 -0
- package/dist/cjs/data/bootstrap.d.ts +70 -0
- package/dist/cjs/data/bootstrap.js +291 -0
- package/dist/cjs/data/bootstrap.js.map +1 -0
- package/dist/cjs/data/call.d.ts +33 -0
- package/dist/cjs/data/call.js +216 -0
- package/dist/cjs/data/call.js.map +1 -0
- package/dist/cjs/data/client.d.ts +134 -0
- package/dist/cjs/data/client.js +185 -0
- package/dist/cjs/data/client.js.map +1 -0
- package/dist/cjs/data/collection.d.ts +335 -0
- package/dist/cjs/data/collection.js +601 -0
- package/dist/cjs/data/collection.js.map +1 -0
- package/dist/cjs/data/context.d.ts +12 -0
- package/dist/cjs/data/context.js +50 -0
- package/dist/cjs/data/context.js.map +1 -0
- package/dist/cjs/data/declarations.d.ts +11 -0
- package/dist/cjs/data/declarations.js +18 -0
- package/dist/cjs/data/declarations.js.map +1 -0
- package/dist/cjs/data/define.d.ts +77 -0
- package/dist/cjs/data/define.js +31 -0
- package/dist/cjs/data/define.js.map +1 -0
- package/dist/cjs/data/error.d.ts +78 -0
- package/dist/cjs/data/error.js +182 -0
- package/dist/cjs/data/error.js.map +1 -0
- package/dist/cjs/data/index.d.ts +24 -0
- package/dist/cjs/data/index.js +49 -0
- package/dist/cjs/data/index.js.map +1 -0
- package/dist/cjs/data/schema.d.ts +88 -0
- package/dist/cjs/data/schema.js +657 -0
- package/dist/cjs/data/schema.js.map +1 -0
- package/dist/cjs/data/sort.d.ts +8 -0
- package/dist/cjs/data/sort.js +21 -0
- package/dist/cjs/data/sort.js.map +1 -0
- 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/files.d.ts +67 -0
- package/dist/cjs/files.js +119 -0
- package/dist/cjs/files.js.map +1 -0
- package/dist/cjs/framework-scope.d.ts +1 -0
- package/dist/cjs/framework-scope.js +14 -0
- package/dist/cjs/framework-scope.js.map +1 -0
- package/dist/cjs/index.d.ts +14 -0
- package/dist/cjs/index.js +33 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/mq/broker.d.ts +65 -0
- package/dist/cjs/mq/broker.js +115 -0
- package/dist/cjs/mq/broker.js.map +1 -0
- package/dist/cjs/mq/client.d.ts +37 -0
- package/dist/cjs/mq/client.js +321 -0
- package/dist/cjs/mq/client.js.map +1 -0
- package/dist/cjs/mq/index.d.ts +5 -0
- package/dist/cjs/mq/index.js +11 -0
- package/dist/cjs/mq/index.js.map +1 -0
- package/dist/cjs/mq/types.d.ts +48 -0
- package/dist/cjs/mq/types.js +3 -0
- package/dist/cjs/mq/types.js.map +1 -0
- package/dist/cjs/openapi/api.generated.d.ts +820 -0
- package/dist/cjs/openapi/api.generated.js +607 -0
- package/dist/cjs/openapi/api.generated.js.map +1 -0
- package/dist/cjs/openapi/client.d.ts +56 -0
- package/dist/cjs/openapi/client.js +219 -0
- package/dist/cjs/openapi/client.js.map +1 -0
- package/dist/cjs/openapi/codecs.generated.d.ts +2234 -0
- package/dist/cjs/openapi/codecs.generated.js +6 -0
- package/dist/cjs/openapi/codecs.generated.js.map +1 -0
- package/dist/cjs/openapi/index.d.ts +5 -0
- package/dist/cjs/openapi/index.js +12 -0
- package/dist/cjs/openapi/index.js.map +1 -0
- package/dist/cjs/openapi/types.generated.d.ts +3227 -0
- package/dist/cjs/openapi/types.generated.js +3 -0
- package/dist/cjs/openapi/types.generated.js.map +1 -0
- package/dist/cjs/package.json +1 -0
- package/dist/cjs/react.d.ts +9 -0
- package/dist/cjs/react.js +16 -0
- package/dist/cjs/react.js.map +1 -0
- package/dist/cjs/runtime-context.d.ts +9 -0
- package/dist/cjs/runtime-context.js +25 -0
- package/dist/cjs/runtime-context.js.map +1 -0
- package/dist/cjs/runtime-env.d.ts +1 -0
- package/dist/cjs/runtime-env.js +18 -0
- package/dist/cjs/runtime-env.js.map +1 -0
- package/dist/cjs/source.d.ts +39 -0
- package/dist/cjs/source.js +29 -0
- package/dist/cjs/source.js.map +1 -0
- package/dist/cjs/stream.d.ts +40 -0
- package/dist/cjs/stream.js +33 -0
- package/dist/cjs/stream.js.map +1 -0
- package/dist/cjs/uns-v2/client.d.ts +132 -0
- package/dist/cjs/uns-v2/client.js +352 -0
- package/dist/cjs/uns-v2/client.js.map +1 -0
- package/dist/cjs/uns-v2/codec.d.ts +11 -0
- package/dist/cjs/uns-v2/codec.js +290 -0
- package/dist/cjs/uns-v2/codec.js.map +1 -0
- package/dist/cjs/uns-v2/data-client.d.ts +10 -0
- package/dist/cjs/uns-v2/data-client.js +18 -0
- package/dist/cjs/uns-v2/data-client.js.map +1 -0
- package/dist/cjs/uns-v2/generated.d.ts +18178 -0
- package/dist/cjs/uns-v2/generated.js +144 -0
- package/dist/cjs/uns-v2/generated.js.map +1 -0
- package/dist/cjs/uns-v2/index.d.ts +5 -0
- package/dist/cjs/uns-v2/index.js +24 -0
- package/dist/cjs/uns-v2/index.js.map +1 -0
- 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/cjs/vue.d.ts +9 -0
- package/dist/cjs/vue.js +39 -0
- package/dist/cjs/vue.js.map +1 -0
- package/dist/esm/app-identity-contract.generated.d.ts +22 -0
- package/dist/esm/app-identity-contract.generated.js +48 -0
- package/dist/esm/app-identity-contract.generated.js.map +1 -0
- package/dist/esm/capabilities.d.ts +54 -0
- package/dist/esm/capabilities.js +129 -0
- package/dist/esm/capabilities.js.map +1 -0
- package/dist/esm/client.d.ts +604 -0
- package/dist/esm/client.js +32 -0
- package/dist/esm/client.js.map +1 -0
- package/dist/esm/cloud-server.d.ts +31 -0
- package/dist/esm/cloud-server.js +109 -0
- package/dist/esm/cloud-server.js.map +1 -0
- package/dist/esm/cloud-transport.d.ts +67 -0
- package/dist/esm/cloud-transport.js +267 -0
- package/dist/esm/cloud-transport.js.map +1 -0
- package/dist/esm/controls.d.ts +93 -0
- package/dist/esm/controls.js +163 -0
- package/dist/esm/controls.js.map +1 -0
- package/dist/esm/data/bootstrap.d.ts +70 -0
- package/dist/esm/data/bootstrap.js +286 -0
- package/dist/esm/data/bootstrap.js.map +1 -0
- package/dist/esm/data/call.d.ts +33 -0
- package/dist/esm/data/call.js +211 -0
- package/dist/esm/data/call.js.map +1 -0
- package/dist/esm/data/client.d.ts +134 -0
- package/dist/esm/data/client.js +181 -0
- package/dist/esm/data/client.js.map +1 -0
- package/dist/esm/data/collection.d.ts +335 -0
- package/dist/esm/data/collection.js +594 -0
- package/dist/esm/data/collection.js.map +1 -0
- package/dist/esm/data/context.d.ts +12 -0
- package/dist/esm/data/context.js +44 -0
- package/dist/esm/data/context.js.map +1 -0
- package/dist/esm/data/declarations.d.ts +11 -0
- package/dist/esm/data/declarations.js +10 -0
- package/dist/esm/data/declarations.js.map +1 -0
- package/dist/esm/data/define.d.ts +77 -0
- package/dist/esm/data/define.js +27 -0
- package/dist/esm/data/define.js.map +1 -0
- package/dist/esm/data/error.d.ts +78 -0
- package/dist/esm/data/error.js +176 -0
- package/dist/esm/data/error.js.map +1 -0
- package/dist/esm/data/index.d.ts +24 -0
- package/dist/esm/data/index.js +20 -0
- package/dist/esm/data/index.js.map +1 -0
- package/dist/esm/data/schema.d.ts +88 -0
- package/dist/esm/data/schema.js +646 -0
- package/dist/esm/data/schema.js.map +1 -0
- package/dist/esm/data/sort.d.ts +8 -0
- package/dist/esm/data/sort.js +18 -0
- package/dist/esm/data/sort.js.map +1 -0
- 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/files.d.ts +67 -0
- package/dist/esm/files.js +113 -0
- package/dist/esm/files.js.map +1 -0
- package/dist/esm/framework-scope.d.ts +1 -0
- package/dist/esm/framework-scope.js +11 -0
- package/dist/esm/framework-scope.js.map +1 -0
- package/dist/esm/index.d.ts +14 -0
- package/dist/esm/index.js +10 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/mq/broker.d.ts +65 -0
- package/dist/esm/mq/broker.js +109 -0
- package/dist/esm/mq/broker.js.map +1 -0
- package/dist/esm/mq/client.d.ts +37 -0
- package/dist/esm/mq/client.js +314 -0
- package/dist/esm/mq/client.js.map +1 -0
- package/dist/esm/mq/index.d.ts +5 -0
- package/dist/esm/mq/index.js +3 -0
- package/dist/esm/mq/index.js.map +1 -0
- package/dist/esm/mq/types.d.ts +48 -0
- package/dist/esm/mq/types.js +2 -0
- package/dist/esm/mq/types.js.map +1 -0
- package/dist/esm/openapi/api.generated.d.ts +820 -0
- package/dist/esm/openapi/api.generated.js +603 -0
- package/dist/esm/openapi/api.generated.js.map +1 -0
- package/dist/esm/openapi/client.d.ts +56 -0
- package/dist/esm/openapi/client.js +210 -0
- package/dist/esm/openapi/client.js.map +1 -0
- package/dist/esm/openapi/codecs.generated.d.ts +2234 -0
- package/dist/esm/openapi/codecs.generated.js +3 -0
- package/dist/esm/openapi/codecs.generated.js.map +1 -0
- package/dist/esm/openapi/index.d.ts +5 -0
- package/dist/esm/openapi/index.js +3 -0
- package/dist/esm/openapi/index.js.map +1 -0
- package/dist/esm/openapi/types.generated.d.ts +3227 -0
- package/dist/esm/openapi/types.generated.js +2 -0
- package/dist/esm/openapi/types.generated.js.map +1 -0
- package/dist/esm/package.json +1 -0
- package/dist/esm/react.d.ts +9 -0
- package/dist/esm/react.js +12 -0
- package/dist/esm/react.js.map +1 -0
- package/dist/esm/runtime-context.d.ts +9 -0
- package/dist/esm/runtime-context.js +22 -0
- package/dist/esm/runtime-context.js.map +1 -0
- package/dist/esm/runtime-env.d.ts +1 -0
- package/dist/esm/runtime-env.js +15 -0
- package/dist/esm/runtime-env.js.map +1 -0
- package/dist/esm/source.d.ts +39 -0
- package/dist/esm/source.js +25 -0
- package/dist/esm/source.js.map +1 -0
- package/dist/esm/stream.d.ts +40 -0
- package/dist/esm/stream.js +29 -0
- package/dist/esm/stream.js.map +1 -0
- package/dist/esm/uns-v2/client.d.ts +132 -0
- package/dist/esm/uns-v2/client.js +343 -0
- package/dist/esm/uns-v2/client.js.map +1 -0
- package/dist/esm/uns-v2/codec.d.ts +11 -0
- package/dist/esm/uns-v2/codec.js +284 -0
- package/dist/esm/uns-v2/codec.js.map +1 -0
- package/dist/esm/uns-v2/data-client.d.ts +10 -0
- package/dist/esm/uns-v2/data-client.js +14 -0
- package/dist/esm/uns-v2/data-client.js.map +1 -0
- package/dist/esm/uns-v2/generated.d.ts +18178 -0
- package/dist/esm/uns-v2/generated.js +141 -0
- package/dist/esm/uns-v2/generated.js.map +1 -0
- package/dist/esm/uns-v2/index.d.ts +5 -0
- package/dist/esm/uns-v2/index.js +5 -0
- package/dist/esm/uns-v2/index.js.map +1 -0
- 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/dist/esm/vue.d.ts +9 -0
- package/dist/esm/vue.js +36 -0
- package/dist/esm/vue.js.map +1 -0
- package/docs/acceptance-2026-10-22.md +88 -0
- package/package.json +243 -4
- package/skills/tier0-sdk-v2/SKILL.md +66 -0
- package/skills/tier0-sdk-v2/references/integration.md +72 -0
- package/skills/tier0-sdk-v2/tier0-sdk-v2-agent/SKILL.md +73 -0
- package/skills/tier0-sdk-v2/tier0-sdk-v2-agent/references/results.md +45 -0
- package/skills/tier0-sdk-v2/tier0-sdk-v2-controls/SKILL.md +63 -0
- package/skills/tier0-sdk-v2/tier0-sdk-v2-data/SKILL.md +58 -0
- package/skills/tier0-sdk-v2/tier0-sdk-v2-data/references/consistency.md +70 -0
- package/skills/tier0-sdk-v2/tier0-sdk-v2-data/references/errors.md +82 -0
- package/skills/tier0-sdk-v2/tier0-sdk-v2-data/references/modeling.md +113 -0
- package/skills/tier0-sdk-v2/tier0-sdk-v2-data/references/read-write.md +168 -0
- package/skills/tier0-sdk-v2/tier0-sdk-v2-data/references/schema-evolution.md +36 -0
- package/skills/tier0-sdk-v2/tier0-sdk-v2-files/SKILL.md +85 -0
- package/skills/tier0-sdk-v2/tier0-sdk-v2-files/references/delete.md +22 -0
- package/skills/tier0-sdk-v2/tier0-sdk-v2-files/references/download.md +49 -0
- package/skills/tier0-sdk-v2/tier0-sdk-v2-files/references/multipart.md +42 -0
- package/skills/tier0-sdk-v2/tier0-sdk-v2-files/references/upload.md +27 -0
- package/skills/tier0-sdk-v2/tier0-sdk-v2-files/references/url.md +22 -0
- package/skills/tier0-sdk-v2/tier0-sdk-v2-members/SKILL.md +56 -0
- package/skills/tier0-sdk-v2/tier0-sdk-v2-members/references/app-members.md +41 -0
- package/skills/tier0-sdk-v2/tier0-sdk-v2-members/references/platform-members.md +56 -0
- package/skills/tier0-sdk-v2/tier0-sdk-v2-mq/SKILL.md +78 -0
- package/skills/tier0-sdk-v2/tier0-sdk-v2-mq/references/quickstart.md +69 -0
- package/skills/tier0-sdk-v2/tier0-sdk-v2-notifications/SKILL.md +42 -0
- package/skills/tier0-sdk-v2/tier0-sdk-v2-notifications/references/get.md +34 -0
- package/skills/tier0-sdk-v2/tier0-sdk-v2-notifications/references/send.md +72 -0
- package/skills/tier0-sdk-v2/tier0-sdk-v2-source/SKILL.md +38 -0
- package/skills/tier0-sdk-v2/tier0-sdk-v2-source/references/changes.md +40 -0
- package/skills/tier0-sdk-v2/tier0-sdk-v2-source/references/create.md +63 -0
- package/skills/tier0-sdk-v2/tier0-sdk-v2-source/references/delete.md +47 -0
- package/skills/tier0-sdk-v2/tier0-sdk-v2-source/references/protocols.md +36 -0
- package/skills/tier0-sdk-v2/tier0-sdk-v2-source/references/read.md +34 -0
- package/skills/tier0-sdk-v2/tier0-sdk-v2-source/references/state.md +37 -0
- package/skills/tier0-sdk-v2/tier0-sdk-v2-source/references/update.md +62 -0
- package/skills/tier0-sdk-v2/tier0-sdk-v2-stream/SKILL.md +43 -0
- package/skills/tier0-sdk-v2/tier0-sdk-v2-stream/references/create.md +56 -0
- package/skills/tier0-sdk-v2/tier0-sdk-v2-stream/references/delete.md +35 -0
- package/skills/tier0-sdk-v2/tier0-sdk-v2-stream/references/deploy.md +64 -0
- package/skills/tier0-sdk-v2/tier0-sdk-v2-stream/references/lifecycle.md +26 -0
- package/skills/tier0-sdk-v2/tier0-sdk-v2-stream/references/read.md +35 -0
- package/skills/tier0-sdk-v2/tier0-sdk-v2-stream/references/update.md +36 -0
- package/skills/tier0-sdk-v2/tier0-sdk-v2-system/SKILL.md +64 -0
- package/skills/tier0-sdk-v2/tier0-sdk-v2-system/references/info.md +23 -0
- package/skills/tier0-sdk-v2/tier0-sdk-v2-system/references/whoami.md +21 -0
- 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 +56 -0
- package/skills/tier0-sdk-v2/tier0-sdk-v2-uns/references/data-workflows.md +69 -0
- 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
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
import { type CloudTransportConfig } from '../cloud-transport.js';
|
|
2
|
+
import { type HttpClient, type RequestOptions } from '../openapi/client.js';
|
|
3
|
+
import { type CloudRecordSubscribeReq, type UnsV2OperationName, type UnsV2StreamOperationName, type UnsV2Operations, type UnsV2Request, type UnsV2Response } from './generated.js';
|
|
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;
|
|
18
|
+
export interface UnsV2ErrorInfo {
|
|
19
|
+
status?: number;
|
|
20
|
+
operation: UnsV2ErrorOperation;
|
|
21
|
+
code: string;
|
|
22
|
+
requestId?: string;
|
|
23
|
+
execution: UnsV2Execution;
|
|
24
|
+
retry: UnsV2Retry;
|
|
25
|
+
opId?: string;
|
|
26
|
+
path?: string;
|
|
27
|
+
details?: RecordValue[];
|
|
28
|
+
repair?: string;
|
|
29
|
+
reason?: string;
|
|
30
|
+
queryId?: string;
|
|
31
|
+
/** The error envelope's `data`, verbatim; stable access codes such as `data.reason` live here. */
|
|
32
|
+
data?: unknown;
|
|
33
|
+
}
|
|
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
|
+
*/
|
|
40
|
+
export declare class UnsV2Error extends Error implements UnsV2ErrorInfo {
|
|
41
|
+
readonly status?: number;
|
|
42
|
+
readonly operation: UnsV2ErrorOperation;
|
|
43
|
+
readonly code: string;
|
|
44
|
+
readonly requestId?: string;
|
|
45
|
+
readonly execution: UnsV2Execution;
|
|
46
|
+
readonly retry: UnsV2Retry;
|
|
47
|
+
readonly opId?: string;
|
|
48
|
+
readonly path?: string;
|
|
49
|
+
readonly details?: RecordValue[];
|
|
50
|
+
readonly repair?: string;
|
|
51
|
+
readonly reason?: string;
|
|
52
|
+
readonly queryId?: string;
|
|
53
|
+
readonly data?: unknown;
|
|
54
|
+
constructor(message: string, info: UnsV2ErrorInfo);
|
|
55
|
+
get outcomeUnknown(): boolean;
|
|
56
|
+
}
|
|
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
|
+
*/
|
|
61
|
+
export declare class UnsV2OutcomeUnknownError extends UnsV2Error {
|
|
62
|
+
constructor(message: string, info: UnsV2ErrorInfo);
|
|
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
|
+
};
|
|
113
|
+
export declare class UnsV2ClientCore {
|
|
114
|
+
private readonly transport;
|
|
115
|
+
constructor(resolveClient?: () => HttpClient, config?: CloudTransportConfig);
|
|
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>;
|
|
127
|
+
}
|
|
128
|
+
export type UnsV2Client = UnsV2ClientCore & UnsV2Operations;
|
|
129
|
+
export declare function createUnsV2Client(resolveClient?: () => HttpClient, config?: CloudTransportConfig): UnsV2Client;
|
|
130
|
+
/** Uses configureClient()/TIER0_API_HOST/TIER0_API_KEY and does not imply v2 readiness. */
|
|
131
|
+
export declare const unsV2: UnsV2Client;
|
|
132
|
+
export {};
|
|
@@ -0,0 +1,343 @@
|
|
|
1
|
+
import { CloudTransport, CloudTransportError, UNS_V2_MAX_REQUEST_BYTES, } from '../cloud-transport.js';
|
|
2
|
+
import { getClient } from '../openapi/client.js';
|
|
3
|
+
import { decodeUnsV2JSON, encodeUnsV2JSON } from './codec.js';
|
|
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
|
+
*/
|
|
13
|
+
export class UnsV2Error extends Error {
|
|
14
|
+
status;
|
|
15
|
+
operation;
|
|
16
|
+
code;
|
|
17
|
+
requestId;
|
|
18
|
+
execution;
|
|
19
|
+
retry;
|
|
20
|
+
opId;
|
|
21
|
+
path;
|
|
22
|
+
details;
|
|
23
|
+
repair;
|
|
24
|
+
reason;
|
|
25
|
+
queryId;
|
|
26
|
+
data;
|
|
27
|
+
constructor(message, info) {
|
|
28
|
+
super(message);
|
|
29
|
+
this.name = 'UnsV2Error';
|
|
30
|
+
Object.assign(this, info);
|
|
31
|
+
this.status = info.status;
|
|
32
|
+
this.operation = info.operation;
|
|
33
|
+
this.code = info.code;
|
|
34
|
+
this.execution = info.execution;
|
|
35
|
+
this.retry = info.retry;
|
|
36
|
+
}
|
|
37
|
+
get outcomeUnknown() {
|
|
38
|
+
return this.execution === 'unknown';
|
|
39
|
+
}
|
|
40
|
+
}
|
|
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
|
+
*/
|
|
45
|
+
export class UnsV2OutcomeUnknownError extends UnsV2Error {
|
|
46
|
+
constructor(message, info) {
|
|
47
|
+
super(message, info);
|
|
48
|
+
this.name = 'UnsV2OutcomeUnknownError';
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
function record(value) {
|
|
52
|
+
return value !== null && typeof value === 'object' && !Array.isArray(value);
|
|
53
|
+
}
|
|
54
|
+
function resourcePath(operation, request) {
|
|
55
|
+
let path = operation.path;
|
|
56
|
+
for (const key of operation.pathParams) {
|
|
57
|
+
const value = record(request) && Object.prototype.hasOwnProperty.call(request, key) ? request[key] : undefined;
|
|
58
|
+
if (typeof value !== 'string' || value.length < 1 || value.length > 128 ||
|
|
59
|
+
value === '.' || value === '..' || /[/\\\u0000-\u001f\u007f]/.test(value)) {
|
|
60
|
+
throw new TypeError(`Tier0 SDK: invalid UNS v2 path identity ${key}.`);
|
|
61
|
+
}
|
|
62
|
+
path = path.replace(`:${key}`, encodeURIComponent(value));
|
|
63
|
+
}
|
|
64
|
+
return path;
|
|
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
|
+
}
|
|
88
|
+
function errorInfo(value, status, operation) {
|
|
89
|
+
if (!record(value))
|
|
90
|
+
return undefined;
|
|
91
|
+
const fault = parseUnsV2Fault(value.error);
|
|
92
|
+
if (!fault)
|
|
93
|
+
return undefined;
|
|
94
|
+
return {
|
|
95
|
+
...fault,
|
|
96
|
+
status,
|
|
97
|
+
operation,
|
|
98
|
+
requestId: typeof value.requestId === 'string' ? value.requestId : undefined,
|
|
99
|
+
data: value.data ?? undefined,
|
|
100
|
+
};
|
|
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
|
+
}
|
|
165
|
+
export class UnsV2ClientCore {
|
|
166
|
+
transport;
|
|
167
|
+
constructor(resolveClient = getClient, config = {}) {
|
|
168
|
+
this.transport = new CloudTransport(resolveClient, config);
|
|
169
|
+
}
|
|
170
|
+
async call(name, request, options = {}) {
|
|
171
|
+
options.signal?.throwIfAborted();
|
|
172
|
+
if (typeof name !== 'string' || !Object.prototype.hasOwnProperty.call(UNS_V2_OPERATIONS, name)) {
|
|
173
|
+
throw new TypeError('Tier0 SDK: unknown UNS v2 operation.');
|
|
174
|
+
}
|
|
175
|
+
const operation = UNS_V2_OPERATIONS[name];
|
|
176
|
+
const mutation = operation.mutation;
|
|
177
|
+
const path = resourcePath(operation, request);
|
|
178
|
+
const body = encodeUnsV2JSON(request, operation.request);
|
|
179
|
+
if (new TextEncoder().encode(body).byteLength > UNS_V2_MAX_REQUEST_BYTES) {
|
|
180
|
+
throw new TypeError('Tier0 SDK: UNS v2 request body exceeds the 16777216-byte contract limit.');
|
|
181
|
+
}
|
|
182
|
+
let response;
|
|
183
|
+
try {
|
|
184
|
+
response = await this.transport.postText(path, body, options);
|
|
185
|
+
}
|
|
186
|
+
catch (error) {
|
|
187
|
+
if (!(error instanceof CloudTransportError))
|
|
188
|
+
throw error;
|
|
189
|
+
const message = error.kind === 'TRANSPORT_TIMEOUT'
|
|
190
|
+
? 'UNS v2 HTTP transport deadline exceeded.'
|
|
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);
|
|
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
|
+
});
|
|
203
|
+
let value;
|
|
204
|
+
try {
|
|
205
|
+
value = decodeUnsV2JSON(response.text, response.status === 200 ? operation.response : 'UnsV2ErrorResponse');
|
|
206
|
+
}
|
|
207
|
+
catch {
|
|
208
|
+
throw invalid('Invalid UNS v2 response.', false);
|
|
209
|
+
}
|
|
210
|
+
if (response.status !== 200) {
|
|
211
|
+
const info = errorInfo(value, response.status, name);
|
|
212
|
+
if (!info || !record(value) || value.code !== response.status) {
|
|
213
|
+
throw invalid('Invalid UNS v2 error response.', record(value) && typeof value.code === 'number');
|
|
214
|
+
}
|
|
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);
|
|
220
|
+
}
|
|
221
|
+
if (!record(value) || value.code !== 200 || typeof value.msg !== 'string' ||
|
|
222
|
+
typeof value.requestId !== 'string' || !Object.prototype.hasOwnProperty.call(value, 'data')) {
|
|
223
|
+
throw localError('Invalid UNS v2 success envelope.', name, mutation, 'UNS_V2_PROTOCOL_ERROR', response.status, false);
|
|
224
|
+
}
|
|
225
|
+
return value;
|
|
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
|
+
}
|
|
335
|
+
}
|
|
336
|
+
export function createUnsV2Client(resolveClient = getClient, config = {}) {
|
|
337
|
+
const core = new UnsV2ClientCore(resolveClient, config);
|
|
338
|
+
const methods = Object.fromEntries(Object.keys(UNS_V2_OPERATIONS).map(name => [name, (request, options) => core.call(name, request, options)]));
|
|
339
|
+
return Object.assign(core, methods);
|
|
340
|
+
}
|
|
341
|
+
/** Uses configureClient()/TIER0_API_HOST/TIER0_API_KEY and does not imply v2 readiness. */
|
|
342
|
+
export const unsV2 = createUnsV2Client();
|
|
343
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +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 { 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"]}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/** Exact JSON number used when JavaScript number cannot preserve the wire value. */
|
|
2
|
+
export declare class UnsV2RawNumber {
|
|
3
|
+
readonly lexeme: string;
|
|
4
|
+
constructor(lexeme: string);
|
|
5
|
+
toNumber(): number;
|
|
6
|
+
toBigInt(): bigint;
|
|
7
|
+
toString(): string;
|
|
8
|
+
toJSON(): never;
|
|
9
|
+
}
|
|
10
|
+
export declare function encodeUnsV2JSON(value: unknown, schemaName: string): string;
|
|
11
|
+
export declare function decodeUnsV2JSON(text: string, schemaName: string): unknown;
|