@tier0/sdk-v2 0.0.0-stage → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/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 +46 -0
- package/dist/cjs/cloud-transport.js +192 -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 +66 -0
- package/dist/cjs/data/bootstrap.js +282 -0
- package/dist/cjs/data/bootstrap.js.map +1 -0
- package/dist/cjs/data/call.d.ts +16 -0
- package/dist/cjs/data/call.js +51 -0
- package/dist/cjs/data/call.js.map +1 -0
- package/dist/cjs/data/client.d.ts +92 -0
- package/dist/cjs/data/client.js +102 -0
- package/dist/cjs/data/client.js.map +1 -0
- package/dist/cjs/data/collection.d.ts +238 -0
- package/dist/cjs/data/collection.js +441 -0
- package/dist/cjs/data/collection.js.map +1 -0
- package/dist/cjs/data/context.d.ts +10 -0
- package/dist/cjs/data/context.js +39 -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 +69 -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 +60 -0
- package/dist/cjs/data/error.js +184 -0
- package/dist/cjs/data/error.js.map +1 -0
- package/dist/cjs/data/index.d.ts +21 -0
- package/dist/cjs/data/index.js +43 -0
- package/dist/cjs/data/index.js.map +1 -0
- package/dist/cjs/data/schema.d.ts +82 -0
- package/dist/cjs/data/schema.js +607 -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/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 +54 -0
- package/dist/cjs/uns-v2/client.js +177 -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 +15551 -0
- package/dist/cjs/uns-v2/generated.js +139 -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/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 +46 -0
- package/dist/esm/cloud-transport.js +187 -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 +66 -0
- package/dist/esm/data/bootstrap.js +277 -0
- package/dist/esm/data/bootstrap.js.map +1 -0
- package/dist/esm/data/call.d.ts +16 -0
- package/dist/esm/data/call.js +47 -0
- package/dist/esm/data/call.js.map +1 -0
- package/dist/esm/data/client.d.ts +92 -0
- package/dist/esm/data/client.js +99 -0
- package/dist/esm/data/client.js.map +1 -0
- package/dist/esm/data/collection.d.ts +238 -0
- package/dist/esm/data/collection.js +434 -0
- package/dist/esm/data/collection.js.map +1 -0
- package/dist/esm/data/context.d.ts +10 -0
- package/dist/esm/data/context.js +34 -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 +69 -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 +60 -0
- package/dist/esm/data/error.js +178 -0
- package/dist/esm/data/error.js.map +1 -0
- package/dist/esm/data/index.d.ts +21 -0
- package/dist/esm/data/index.js +18 -0
- package/dist/esm/data/index.js.map +1 -0
- package/dist/esm/data/schema.d.ts +82 -0
- package/dist/esm/data/schema.js +596 -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/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 +54 -0
- package/dist/esm/uns-v2/client.js +170 -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 +15551 -0
- package/dist/esm/uns-v2/generated.js +136 -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/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 +242 -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-agent/SKILL.md +73 -0
- package/skills/tier0-sdk-v2-agent/references/results.md +45 -0
- package/skills/tier0-sdk-v2-controls/SKILL.md +63 -0
- package/skills/tier0-sdk-v2-data/SKILL.md +57 -0
- package/skills/tier0-sdk-v2-data/references/consistency.md +70 -0
- package/skills/tier0-sdk-v2-data/references/errors.md +69 -0
- package/skills/tier0-sdk-v2-data/references/modeling.md +77 -0
- package/skills/tier0-sdk-v2-data/references/read-write.md +72 -0
- package/skills/tier0-sdk-v2-data/references/schema-evolution.md +36 -0
- package/skills/tier0-sdk-v2-files/SKILL.md +85 -0
- package/skills/tier0-sdk-v2-files/references/delete.md +22 -0
- package/skills/tier0-sdk-v2-files/references/download.md +49 -0
- package/skills/tier0-sdk-v2-files/references/multipart.md +42 -0
- package/skills/tier0-sdk-v2-files/references/upload.md +27 -0
- package/skills/tier0-sdk-v2-files/references/url.md +22 -0
- package/skills/tier0-sdk-v2-members/SKILL.md +56 -0
- package/skills/tier0-sdk-v2-members/references/app-members.md +41 -0
- package/skills/tier0-sdk-v2-members/references/platform-members.md +56 -0
- package/skills/tier0-sdk-v2-mq/SKILL.md +78 -0
- package/skills/tier0-sdk-v2-mq/references/quickstart.md +69 -0
- package/skills/tier0-sdk-v2-notifications/SKILL.md +42 -0
- package/skills/tier0-sdk-v2-notifications/references/get.md +34 -0
- package/skills/tier0-sdk-v2-notifications/references/send.md +72 -0
- package/skills/tier0-sdk-v2-source/SKILL.md +38 -0
- package/skills/tier0-sdk-v2-source/references/changes.md +40 -0
- package/skills/tier0-sdk-v2-source/references/create.md +63 -0
- package/skills/tier0-sdk-v2-source/references/delete.md +47 -0
- package/skills/tier0-sdk-v2-source/references/protocols.md +36 -0
- package/skills/tier0-sdk-v2-source/references/read.md +34 -0
- package/skills/tier0-sdk-v2-source/references/state.md +37 -0
- package/skills/tier0-sdk-v2-source/references/update.md +61 -0
- package/skills/tier0-sdk-v2-stream/SKILL.md +43 -0
- package/skills/tier0-sdk-v2-stream/references/create.md +55 -0
- package/skills/tier0-sdk-v2-stream/references/delete.md +35 -0
- package/skills/tier0-sdk-v2-stream/references/deploy.md +63 -0
- package/skills/tier0-sdk-v2-stream/references/lifecycle.md +25 -0
- package/skills/tier0-sdk-v2-stream/references/read.md +35 -0
- package/skills/tier0-sdk-v2-stream/references/update.md +35 -0
- package/skills/tier0-sdk-v2-system/SKILL.md +64 -0
- package/skills/tier0-sdk-v2-system/references/info.md +23 -0
- package/skills/tier0-sdk-v2-system/references/whoami.md +21 -0
- package/skills/tier0-sdk-v2-uns/SKILL.md +53 -0
- package/skills/tier0-sdk-v2-uns/references/create.md +85 -0
- package/skills/tier0-sdk-v2-uns/references/data-workflows.md +73 -0
- package/skills/tier0-sdk-v2-uns/references/delete.md +69 -0
- package/skills/tier0-sdk-v2-uns/references/namespace.md +75 -0
- package/skills/tier0-sdk-v2-uns/references/read.md +32 -0
- package/skills/tier0-sdk-v2-uns/references/restore.md +41 -0
- package/skills/tier0-sdk-v2-uns/references/update.md +86 -0
|
@@ -0,0 +1,170 @@
|
|
|
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 { UNS_V2_OPERATIONS, } from './generated.js';
|
|
5
|
+
/** Server advice is exposed verbatim. The SDK never acts on it or retries a request. */
|
|
6
|
+
export class UnsV2Error extends Error {
|
|
7
|
+
status;
|
|
8
|
+
operation;
|
|
9
|
+
code;
|
|
10
|
+
requestId;
|
|
11
|
+
retryable;
|
|
12
|
+
retryAdvice;
|
|
13
|
+
rolledBack;
|
|
14
|
+
opId;
|
|
15
|
+
path;
|
|
16
|
+
details;
|
|
17
|
+
repair;
|
|
18
|
+
reason;
|
|
19
|
+
queryId;
|
|
20
|
+
data;
|
|
21
|
+
constructor(message, info) {
|
|
22
|
+
super(message);
|
|
23
|
+
this.name = 'UnsV2Error';
|
|
24
|
+
Object.assign(this, info);
|
|
25
|
+
this.status = info.status;
|
|
26
|
+
this.operation = info.operation;
|
|
27
|
+
this.code = info.code;
|
|
28
|
+
this.retryable = info.retryable;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
/** A mutating request may have reached the service. Reconcile before any deliberate replay. */
|
|
32
|
+
export class UnsV2OutcomeUnknownError extends UnsV2Error {
|
|
33
|
+
outcomeUnknown = true;
|
|
34
|
+
constructor(message, info) {
|
|
35
|
+
super(message, info);
|
|
36
|
+
this.name = 'UnsV2OutcomeUnknownError';
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
function record(value) {
|
|
40
|
+
return value !== null && typeof value === 'object' && !Array.isArray(value);
|
|
41
|
+
}
|
|
42
|
+
function resourcePath(operation, request) {
|
|
43
|
+
let path = operation.path;
|
|
44
|
+
for (const key of operation.pathParams) {
|
|
45
|
+
const value = record(request) && Object.prototype.hasOwnProperty.call(request, key) ? request[key] : undefined;
|
|
46
|
+
if (typeof value !== 'string' || value.length < 1 || value.length > 128 ||
|
|
47
|
+
value === '.' || value === '..' || /[/\\\u0000-\u001f\u007f]/.test(value)) {
|
|
48
|
+
throw new TypeError(`Tier0 SDK: invalid UNS v2 path identity ${key}.`);
|
|
49
|
+
}
|
|
50
|
+
path = path.replace(`:${key}`, encodeURIComponent(value));
|
|
51
|
+
}
|
|
52
|
+
return path;
|
|
53
|
+
}
|
|
54
|
+
function errorInfo(value, status, operation) {
|
|
55
|
+
if (!record(value) || !record(value.error) || typeof value.error.code !== 'string' ||
|
|
56
|
+
typeof value.error.retryable !== 'boolean' || !Array.isArray(value.error.details) ||
|
|
57
|
+
!record(value.error.retryAdvice))
|
|
58
|
+
return undefined;
|
|
59
|
+
const advice = value.error.retryAdvice;
|
|
60
|
+
if (typeof advice.recommendedAction !== 'string' || typeof advice.canRetrySameRequest !== 'boolean' ||
|
|
61
|
+
typeof advice.keepIdempotencyKey !== 'boolean')
|
|
62
|
+
return undefined;
|
|
63
|
+
return {
|
|
64
|
+
status,
|
|
65
|
+
operation,
|
|
66
|
+
code: value.error.code,
|
|
67
|
+
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
|
+
data: value.data ?? undefined,
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
export class UnsV2ClientCore {
|
|
81
|
+
transport;
|
|
82
|
+
constructor(resolveClient = getClient, config = {}) {
|
|
83
|
+
this.transport = new CloudTransport(resolveClient, config);
|
|
84
|
+
}
|
|
85
|
+
async call(name, request, options = {}) {
|
|
86
|
+
options.signal?.throwIfAborted();
|
|
87
|
+
if (typeof name !== 'string' || !Object.prototype.hasOwnProperty.call(UNS_V2_OPERATIONS, name)) {
|
|
88
|
+
throw new TypeError('Tier0 SDK: unknown UNS v2 operation.');
|
|
89
|
+
}
|
|
90
|
+
const operation = UNS_V2_OPERATIONS[name];
|
|
91
|
+
const mutation = operation.mutation;
|
|
92
|
+
const path = resourcePath(operation, request);
|
|
93
|
+
const body = encodeUnsV2JSON(request, operation.request);
|
|
94
|
+
if (new TextEncoder().encode(body).byteLength > UNS_V2_MAX_REQUEST_BYTES) {
|
|
95
|
+
throw new TypeError('Tier0 SDK: UNS v2 request body exceeds the 16777216-byte contract limit.');
|
|
96
|
+
}
|
|
97
|
+
let response;
|
|
98
|
+
try {
|
|
99
|
+
response = await this.transport.postText(path, body, options);
|
|
100
|
+
}
|
|
101
|
+
catch (error) {
|
|
102
|
+
if (!(error instanceof CloudTransportError))
|
|
103
|
+
throw error;
|
|
104
|
+
const info = {
|
|
105
|
+
status: error.status,
|
|
106
|
+
operation: name,
|
|
107
|
+
code: `UNS_V2_${error.kind}`,
|
|
108
|
+
retryable: false,
|
|
109
|
+
};
|
|
110
|
+
const message = error.kind === 'TRANSPORT_TIMEOUT'
|
|
111
|
+
? 'UNS v2 HTTP transport deadline exceeded.'
|
|
112
|
+
: error.kind === 'PROTOCOL_ERROR' ? 'Invalid UNS v2 HTTP response.' : 'UNS v2 transport failed.';
|
|
113
|
+
if (mutation)
|
|
114
|
+
throw new UnsV2OutcomeUnknownError(message, info);
|
|
115
|
+
throw new UnsV2Error(message, info);
|
|
116
|
+
}
|
|
117
|
+
let value;
|
|
118
|
+
try {
|
|
119
|
+
value = decodeUnsV2JSON(response.text, response.status === 200 ? operation.response : 'UnsV2ErrorResponse');
|
|
120
|
+
}
|
|
121
|
+
catch {
|
|
122
|
+
const info = {
|
|
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);
|
|
131
|
+
}
|
|
132
|
+
if (response.status !== 200) {
|
|
133
|
+
const info = errorInfo(value, response.status, name);
|
|
134
|
+
if (!info || !record(value) || value.code !== response.status) {
|
|
135
|
+
const invalid = {
|
|
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);
|
|
144
|
+
}
|
|
145
|
+
const message = record(value) && typeof value.msg === 'string' ? value.msg : info.code;
|
|
146
|
+
throw new UnsV2Error(message, info);
|
|
147
|
+
}
|
|
148
|
+
if (!record(value) || value.code !== 200 || typeof value.msg !== 'string' ||
|
|
149
|
+
typeof value.requestId !== 'string' || !Object.prototype.hasOwnProperty.call(value, 'data')) {
|
|
150
|
+
const info = {
|
|
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);
|
|
159
|
+
}
|
|
160
|
+
return value;
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
export function createUnsV2Client(resolveClient = getClient, config = {}) {
|
|
164
|
+
const core = new UnsV2ClientCore(resolveClient, config);
|
|
165
|
+
const methods = Object.fromEntries(Object.keys(UNS_V2_OPERATIONS).map(name => [name, (request, options) => core.call(name, request, options)]));
|
|
166
|
+
return Object.assign(core, methods);
|
|
167
|
+
}
|
|
168
|
+
/** Uses configureClient()/TIER0_API_HOST/TIER0_API_KEY and does not imply v2 readiness. */
|
|
169
|
+
export const unsV2 = createUnsV2Client();
|
|
170
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../../src/uns-v2/client.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,EACd,mBAAmB,EACnB,wBAAwB,GAEzB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,SAAS,EAAwC,MAAM,sBAAsB,CAAC;AACvF,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAC9D,OAAO,EACL,iBAAiB,GAMlB,MAAM,gBAAgB,CAAC;AAsBxB,wFAAwF;AACxF,MAAM,OAAO,UAAW,SAAQ,KAAK;IAC1B,MAAM,CAAU;IAChB,SAAS,CAAqB;IAC9B,IAAI,CAAS;IACb,SAAS,CAAU;IACnB,SAAS,CAAU;IACnB,WAAW,CAAe;IAC1B,UAAU,CAAW;IACrB,IAAI,CAAU;IACd,IAAI,CAAU;IACd,OAAO,CAAiB;IACxB,MAAM,CAAU;IAChB,MAAM,CAAU;IAChB,OAAO,CAAU;IACjB,IAAI,CAAW;IAExB,YAAY,OAAe,EAAE,IAAoB;QAC/C,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,YAAY,CAAC;QACzB,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAC1B,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;QAC1B,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;QAChC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;QACtB,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;IAClC,CAAC;CACF;AAED,+FAA+F;AAC/F,MAAM,OAAO,wBAAyB,SAAQ,UAAU;IAC7C,cAAc,GAAG,IAAI,CAAC;IAC/B,YAAY,OAAe,EAAE,IAAoB;QAC/C,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QACrB,IAAI,CAAC,IAAI,GAAG,0BAA0B,CAAC;IACzC,CAAC;CACF;AAED,SAAS,MAAM,CAAC,KAAc;IAC5B,OAAO,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC9E,CAAC;AAED,SAAS,YAAY,CAAC,SAAmE,EAAE,OAAgB;IACzG,IAAI,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC;IAC1B,KAAK,MAAM,GAAG,IAAI,SAAS,CAAC,UAAU,EAAE,CAAC;QACvC,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAC/G,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,KAAK,CAAC,MAAM,GAAG,GAAG;YACnE,KAAK,KAAK,GAAG,IAAI,KAAK,KAAK,IAAI,IAAI,0BAA0B,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;YAC9E,MAAM,IAAI,SAAS,CAAC,2CAA2C,GAAG,GAAG,CAAC,CAAC;QACzE,CAAC;QACD,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,GAAG,EAAE,EAAE,kBAAkB,CAAC,KAAK,CAAC,CAAC,CAAC;IAC5D,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,SAAS,CAAC,KAAc,EAAE,MAAc,EAAE,SAA6B;IAC9E,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,OAAO,KAAK,CAAC,KAAK,CAAC,IAAI,KAAK,QAAQ;QAC9E,OAAO,KAAK,CAAC,KAAK,CAAC,SAAS,KAAK,SAAS,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC;QACjF,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,WAAW,CAAC;QAAE,OAAO,SAAS,CAAC;IACvD,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC,WAAW,CAAC;IACvC,IAAI,OAAO,MAAM,CAAC,iBAAiB,KAAK,QAAQ,IAAI,OAAO,MAAM,CAAC,mBAAmB,KAAK,SAAS;QAC/F,OAAO,MAAM,CAAC,kBAAkB,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IACrE,OAAO;QACL,MAAM;QACN,SAAS;QACT,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC,IAAI;QACtB,SAAS,EAAE,OAAO,KAAK,CAAC,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS;QAC5E,SAAS,EAAE,KAAK,CAAC,KAAK,CAAC,SAAS;QAChC,WAAW,EAAE,MAAgC;QAC7C,UAAU,EAAE,OAAO,KAAK,CAAC,KAAK,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS;QAC5F,IAAI,EAAE,OAAO,KAAK,CAAC,KAAK,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS;QACzE,IAAI,EAAE,OAAO,KAAK,CAAC,KAAK,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS;QACzE,OAAO,EAAE,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS;QAC5E,MAAM,EAAE,OAAO,KAAK,CAAC,KAAK,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS;QAC/E,MAAM,EAAE,OAAO,KAAK,CAAC,KAAK,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS;QAC/E,OAAO,EAAE,OAAO,KAAK,CAAC,KAAK,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS;QAClF,IAAI,EAAE,KAAK,CAAC,IAAI,IAAI,SAAS;KAC9B,CAAC;AACJ,CAAC;AAED,MAAM,OAAO,eAAe;IACT,SAAS,CAAiB;IAE3C,YAAY,gBAAkC,SAAS,EAAE,SAA+B,EAAE;QACxF,IAAI,CAAC,SAAS,GAAG,IAAI,cAAc,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;IAC7D,CAAC;IAED,KAAK,CAAC,IAAI,CAAkC,IAAU,EAAE,OAA2B,EAAE,UAA0B,EAAE;QAC/G,OAAO,CAAC,MAAM,EAAE,cAAc,EAAE,CAAC;QACjC,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,iBAAiB,EAAE,IAAI,CAAC,EAAE,CAAC;YAC/F,MAAM,IAAI,SAAS,CAAC,sCAAsC,CAAC,CAAC;QAC9D,CAAC;QACD,MAAM,SAAS,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;QAC1C,MAAM,QAAQ,GAAG,SAAS,CAAC,QAAQ,CAAC;QACpC,MAAM,IAAI,GAAG,YAAY,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QAC9C,MAAM,IAAI,GAAG,eAAe,CAAC,OAAO,EAAE,SAAS,CAAC,OAAO,CAAC,CAAC;QACzD,IAAI,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,UAAU,GAAG,wBAAwB,EAAE,CAAC;YACzE,MAAM,IAAI,SAAS,CAAC,0EAA0E,CAAC,CAAC;QAClG,CAAC;QACD,IAAI,QAAyD,CAAC;QAC9D,IAAI,CAAC;YACH,QAAQ,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;QAChE,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,CAAC,KAAK,YAAY,mBAAmB,CAAC;gBAAE,MAAM,KAAK,CAAC;YACzD,MAAM,IAAI,GAAmB;gBAC3B,MAAM,EAAE,KAAK,CAAC,MAAM;gBACpB,SAAS,EAAE,IAAI;gBACf,IAAI,EAAE,UAAU,KAAK,CAAC,IAAI,EAAE;gBAC5B,SAAS,EAAE,KAAK;aACjB,CAAC;YACF,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,KAAK,mBAAmB;gBAChD,CAAC,CAAC,0CAA0C;gBAC5C,CAAC,CAAC,KAAK,CAAC,IAAI,KAAK,gBAAgB,CAAC,CAAC,CAAC,+BAA+B,CAAC,CAAC,CAAC,0BAA0B,CAAC;YACnG,IAAI,QAAQ;gBAAE,MAAM,IAAI,wBAAwB,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;YAChE,MAAM,IAAI,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QACtC,CAAC;QAED,IAAI,KAAc,CAAC;QACnB,IAAI,CAAC;YACH,KAAK,GAAG,eAAe,CAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,MAAM,KAAK,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC;QAC9G,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,IAAI,GAAmB;gBAC3B,MAAM,EAAE,QAAQ,CAAC,MAAM;gBACvB,SAAS,EAAE,IAAI;gBACf,IAAI,EAAE,uBAAuB;gBAC7B,SAAS,EAAE,KAAK;aACjB,CAAC;YACF,IAAI,QAAQ;gBAAE,MAAM,IAAI,wBAAwB,CAAC,0BAA0B,EAAE,IAAI,CAAC,CAAC;YACnF,MAAM,IAAI,UAAU,CAAC,0BAA0B,EAAE,IAAI,CAAC,CAAC;QACzD,CAAC;QAED,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YAC5B,MAAM,IAAI,GAAG,SAAS,CAAC,KAAK,EAAE,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;YACrD,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,CAAC,MAAM,EAAE,CAAC;gBAC9D,MAAM,OAAO,GAAmB;oBAC9B,MAAM,EAAE,QAAQ,CAAC,MAAM;oBACvB,SAAS,EAAE,IAAI;oBACf,IAAI,EAAE,uBAAuB;oBAC7B,SAAS,EAAE,KAAK;iBACjB,CAAC;gBACF,IAAI,QAAQ;oBAAE,MAAM,IAAI,wBAAwB,CAAC,gCAAgC,EAAE,OAAO,CAAC,CAAC;gBAC5F,MAAM,IAAI,UAAU,CAAC,gCAAgC,EAAE,OAAO,CAAC,CAAC;YAClE,CAAC;YACD,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,OAAO,KAAK,CAAC,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;YACvF,MAAM,IAAI,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QACtC,CAAC;QAED,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,GAAG,IAAI,OAAO,KAAK,CAAC,GAAG,KAAK,QAAQ;YACrE,OAAO,KAAK,CAAC,SAAS,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC,EAAE,CAAC;YAChG,MAAM,IAAI,GAAmB;gBAC3B,MAAM,EAAE,QAAQ,CAAC,MAAM;gBACvB,SAAS,EAAE,IAAI;gBACf,IAAI,EAAE,uBAAuB;gBAC7B,SAAS,EAAE,KAAK;aACjB,CAAC;YACF,IAAI,QAAQ;gBAAE,MAAM,IAAI,wBAAwB,CAAC,kCAAkC,EAAE,IAAI,CAAC,CAAC;YAC3F,MAAM,IAAI,UAAU,CAAC,kCAAkC,EAAE,IAAI,CAAC,CAAC;QACjE,CAAC;QACD,OAAO,KAA4B,CAAC;IACtC,CAAC;CACF;AAID,MAAM,UAAU,iBAAiB,CAAC,gBAAkC,SAAS,EAAE,SAA+B,EAAE;IAC9G,MAAM,IAAI,GAAG,IAAI,eAAe,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;IACxD,MAAM,OAAO,GAAG,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,OAAgB,EAAE,OAAwB,EAAE,EAAE,CAClI,IAAI,CAAC,IAAI,CAAC,IAA0B,EAAE,OAA2C,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;IACjG,OAAO,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,OAAO,CAA2B,CAAC;AAChE,CAAC;AAED,2FAA2F;AAC3F,MAAM,CAAC,MAAM,KAAK,GAAG,iBAAiB,EAAE,CAAC","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"]}
|
|
@@ -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;
|
|
@@ -0,0 +1,284 @@
|
|
|
1
|
+
import { UNS_V2_CODEC_SCHEMAS } from './generated.js';
|
|
2
|
+
import { V1_CODEC_SCHEMAS } from '../openapi/codecs.generated.js';
|
|
3
|
+
const numericBrand = Symbol('UnsV2NumericToken');
|
|
4
|
+
const schemas = { ...UNS_V2_CODEC_SCHEMAS, ...V1_CODEC_SCHEMAS };
|
|
5
|
+
const jsonNumberPattern = /^-?(?:0|[1-9]\d*)(?:\.\d+)?(?:[eE][+-]?\d+)?$/;
|
|
6
|
+
const int64Min = -(1n << 63n);
|
|
7
|
+
const int64Max = (1n << 63n) - 1n;
|
|
8
|
+
/** Exact JSON number used when JavaScript number cannot preserve the wire value. */
|
|
9
|
+
export class UnsV2RawNumber {
|
|
10
|
+
lexeme;
|
|
11
|
+
constructor(lexeme) {
|
|
12
|
+
if (!jsonNumberPattern.test(lexeme))
|
|
13
|
+
throw new TypeError('Tier0 SDK: invalid raw JSON number.');
|
|
14
|
+
this.lexeme = lexeme;
|
|
15
|
+
Object.freeze(this);
|
|
16
|
+
}
|
|
17
|
+
toNumber() { return Number(this.lexeme); }
|
|
18
|
+
toBigInt() {
|
|
19
|
+
if (!/^-?(?:0|[1-9]\d*)$/.test(this.lexeme))
|
|
20
|
+
throw new TypeError('Tier0 SDK: raw JSON number is not an integer.');
|
|
21
|
+
return BigInt(this.lexeme);
|
|
22
|
+
}
|
|
23
|
+
toString() { return this.lexeme; }
|
|
24
|
+
toJSON() {
|
|
25
|
+
throw new TypeError('Tier0 SDK: UnsV2RawNumber requires encodeUnsV2JSON or explicit conversion.');
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
function numeric(value) {
|
|
29
|
+
return value !== null && typeof value === 'object' && numericBrand in value;
|
|
30
|
+
}
|
|
31
|
+
class JSONParser {
|
|
32
|
+
text;
|
|
33
|
+
offset = 0;
|
|
34
|
+
constructor(text) {
|
|
35
|
+
this.text = text;
|
|
36
|
+
}
|
|
37
|
+
parse() {
|
|
38
|
+
const value = this.value();
|
|
39
|
+
this.space();
|
|
40
|
+
if (this.offset !== this.text.length)
|
|
41
|
+
throw new SyntaxError('Trailing JSON content.');
|
|
42
|
+
return value;
|
|
43
|
+
}
|
|
44
|
+
space() {
|
|
45
|
+
while (this.text[this.offset] === ' ' || this.text[this.offset] === '\t' ||
|
|
46
|
+
this.text[this.offset] === '\r' || this.text[this.offset] === '\n')
|
|
47
|
+
this.offset += 1;
|
|
48
|
+
}
|
|
49
|
+
value() {
|
|
50
|
+
this.space();
|
|
51
|
+
const char = this.text[this.offset];
|
|
52
|
+
if (char === '"')
|
|
53
|
+
return this.string();
|
|
54
|
+
if (char === '{')
|
|
55
|
+
return this.object();
|
|
56
|
+
if (char === '[')
|
|
57
|
+
return this.array();
|
|
58
|
+
if (this.text.startsWith('true', this.offset)) {
|
|
59
|
+
this.offset += 4;
|
|
60
|
+
return true;
|
|
61
|
+
}
|
|
62
|
+
if (this.text.startsWith('false', this.offset)) {
|
|
63
|
+
this.offset += 5;
|
|
64
|
+
return false;
|
|
65
|
+
}
|
|
66
|
+
if (this.text.startsWith('null', this.offset)) {
|
|
67
|
+
this.offset += 4;
|
|
68
|
+
return null;
|
|
69
|
+
}
|
|
70
|
+
const match = this.text.slice(this.offset).match(/^-?(?:0|[1-9]\d*)(?:\.\d+)?(?:[eE][+-]?\d+)?/);
|
|
71
|
+
if (match) {
|
|
72
|
+
this.offset += match[0].length;
|
|
73
|
+
return { [numericBrand]: match[0] };
|
|
74
|
+
}
|
|
75
|
+
throw new SyntaxError(`Invalid JSON at offset ${this.offset}.`);
|
|
76
|
+
}
|
|
77
|
+
string() {
|
|
78
|
+
const start = this.offset++;
|
|
79
|
+
let escaped = false;
|
|
80
|
+
while (this.offset < this.text.length) {
|
|
81
|
+
const char = this.text[this.offset++];
|
|
82
|
+
if (char === '"' && !escaped)
|
|
83
|
+
return JSON.parse(this.text.slice(start, this.offset));
|
|
84
|
+
if (char === '\\' && !escaped)
|
|
85
|
+
escaped = true;
|
|
86
|
+
else
|
|
87
|
+
escaped = false;
|
|
88
|
+
}
|
|
89
|
+
throw new SyntaxError('Unterminated JSON string.');
|
|
90
|
+
}
|
|
91
|
+
object() {
|
|
92
|
+
const result = Object.create(null);
|
|
93
|
+
this.offset += 1;
|
|
94
|
+
this.space();
|
|
95
|
+
if (this.text[this.offset] === '}') {
|
|
96
|
+
this.offset += 1;
|
|
97
|
+
return result;
|
|
98
|
+
}
|
|
99
|
+
while (true) {
|
|
100
|
+
this.space();
|
|
101
|
+
if (this.text[this.offset] !== '"')
|
|
102
|
+
throw new SyntaxError('Expected JSON object key.');
|
|
103
|
+
const key = this.string();
|
|
104
|
+
this.space();
|
|
105
|
+
if (this.text[this.offset++] !== ':')
|
|
106
|
+
throw new SyntaxError('Expected JSON object colon.');
|
|
107
|
+
result[key] = this.value();
|
|
108
|
+
this.space();
|
|
109
|
+
const delimiter = this.text[this.offset++];
|
|
110
|
+
if (delimiter === '}')
|
|
111
|
+
return result;
|
|
112
|
+
if (delimiter !== ',')
|
|
113
|
+
throw new SyntaxError('Expected JSON object delimiter.');
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
array() {
|
|
117
|
+
const result = [];
|
|
118
|
+
this.offset += 1;
|
|
119
|
+
this.space();
|
|
120
|
+
if (this.text[this.offset] === ']') {
|
|
121
|
+
this.offset += 1;
|
|
122
|
+
return result;
|
|
123
|
+
}
|
|
124
|
+
while (true) {
|
|
125
|
+
result.push(this.value());
|
|
126
|
+
this.space();
|
|
127
|
+
const delimiter = this.text[this.offset++];
|
|
128
|
+
if (delimiter === ']')
|
|
129
|
+
return result;
|
|
130
|
+
if (delimiter !== ',')
|
|
131
|
+
throw new SyntaxError('Expected JSON array delimiter.');
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
function variants(codec, seen = new Set()) {
|
|
136
|
+
if (!codec)
|
|
137
|
+
return [];
|
|
138
|
+
if (codec.r) {
|
|
139
|
+
if (seen.has(codec.r))
|
|
140
|
+
return [];
|
|
141
|
+
const next = new Set(seen);
|
|
142
|
+
next.add(codec.r);
|
|
143
|
+
return variants(schemas[codec.r], next);
|
|
144
|
+
}
|
|
145
|
+
if (codec.k === 'u')
|
|
146
|
+
return (codec.a || []).flatMap(item => variants(item, seen));
|
|
147
|
+
return [codec];
|
|
148
|
+
}
|
|
149
|
+
function kind(codec, expected) {
|
|
150
|
+
return variants(codec).find(item => item.k === expected);
|
|
151
|
+
}
|
|
152
|
+
function property(codec, name) {
|
|
153
|
+
for (const candidate of variants(codec)) {
|
|
154
|
+
if (candidate.k !== 'o')
|
|
155
|
+
continue;
|
|
156
|
+
if (candidate.p && Object.prototype.hasOwnProperty.call(candidate.p, name))
|
|
157
|
+
return candidate.p[name];
|
|
158
|
+
if (candidate.x)
|
|
159
|
+
return candidate.x;
|
|
160
|
+
}
|
|
161
|
+
return undefined;
|
|
162
|
+
}
|
|
163
|
+
function decimalIdentity(token) {
|
|
164
|
+
const match = token.match(/^(-?)(\d+)(?:\.(\d+))?(?:[eE]([+-]?\d+))?$/);
|
|
165
|
+
if (!match)
|
|
166
|
+
throw new SyntaxError('Invalid JSON number.');
|
|
167
|
+
const negative = match[1] === '-';
|
|
168
|
+
const fraction = match[3] || '';
|
|
169
|
+
let digits = `${match[2]}${fraction}`.replace(/^0+/, '');
|
|
170
|
+
if (!digits)
|
|
171
|
+
return '0';
|
|
172
|
+
let power = Number(match[4] || 0) - fraction.length;
|
|
173
|
+
const trailing = digits.match(/0+$/)?.[0].length || 0;
|
|
174
|
+
if (trailing) {
|
|
175
|
+
digits = digits.slice(0, -trailing);
|
|
176
|
+
power += trailing;
|
|
177
|
+
}
|
|
178
|
+
return `${negative ? '-' : ''}${digits}e${power}`;
|
|
179
|
+
}
|
|
180
|
+
function decode(value, codec) {
|
|
181
|
+
if (numeric(value)) {
|
|
182
|
+
const token = value[numericBrand];
|
|
183
|
+
if (kind(codec, 'i')) {
|
|
184
|
+
if (!/^-?(?:0|[1-9]\d*)$/.test(token))
|
|
185
|
+
throw new SyntaxError('Invalid int64 JSON token.');
|
|
186
|
+
const integer = BigInt(token);
|
|
187
|
+
if (integer < int64Min || integer > int64Max)
|
|
188
|
+
throw new SyntaxError('UNS v2 int64 exceeds the signed 64-bit range.');
|
|
189
|
+
return integer >= BigInt(Number.MIN_SAFE_INTEGER) && integer <= BigInt(Number.MAX_SAFE_INTEGER)
|
|
190
|
+
? Number(integer) : integer;
|
|
191
|
+
}
|
|
192
|
+
if (kind(codec, 'j') && !/^-?(?:0|[1-9]\d*)$/.test(token)) {
|
|
193
|
+
throw new SyntaxError('Invalid integer JSON token.');
|
|
194
|
+
}
|
|
195
|
+
const number = Number(token);
|
|
196
|
+
if (Number.isFinite(number) && (!Number.isInteger(number) || Number.isSafeInteger(number)) &&
|
|
197
|
+
decimalIdentity(token) === decimalIdentity(JSON.stringify(number)))
|
|
198
|
+
return number;
|
|
199
|
+
return new UnsV2RawNumber(token);
|
|
200
|
+
}
|
|
201
|
+
if (Array.isArray(value)) {
|
|
202
|
+
const item = kind(codec, 'a')?.i;
|
|
203
|
+
return value.map(entry => decode(entry, item));
|
|
204
|
+
}
|
|
205
|
+
if (value !== null && typeof value === 'object') {
|
|
206
|
+
return Object.fromEntries(Object.entries(value).map(([name, entry]) => [name, decode(entry, property(codec, name))]));
|
|
207
|
+
}
|
|
208
|
+
return value;
|
|
209
|
+
}
|
|
210
|
+
function encode(value, codec, seen) {
|
|
211
|
+
if (value === undefined)
|
|
212
|
+
return undefined;
|
|
213
|
+
if (value === null || typeof value === 'boolean')
|
|
214
|
+
return JSON.stringify(value);
|
|
215
|
+
if (typeof value === 'string')
|
|
216
|
+
return JSON.stringify(value);
|
|
217
|
+
if (typeof value === 'bigint') {
|
|
218
|
+
if (!kind(codec, 'i') || value < int64Min || value > int64Max) {
|
|
219
|
+
throw new TypeError('Tier0 SDK: bigint is only valid for signed int64 contract fields.');
|
|
220
|
+
}
|
|
221
|
+
return value.toString();
|
|
222
|
+
}
|
|
223
|
+
if (typeof value === 'number') {
|
|
224
|
+
if (!Number.isFinite(value))
|
|
225
|
+
throw new TypeError('Tier0 SDK: UNS v2 request contains a non-finite number.');
|
|
226
|
+
if (kind(codec, 'j') && !Number.isInteger(value)) {
|
|
227
|
+
throw new TypeError('Tier0 SDK: UNS v2 integer field requires an integer.');
|
|
228
|
+
}
|
|
229
|
+
if (kind(codec, 'i') && !Number.isSafeInteger(value)) {
|
|
230
|
+
throw new TypeError('Tier0 SDK: UNS v2 int64 must be a safe integer; string coercion is forbidden.');
|
|
231
|
+
}
|
|
232
|
+
if (Number.isInteger(value) && !Number.isSafeInteger(value)) {
|
|
233
|
+
throw new TypeError('Tier0 SDK: UNS v2 request integer exceeds the JavaScript safe-integer range.');
|
|
234
|
+
}
|
|
235
|
+
return JSON.stringify(value);
|
|
236
|
+
}
|
|
237
|
+
if (value instanceof UnsV2RawNumber) {
|
|
238
|
+
if (kind(codec, 'i')) {
|
|
239
|
+
if (!/^-?(?:0|[1-9]\d*)$/.test(value.lexeme))
|
|
240
|
+
throw new TypeError('Tier0 SDK: int64 requires an integer.');
|
|
241
|
+
const integer = BigInt(value.lexeme);
|
|
242
|
+
if (integer < int64Min || integer > int64Max)
|
|
243
|
+
throw new TypeError('Tier0 SDK: int64 exceeds the signed 64-bit range.');
|
|
244
|
+
}
|
|
245
|
+
if (kind(codec, 'j') && !/^-?(?:0|[1-9]\d*)$/.test(value.lexeme)) {
|
|
246
|
+
throw new TypeError('Tier0 SDK: integer field requires an integer.');
|
|
247
|
+
}
|
|
248
|
+
return value.lexeme;
|
|
249
|
+
}
|
|
250
|
+
if (typeof value !== 'object' || seen.has(value))
|
|
251
|
+
throw new TypeError('Tier0 SDK: UNS v2 request must be acyclic JSON.');
|
|
252
|
+
seen.add(value);
|
|
253
|
+
try {
|
|
254
|
+
if (Array.isArray(value)) {
|
|
255
|
+
const item = kind(codec, 'a')?.i;
|
|
256
|
+
return `[${value.map(entry => {
|
|
257
|
+
const encoded = encode(entry, item, seen);
|
|
258
|
+
if (encoded === undefined)
|
|
259
|
+
throw new TypeError('Tier0 SDK: UNS v2 arrays cannot contain undefined.');
|
|
260
|
+
return encoded;
|
|
261
|
+
}).join(',')}]`;
|
|
262
|
+
}
|
|
263
|
+
const entries = [];
|
|
264
|
+
for (const [name, entry] of Object.entries(value)) {
|
|
265
|
+
const encoded = encode(entry, property(codec, name), seen);
|
|
266
|
+
if (encoded !== undefined)
|
|
267
|
+
entries.push(`${JSON.stringify(name)}:${encoded}`);
|
|
268
|
+
}
|
|
269
|
+
return `{${entries.join(',')}}`;
|
|
270
|
+
}
|
|
271
|
+
finally {
|
|
272
|
+
seen.delete(value);
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
export function encodeUnsV2JSON(value, schemaName) {
|
|
276
|
+
const encoded = encode(value, { r: schemaName }, new Set());
|
|
277
|
+
if (encoded === undefined)
|
|
278
|
+
throw new TypeError('Tier0 SDK: UNS v2 request body is required.');
|
|
279
|
+
return encoded;
|
|
280
|
+
}
|
|
281
|
+
export function decodeUnsV2JSON(text, schemaName) {
|
|
282
|
+
return decode(new JSONParser(text).parse(), { r: schemaName });
|
|
283
|
+
}
|
|
284
|
+
//# sourceMappingURL=codec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codec.js","sourceRoot":"","sources":["../../../src/uns-v2/codec.ts"],"names":[],"mappings":"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","sourcesContent":["import { UNS_V2_CODEC_SCHEMAS } from './generated.js';\r\nimport { V1_CODEC_SCHEMAS } from '../openapi/codecs.generated.js';\r\n\r\ntype Codec = { readonly k?: string; readonly r?: string; readonly i?: Codec; readonly p?: Record<string, Codec>; readonly x?: Codec; readonly a?: readonly Codec[] };\r\nconst numericBrand: unique symbol = Symbol('UnsV2NumericToken');\r\ntype NumericToken = { readonly [numericBrand]: string };\r\nconst schemas = { ...UNS_V2_CODEC_SCHEMAS, ...V1_CODEC_SCHEMAS } as unknown as Record<string, Codec>;\r\nconst jsonNumberPattern = /^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?(?:[eE][+-]?\\d+)?$/;\r\nconst int64Min = -(1n << 63n);\r\nconst int64Max = (1n << 63n) - 1n;\r\n\r\n/** Exact JSON number used when JavaScript number cannot preserve the wire value. */\r\nexport class UnsV2RawNumber {\r\n readonly lexeme: string;\r\n\r\n constructor(lexeme: string) {\r\n if (!jsonNumberPattern.test(lexeme)) throw new TypeError('Tier0 SDK: invalid raw JSON number.');\r\n this.lexeme = lexeme;\r\n Object.freeze(this);\r\n }\r\n\r\n toNumber(): number { return Number(this.lexeme); }\r\n toBigInt(): bigint {\r\n if (!/^-?(?:0|[1-9]\\d*)$/.test(this.lexeme)) throw new TypeError('Tier0 SDK: raw JSON number is not an integer.');\r\n return BigInt(this.lexeme);\r\n }\r\n toString(): string { return this.lexeme; }\r\n toJSON(): never {\r\n throw new TypeError('Tier0 SDK: UnsV2RawNumber requires encodeUnsV2JSON or explicit conversion.');\r\n }\r\n}\r\n\r\nfunction numeric(value: unknown): value is NumericToken {\r\n return value !== null && typeof value === 'object' && numericBrand in value;\r\n}\r\n\r\nclass JSONParser {\r\n private offset = 0;\r\n constructor(private readonly text: string) {}\r\n\r\n parse(): unknown {\r\n const value = this.value();\r\n this.space();\r\n if (this.offset !== this.text.length) throw new SyntaxError('Trailing JSON content.');\r\n return value;\r\n }\r\n\r\n private space(): void {\r\n while (this.text[this.offset] === ' ' || this.text[this.offset] === '\\t' ||\r\n this.text[this.offset] === '\\r' || this.text[this.offset] === '\\n') this.offset += 1;\r\n }\r\n\r\n private value(): unknown {\r\n this.space();\r\n const char = this.text[this.offset];\r\n if (char === '\"') return this.string();\r\n if (char === '{') return this.object();\r\n if (char === '[') return this.array();\r\n if (this.text.startsWith('true', this.offset)) { this.offset += 4; return true; }\r\n if (this.text.startsWith('false', this.offset)) { this.offset += 5; return false; }\r\n if (this.text.startsWith('null', this.offset)) { this.offset += 4; return null; }\r\n const match = this.text.slice(this.offset).match(/^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?(?:[eE][+-]?\\d+)?/);\r\n if (match) { this.offset += match[0].length; return { [numericBrand]: match[0] }; }\r\n throw new SyntaxError(`Invalid JSON at offset ${this.offset}.`);\r\n }\r\n\r\n private string(): string {\r\n const start = this.offset++;\r\n let escaped = false;\r\n while (this.offset < this.text.length) {\r\n const char = this.text[this.offset++];\r\n if (char === '\"' && !escaped) return JSON.parse(this.text.slice(start, this.offset)) as string;\r\n if (char === '\\\\' && !escaped) escaped = true;\r\n else escaped = false;\r\n }\r\n throw new SyntaxError('Unterminated JSON string.');\r\n }\r\n\r\n private object(): Record<string, unknown> {\r\n const result: Record<string, unknown> = Object.create(null) as Record<string, unknown>;\r\n this.offset += 1;\r\n this.space();\r\n if (this.text[this.offset] === '}') { this.offset += 1; return result; }\r\n while (true) {\r\n this.space();\r\n if (this.text[this.offset] !== '\"') throw new SyntaxError('Expected JSON object key.');\r\n const key = this.string();\r\n this.space();\r\n if (this.text[this.offset++] !== ':') throw new SyntaxError('Expected JSON object colon.');\r\n result[key] = this.value();\r\n this.space();\r\n const delimiter = this.text[this.offset++];\r\n if (delimiter === '}') return result;\r\n if (delimiter !== ',') throw new SyntaxError('Expected JSON object delimiter.');\r\n }\r\n }\r\n\r\n private array(): unknown[] {\r\n const result: unknown[] = [];\r\n this.offset += 1;\r\n this.space();\r\n if (this.text[this.offset] === ']') { this.offset += 1; return result; }\r\n while (true) {\r\n result.push(this.value());\r\n this.space();\r\n const delimiter = this.text[this.offset++];\r\n if (delimiter === ']') return result;\r\n if (delimiter !== ',') throw new SyntaxError('Expected JSON array delimiter.');\r\n }\r\n }\r\n}\r\n\r\nfunction variants(codec: Codec | undefined, seen = new Set<string>()): Codec[] {\r\n if (!codec) return [];\r\n if (codec.r) {\r\n if (seen.has(codec.r)) return [];\r\n const next = new Set(seen);\r\n next.add(codec.r);\r\n return variants(schemas[codec.r], next);\r\n }\r\n if (codec.k === 'u') return (codec.a || []).flatMap(item => variants(item, seen));\r\n return [codec];\r\n}\r\n\r\nfunction kind(codec: Codec | undefined, expected: string): Codec | undefined {\r\n return variants(codec).find(item => item.k === expected);\r\n}\r\n\r\nfunction property(codec: Codec | undefined, name: string): Codec | undefined {\r\n for (const candidate of variants(codec)) {\r\n if (candidate.k !== 'o') continue;\r\n if (candidate.p && Object.prototype.hasOwnProperty.call(candidate.p, name)) return candidate.p[name];\r\n if (candidate.x) return candidate.x;\r\n }\r\n return undefined;\r\n}\r\n\r\nfunction decimalIdentity(token: string): string {\r\n const match = token.match(/^(-?)(\\d+)(?:\\.(\\d+))?(?:[eE]([+-]?\\d+))?$/);\r\n if (!match) throw new SyntaxError('Invalid JSON number.');\r\n const negative = match[1] === '-';\r\n const fraction = match[3] || '';\r\n let digits = `${match[2]}${fraction}`.replace(/^0+/, '');\r\n if (!digits) return '0';\r\n let power = Number(match[4] || 0) - fraction.length;\r\n const trailing = digits.match(/0+$/)?.[0].length || 0;\r\n if (trailing) {\r\n digits = digits.slice(0, -trailing);\r\n power += trailing;\r\n }\r\n return `${negative ? '-' : ''}${digits}e${power}`;\r\n}\r\n\r\nfunction decode(value: unknown, codec: Codec | undefined): unknown {\r\n if (numeric(value)) {\r\n const token = value[numericBrand];\r\n if (kind(codec, 'i')) {\r\n if (!/^-?(?:0|[1-9]\\d*)$/.test(token)) throw new SyntaxError('Invalid int64 JSON token.');\r\n const integer = BigInt(token);\r\n if (integer < int64Min || integer > int64Max) throw new SyntaxError('UNS v2 int64 exceeds the signed 64-bit range.');\r\n return integer >= BigInt(Number.MIN_SAFE_INTEGER) && integer <= BigInt(Number.MAX_SAFE_INTEGER)\r\n ? Number(integer) : integer;\r\n }\r\n if (kind(codec, 'j') && !/^-?(?:0|[1-9]\\d*)$/.test(token)) {\r\n throw new SyntaxError('Invalid integer JSON token.');\r\n }\r\n const number = Number(token);\r\n if (Number.isFinite(number) && (!Number.isInteger(number) || Number.isSafeInteger(number)) &&\r\n decimalIdentity(token) === decimalIdentity(JSON.stringify(number))) return number;\r\n return new UnsV2RawNumber(token);\r\n }\r\n if (Array.isArray(value)) {\r\n const item = kind(codec, 'a')?.i;\r\n return value.map(entry => decode(entry, item));\r\n }\r\n if (value !== null && typeof value === 'object') {\r\n return Object.fromEntries(Object.entries(value).map(([name, entry]) => [name, decode(entry, property(codec, name))]));\r\n }\r\n return value;\r\n}\r\n\r\nfunction encode(value: unknown, codec: Codec | undefined, seen: Set<unknown>): string | undefined {\r\n if (value === undefined) return undefined;\r\n if (value === null || typeof value === 'boolean') return JSON.stringify(value);\r\n if (typeof value === 'string') return JSON.stringify(value);\r\n if (typeof value === 'bigint') {\r\n if (!kind(codec, 'i') || value < int64Min || value > int64Max) {\r\n throw new TypeError('Tier0 SDK: bigint is only valid for signed int64 contract fields.');\r\n }\r\n return value.toString();\r\n }\r\n if (typeof value === 'number') {\r\n if (!Number.isFinite(value)) throw new TypeError('Tier0 SDK: UNS v2 request contains a non-finite number.');\r\n if (kind(codec, 'j') && !Number.isInteger(value)) {\r\n throw new TypeError('Tier0 SDK: UNS v2 integer field requires an integer.');\r\n }\r\n if (kind(codec, 'i') && !Number.isSafeInteger(value)) {\r\n throw new TypeError('Tier0 SDK: UNS v2 int64 must be a safe integer; string coercion is forbidden.');\r\n }\r\n if (Number.isInteger(value) && !Number.isSafeInteger(value)) {\r\n throw new TypeError('Tier0 SDK: UNS v2 request integer exceeds the JavaScript safe-integer range.');\r\n }\r\n return JSON.stringify(value);\r\n }\r\n if (value instanceof UnsV2RawNumber) {\r\n if (kind(codec, 'i')) {\r\n if (!/^-?(?:0|[1-9]\\d*)$/.test(value.lexeme)) throw new TypeError('Tier0 SDK: int64 requires an integer.');\r\n const integer = BigInt(value.lexeme);\r\n if (integer < int64Min || integer > int64Max) throw new TypeError('Tier0 SDK: int64 exceeds the signed 64-bit range.');\r\n }\r\n if (kind(codec, 'j') && !/^-?(?:0|[1-9]\\d*)$/.test(value.lexeme)) {\r\n throw new TypeError('Tier0 SDK: integer field requires an integer.');\r\n }\r\n return value.lexeme;\r\n }\r\n if (typeof value !== 'object' || seen.has(value)) throw new TypeError('Tier0 SDK: UNS v2 request must be acyclic JSON.');\r\n seen.add(value);\r\n try {\r\n if (Array.isArray(value)) {\r\n const item = kind(codec, 'a')?.i;\r\n return `[${value.map(entry => {\r\n const encoded = encode(entry, item, seen);\r\n if (encoded === undefined) throw new TypeError('Tier0 SDK: UNS v2 arrays cannot contain undefined.');\r\n return encoded;\r\n }).join(',')}]`;\r\n }\r\n const entries: string[] = [];\r\n for (const [name, entry] of Object.entries(value)) {\r\n const encoded = encode(entry, property(codec, name), seen);\r\n if (encoded !== undefined) entries.push(`${JSON.stringify(name)}:${encoded}`);\r\n }\r\n return `{${entries.join(',')}}`;\r\n } finally {\r\n seen.delete(value);\r\n }\r\n}\r\n\r\nexport function encodeUnsV2JSON(value: unknown, schemaName: string): string {\r\n const encoded = encode(value, { r: schemaName }, new Set());\r\n if (encoded === undefined) throw new TypeError('Tier0 SDK: UNS v2 request body is required.');\r\n return encoded;\r\n}\r\n\r\nexport function decodeUnsV2JSON(text: string, schemaName: string): unknown {\r\n return decode(new JSONParser(text).parse(), { r: schemaName });\r\n}\r\n"]}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { type ClientConfig } from '../openapi/client.js';
|
|
2
|
+
import type { CloudTransportConfig } from '../cloud-transport.js';
|
|
3
|
+
import { type UnsV2Client } from './client.js';
|
|
4
|
+
import { type UnsV2Operations, type UnsV2OperationName } from './generated.js';
|
|
5
|
+
export type UnsDataOperationName = Exclude<UnsV2OperationName, `source${string}` | `stream${string}` | `control${string}`>;
|
|
6
|
+
export type UnsDataClient = Readonly<Pick<UnsV2Operations, UnsDataOperationName>>;
|
|
7
|
+
/** Excludes Source, Stream and Control management from the application data facade. */
|
|
8
|
+
export declare function bindUnsDataClient(raw: UnsV2Client): UnsDataClient;
|
|
9
|
+
export type UnsDataClientConfig = ClientConfig & CloudTransportConfig;
|
|
10
|
+
export declare function createUnsDataClient(config?: UnsDataClientConfig): UnsDataClient;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { HttpClient } from '../openapi/client.js';
|
|
2
|
+
import { createUnsV2Client } from './client.js';
|
|
3
|
+
import { UNS_V2_OPERATIONS } from './generated.js';
|
|
4
|
+
/** Excludes Source, Stream and Control management from the application data facade. */
|
|
5
|
+
export function bindUnsDataClient(raw) {
|
|
6
|
+
return Object.freeze(Object.fromEntries(Object.keys(UNS_V2_OPERATIONS)
|
|
7
|
+
.filter(name => !/^(source|stream|control)/.test(name))
|
|
8
|
+
.map(name => [name, raw[name]])));
|
|
9
|
+
}
|
|
10
|
+
export function createUnsDataClient(config = {}) {
|
|
11
|
+
const http = new HttpClient(config);
|
|
12
|
+
return bindUnsDataClient(createUnsV2Client(() => http, config));
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=data-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"data-client.js","sourceRoot":"","sources":["../../../src/uns-v2/data-client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAqB,MAAM,sBAAsB,CAAC;AAErE,OAAO,EAAE,iBAAiB,EAAoB,MAAM,aAAa,CAAC;AAClE,OAAO,EAAE,iBAAiB,EAAiD,MAAM,gBAAgB,CAAC;AAIlG,uFAAuF;AACvF,MAAM,UAAU,iBAAiB,CAAC,GAAgB;IAChD,OAAO,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,WAAW,CACrC,MAAM,CAAC,IAAI,CAAC,iBAAiB,CAAC;SAC3B,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,0BAA0B,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;SACtD,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,GAAG,CAAC,IAA0B,CAAC,CAAC,CAAC,CACxD,CAAkB,CAAC;AACtB,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,SAA8B,EAAE;IAClE,MAAM,IAAI,GAAG,IAAI,UAAU,CAAC,MAAM,CAAC,CAAC;IACpC,OAAO,iBAAiB,CAAC,iBAAiB,CAAC,GAAG,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;AAClE,CAAC","sourcesContent":["import { HttpClient, type ClientConfig } from '../openapi/client.js';\nimport type { CloudTransportConfig } from '../cloud-transport.js';\nimport { createUnsV2Client, type UnsV2Client } from './client.js';\nimport { UNS_V2_OPERATIONS, type UnsV2Operations, type UnsV2OperationName } from './generated.js';\n\nexport type UnsDataOperationName = Exclude<UnsV2OperationName, `source${string}` | `stream${string}` | `control${string}`>;\nexport type UnsDataClient = Readonly<Pick<UnsV2Operations, UnsDataOperationName>>;\n/** Excludes Source, Stream and Control management from the application data facade. */\nexport function bindUnsDataClient(raw: UnsV2Client): UnsDataClient {\n return Object.freeze(Object.fromEntries(\n Object.keys(UNS_V2_OPERATIONS)\n .filter(name => !/^(source|stream|control)/.test(name))\n .map(name => [name, raw[name as UnsV2OperationName]]),\n )) as UnsDataClient;\n}\nexport type UnsDataClientConfig = ClientConfig & CloudTransportConfig;\nexport function createUnsDataClient(config: UnsDataClientConfig = {}): UnsDataClient {\n const http = new HttpClient(config);\n return bindUnsDataClient(createUnsV2Client(() => http, config));\n}\n"]}
|