@settlemint/dalp-sdk 3.0.7-main.29020424106 → 3.0.7-main.29021909053

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.
@@ -1 +1 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAqBA,OAAO,KAAK,EAAE,UAAU,EAAyB,gBAAgB,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AAmB9G;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,gBAAgB,GAAG,sBAAsB,GAAG,UAAU,CAyG9F"}
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAqBA,OAAO,KAAK,EAAE,UAAU,EAAyB,gBAAgB,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AAmB9G;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,gBAAgB,GAAG,sBAAsB,GAAG,UAAU,CAyH9F"}
package/dist/index.js CHANGED
@@ -42781,8 +42781,25 @@ for (const entry of ENTRIES_LIST) {
42781
42781
  ORPC_CODE_TO_ENTRY.set(entry.orpcCode, entry);
42782
42782
  }
42783
42783
  }
42784
+ function lookupEntryByOrpcCode(orpcCode) {
42785
+ return ORPC_CODE_TO_ENTRY.get(orpcCode);
42786
+ }
42784
42787
  // ../../packages/dalp/errors/src/status.ts
42785
42788
  import { COMMON_ERROR_STATUS_MAP } from "@orpc/client";
42789
+ var DEFAULT_ERROR_STATUS = 500;
42790
+ function resolveStatusFromData(data, entriesIndex) {
42791
+ if (!isPlainObject(data)) {
42792
+ return;
42793
+ }
42794
+ const id = typeof data.id === "string" ? data.id : undefined;
42795
+ const dalpCode = typeof data.dalpCode === "string" ? data.dalpCode : undefined;
42796
+ const entry = (id ? entriesIndex?.[id] : undefined) ?? (dalpCode ? entriesIndex?.[dalpCode] : undefined);
42797
+ return entry?.status;
42798
+ }
42799
+ function resolveDalpOrpcErrorStatus(error, entriesIndex) {
42800
+ const catalog = entriesIndex ?? ENTRIES_INDEX;
42801
+ return resolveStatusFromData(error.data, catalog) ?? lookupEntryByOrpcCode(error.code)?.status ?? COMMON_ERROR_STATUS_MAP[error.code] ?? DEFAULT_ERROR_STATUS;
42802
+ }
42786
42803
  // ../../packages/dalp/errors/src/lookup/contract-arg-mapping.ts
42787
42804
  function interpolateTemplate(template, args) {
42788
42805
  let result = template;
@@ -94388,7 +94405,7 @@ var v2Contract2 = {
94388
94405
  // ../../packages/dalp/api-contract/src/contract.ts
94389
94406
  var rpcContract = v2Contract2;
94390
94407
  // src/sdk-error.ts
94391
- import { ORPCError as ORPCError6 } from "@orpc/client";
94408
+ import { COMMON_ERROR_STATUS_MAP as COMMON_ERROR_STATUS_MAP2, ORPCError as ORPCError6 } from "@orpc/client";
94392
94409
  var DALP_SDK_ERROR_CODE = "DALP_SDK_ERROR";
94393
94410
  var DALP_SDK_ERROR_CATEGORY = "sdk.configuration";
94394
94411
 
@@ -94509,12 +94526,75 @@ function createDalpSdkErrorFromDapiPublicError(error, cause, retryAfterSeconds)
94509
94526
  cause
94510
94527
  });
94511
94528
  }
94512
- function decodeDapiErrorResponseBody(body) {
94529
+ function decodeDapiErrorResponseBody(body, response) {
94513
94530
  const parsed = readDalpOrpcError(body);
94514
- if (!parsed) {
94531
+ if (parsed) {
94532
+ return createDalpSdkErrorFromOrpcJson(parsed, undefined, readRetryAfterSecondsFromBody(body, parsed));
94533
+ }
94534
+ return decodePlainOrpcErrorResponseBody(body, response);
94535
+ }
94536
+ function decodePlainOrpcErrorResponseBody(body, response) {
94537
+ if (!isRecord4(body)) {
94538
+ return null;
94539
+ }
94540
+ const code2 = typeof body.code === "string" && body.code.length > 0 ? body.code : undefined;
94541
+ if (!code2) {
94542
+ return null;
94543
+ }
94544
+ const wireStatus = typeof body.status === "number" && Number.isFinite(body.status) ? body.status : undefined;
94545
+ const httpStatus = typeof response?.status === "number" && Number.isFinite(response.status) && response.status >= 400 ? response.status : undefined;
94546
+ const status6 = wireStatus ?? httpStatus ?? COMMON_ERROR_STATUS_MAP2[code2] ?? 500;
94547
+ const message = typeof body.message === "string" && body.message.length > 0 ? body.message : code2;
94548
+ const retryable = typeof body.retryable === "boolean" ? body.retryable : status6 === 429 || status6 >= 500;
94549
+ return new DalpSdkError({
94550
+ code: code2,
94551
+ category: "unknown",
94552
+ status: status6,
94553
+ retryable,
94554
+ message,
94555
+ why: "",
94556
+ fix: "",
94557
+ orpcData: isRecord4(body.data) ? body.data : undefined
94558
+ });
94559
+ }
94560
+ function reattachDalpErrorStatus(error) {
94561
+ if (error instanceof DalpSdkError && error.status !== undefined) {
94562
+ return error;
94563
+ }
94564
+ const orpcJson = toReconcilableOrpcErrorJson(error);
94565
+ if (!orpcJson) {
94566
+ return error;
94567
+ }
94568
+ const status6 = resolveDalpOrpcErrorStatus({ code: orpcJson.code, data: orpcJson.data });
94569
+ const rebuilt = decodeDapiErrorResponseBody({ ...orpcJson, status: status6 });
94570
+ if (!rebuilt) {
94571
+ return error;
94572
+ }
94573
+ if (rebuilt.cause === undefined && error.cause !== undefined) {
94574
+ rebuilt.cause = error.cause;
94575
+ }
94576
+ return rebuilt;
94577
+ }
94578
+ function toReconcilableOrpcErrorJson(error) {
94579
+ if (error instanceof ORPCError6) {
94580
+ return error.toJSON();
94581
+ }
94582
+ return findOrpcErrorJson(error, 0);
94583
+ }
94584
+ function findOrpcErrorJson(value2, depth) {
94585
+ if (!isRecord4(value2) || depth > 4) {
94515
94586
  return null;
94516
94587
  }
94517
- return createDalpSdkErrorFromOrpcJson(parsed, undefined, readRetryAfterSecondsFromBody(body, parsed));
94588
+ if (typeof value2.code === "string" && value2.code.length > 0 && typeof value2.message === "string") {
94589
+ return value2;
94590
+ }
94591
+ for (const key of ["data", "cause", "error"]) {
94592
+ const found = findOrpcErrorJson(value2[key], depth + 1);
94593
+ if (found) {
94594
+ return found;
94595
+ }
94596
+ }
94597
+ return null;
94518
94598
  }
94519
94599
  function readRetryAfterSecondsFromBody(body, parsed) {
94520
94600
  if (parsed) {
@@ -94670,7 +94750,7 @@ function normalizeDalpBaseUrl(url) {
94670
94750
  // package.json
94671
94751
  var package_default = {
94672
94752
  name: "@settlemint/dalp-sdk",
94673
- version: "3.0.7-main.29020424106",
94753
+ version: "3.0.7-main.29021909053",
94674
94754
  private: false,
94675
94755
  description: "Fully typed SDK for the DALP tokenization platform API",
94676
94756
  homepage: "https://settlemint.com",
@@ -94841,7 +94921,28 @@ function createDalpClient(config3) {
94841
94921
  customErrorResponseBodyDecoder: decodeDapiErrorResponseBody,
94842
94922
  fetch: wrappedFetch
94843
94923
  });
94844
- return createORPCClient(link);
94924
+ return createORPCClient(link, {
94925
+ interceptors: [
94926
+ async ({ next }) => {
94927
+ try {
94928
+ const result = await next();
94929
+ return isAsyncIterable(result) ? reattachStatusToStream(result) : result;
94930
+ } catch (error) {
94931
+ throw reattachDalpErrorStatus(error);
94932
+ }
94933
+ }
94934
+ ]
94935
+ });
94936
+ }
94937
+ function isAsyncIterable(value2) {
94938
+ return value2 !== null && typeof value2 === "object" && typeof value2[Symbol.asyncIterator] === "function";
94939
+ }
94940
+ async function* reattachStatusToStream(source) {
94941
+ try {
94942
+ yield* source;
94943
+ } catch (error) {
94944
+ throw reattachDalpErrorStatus(error);
94945
+ }
94845
94946
  }
94846
94947
  // src/bundler.ts
94847
94948
  var BUNDLER_ENDPOINT_PATH = "/api/v2/bundler";
@@ -69,7 +69,23 @@ export declare class DalpSdkError extends ORPCError<string, DapiPublicError | un
69
69
  export declare function createDalpSdkConfigurationError(input: DalpSdkConfigurationErrorInput): DalpSdkError;
70
70
  export declare function createDalpSdkErrorFromOrpcJson(parsed: DalpOrpcErrorJson, cause?: unknown, retryAfterSeconds?: number): DalpSdkError;
71
71
  export declare function createDalpSdkErrorFromDapiPublicError(error: DapiPublicError, cause?: unknown, retryAfterSeconds?: number): DalpSdkError;
72
- export declare function decodeDapiErrorResponseBody(body: unknown): DalpSdkError | null;
72
+ export declare function decodeDapiErrorResponseBody(body: unknown, response?: {
73
+ status?: number;
74
+ }): DalpSdkError | null;
75
+ /**
76
+ * Re-attach `status` to a thrown client error at the outermost boundary.
77
+ *
78
+ * oRPC v2 removed `status` from `ORPCError`, and the always-on
79
+ * `ResponseValidationLinkPlugin` runs `reconcileORPCError`, which re-clones any
80
+ * contract-mapped error (`FORBIDDEN`, `NOT_FOUND`, `UNAUTHORIZED`, `CONFLICT`,
81
+ * every DALP code) into a base `ORPCError` — dropping the `status` (and subtype)
82
+ * that {@link decodeDapiErrorResponseBody} attached during response decode. This
83
+ * runs as a client-level interceptor (outside the link plugins), so it sees the
84
+ * final reconciled error and rebuilds a {@link DalpSdkError} whose `status` is
85
+ * derived from the catalog exactly as the server derives it. Non-`ORPCError`
86
+ * throws and already-complete `DalpSdkError`s pass through untouched.
87
+ */
88
+ export declare function reattachDalpErrorStatus(error: unknown): unknown;
73
89
  export declare function getDapiPublicErrorFromResponseBody(body: unknown): DapiPublicError | undefined;
74
90
  export declare function isDapiPublicError(value: unknown): value is DapiPublicError;
75
91
  export {};
@@ -1 +1 @@
1
- {"version":3,"file":"sdk-error.d.ts","sourceRoot":"","sources":["../src/sdk-error.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"sdk-error.d.ts","sourceRoot":"","sources":["../src/sdk-error.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@settlemint/dalp-sdk",
3
- "version": "3.0.7-main.29020424106",
3
+ "version": "3.0.7-main.29021909053",
4
4
  "private": false,
5
5
  "description": "Fully typed SDK for the DALP tokenization platform API",
6
6
  "homepage": "https://settlemint.com",