@polyester/sdk 0.26.1 → 0.27.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.
Files changed (86) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/dist/gen/auth/v1/auth_pb.d.ts +30 -21
  3. package/dist/gen/auth/v1/auth_pb.d.ts.map +1 -1
  4. package/dist/gen/auth/v1/auth_pb.js +25 -8
  5. package/dist/gen/auth/v1/auth_pb.js.map +1 -1
  6. package/dist/gen/auth/v1/mfa_pb.js +1 -1
  7. package/dist/gen/auth/v1/mfa_pb.js.map +1 -1
  8. package/dist/gen/auth/v1/profile_pb.d.ts +2 -2
  9. package/dist/gen/auth/v1/profile_pb.d.ts.map +1 -1
  10. package/dist/gen/auth/v1/profile_pb.js +2 -1
  11. package/dist/gen/auth/v1/profile_pb.js.map +1 -1
  12. package/dist/gen/auth/v1/resolve_pb.d.ts.map +1 -1
  13. package/dist/gen/auth/v1/resolve_pb.js +2 -1
  14. package/dist/gen/auth/v1/resolve_pb.js.map +1 -1
  15. package/dist/gen/auth/v1/social_verification_pb.d.ts +3 -0
  16. package/dist/gen/auth/v1/social_verification_pb.d.ts.map +1 -1
  17. package/dist/gen/auth/v1/social_verification_pb.js +2 -1
  18. package/dist/gen/auth/v1/social_verification_pb.js.map +1 -1
  19. package/dist/gen/auth/v1/subaccounts_pb.d.ts +90 -10
  20. package/dist/gen/auth/v1/subaccounts_pb.d.ts.map +1 -1
  21. package/dist/gen/auth/v1/subaccounts_pb.js +40 -28
  22. package/dist/gen/auth/v1/subaccounts_pb.js.map +1 -1
  23. package/dist/gen/claims/v1/claims_pb.d.ts +108 -2
  24. package/dist/gen/claims/v1/claims_pb.d.ts.map +1 -1
  25. package/dist/gen/claims/v1/claims_pb.js +109 -11
  26. package/dist/gen/claims/v1/claims_pb.js.map +1 -1
  27. package/dist/gen/index.d.ts +1 -1
  28. package/dist/gen/index.js +1 -1
  29. package/dist/gen/ledger/read/v1/ledger_read_pb.d.ts.map +1 -1
  30. package/dist/gen/ledger/read/v1/ledger_read_pb.js +6 -1
  31. package/dist/gen/ledger/read/v1/ledger_read_pb.js.map +1 -1
  32. package/dist/gen/orderbook/v1/orderbook_pb.d.ts +1 -1
  33. package/dist/gen/orderbook/v1/orderbook_pb.js.map +1 -1
  34. package/dist/gen/orders/v1/orders_read_pb.d.ts +10 -0
  35. package/dist/gen/orders/v1/orders_read_pb.d.ts.map +1 -1
  36. package/dist/gen/orders/v1/orders_read_pb.js +1 -1
  37. package/dist/gen/orders/v1/orders_read_pb.js.map +1 -1
  38. package/dist/gen/polyester/api/options_pb.d.ts +39 -2
  39. package/dist/gen/polyester/api/options_pb.d.ts.map +1 -1
  40. package/dist/gen/polyester/api/options_pb.js +43 -2
  41. package/dist/gen/polyester/api/options_pb.js.map +1 -1
  42. package/dist/index.d.ts +4 -4
  43. package/dist/index.js +2 -2
  44. package/dist/services/auth/account-signer-auth.d.ts +10 -3
  45. package/dist/services/auth/account-signer-auth.d.ts.map +1 -1
  46. package/dist/services/auth/account-signer-auth.js +14 -12
  47. package/dist/services/auth/account-signer-auth.js.map +1 -1
  48. package/dist/services/auth/auth.d.ts +3 -4
  49. package/dist/services/auth/auth.d.ts.map +1 -1
  50. package/dist/services/auth/auth.js +4 -6
  51. package/dist/services/auth/auth.js.map +1 -1
  52. package/dist/services/auth/auth.types.d.ts +2 -2
  53. package/dist/services/candles/candles.schemas.d.ts +10 -10
  54. package/dist/services/claims/claims.js +1 -1
  55. package/dist/services/heatmap/heatmap.schemas.d.ts +9 -9
  56. package/dist/services/lifecycle/lifecycle.schemas.d.ts +42 -42
  57. package/dist/services/market-overview/market-overview.schemas.d.ts +3 -3
  58. package/dist/services/orders/orders-output.schemas.d.ts +12 -6
  59. package/dist/services/orders/orders-output.schemas.d.ts.map +1 -1
  60. package/dist/services/orders/orders-output.schemas.js +2 -0
  61. package/dist/services/orders/orders-output.schemas.js.map +1 -1
  62. package/dist/services/subaccounts/index.d.ts +2 -2
  63. package/dist/services/subaccounts/subaccounts.d.ts +9 -3
  64. package/dist/services/subaccounts/subaccounts.d.ts.map +1 -1
  65. package/dist/services/subaccounts/subaccounts.js +13 -3
  66. package/dist/services/subaccounts/subaccounts.js.map +1 -1
  67. package/dist/services/subaccounts/subaccounts.schemas.d.ts +25 -6
  68. package/dist/services/subaccounts/subaccounts.schemas.d.ts.map +1 -1
  69. package/dist/services/subaccounts/subaccounts.schemas.js +13 -2
  70. package/dist/services/subaccounts/subaccounts.schemas.js.map +1 -1
  71. package/dist/services/subaccounts/subaccounts.types.d.ts +2 -2
  72. package/dist/services/triggers/trigger-input.schemas.d.ts +1 -1
  73. package/dist/services/triggers/triggers-output.schemas.d.ts +15 -15
  74. package/dist/shared/connect-error-mapping.d.ts.map +1 -1
  75. package/dist/shared/connect-error-mapping.js +6 -4
  76. package/dist/shared/connect-error-mapping.js.map +1 -1
  77. package/dist/shared/error-detail.d.ts +12 -8
  78. package/dist/shared/error-detail.d.ts.map +1 -1
  79. package/dist/shared/error-detail.js +30 -19
  80. package/dist/shared/error-detail.js.map +1 -1
  81. package/dist/shared/errors.d.ts +10 -1
  82. package/dist/shared/errors.d.ts.map +1 -1
  83. package/dist/shared/errors.js +12 -1
  84. package/dist/shared/errors.js.map +1 -1
  85. package/dist/wired-services.js +1 -1
  86. package/package.json +1 -1
@@ -29,62 +29,62 @@ declare const CreateTriggerResultSchema: v.SchemaWithPipe<readonly [v.ObjectSche
29
29
  type CreateTriggerResult = v.InferOutput<typeof CreateTriggerResultSchema>;
30
30
  declare const CancelTriggerResultSchema: v.SchemaWithPipe<readonly [v.ObjectSchema<{
31
31
  readonly triggerId: v.SchemaWithPipe<readonly [v.BigintSchema<undefined>, v.TransformAction<bigint, string>]>;
32
- readonly status: v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.TransformAction<number, "unspecified" | "failed" | "cancelled" | "created" | "completed" | "armed" | "running" | "paused">]>;
32
+ readonly status: v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.TransformAction<number, "unspecified" | "completed" | "failed" | "cancelled" | "created" | "armed" | "running" | "paused">]>;
33
33
  readonly tsNs: v.BigintSchema<undefined>;
34
34
  }, undefined>, v.TransformAction<{
35
35
  triggerId: string;
36
- status: "unspecified" | "failed" | "cancelled" | "created" | "completed" | "armed" | "running" | "paused";
36
+ status: "unspecified" | "completed" | "failed" | "cancelled" | "created" | "armed" | "running" | "paused";
37
37
  tsNs: bigint;
38
38
  }, {
39
39
  ts: number;
40
40
  tsNs: string;
41
41
  triggerId: string;
42
- status: "unspecified" | "failed" | "cancelled" | "created" | "completed" | "armed" | "running" | "paused";
42
+ status: "unspecified" | "completed" | "failed" | "cancelled" | "created" | "armed" | "running" | "paused";
43
43
  }>]>;
44
44
  type CancelTriggerResult = v.InferOutput<typeof CancelTriggerResultSchema>;
45
45
  declare const ModifyTriggerResultSchema: v.SchemaWithPipe<readonly [v.ObjectSchema<{
46
46
  readonly triggerId: v.SchemaWithPipe<readonly [v.BigintSchema<undefined>, v.TransformAction<bigint, string>]>;
47
- readonly status: v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.TransformAction<number, "unspecified" | "failed" | "cancelled" | "created" | "completed" | "armed" | "running" | "paused">]>;
47
+ readonly status: v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.TransformAction<number, "unspecified" | "completed" | "failed" | "cancelled" | "created" | "armed" | "running" | "paused">]>;
48
48
  readonly tsNs: v.BigintSchema<undefined>;
49
49
  }, undefined>, v.TransformAction<{
50
50
  triggerId: string;
51
- status: "unspecified" | "failed" | "cancelled" | "created" | "completed" | "armed" | "running" | "paused";
51
+ status: "unspecified" | "completed" | "failed" | "cancelled" | "created" | "armed" | "running" | "paused";
52
52
  tsNs: bigint;
53
53
  }, {
54
54
  ts: number;
55
55
  tsNs: string;
56
56
  triggerId: string;
57
- status: "unspecified" | "failed" | "cancelled" | "created" | "completed" | "armed" | "running" | "paused";
57
+ status: "unspecified" | "completed" | "failed" | "cancelled" | "created" | "armed" | "running" | "paused";
58
58
  }>]>;
59
59
  type ModifyTriggerResult = v.InferOutput<typeof ModifyTriggerResultSchema>;
60
60
  declare const PauseTriggerResultSchema: v.SchemaWithPipe<readonly [v.ObjectSchema<{
61
61
  readonly triggerId: v.SchemaWithPipe<readonly [v.BigintSchema<undefined>, v.TransformAction<bigint, string>]>;
62
- readonly status: v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.TransformAction<number, "unspecified" | "failed" | "cancelled" | "created" | "completed" | "armed" | "running" | "paused">]>;
62
+ readonly status: v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.TransformAction<number, "unspecified" | "completed" | "failed" | "cancelled" | "created" | "armed" | "running" | "paused">]>;
63
63
  readonly tsNs: v.BigintSchema<undefined>;
64
64
  }, undefined>, v.TransformAction<{
65
65
  triggerId: string;
66
- status: "unspecified" | "failed" | "cancelled" | "created" | "completed" | "armed" | "running" | "paused";
66
+ status: "unspecified" | "completed" | "failed" | "cancelled" | "created" | "armed" | "running" | "paused";
67
67
  tsNs: bigint;
68
68
  }, {
69
69
  ts: number;
70
70
  tsNs: string;
71
71
  triggerId: string;
72
- status: "unspecified" | "failed" | "cancelled" | "created" | "completed" | "armed" | "running" | "paused";
72
+ status: "unspecified" | "completed" | "failed" | "cancelled" | "created" | "armed" | "running" | "paused";
73
73
  }>]>;
74
74
  type PauseTriggerResult = v.InferOutput<typeof PauseTriggerResultSchema>;
75
75
  declare const ResumeTriggerResultSchema: v.SchemaWithPipe<readonly [v.ObjectSchema<{
76
76
  readonly triggerId: v.SchemaWithPipe<readonly [v.BigintSchema<undefined>, v.TransformAction<bigint, string>]>;
77
- readonly status: v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.TransformAction<number, "unspecified" | "failed" | "cancelled" | "created" | "completed" | "armed" | "running" | "paused">]>;
77
+ readonly status: v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.TransformAction<number, "unspecified" | "completed" | "failed" | "cancelled" | "created" | "armed" | "running" | "paused">]>;
78
78
  readonly tsNs: v.BigintSchema<undefined>;
79
79
  }, undefined>, v.TransformAction<{
80
80
  triggerId: string;
81
- status: "unspecified" | "failed" | "cancelled" | "created" | "completed" | "armed" | "running" | "paused";
81
+ status: "unspecified" | "completed" | "failed" | "cancelled" | "created" | "armed" | "running" | "paused";
82
82
  tsNs: bigint;
83
83
  }, {
84
84
  ts: number;
85
85
  tsNs: string;
86
86
  triggerId: string;
87
- status: "unspecified" | "failed" | "cancelled" | "created" | "completed" | "armed" | "running" | "paused";
87
+ status: "unspecified" | "completed" | "failed" | "cancelled" | "created" | "armed" | "running" | "paused";
88
88
  }>]>;
89
89
  type ResumeTriggerResult = v.InferOutput<typeof ResumeTriggerResultSchema>;
90
90
  type StopDetailsOutput = {
@@ -556,7 +556,7 @@ declare function createTriggerSchema(scales: SdkScales): v.SchemaWithPipe<readon
556
556
  triggerId: string;
557
557
  subaccountId: string;
558
558
  symbolId: number;
559
- status: "unspecified" | "failed" | "cancelled" | "created" | "completed" | "armed" | "running" | "paused";
559
+ status: "unspecified" | "completed" | "failed" | "cancelled" | "created" | "armed" | "running" | "paused";
560
560
  parentOrderId: string | undefined;
561
561
  qty: string;
562
562
  feeAsset: "unspecified" | "quote" | "base";
@@ -712,7 +712,7 @@ declare function createTriggerSchema(scales: SdkScales): v.SchemaWithPipe<readon
712
712
  triggerId: string;
713
713
  subaccountId: string;
714
714
  symbolId: number;
715
- status: "unspecified" | "failed" | "cancelled" | "created" | "completed" | "armed" | "running" | "paused";
715
+ status: "unspecified" | "completed" | "failed" | "cancelled" | "created" | "armed" | "running" | "paused";
716
716
  parentOrderId: string | undefined;
717
717
  qty: string;
718
718
  feeAsset: "unspecified" | "quote" | "base";
@@ -868,7 +868,7 @@ declare function createTriggerSchema(scales: SdkScales): v.SchemaWithPipe<readon
868
868
  triggerId: string;
869
869
  subaccountId: string;
870
870
  symbolId: number;
871
- status: "unspecified" | "failed" | "cancelled" | "created" | "completed" | "armed" | "running" | "paused";
871
+ status: "unspecified" | "completed" | "failed" | "cancelled" | "created" | "armed" | "running" | "paused";
872
872
  parentOrderId: string | undefined;
873
873
  qty: string;
874
874
  feeAsset: "unspecified" | "quote" | "base";
@@ -1 +1 @@
1
- {"version":3,"file":"connect-error-mapping.d.ts","names":[],"sources":["../../src/shared/connect-error-mapping.ts"],"mappings":";;;;;;;iBA+HgB,6BAA6B,IAAI,eAAe;;;;;;iBAsJhD,iBAAiB;;;;;;iBA0CjB,iCAAiC"}
1
+ {"version":3,"file":"connect-error-mapping.d.ts","names":[],"sources":["../../src/shared/connect-error-mapping.ts"],"mappings":";;;;;;;iBAmIgB,6BAA6B,IAAI,eAAe;;;;;;iBA6JhD,iBAAiB;;;;;;iBA0CjB,iCAAiC"}
@@ -1,8 +1,8 @@
1
- import { AlreadyExistsError, AuthenticationError, InternalServerError, MfaEnrollmentRequiredError, MfaLastFactorRequiredError, MfaVerificationError, PermissionError, PolicyInUseError, PolicyLockedError, PolicyScopeMismatchError, PolyesterError, PreconditionFailedError, RateLimitError, ResourceNotFoundError, RevisionConflictError, ServiceUnavailableError, SessionElevationRequiredError, StaleQuoteError, StepUpRequiredError, TimeoutError, TransientError, ValidationError, isAbortError, normalizeErrorMessage } from "./errors.js";
1
+ import { AlreadyExistsError, AuthenticationError, InternalServerError, MfaEnrollmentRequiredError, MfaLastFactorRequiredError, MfaVerificationError, PermissionError, PolicyInUseError, PolicyLockedError, PolicyScopeMismatchError, PolyesterError, PreconditionFailedError, RateLimitError, ResourceNotFoundError, RevisionConflictError, ServiceUnavailableError, SessionElevationRequiredError, StaleQuoteError, StepUpRequiredError, SubaccountChallengeInvalidError, TimeoutError, TransientError, ValidationError, isAbortError, normalizeErrorMessage } from "./errors.js";
2
2
  import { parseConnectErrorDetail } from "./error-detail.js";
3
3
  import { Code, ConnectError } from "@connectrpc/connect";
4
4
  //#region src/shared/connect-error-mapping.ts
5
- function hasTransientTransferError(detail) {
5
+ function hasTransientServiceError(detail) {
6
6
  if (detail?.service === "withdraw") return [
7
7
  "SERVICE_UNAVAILABLE",
8
8
  "SOURCE_SMART_ACCOUNT_UNAVAILABLE",
@@ -21,6 +21,7 @@ function hasTransientTransferError(detail) {
21
21
  "CAPITAL_VIEW_UNAVAILABLE",
22
22
  "ACCOUNT_SHARD_UNAVAILABLE"
23
23
  ].includes(detail.code);
24
+ if (detail?.service === "claims") return ["SERVICE_UNAVAILABLE", "CLAIM_TEMPORARILY_UNAVAILABLE"].includes(detail.code);
24
25
  return false;
25
26
  }
26
27
  function safeRetryAfterMs(rateLimit) {
@@ -77,6 +78,7 @@ function connectErrorToPolyesterError(ce) {
77
78
  const withFallback = (fallback) => message || fallback;
78
79
  if (detail?.service === "auth" && detail.code === "AUTH_RESOURCE_NOT_FOUND") return new ResourceNotFoundError(withFallback("Resource not found."), options);
79
80
  if (detail?.service === "auth" && detail.code === "AUTH_REVISION_CONFLICT") return new RevisionConflictError(withFallback("Resource changed since it was last read."), options);
81
+ if (detail?.service === "auth" && detail.code === "AUTH_SUBACCOUNT_CHALLENGE_INVALID") return new SubaccountChallengeInvalidError(withFallback("Subaccount challenge is expired, replaced, or invalid."), options);
80
82
  if (detail?.service === "auth" && detail.code === "AUTH_POLICY_IN_USE") return new PolicyInUseError(withFallback("Policy is still in use."), options);
81
83
  if (detail?.service === "auth" && detail.code === "AUTH_POLICY_LOCKED") return new PolicyLockedError(withFallback("Policy is locked."), options);
82
84
  if (detail?.service === "auth" && detail.code === "AUTH_POLICY_SCOPE_MISMATCH") return new PolicyScopeMismatchError(withFallback("Policy does not belong to the target account scope."), options);
@@ -88,12 +90,12 @@ function connectErrorToPolyesterError(ce) {
88
90
  if (mfaKind) return new MFA_ERROR_CLASSES[mfaKind](withFallback("Multi-factor authentication required."), options);
89
91
  if (detail?.service === "orders" && detail.code === "STALE_QUOTE") return new StaleQuoteError(withFallback("The submitted market quote is stale."), options);
90
92
  const rateLimit = detail?.service === "orders" ? detail.rateLimit : void 0;
91
- if (rateLimit || (detail?.service === "orders" || detail?.service === "withdraw" || detail?.service === "internal_transfer") && detail.code === "RATE_LIMIT_EXCEEDED") return new RateLimitError(withFallback("Rate limit exceeded."), {
93
+ if (rateLimit || (detail?.service === "orders" || detail?.service === "withdraw" || detail?.service === "internal_transfer" || detail?.service === "claims") && detail.code === "RATE_LIMIT_EXCEEDED") return new RateLimitError(withFallback("Rate limit exceeded."), {
92
94
  ...options,
93
95
  rateLimit,
94
96
  retryAfterMs: safeRetryAfterMs(rateLimit) ?? parseRetryAfterMs(ce)
95
97
  });
96
- if (hasTransientTransferError(detail)) return new ServiceUnavailableError(withFallback("Service unavailable."), options);
98
+ if (hasTransientServiceError(detail)) return new ServiceUnavailableError(withFallback("Service unavailable."), options);
97
99
  switch (ce.code) {
98
100
  case Code.InvalidArgument:
99
101
  case Code.OutOfRange: return new ValidationError(withFallback("Invalid request."), options);
@@ -1 +1 @@
1
- {"version":3,"file":"connect-error-mapping.js","names":[],"sources":["../../src/shared/connect-error-mapping.ts"],"sourcesContent":["import { Code, ConnectError, type Interceptor, type Transport } from \"@connectrpc/connect\";\nimport { parseConnectErrorDetail, type PolyesterErrorDetail } from \"./error-detail.js\";\nimport {\n AlreadyExistsError,\n AuthenticationError,\n InternalServerError,\n isAbortError,\n MfaEnrollmentRequiredError,\n MfaLastFactorRequiredError,\n MfaVerificationError,\n type MfaVerificationFailureReason,\n normalizeErrorMessage,\n PermissionError,\n PolicyInUseError,\n PolicyLockedError,\n PolicyScopeMismatchError,\n PolyesterError,\n type PolyesterErrorOptions,\n PreconditionFailedError,\n RateLimitError,\n ResourceNotFoundError,\n RevisionConflictError,\n ServiceUnavailableError,\n SessionElevationRequiredError,\n StaleQuoteError,\n StepUpRequiredError,\n TimeoutError,\n TransientError,\n ValidationError,\n} from \"./errors.js\";\nimport type { RateLimitDetail } from \"./rate-limit.schemas.js\";\n\nfunction hasTransientTransferError(detail: PolyesterErrorDetail | undefined): boolean {\n if (detail?.service === \"withdraw\") {\n return [\n \"SERVICE_UNAVAILABLE\",\n \"SOURCE_SMART_ACCOUNT_UNAVAILABLE\",\n \"CAPITAL_VIEW_UNAVAILABLE\",\n \"CHAIN_METADATA_UNAVAILABLE\",\n \"FEE_UNAVAILABLE\",\n \"SUPPLY_UNAVAILABLE\",\n \"STEP_UP_UNAVAILABLE\",\n \"DESTINATION_VALIDATION_UNAVAILABLE\",\n \"ACCOUNT_SHARD_UNAVAILABLE\",\n ].includes(detail.code);\n }\n if (detail?.service === \"internal_transfer\") {\n return [\n \"SERVICE_UNAVAILABLE\",\n \"SMART_ACCOUNT_UNAVAILABLE\",\n \"STEP_UP_UNAVAILABLE\",\n \"CAPITAL_VIEW_UNAVAILABLE\",\n \"ACCOUNT_SHARD_UNAVAILABLE\",\n ].includes(detail.code);\n }\n return false;\n}\n\nfunction safeRetryAfterMs(rateLimit: RateLimitDetail | undefined): number | undefined {\n if (rateLimit?.retryAfterMs === undefined) return undefined;\n const value = BigInt(rateLimit.retryAfterMs);\n return value <= BigInt(Number.MAX_SAFE_INTEGER) ? Number(value) : undefined;\n}\n\nconst HTTP_WEEKDAY = \"(?:Mon|Tue|Wed|Thu|Fri|Sat|Sun)\";\nconst HTTP_WEEKDAY_LONG = \"(?:Monday|Tuesday|Wednesday|Thursday|Friday|Saturday|Sunday)\";\nconst HTTP_MONTH = \"(?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\";\nconst HTTP_DATE_RE = new RegExp(\n `^(?:${HTTP_WEEKDAY}, \\\\d{2} ${HTTP_MONTH} \\\\d{4} \\\\d{2}:\\\\d{2}:\\\\d{2} GMT|${HTTP_WEEKDAY_LONG}, \\\\d{2}-${HTTP_MONTH}-\\\\d{2} \\\\d{2}:\\\\d{2}:\\\\d{2} GMT|${HTTP_WEEKDAY} ${HTTP_MONTH} {1,2}\\\\d{1,2} \\\\d{2}:\\\\d{2}:\\\\d{2} \\\\d{4})$`,\n \"u\",\n);\n\n/**\n * Returns the error message without the leading \"[code] \" prefix that\n * `ConnectError` prepends, e.g. \"[invalid_argument] Insufficient funds.\"\n * becomes \"Insufficient funds.\".\n */\nexport function getNormalizedConnectMessage(err: unknown): string {\n const ce = ConnectError.from(err);\n const raw = ce.message ?? \"\";\n return normalizeErrorMessage(raw);\n}\n\nexport type MfaErrorKind = \"session-elevation\" | \"enrollment\" | \"step-up\";\n\n/**\n * Classifies an error as one of the MFA flows the backend can demand.\n * Classification is based only on stable structured auth error details.\n */\nexport function detectMfaErrorKind(err: unknown): MfaErrorKind | null {\n const mapped = toPolyesterError(err);\n return mfaErrorKind(mapped instanceof PolyesterError ? mapped.detail : undefined);\n}\n\nfunction mfaErrorKind(detail: PolyesterErrorDetail | undefined): MfaErrorKind | null {\n if (detail?.service === \"auth\" && detail.code === \"AUTH_MFA_ELEVATION_REQUIRED\") {\n return \"session-elevation\";\n }\n if (detail?.service === \"auth\" && detail.code === \"AUTH_STEP_UP_REQUIRED\") return \"step-up\";\n if (detail?.service === \"auth\" && detail.code === \"AUTH_MFA_NOT_ENROLLED\") return \"enrollment\";\n return null;\n}\n\nfunction parseRetryAfterMs(ce: ConnectError): number | undefined {\n const value = ce.metadata.get(\"retry-after\");\n if (!value) return undefined;\n if (/^\\d+$/u.test(value)) {\n const seconds = BigInt(value);\n const maxSafeSeconds = BigInt(Math.floor(Number.MAX_SAFE_INTEGER / 1000));\n return seconds <= maxSafeSeconds ? Number(seconds) * 1000 : undefined;\n }\n if (!HTTP_DATE_RE.test(value)) return undefined;\n const date = Date.parse(value);\n if (!Number.isNaN(date)) return Math.max(0, date - Date.now());\n return undefined;\n}\n\nconst MFA_ERROR_CLASSES = {\n \"session-elevation\": SessionElevationRequiredError,\n enrollment: MfaEnrollmentRequiredError,\n \"step-up\": StepUpRequiredError,\n} as const;\n\n/**\n * Maps a `ConnectError` from the Polyester backend onto the typed\n * {@link PolyesterError} tree. The original error is preserved as `cause`.\n */\nexport function connectErrorToPolyesterError(ce: ConnectError): PolyesterError {\n const message = getNormalizedConnectMessage(ce);\n const detail = parseConnectErrorDetail(ce);\n const options: PolyesterErrorOptions = { cause: ce, detail };\n const withFallback = (fallback: string) => message || fallback;\n\n if (detail?.service === \"auth\" && detail.code === \"AUTH_RESOURCE_NOT_FOUND\") {\n return new ResourceNotFoundError(withFallback(\"Resource not found.\"), options);\n }\n\n if (detail?.service === \"auth\" && detail.code === \"AUTH_REVISION_CONFLICT\") {\n return new RevisionConflictError(\n withFallback(\"Resource changed since it was last read.\"),\n options,\n );\n }\n\n if (detail?.service === \"auth\" && detail.code === \"AUTH_POLICY_IN_USE\") {\n return new PolicyInUseError(withFallback(\"Policy is still in use.\"), options);\n }\n if (detail?.service === \"auth\" && detail.code === \"AUTH_POLICY_LOCKED\") {\n return new PolicyLockedError(withFallback(\"Policy is locked.\"), options);\n }\n if (detail?.service === \"auth\" && detail.code === \"AUTH_POLICY_SCOPE_MISMATCH\") {\n return new PolicyScopeMismatchError(\n withFallback(\"Policy does not belong to the target account scope.\"),\n options,\n );\n }\n if (detail?.service === \"auth\" && detail.code === \"AUTH_MFA_LAST_FACTOR_REQUIRED\") {\n return new MfaLastFactorRequiredError(\n withFallback(\"At least one active MFA factor must remain enrolled.\"),\n options,\n );\n }\n if (detail?.service === \"auth\" && detail.code === \"AUTH_INTERNAL_ERROR\") {\n return new InternalServerError(withFallback(\"Internal server error.\"), options);\n }\n\n const mfaVerificationReason = getMfaVerificationFailureReason(detail);\n if (mfaVerificationReason) {\n return new MfaVerificationError(\n withFallback(\"MFA verification failed.\"),\n mfaVerificationReason,\n options,\n );\n }\n\n const mfaKind = mfaErrorKind(detail);\n if (mfaKind) {\n return new MFA_ERROR_CLASSES[mfaKind](\n withFallback(\"Multi-factor authentication required.\"),\n options,\n );\n }\n\n if (detail?.service === \"orders\" && detail.code === \"STALE_QUOTE\") {\n return new StaleQuoteError(withFallback(\"The submitted market quote is stale.\"), options);\n }\n\n const rateLimit = detail?.service === \"orders\" ? detail.rateLimit : undefined;\n if (\n rateLimit ||\n ((detail?.service === \"orders\" ||\n detail?.service === \"withdraw\" ||\n detail?.service === \"internal_transfer\") &&\n detail.code === \"RATE_LIMIT_EXCEEDED\")\n ) {\n return new RateLimitError(withFallback(\"Rate limit exceeded.\"), {\n ...options,\n rateLimit,\n retryAfterMs: safeRetryAfterMs(rateLimit) ?? parseRetryAfterMs(ce),\n });\n }\n\n if (hasTransientTransferError(detail)) {\n return new ServiceUnavailableError(withFallback(\"Service unavailable.\"), options);\n }\n\n switch (ce.code) {\n case Code.InvalidArgument:\n case Code.OutOfRange:\n return new ValidationError(withFallback(\"Invalid request.\"), options);\n case Code.NotFound:\n return new ResourceNotFoundError(withFallback(\"Resource not found.\"), options);\n case Code.AlreadyExists:\n return new AlreadyExistsError(withFallback(\"Resource already exists.\"), options);\n case Code.PermissionDenied:\n return new PermissionError(withFallback(\"Permission denied.\"), options);\n case Code.Unauthenticated:\n return new AuthenticationError(withFallback(\"Authentication required.\"), options);\n case Code.FailedPrecondition:\n return new PreconditionFailedError(withFallback(\"Precondition failed.\"), options);\n case Code.ResourceExhausted:\n return new RateLimitError(withFallback(\"Rate limit exceeded.\"), {\n ...options,\n retryAfterMs: parseRetryAfterMs(ce),\n });\n case Code.DeadlineExceeded:\n return new TimeoutError(withFallback(\"Request timed out.\"), options);\n case Code.Unavailable:\n return new ServiceUnavailableError(withFallback(\"Service unavailable.\"), options);\n case Code.Aborted:\n return new TransientError(withFallback(\"Operation aborted by the backend.\"), options);\n default:\n // Gateways sometimes surface outages as Unknown with this stock phrase.\n if (/service temporarily unavailable/i.test(message)) {\n return new ServiceUnavailableError(withFallback(\"Service unavailable.\"), options);\n }\n return new InternalServerError(withFallback(\"Internal server error.\"), options);\n }\n}\n\nfunction getMfaVerificationFailureReason(\n detail: PolyesterErrorDetail | undefined,\n): MfaVerificationFailureReason | null {\n if (detail?.service === \"auth\" && detail.code === \"AUTH_MFA_CHALLENGE_INVALID\") {\n return \"challenge-invalid\";\n }\n if (detail?.service === \"auth\" && detail.code === \"AUTH_MFA_CHALLENGE_LOCKED\") {\n return \"challenge-locked\";\n }\n if (detail?.service === \"auth\" && detail.code === \"AUTH_MFA_OTP_INVALID\") return \"otp-invalid\";\n if (detail?.service === \"auth\" && detail.code === \"AUTH_MFA_RECOVERY_INVALID\") {\n return \"recovery-code-invalid\";\n }\n if (\n (detail?.service === \"auth\" && detail.code === \"AUTH_MFA_PASSKEY_CREDENTIAL_INVALID\") ||\n (detail?.service === \"auth\" && detail.code === \"AUTH_MFA_PASSKEY_VERIFY_FAILED\")\n ) {\n return \"passkey-invalid\";\n }\n\n return null;\n}\n\nfunction findPolyesterErrorInCauseChain(err: unknown): PolyesterError | null {\n let current: unknown = err;\n for (let depth = 0; depth < 5 && current instanceof Error; depth++) {\n current = current.cause;\n if (current instanceof PolyesterError) return current;\n }\n return null;\n}\n\n/**\n * Converts any RPC-layer failure into its typed SDK error. Abort errors and\n * caller-cancelled requests pass through unchanged, as do errors that are\n * already typed (e.g. a `NetworkError` from the SDK fetch wrapper).\n */\nexport function toPolyesterError(err: unknown): unknown {\n if (err instanceof PolyesterError) return err;\n if (isAbortError(err)) return err;\n if (err instanceof ConnectError) {\n if (err.code === Code.Canceled) return err;\n const wrapped = findPolyesterErrorInCauseChain(err);\n if (wrapped) return wrapped;\n return connectErrorToPolyesterError(err);\n }\n return err;\n}\n\nfunction callerAbortError(signal: AbortSignal): DOMException {\n const reason: unknown = signal.reason;\n return reason instanceof DOMException && reason.name === \"AbortError\"\n ? reason\n : new DOMException(\"Request canceled.\", \"AbortError\");\n}\n\nfunction toTransportError(err: unknown, signal?: AbortSignal): unknown {\n if (signal?.aborted && err instanceof ConnectError && err.code === Code.Canceled) {\n return callerAbortError(signal);\n }\n return toPolyesterError(err);\n}\n\nasync function* mapStreamErrors<T>(\n source: AsyncIterable<T>,\n signal?: AbortSignal,\n): AsyncIterable<T> {\n try {\n yield* source;\n } catch (err) {\n throw toTransportError(err, signal);\n }\n}\n\n/**\n * Interceptor that converts every RPC failure (unary and streaming) into the\n * typed {@link PolyesterError} hierarchy. Installed outermost by\n * `createTransports`, so callers of SDK services always see typed errors.\n */\nexport function createErrorMappingInterceptor(): Interceptor {\n return (next) => async (req) => {\n try {\n const res = await next(req);\n if (res.stream) {\n return { ...res, message: mapStreamErrors(res.message) };\n }\n return res;\n } catch (err) {\n throw toPolyesterError(err);\n }\n };\n}\n\n/**\n * Wraps a Connect transport so errors are translated after Connect's call\n * runner has applied its own error normalization.\n */\nexport function createErrorMappingTransport(transport: Transport): Transport {\n return {\n async unary(method, signal, timeoutMs, header, input, contextValues) {\n if (signal?.aborted) throw callerAbortError(signal);\n try {\n return await transport.unary(\n method,\n signal,\n timeoutMs,\n header,\n input,\n contextValues,\n );\n } catch (error) {\n throw toTransportError(error, signal);\n }\n },\n async stream(method, signal, timeoutMs, header, input, contextValues) {\n if (signal?.aborted) throw callerAbortError(signal);\n try {\n const response = await transport.stream(\n method,\n signal,\n timeoutMs,\n header,\n input,\n contextValues,\n );\n return { ...response, message: mapStreamErrors(response.message, signal) };\n } catch (error) {\n throw toTransportError(error, signal);\n }\n },\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"connect-error-mapping.js","names":[],"sources":["../../src/shared/connect-error-mapping.ts"],"sourcesContent":["import { Code, ConnectError, type Interceptor, type Transport } from \"@connectrpc/connect\";\nimport { parseConnectErrorDetail, type PolyesterErrorDetail } from \"./error-detail.js\";\nimport {\n AlreadyExistsError,\n AuthenticationError,\n InternalServerError,\n isAbortError,\n MfaEnrollmentRequiredError,\n MfaLastFactorRequiredError,\n MfaVerificationError,\n type MfaVerificationFailureReason,\n normalizeErrorMessage,\n PermissionError,\n PolicyInUseError,\n PolicyLockedError,\n PolicyScopeMismatchError,\n PolyesterError,\n type PolyesterErrorOptions,\n PreconditionFailedError,\n RateLimitError,\n ResourceNotFoundError,\n RevisionConflictError,\n ServiceUnavailableError,\n SessionElevationRequiredError,\n StaleQuoteError,\n SubaccountChallengeInvalidError,\n StepUpRequiredError,\n TimeoutError,\n TransientError,\n ValidationError,\n} from \"./errors.js\";\nimport type { RateLimitDetail } from \"./rate-limit.schemas.js\";\n\nfunction hasTransientServiceError(detail: PolyesterErrorDetail | undefined): boolean {\n if (detail?.service === \"withdraw\") {\n return [\n \"SERVICE_UNAVAILABLE\",\n \"SOURCE_SMART_ACCOUNT_UNAVAILABLE\",\n \"CAPITAL_VIEW_UNAVAILABLE\",\n \"CHAIN_METADATA_UNAVAILABLE\",\n \"FEE_UNAVAILABLE\",\n \"SUPPLY_UNAVAILABLE\",\n \"STEP_UP_UNAVAILABLE\",\n \"DESTINATION_VALIDATION_UNAVAILABLE\",\n \"ACCOUNT_SHARD_UNAVAILABLE\",\n ].includes(detail.code);\n }\n if (detail?.service === \"internal_transfer\") {\n return [\n \"SERVICE_UNAVAILABLE\",\n \"SMART_ACCOUNT_UNAVAILABLE\",\n \"STEP_UP_UNAVAILABLE\",\n \"CAPITAL_VIEW_UNAVAILABLE\",\n \"ACCOUNT_SHARD_UNAVAILABLE\",\n ].includes(detail.code);\n }\n if (detail?.service === \"claims\") {\n return [\"SERVICE_UNAVAILABLE\", \"CLAIM_TEMPORARILY_UNAVAILABLE\"].includes(detail.code);\n }\n return false;\n}\n\nfunction safeRetryAfterMs(rateLimit: RateLimitDetail | undefined): number | undefined {\n if (rateLimit?.retryAfterMs === undefined) return undefined;\n const value = BigInt(rateLimit.retryAfterMs);\n return value <= BigInt(Number.MAX_SAFE_INTEGER) ? Number(value) : undefined;\n}\n\nconst HTTP_WEEKDAY = \"(?:Mon|Tue|Wed|Thu|Fri|Sat|Sun)\";\nconst HTTP_WEEKDAY_LONG = \"(?:Monday|Tuesday|Wednesday|Thursday|Friday|Saturday|Sunday)\";\nconst HTTP_MONTH = \"(?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\";\nconst HTTP_DATE_RE = new RegExp(\n `^(?:${HTTP_WEEKDAY}, \\\\d{2} ${HTTP_MONTH} \\\\d{4} \\\\d{2}:\\\\d{2}:\\\\d{2} GMT|${HTTP_WEEKDAY_LONG}, \\\\d{2}-${HTTP_MONTH}-\\\\d{2} \\\\d{2}:\\\\d{2}:\\\\d{2} GMT|${HTTP_WEEKDAY} ${HTTP_MONTH} {1,2}\\\\d{1,2} \\\\d{2}:\\\\d{2}:\\\\d{2} \\\\d{4})$`,\n \"u\",\n);\n\n/**\n * Returns the error message without the leading \"[code] \" prefix that\n * `ConnectError` prepends, e.g. \"[invalid_argument] Insufficient funds.\"\n * becomes \"Insufficient funds.\".\n */\nexport function getNormalizedConnectMessage(err: unknown): string {\n const ce = ConnectError.from(err);\n const raw = ce.message ?? \"\";\n return normalizeErrorMessage(raw);\n}\n\nexport type MfaErrorKind = \"session-elevation\" | \"enrollment\" | \"step-up\";\n\n/**\n * Classifies an error as one of the MFA flows the backend can demand.\n * Classification is based only on stable structured auth error details.\n */\nexport function detectMfaErrorKind(err: unknown): MfaErrorKind | null {\n const mapped = toPolyesterError(err);\n return mfaErrorKind(mapped instanceof PolyesterError ? mapped.detail : undefined);\n}\n\nfunction mfaErrorKind(detail: PolyesterErrorDetail | undefined): MfaErrorKind | null {\n if (detail?.service === \"auth\" && detail.code === \"AUTH_MFA_ELEVATION_REQUIRED\") {\n return \"session-elevation\";\n }\n if (detail?.service === \"auth\" && detail.code === \"AUTH_STEP_UP_REQUIRED\") return \"step-up\";\n if (detail?.service === \"auth\" && detail.code === \"AUTH_MFA_NOT_ENROLLED\") return \"enrollment\";\n return null;\n}\n\nfunction parseRetryAfterMs(ce: ConnectError): number | undefined {\n const value = ce.metadata.get(\"retry-after\");\n if (!value) return undefined;\n if (/^\\d+$/u.test(value)) {\n const seconds = BigInt(value);\n const maxSafeSeconds = BigInt(Math.floor(Number.MAX_SAFE_INTEGER / 1000));\n return seconds <= maxSafeSeconds ? Number(seconds) * 1000 : undefined;\n }\n if (!HTTP_DATE_RE.test(value)) return undefined;\n const date = Date.parse(value);\n if (!Number.isNaN(date)) return Math.max(0, date - Date.now());\n return undefined;\n}\n\nconst MFA_ERROR_CLASSES = {\n \"session-elevation\": SessionElevationRequiredError,\n enrollment: MfaEnrollmentRequiredError,\n \"step-up\": StepUpRequiredError,\n} as const;\n\n/**\n * Maps a `ConnectError` from the Polyester backend onto the typed\n * {@link PolyesterError} tree. The original error is preserved as `cause`.\n */\nexport function connectErrorToPolyesterError(ce: ConnectError): PolyesterError {\n const message = getNormalizedConnectMessage(ce);\n const detail = parseConnectErrorDetail(ce);\n const options: PolyesterErrorOptions = { cause: ce, detail };\n const withFallback = (fallback: string) => message || fallback;\n\n if (detail?.service === \"auth\" && detail.code === \"AUTH_RESOURCE_NOT_FOUND\") {\n return new ResourceNotFoundError(withFallback(\"Resource not found.\"), options);\n }\n\n if (detail?.service === \"auth\" && detail.code === \"AUTH_REVISION_CONFLICT\") {\n return new RevisionConflictError(\n withFallback(\"Resource changed since it was last read.\"),\n options,\n );\n }\n\n if (detail?.service === \"auth\" && detail.code === \"AUTH_SUBACCOUNT_CHALLENGE_INVALID\") {\n return new SubaccountChallengeInvalidError(\n withFallback(\"Subaccount challenge is expired, replaced, or invalid.\"),\n options,\n );\n }\n if (detail?.service === \"auth\" && detail.code === \"AUTH_POLICY_IN_USE\") {\n return new PolicyInUseError(withFallback(\"Policy is still in use.\"), options);\n }\n if (detail?.service === \"auth\" && detail.code === \"AUTH_POLICY_LOCKED\") {\n return new PolicyLockedError(withFallback(\"Policy is locked.\"), options);\n }\n if (detail?.service === \"auth\" && detail.code === \"AUTH_POLICY_SCOPE_MISMATCH\") {\n return new PolicyScopeMismatchError(\n withFallback(\"Policy does not belong to the target account scope.\"),\n options,\n );\n }\n if (detail?.service === \"auth\" && detail.code === \"AUTH_MFA_LAST_FACTOR_REQUIRED\") {\n return new MfaLastFactorRequiredError(\n withFallback(\"At least one active MFA factor must remain enrolled.\"),\n options,\n );\n }\n if (detail?.service === \"auth\" && detail.code === \"AUTH_INTERNAL_ERROR\") {\n return new InternalServerError(withFallback(\"Internal server error.\"), options);\n }\n\n const mfaVerificationReason = getMfaVerificationFailureReason(detail);\n if (mfaVerificationReason) {\n return new MfaVerificationError(\n withFallback(\"MFA verification failed.\"),\n mfaVerificationReason,\n options,\n );\n }\n\n const mfaKind = mfaErrorKind(detail);\n if (mfaKind) {\n return new MFA_ERROR_CLASSES[mfaKind](\n withFallback(\"Multi-factor authentication required.\"),\n options,\n );\n }\n\n if (detail?.service === \"orders\" && detail.code === \"STALE_QUOTE\") {\n return new StaleQuoteError(withFallback(\"The submitted market quote is stale.\"), options);\n }\n\n const rateLimit = detail?.service === \"orders\" ? detail.rateLimit : undefined;\n if (\n rateLimit ||\n ((detail?.service === \"orders\" ||\n detail?.service === \"withdraw\" ||\n detail?.service === \"internal_transfer\" ||\n detail?.service === \"claims\") &&\n detail.code === \"RATE_LIMIT_EXCEEDED\")\n ) {\n return new RateLimitError(withFallback(\"Rate limit exceeded.\"), {\n ...options,\n rateLimit,\n retryAfterMs: safeRetryAfterMs(rateLimit) ?? parseRetryAfterMs(ce),\n });\n }\n\n if (hasTransientServiceError(detail)) {\n return new ServiceUnavailableError(withFallback(\"Service unavailable.\"), options);\n }\n\n switch (ce.code) {\n case Code.InvalidArgument:\n case Code.OutOfRange:\n return new ValidationError(withFallback(\"Invalid request.\"), options);\n case Code.NotFound:\n return new ResourceNotFoundError(withFallback(\"Resource not found.\"), options);\n case Code.AlreadyExists:\n return new AlreadyExistsError(withFallback(\"Resource already exists.\"), options);\n case Code.PermissionDenied:\n return new PermissionError(withFallback(\"Permission denied.\"), options);\n case Code.Unauthenticated:\n return new AuthenticationError(withFallback(\"Authentication required.\"), options);\n case Code.FailedPrecondition:\n return new PreconditionFailedError(withFallback(\"Precondition failed.\"), options);\n case Code.ResourceExhausted:\n return new RateLimitError(withFallback(\"Rate limit exceeded.\"), {\n ...options,\n retryAfterMs: parseRetryAfterMs(ce),\n });\n case Code.DeadlineExceeded:\n return new TimeoutError(withFallback(\"Request timed out.\"), options);\n case Code.Unavailable:\n return new ServiceUnavailableError(withFallback(\"Service unavailable.\"), options);\n case Code.Aborted:\n return new TransientError(withFallback(\"Operation aborted by the backend.\"), options);\n default:\n // Gateways sometimes surface outages as Unknown with this stock phrase.\n if (/service temporarily unavailable/i.test(message)) {\n return new ServiceUnavailableError(withFallback(\"Service unavailable.\"), options);\n }\n return new InternalServerError(withFallback(\"Internal server error.\"), options);\n }\n}\n\nfunction getMfaVerificationFailureReason(\n detail: PolyesterErrorDetail | undefined,\n): MfaVerificationFailureReason | null {\n if (detail?.service === \"auth\" && detail.code === \"AUTH_MFA_CHALLENGE_INVALID\") {\n return \"challenge-invalid\";\n }\n if (detail?.service === \"auth\" && detail.code === \"AUTH_MFA_CHALLENGE_LOCKED\") {\n return \"challenge-locked\";\n }\n if (detail?.service === \"auth\" && detail.code === \"AUTH_MFA_OTP_INVALID\") return \"otp-invalid\";\n if (detail?.service === \"auth\" && detail.code === \"AUTH_MFA_RECOVERY_INVALID\") {\n return \"recovery-code-invalid\";\n }\n if (\n (detail?.service === \"auth\" && detail.code === \"AUTH_MFA_PASSKEY_CREDENTIAL_INVALID\") ||\n (detail?.service === \"auth\" && detail.code === \"AUTH_MFA_PASSKEY_VERIFY_FAILED\")\n ) {\n return \"passkey-invalid\";\n }\n\n return null;\n}\n\nfunction findPolyesterErrorInCauseChain(err: unknown): PolyesterError | null {\n let current: unknown = err;\n for (let depth = 0; depth < 5 && current instanceof Error; depth++) {\n current = current.cause;\n if (current instanceof PolyesterError) return current;\n }\n return null;\n}\n\n/**\n * Converts any RPC-layer failure into its typed SDK error. Abort errors and\n * caller-cancelled requests pass through unchanged, as do errors that are\n * already typed (e.g. a `NetworkError` from the SDK fetch wrapper).\n */\nexport function toPolyesterError(err: unknown): unknown {\n if (err instanceof PolyesterError) return err;\n if (isAbortError(err)) return err;\n if (err instanceof ConnectError) {\n if (err.code === Code.Canceled) return err;\n const wrapped = findPolyesterErrorInCauseChain(err);\n if (wrapped) return wrapped;\n return connectErrorToPolyesterError(err);\n }\n return err;\n}\n\nfunction callerAbortError(signal: AbortSignal): DOMException {\n const reason: unknown = signal.reason;\n return reason instanceof DOMException && reason.name === \"AbortError\"\n ? reason\n : new DOMException(\"Request canceled.\", \"AbortError\");\n}\n\nfunction toTransportError(err: unknown, signal?: AbortSignal): unknown {\n if (signal?.aborted && err instanceof ConnectError && err.code === Code.Canceled) {\n return callerAbortError(signal);\n }\n return toPolyesterError(err);\n}\n\nasync function* mapStreamErrors<T>(\n source: AsyncIterable<T>,\n signal?: AbortSignal,\n): AsyncIterable<T> {\n try {\n yield* source;\n } catch (err) {\n throw toTransportError(err, signal);\n }\n}\n\n/**\n * Interceptor that converts every RPC failure (unary and streaming) into the\n * typed {@link PolyesterError} hierarchy. Installed outermost by\n * `createTransports`, so callers of SDK services always see typed errors.\n */\nexport function createErrorMappingInterceptor(): Interceptor {\n return (next) => async (req) => {\n try {\n const res = await next(req);\n if (res.stream) {\n return { ...res, message: mapStreamErrors(res.message) };\n }\n return res;\n } catch (err) {\n throw toPolyesterError(err);\n }\n };\n}\n\n/**\n * Wraps a Connect transport so errors are translated after Connect's call\n * runner has applied its own error normalization.\n */\nexport function createErrorMappingTransport(transport: Transport): Transport {\n return {\n async unary(method, signal, timeoutMs, header, input, contextValues) {\n if (signal?.aborted) throw callerAbortError(signal);\n try {\n return await transport.unary(\n method,\n signal,\n timeoutMs,\n header,\n input,\n contextValues,\n );\n } catch (error) {\n throw toTransportError(error, signal);\n }\n },\n async stream(method, signal, timeoutMs, header, input, contextValues) {\n if (signal?.aborted) throw callerAbortError(signal);\n try {\n const response = await transport.stream(\n method,\n signal,\n timeoutMs,\n header,\n input,\n contextValues,\n );\n return { ...response, message: mapStreamErrors(response.message, signal) };\n } catch (error) {\n throw toTransportError(error, signal);\n }\n },\n };\n}\n"],"mappings":"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"}
@@ -1,9 +1,10 @@
1
1
  import { AuthErrorCode } from "../gen/auth/v1/auth_pb.js";
2
2
  import { ProfileErrorCode } from "../gen/auth/v1/profile_pb.js";
3
- import { ErrorCode } from "../gen/chain/withdraw/v1/withdraw_pb.js";
4
- import { ErrorCode as ErrorCode$1 } from "../gen/ledger/read/v1/ledger_read_pb.js";
5
- import { ErrorCode as ErrorCode$2 } from "../gen/marketoverview/v1/marketoverview_pb.js";
6
- import { ErrorCode as ErrorCode$3 } from "../gen/transfer/v1/internal_transfer_pb.js";
3
+ import { ErrorCode } from "../gen/claims/v1/claims_pb.js";
4
+ import { ErrorCode as ErrorCode$1 } from "../gen/chain/withdraw/v1/withdraw_pb.js";
5
+ import { ErrorCode as ErrorCode$2 } from "../gen/ledger/read/v1/ledger_read_pb.js";
6
+ import { ErrorCode as ErrorCode$3 } from "../gen/marketoverview/v1/marketoverview_pb.js";
7
+ import { ErrorCode as ErrorCode$4 } from "../gen/transfer/v1/internal_transfer_pb.js";
7
8
  import { OrderErrorDetail } from "../services/orders/order-errors.schemas.js";
8
9
  import { ConnectError } from "@connectrpc/connect";
9
10
  //#region src/shared/error-detail.d.ts
@@ -21,16 +22,19 @@ type PolyesterErrorDetail = {
21
22
  service: "orders";
22
23
  } & OrderErrorDetail) | {
23
24
  service: "withdraw";
24
- code: NamedCode<typeof ErrorCode>;
25
+ code: NamedCode<typeof ErrorCode$1>;
25
26
  } | {
26
27
  service: "internal_transfer";
27
- code: NamedCode<typeof ErrorCode$3>;
28
+ code: NamedCode<typeof ErrorCode$4>;
28
29
  } | {
29
30
  service: "ledger";
30
- code: NamedCode<typeof ErrorCode$1>;
31
+ code: NamedCode<typeof ErrorCode$2>;
31
32
  } | {
32
33
  service: "market_overview";
33
- code: NamedCode<typeof ErrorCode$2>;
34
+ code: NamedCode<typeof ErrorCode$3>;
35
+ } | {
36
+ service: "claims";
37
+ code: NamedCode<typeof ErrorCode>;
34
38
  };
35
39
  //#endregion
36
40
  export { PolyesterErrorDetail };
@@ -1 +1 @@
1
- {"version":3,"file":"error-detail.d.ts","names":[],"sources":["../../src/shared/error-detail.ts"],"mappings":";;;;;;;;;KAiCK,UAAU,aAAa,gCAAgC;KAEhD;EACJ;EAAiB,MAAM,iBAAiB;EAAgB;;EAEtD;EACA,MAAM,iBAAiB;EACvB;EACA;;EAED;IAAsB;EACvB;EAAqB,MAAM,iBAAiB;;EAE1C;EACA,MAAM,iBAAiB;;EAEzB;EAAmB,MAAM,iBAAiB;;EAExC;EACA,MAAM,iBAAiB"}
1
+ {"version":3,"file":"error-detail.d.ts","names":[],"sources":["../../src/shared/error-detail.ts"],"mappings":";;;;;;;;;;KAqCK,UAAU,aAAa,gCAAgC;KAEhD;EACJ;EAAiB,MAAM,iBAAiB;EAAgB;;EAEtD;EACA,MAAM,iBAAiB;EACvB;EACA;;EAED;IAAsB;EACvB;EAAqB,MAAM,iBAAiB;;EAE1C;EACA,MAAM,iBAAiB;;EAEzB;EAAmB,MAAM,iBAAiB;;EAExC;EACA,MAAM,iBAAiB;;EAEzB;EAAmB,MAAM,iBAAiB"}
@@ -1,10 +1,11 @@
1
1
  import { AuthErrorCode, AuthErrorDetailSchema } from "../gen/auth/v1/auth_pb.js";
2
2
  import { ProfileErrorCode, ProfileErrorDetailSchema } from "../gen/auth/v1/profile_pb.js";
3
- import { ErrorCode, ErrorDetailSchema } from "../gen/chain/withdraw/v1/withdraw_pb.js";
4
- import { ErrorCode as ErrorCode$1, ErrorDetailSchema as ErrorDetailSchema$1 } from "../gen/ledger/read/v1/ledger_read_pb.js";
5
- import { ErrorCode as ErrorCode$2, ErrorDetailSchema as ErrorDetailSchema$2 } from "../gen/marketoverview/v1/marketoverview_pb.js";
6
- import { ErrorDetailSchema as ErrorDetailSchema$3 } from "../gen/orders/v1/orders_pb.js";
7
- import { ErrorCode as ErrorCode$3, ErrorDetailSchema as ErrorDetailSchema$4 } from "../gen/transfer/v1/internal_transfer_pb.js";
3
+ import { ErrorCode, ErrorDetailSchema } from "../gen/claims/v1/claims_pb.js";
4
+ import { ErrorCode as ErrorCode$1, ErrorDetailSchema as ErrorDetailSchema$1 } from "../gen/chain/withdraw/v1/withdraw_pb.js";
5
+ import { ErrorCode as ErrorCode$2, ErrorDetailSchema as ErrorDetailSchema$2 } from "../gen/ledger/read/v1/ledger_read_pb.js";
6
+ import { ErrorCode as ErrorCode$3, ErrorDetailSchema as ErrorDetailSchema$3 } from "../gen/marketoverview/v1/marketoverview_pb.js";
7
+ import { ErrorDetailSchema as ErrorDetailSchema$4 } from "../gen/orders/v1/orders_pb.js";
8
+ import { ErrorCode as ErrorCode$4, ErrorDetailSchema as ErrorDetailSchema$5 } from "../gen/transfer/v1/internal_transfer_pb.js";
8
9
  import { OrderErrorDetailSchema } from "../services/orders/order-errors.schemas.js";
9
10
  import { create, fromBinary } from "@bufbuild/protobuf";
10
11
  import * as v from "valibot";
@@ -48,8 +49,8 @@ function parseConnectErrorDetail(error) {
48
49
  };
49
50
  break;
50
51
  }
51
- case ErrorDetailSchema$3.typeName: {
52
- const order = decodeDetail(raw, ErrorDetailSchema$3);
52
+ case ErrorDetailSchema$4.typeName: {
53
+ const order = decodeDetail(raw, ErrorDetailSchema$4);
53
54
  if (!order) break;
54
55
  const parsed = v.safeParse(OrderErrorDetailSchema, order);
55
56
  if (parsed.success) return {
@@ -58,46 +59,56 @@ function parseConnectErrorDetail(error) {
58
59
  };
59
60
  break;
60
61
  }
61
- case ErrorDetailSchema.typeName: {
62
- const withdraw = decodeDetail(raw, ErrorDetailSchema);
62
+ case ErrorDetailSchema$1.typeName: {
63
+ const withdraw = decodeDetail(raw, ErrorDetailSchema$1);
63
64
  if (!withdraw) break;
64
- const code = codeName(ErrorCode, withdraw.code);
65
+ const code = codeName(ErrorCode$1, withdraw.code);
65
66
  if (code) return {
66
67
  service: "withdraw",
67
68
  code
68
69
  };
69
70
  break;
70
71
  }
71
- case ErrorDetailSchema$4.typeName: {
72
- const transfer = decodeDetail(raw, ErrorDetailSchema$4);
72
+ case ErrorDetailSchema$5.typeName: {
73
+ const transfer = decodeDetail(raw, ErrorDetailSchema$5);
73
74
  if (!transfer) break;
74
- const code = codeName(ErrorCode$3, transfer.code);
75
+ const code = codeName(ErrorCode$4, transfer.code);
75
76
  if (code) return {
76
77
  service: "internal_transfer",
77
78
  code
78
79
  };
79
80
  break;
80
81
  }
81
- case ErrorDetailSchema$1.typeName: {
82
- const ledger = decodeDetail(raw, ErrorDetailSchema$1);
82
+ case ErrorDetailSchema$2.typeName: {
83
+ const ledger = decodeDetail(raw, ErrorDetailSchema$2);
83
84
  if (!ledger) break;
84
- const code = codeName(ErrorCode$1, ledger.code);
85
+ const code = codeName(ErrorCode$2, ledger.code);
85
86
  if (code) return {
86
87
  service: "ledger",
87
88
  code
88
89
  };
89
90
  break;
90
91
  }
91
- case ErrorDetailSchema$2.typeName: {
92
- const marketOverview = decodeDetail(raw, ErrorDetailSchema$2);
92
+ case ErrorDetailSchema$3.typeName: {
93
+ const marketOverview = decodeDetail(raw, ErrorDetailSchema$3);
93
94
  if (!marketOverview) break;
94
- const code = codeName(ErrorCode$2, marketOverview.code);
95
+ const code = codeName(ErrorCode$3, marketOverview.code);
95
96
  if (code) return {
96
97
  service: "market_overview",
97
98
  code
98
99
  };
99
100
  break;
100
101
  }
102
+ case ErrorDetailSchema.typeName: {
103
+ const claims = decodeDetail(raw, ErrorDetailSchema);
104
+ if (!claims) break;
105
+ const code = codeName(ErrorCode, claims.code);
106
+ if (code) return {
107
+ service: "claims",
108
+ code
109
+ };
110
+ break;
111
+ }
101
112
  }
102
113
  }
103
114
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"error-detail.js","names":["OrderErrorDetailSchema","ParsedOrderErrorDetailSchema","WithdrawErrorDetailSchema","WithdrawErrorCode","InternalTransferErrorDetailSchema","InternalTransferErrorCode","LedgerErrorDetailSchema","LedgerErrorCode","MarketOverviewErrorDetailSchema","MarketOverviewErrorCode"],"sources":["../../src/shared/error-detail.ts"],"sourcesContent":["import {\n create,\n fromBinary,\n type DescMessage,\n type MessageInitShape,\n type MessageShape,\n} from \"@bufbuild/protobuf\";\nimport type { ConnectError } from \"@connectrpc/connect\";\nimport * as v from \"valibot\";\nimport { AuthErrorCode, AuthErrorDetailSchema } from \"../gen/auth/v1/auth_pb.js\";\nimport { ProfileErrorCode, ProfileErrorDetailSchema } from \"../gen/auth/v1/profile_pb.js\";\nimport {\n ErrorCode as WithdrawErrorCode,\n ErrorDetailSchema as WithdrawErrorDetailSchema,\n} from \"../gen/chain/withdraw/v1/withdraw_pb.js\";\nimport {\n ErrorCode as LedgerErrorCode,\n ErrorDetailSchema as LedgerErrorDetailSchema,\n} from \"../gen/ledger/read/v1/ledger_read_pb.js\";\nimport {\n ErrorCode as MarketOverviewErrorCode,\n ErrorDetailSchema as MarketOverviewErrorDetailSchema,\n} from \"../gen/marketoverview/v1/marketoverview_pb.js\";\nimport { ErrorDetailSchema as OrderErrorDetailSchema } from \"../gen/orders/v1/orders_pb.js\";\nimport {\n ErrorCode as InternalTransferErrorCode,\n ErrorDetailSchema as InternalTransferErrorDetailSchema,\n} from \"../gen/transfer/v1/internal_transfer_pb.js\";\nimport {\n OrderErrorDetailSchema as ParsedOrderErrorDetailSchema,\n type OrderErrorDetail,\n} from \"../services/orders/order-errors.schemas.js\";\n\ntype NamedCode<Enum extends Record<number, string>> = keyof Enum;\n\nexport type PolyesterErrorDetail =\n | { service: \"auth\"; code: NamedCode<typeof AuthErrorCode>; message: string }\n | {\n service: \"profile\";\n code: NamedCode<typeof ProfileErrorCode>;\n field: string;\n message: string;\n }\n | ({ service: \"orders\" } & OrderErrorDetail)\n | { service: \"withdraw\"; code: NamedCode<typeof WithdrawErrorCode> }\n | {\n service: \"internal_transfer\";\n code: NamedCode<typeof InternalTransferErrorCode>;\n }\n | { service: \"ledger\"; code: NamedCode<typeof LedgerErrorCode> }\n | {\n service: \"market_overview\";\n code: NamedCode<typeof MarketOverviewErrorCode>;\n };\n\nfunction codeName<Enum extends Record<number, string>>(\n codes: Enum,\n code: number,\n): NamedCode<Enum> | undefined {\n if (typeof code !== \"number\") return undefined;\n const name = codes[code];\n return typeof name === \"string\" ? (name as NamedCode<Enum>) : undefined;\n}\n\nfunction decodeDetail<Desc extends DescMessage>(\n detail: ConnectError[\"details\"][number],\n schema: Desc,\n): MessageShape<Desc> | undefined {\n try {\n if (\"desc\" in detail) {\n return create(schema, detail.value as MessageInitShape<Desc>);\n }\n return fromBinary(schema, detail.value);\n } catch {\n return undefined;\n }\n}\n\n/** Decodes the first valid backend rejection detail, preserving wire-detail order. */\nexport function parseConnectErrorDetail(error: ConnectError): PolyesterErrorDetail | undefined {\n for (const raw of error.details) {\n const typeName = \"desc\" in raw ? raw.desc.typeName : raw.type;\n switch (typeName) {\n case AuthErrorDetailSchema.typeName: {\n const auth = decodeDetail(raw, AuthErrorDetailSchema);\n if (!auth) break;\n const code = codeName(AuthErrorCode, auth.code);\n if (code) {\n return { service: \"auth\", code, message: auth.message };\n }\n break;\n }\n case ProfileErrorDetailSchema.typeName: {\n const profile = decodeDetail(raw, ProfileErrorDetailSchema);\n if (!profile) break;\n const code = codeName(ProfileErrorCode, profile.code);\n if (code) {\n return {\n service: \"profile\",\n code,\n field: profile.field,\n message: profile.message,\n };\n }\n break;\n }\n case OrderErrorDetailSchema.typeName: {\n const order = decodeDetail(raw, OrderErrorDetailSchema);\n if (!order) break;\n const parsed = v.safeParse(ParsedOrderErrorDetailSchema, order);\n if (parsed.success) return { service: \"orders\", ...parsed.output };\n break;\n }\n case WithdrawErrorDetailSchema.typeName: {\n const withdraw = decodeDetail(raw, WithdrawErrorDetailSchema);\n if (!withdraw) break;\n const code = codeName(WithdrawErrorCode, withdraw.code);\n if (code) return { service: \"withdraw\", code };\n break;\n }\n case InternalTransferErrorDetailSchema.typeName: {\n const transfer = decodeDetail(raw, InternalTransferErrorDetailSchema);\n if (!transfer) break;\n const code = codeName(InternalTransferErrorCode, transfer.code);\n if (code) return { service: \"internal_transfer\", code };\n break;\n }\n case LedgerErrorDetailSchema.typeName: {\n const ledger = decodeDetail(raw, LedgerErrorDetailSchema);\n if (!ledger) break;\n const code = codeName(LedgerErrorCode, ledger.code);\n if (code) return { service: \"ledger\", code };\n break;\n }\n case MarketOverviewErrorDetailSchema.typeName: {\n const marketOverview = decodeDetail(raw, MarketOverviewErrorDetailSchema);\n if (!marketOverview) break;\n const code = codeName(MarketOverviewErrorCode, marketOverview.code);\n if (code) return { service: \"market_overview\", code };\n break;\n }\n }\n }\n return undefined;\n}\n"],"mappings":";;;;;;;;;;;AAuDA,SAAS,SACL,OACA,MAC2B;CAC3B,IAAI,OAAO,SAAS,UAAU,OAAO,KAAA;CACrC,MAAM,OAAO,MAAM;CACnB,OAAO,OAAO,SAAS,WAAY,OAA2B,KAAA;AAClE;AAEA,SAAS,aACL,QACA,QAC8B;CAC9B,IAAI;EACA,IAAI,UAAU,QACV,OAAO,OAAO,QAAQ,OAAO,KAA+B;EAEhE,OAAO,WAAW,QAAQ,OAAO,KAAK;CAC1C,QAAQ;EACJ;CACJ;AACJ;;AAGA,SAAgB,wBAAwB,OAAuD;CAC3F,KAAK,MAAM,OAAO,MAAM,SAEpB,QADiB,UAAU,MAAM,IAAI,KAAK,WAAW,IAAI,MACzD;EACI,KAAK,sBAAsB,UAAU;GACjC,MAAM,OAAO,aAAa,KAAK,qBAAqB;GACpD,IAAI,CAAC,MAAM;GACX,MAAM,OAAO,SAAS,eAAe,KAAK,IAAI;GAC9C,IAAI,MACA,OAAO;IAAE,SAAS;IAAQ;IAAM,SAAS,KAAK;GAAQ;GAE1D;EACJ;EACA,KAAK,yBAAyB,UAAU;GACpC,MAAM,UAAU,aAAa,KAAK,wBAAwB;GAC1D,IAAI,CAAC,SAAS;GACd,MAAM,OAAO,SAAS,kBAAkB,QAAQ,IAAI;GACpD,IAAI,MACA,OAAO;IACH,SAAS;IACT;IACA,OAAO,QAAQ;IACf,SAAS,QAAQ;GACrB;GAEJ;EACJ;EACA,KAAKA,oBAAuB,UAAU;GAClC,MAAM,QAAQ,aAAa,KAAKA,mBAAsB;GACtD,IAAI,CAAC,OAAO;GACZ,MAAM,SAAS,EAAE,UAAUC,wBAA8B,KAAK;GAC9D,IAAI,OAAO,SAAS,OAAO;IAAE,SAAS;IAAU,GAAG,OAAO;GAAO;GACjE;EACJ;EACA,KAAKC,kBAA0B,UAAU;GACrC,MAAM,WAAW,aAAa,KAAKA,iBAAyB;GAC5D,IAAI,CAAC,UAAU;GACf,MAAM,OAAO,SAASC,WAAmB,SAAS,IAAI;GACtD,IAAI,MAAM,OAAO;IAAE,SAAS;IAAY;GAAK;GAC7C;EACJ;EACA,KAAKC,oBAAkC,UAAU;GAC7C,MAAM,WAAW,aAAa,KAAKA,mBAAiC;GACpE,IAAI,CAAC,UAAU;GACf,MAAM,OAAO,SAASC,aAA2B,SAAS,IAAI;GAC9D,IAAI,MAAM,OAAO;IAAE,SAAS;IAAqB;GAAK;GACtD;EACJ;EACA,KAAKC,oBAAwB,UAAU;GACnC,MAAM,SAAS,aAAa,KAAKA,mBAAuB;GACxD,IAAI,CAAC,QAAQ;GACb,MAAM,OAAO,SAASC,aAAiB,OAAO,IAAI;GAClD,IAAI,MAAM,OAAO;IAAE,SAAS;IAAU;GAAK;GAC3C;EACJ;EACA,KAAKC,oBAAgC,UAAU;GAC3C,MAAM,iBAAiB,aAAa,KAAKA,mBAA+B;GACxE,IAAI,CAAC,gBAAgB;GACrB,MAAM,OAAO,SAASC,aAAyB,eAAe,IAAI;GAClE,IAAI,MAAM,OAAO;IAAE,SAAS;IAAmB;GAAK;GACpD;EACJ;CACJ;AAGR"}
1
+ {"version":3,"file":"error-detail.js","names":["OrderErrorDetailSchema","ParsedOrderErrorDetailSchema","WithdrawErrorDetailSchema","WithdrawErrorCode","InternalTransferErrorDetailSchema","InternalTransferErrorCode","LedgerErrorDetailSchema","LedgerErrorCode","MarketOverviewErrorDetailSchema","MarketOverviewErrorCode","ClaimsErrorDetailSchema","ClaimsErrorCode"],"sources":["../../src/shared/error-detail.ts"],"sourcesContent":["import {\n create,\n fromBinary,\n type DescMessage,\n type MessageInitShape,\n type MessageShape,\n} from \"@bufbuild/protobuf\";\nimport type { ConnectError } from \"@connectrpc/connect\";\nimport * as v from \"valibot\";\nimport { AuthErrorCode, AuthErrorDetailSchema } from \"../gen/auth/v1/auth_pb.js\";\nimport { ProfileErrorCode, ProfileErrorDetailSchema } from \"../gen/auth/v1/profile_pb.js\";\nimport {\n ErrorCode as ClaimsErrorCode,\n ErrorDetailSchema as ClaimsErrorDetailSchema,\n} from \"../gen/claims/v1/claims_pb.js\";\nimport {\n ErrorCode as WithdrawErrorCode,\n ErrorDetailSchema as WithdrawErrorDetailSchema,\n} from \"../gen/chain/withdraw/v1/withdraw_pb.js\";\nimport {\n ErrorCode as LedgerErrorCode,\n ErrorDetailSchema as LedgerErrorDetailSchema,\n} from \"../gen/ledger/read/v1/ledger_read_pb.js\";\nimport {\n ErrorCode as MarketOverviewErrorCode,\n ErrorDetailSchema as MarketOverviewErrorDetailSchema,\n} from \"../gen/marketoverview/v1/marketoverview_pb.js\";\nimport { ErrorDetailSchema as OrderErrorDetailSchema } from \"../gen/orders/v1/orders_pb.js\";\nimport {\n ErrorCode as InternalTransferErrorCode,\n ErrorDetailSchema as InternalTransferErrorDetailSchema,\n} from \"../gen/transfer/v1/internal_transfer_pb.js\";\nimport {\n OrderErrorDetailSchema as ParsedOrderErrorDetailSchema,\n type OrderErrorDetail,\n} from \"../services/orders/order-errors.schemas.js\";\n\ntype NamedCode<Enum extends Record<number, string>> = keyof Enum;\n\nexport type PolyesterErrorDetail =\n | { service: \"auth\"; code: NamedCode<typeof AuthErrorCode>; message: string }\n | {\n service: \"profile\";\n code: NamedCode<typeof ProfileErrorCode>;\n field: string;\n message: string;\n }\n | ({ service: \"orders\" } & OrderErrorDetail)\n | { service: \"withdraw\"; code: NamedCode<typeof WithdrawErrorCode> }\n | {\n service: \"internal_transfer\";\n code: NamedCode<typeof InternalTransferErrorCode>;\n }\n | { service: \"ledger\"; code: NamedCode<typeof LedgerErrorCode> }\n | {\n service: \"market_overview\";\n code: NamedCode<typeof MarketOverviewErrorCode>;\n }\n | { service: \"claims\"; code: NamedCode<typeof ClaimsErrorCode> };\n\nfunction codeName<Enum extends Record<number, string>>(\n codes: Enum,\n code: number,\n): NamedCode<Enum> | undefined {\n if (typeof code !== \"number\") return undefined;\n const name = codes[code];\n return typeof name === \"string\" ? (name as NamedCode<Enum>) : undefined;\n}\n\nfunction decodeDetail<Desc extends DescMessage>(\n detail: ConnectError[\"details\"][number],\n schema: Desc,\n): MessageShape<Desc> | undefined {\n try {\n if (\"desc\" in detail) {\n return create(schema, detail.value as MessageInitShape<Desc>);\n }\n return fromBinary(schema, detail.value);\n } catch {\n return undefined;\n }\n}\n\n/** Decodes the first valid backend rejection detail, preserving wire-detail order. */\nexport function parseConnectErrorDetail(error: ConnectError): PolyesterErrorDetail | undefined {\n for (const raw of error.details) {\n const typeName = \"desc\" in raw ? raw.desc.typeName : raw.type;\n switch (typeName) {\n case AuthErrorDetailSchema.typeName: {\n const auth = decodeDetail(raw, AuthErrorDetailSchema);\n if (!auth) break;\n const code = codeName(AuthErrorCode, auth.code);\n if (code) {\n return { service: \"auth\", code, message: auth.message };\n }\n break;\n }\n case ProfileErrorDetailSchema.typeName: {\n const profile = decodeDetail(raw, ProfileErrorDetailSchema);\n if (!profile) break;\n const code = codeName(ProfileErrorCode, profile.code);\n if (code) {\n return {\n service: \"profile\",\n code,\n field: profile.field,\n message: profile.message,\n };\n }\n break;\n }\n case OrderErrorDetailSchema.typeName: {\n const order = decodeDetail(raw, OrderErrorDetailSchema);\n if (!order) break;\n const parsed = v.safeParse(ParsedOrderErrorDetailSchema, order);\n if (parsed.success) return { service: \"orders\", ...parsed.output };\n break;\n }\n case WithdrawErrorDetailSchema.typeName: {\n const withdraw = decodeDetail(raw, WithdrawErrorDetailSchema);\n if (!withdraw) break;\n const code = codeName(WithdrawErrorCode, withdraw.code);\n if (code) return { service: \"withdraw\", code };\n break;\n }\n case InternalTransferErrorDetailSchema.typeName: {\n const transfer = decodeDetail(raw, InternalTransferErrorDetailSchema);\n if (!transfer) break;\n const code = codeName(InternalTransferErrorCode, transfer.code);\n if (code) return { service: \"internal_transfer\", code };\n break;\n }\n case LedgerErrorDetailSchema.typeName: {\n const ledger = decodeDetail(raw, LedgerErrorDetailSchema);\n if (!ledger) break;\n const code = codeName(LedgerErrorCode, ledger.code);\n if (code) return { service: \"ledger\", code };\n break;\n }\n case MarketOverviewErrorDetailSchema.typeName: {\n const marketOverview = decodeDetail(raw, MarketOverviewErrorDetailSchema);\n if (!marketOverview) break;\n const code = codeName(MarketOverviewErrorCode, marketOverview.code);\n if (code) return { service: \"market_overview\", code };\n break;\n }\n case ClaimsErrorDetailSchema.typeName: {\n const claims = decodeDetail(raw, ClaimsErrorDetailSchema);\n if (!claims) break;\n const code = codeName(ClaimsErrorCode, claims.code);\n if (code) return { service: \"claims\", code };\n break;\n }\n }\n }\n return undefined;\n}\n"],"mappings":";;;;;;;;;;;;AA4DA,SAAS,SACL,OACA,MAC2B;CAC3B,IAAI,OAAO,SAAS,UAAU,OAAO,KAAA;CACrC,MAAM,OAAO,MAAM;CACnB,OAAO,OAAO,SAAS,WAAY,OAA2B,KAAA;AAClE;AAEA,SAAS,aACL,QACA,QAC8B;CAC9B,IAAI;EACA,IAAI,UAAU,QACV,OAAO,OAAO,QAAQ,OAAO,KAA+B;EAEhE,OAAO,WAAW,QAAQ,OAAO,KAAK;CAC1C,QAAQ;EACJ;CACJ;AACJ;;AAGA,SAAgB,wBAAwB,OAAuD;CAC3F,KAAK,MAAM,OAAO,MAAM,SAEpB,QADiB,UAAU,MAAM,IAAI,KAAK,WAAW,IAAI,MACzD;EACI,KAAK,sBAAsB,UAAU;GACjC,MAAM,OAAO,aAAa,KAAK,qBAAqB;GACpD,IAAI,CAAC,MAAM;GACX,MAAM,OAAO,SAAS,eAAe,KAAK,IAAI;GAC9C,IAAI,MACA,OAAO;IAAE,SAAS;IAAQ;IAAM,SAAS,KAAK;GAAQ;GAE1D;EACJ;EACA,KAAK,yBAAyB,UAAU;GACpC,MAAM,UAAU,aAAa,KAAK,wBAAwB;GAC1D,IAAI,CAAC,SAAS;GACd,MAAM,OAAO,SAAS,kBAAkB,QAAQ,IAAI;GACpD,IAAI,MACA,OAAO;IACH,SAAS;IACT;IACA,OAAO,QAAQ;IACf,SAAS,QAAQ;GACrB;GAEJ;EACJ;EACA,KAAKA,oBAAuB,UAAU;GAClC,MAAM,QAAQ,aAAa,KAAKA,mBAAsB;GACtD,IAAI,CAAC,OAAO;GACZ,MAAM,SAAS,EAAE,UAAUC,wBAA8B,KAAK;GAC9D,IAAI,OAAO,SAAS,OAAO;IAAE,SAAS;IAAU,GAAG,OAAO;GAAO;GACjE;EACJ;EACA,KAAKC,oBAA0B,UAAU;GACrC,MAAM,WAAW,aAAa,KAAKA,mBAAyB;GAC5D,IAAI,CAAC,UAAU;GACf,MAAM,OAAO,SAASC,aAAmB,SAAS,IAAI;GACtD,IAAI,MAAM,OAAO;IAAE,SAAS;IAAY;GAAK;GAC7C;EACJ;EACA,KAAKC,oBAAkC,UAAU;GAC7C,MAAM,WAAW,aAAa,KAAKA,mBAAiC;GACpE,IAAI,CAAC,UAAU;GACf,MAAM,OAAO,SAASC,aAA2B,SAAS,IAAI;GAC9D,IAAI,MAAM,OAAO;IAAE,SAAS;IAAqB;GAAK;GACtD;EACJ;EACA,KAAKC,oBAAwB,UAAU;GACnC,MAAM,SAAS,aAAa,KAAKA,mBAAuB;GACxD,IAAI,CAAC,QAAQ;GACb,MAAM,OAAO,SAASC,aAAiB,OAAO,IAAI;GAClD,IAAI,MAAM,OAAO;IAAE,SAAS;IAAU;GAAK;GAC3C;EACJ;EACA,KAAKC,oBAAgC,UAAU;GAC3C,MAAM,iBAAiB,aAAa,KAAKA,mBAA+B;GACxE,IAAI,CAAC,gBAAgB;GACrB,MAAM,OAAO,SAASC,aAAyB,eAAe,IAAI;GAClE,IAAI,MAAM,OAAO;IAAE,SAAS;IAAmB;GAAK;GACpD;EACJ;EACA,KAAKC,kBAAwB,UAAU;GACnC,MAAM,SAAS,aAAa,KAAKA,iBAAuB;GACxD,IAAI,CAAC,QAAQ;GACb,MAAM,OAAO,SAASC,WAAiB,OAAO,IAAI;GAClD,IAAI,MAAM,OAAO;IAAE,SAAS;IAAU;GAAK;GAC3C;EACJ;CACJ;AAGR"}
@@ -27,6 +27,7 @@ import { RateLimitDetail } from "./rate-limit.schemas.js";
27
27
  * │ │ ├── RevisionConflictError REVISION_CONFLICT
28
28
  * │ │ ├── PolicyInUseError POLICY_IN_USE
29
29
  * │ │ ├── PolicyLockedError POLICY_LOCKED
30
+ * │ │ ├── SubaccountChallengeInvalidError SUBACCOUNT_CHALLENGE_INVALID
30
31
  * │ │ └── MfaLastFactorRequiredError MFA_LAST_FACTOR_REQUIRED
31
32
  * │ ├── ConfigurationError INVALID_CONFIGURATION false
32
33
  * │ ├── MfaRequiredError MFA_REQUIRED false
@@ -171,6 +172,14 @@ declare class RevisionConflictError extends PreconditionFailedError {
171
172
  readonly code: string;
172
173
  constructor(message: string, options?: PolyesterErrorOptions);
173
174
  }
175
+ /**
176
+ * The subaccount authorization is expired, replaced by a newer challenge, replayed,
177
+ * or otherwise invalid. Request a fresh challenge via `subaccounts.createChallenge`.
178
+ */
179
+ declare class SubaccountChallengeInvalidError extends PreconditionFailedError {
180
+ readonly code: string;
181
+ constructor(message: string, options?: PolyesterErrorOptions);
182
+ }
174
183
  /** The policy cannot be removed while accounts or API keys still use it. */
175
184
  declare class PolicyInUseError extends PreconditionFailedError {
176
185
  readonly code: string;
@@ -249,5 +258,5 @@ declare function isAbortError(err: unknown): boolean;
249
258
  /** Maps a plain HTTP status code onto the SDK error tree. */
250
259
  declare function errorFromHttpStatus(status: number, message: string, options?: PolyesterErrorOptions): PolyesterError;
251
260
  //#endregion
252
- export { AlreadyExistsError, AuthenticationError, ConfigurationError, InternalServerError, MfaEnrollmentRequiredError, MfaLastFactorRequiredError, MfaRequiredError, MfaVerificationError, MfaVerificationFailureReason, NetworkError, PermissionError, PolicyInUseError, PolicyLockedError, PolicyScopeMismatchError, PolyesterError, PolyesterErrorCode, type PolyesterErrorDetail, PolyesterErrorOptions, PreconditionFailedError, RateLimitError, RateLimitErrorOptions, RequestError, ResourceNotFoundError, RevisionConflictError, ServiceUnavailableError, SessionElevationRequiredError, StaleQuoteError, StepUpRequiredError, TimeoutError, TransientError, ValidationError, errorFromHttpStatus, isAbortError, normalizeErrorMessage };
261
+ export { AlreadyExistsError, AuthenticationError, ConfigurationError, InternalServerError, MfaEnrollmentRequiredError, MfaLastFactorRequiredError, MfaRequiredError, MfaVerificationError, MfaVerificationFailureReason, NetworkError, PermissionError, PolicyInUseError, PolicyLockedError, PolicyScopeMismatchError, PolyesterError, PolyesterErrorCode, type PolyesterErrorDetail, PolyesterErrorOptions, PreconditionFailedError, RateLimitError, RateLimitErrorOptions, RequestError, ResourceNotFoundError, RevisionConflictError, ServiceUnavailableError, SessionElevationRequiredError, StaleQuoteError, StepUpRequiredError, SubaccountChallengeInvalidError, TimeoutError, TransientError, ValidationError, errorFromHttpStatus, isAbortError, normalizeErrorMessage };
253
262
  //# sourceMappingURL=errors.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"errors.d.ts","names":[],"sources":["../../src/shared/errors.ts"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KA2DY;UA+BK;;EAEb;;EAEA,SAAS;;iBAKG,sBAAsB;;;;;;;;uBAWhB,uBAAuB;;oBAEvB;;oBAEA;WACT,QAAQ;EAEL,YAAA,iBAAiB,UAAU;;;;;;;;cAe9B,uBAAuB;WACvB;WACA;EAEG,YAAA,iBAAiB,UAAU;;;cAO9B,qBAAqB;WACZ;EAEN,YAAA,iBAAiB,UAAU;;;cAO9B,qBAAqB;WACZ;EAEN,YAAA,iBAAiB,UAAU;;UAM1B,8BAA8B;;EAE3C;;EAEA,YAAY;;;cAIH,uBAAuB;WACd;;WAET;;WAEA,YAAY;EAET,YAAA,iBAAiB,UAAU;;;cAS9B,gCAAgC;WACvB;EAEN,YAAA,iBAAiB,UAAU;;;;;;cAU9B,qBAAqB;WACrB;WACA;EAEG,YAAA,iBAAiB,UAAU;;;cAO9B,wBAAwB;WACf;EAEN,YAAA,iBAAiB,UAAU;;;cAO9B,wBAAwB;WACf;EAEN,YAAA,iBAAiB,UAAU;;;cAO9B,8BAA8B;WACrB;EAEN,YAAA,iBAAiB,UAAU;;;cAO9B,2BAA2B;WAClB;EAEN,YAAA,iBAAiB,UAAU;;;cAO9B,wBAAwB;WACf;EAEN,YAAA,iBAAiB,UAAU;;;cAO9B,4BAA4B;WACnB;EAEN,YAAA,iBAAiB,UAAU;;;cAO9B,gCAAgC;WACvB;EAEN,YAAA,iBAAiB,UAAU;;;;;;cAU9B,8BAA8B;WACrB;EAEN,YAAA,iBAAiB,UAAU;;;cAO9B,yBAAyB;WAChB;EAEN,YAAA,iBAAiB,UAAU;;;cAO9B,0BAA0B;WACjB;EAEN,YAAA,iBAAiB,UAAU;;;cAO9B,iCAAiC;WACxB;EAEN,YAAA,iBAAiB,UAAU;;;cAO9B,2BAA2B;WAClB;EAEN,YAAA,iBAAiB,UAAU;;;;;;cAU9B,yBAAyB;WAChB;EAEN,YAAA,iBAAiB,UAAU;;;cAO9B,mCAAmC;WAC1B;EAEN,YAAA,iBAAiB,UAAU;;;cAO9B,4BAA4B;WACnB;EAEN,YAAA,iBAAiB,UAAU;;;cAO9B,sCAAsC;WAC7B;EAEN,YAAA,iBAAiB,UAAU;;;cAO9B,mCAAmC;WAC1B;EAEN,YAAA,iBAAiB,UAAU;;;KAO/B;;;;;cAWC,6BAA6B;WAKzB,QAAQ;WAJH;EAGd,YAAA,iBACS,QAAQ,8BACjB,UAAU;;;;;;;cAYL,4BAA4B;WAC5B;WACA;EAEG,YAAA,iBAAiB,UAAU;;;;;;;iBAW3B,aAAa;;iBAKb,oBACZ,gBACA,iBACA,UAAU,wBACX"}
1
+ {"version":3,"file":"errors.d.ts","names":[],"sources":["../../src/shared/errors.ts"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KA4DY;UA+BK;;EAEb;;EAEA,SAAS;;iBAKG,sBAAsB;;;;;;;;uBAWhB,uBAAuB;;oBAEvB;;oBAEA;WACT,QAAQ;EAEL,YAAA,iBAAiB,UAAU;;;;;;;;cAe9B,uBAAuB;WACvB;WACA;EAEG,YAAA,iBAAiB,UAAU;;;cAO9B,qBAAqB;WACZ;EAEN,YAAA,iBAAiB,UAAU;;;cAO9B,qBAAqB;WACZ;EAEN,YAAA,iBAAiB,UAAU;;UAM1B,8BAA8B;;EAE3C;;EAEA,YAAY;;;cAIH,uBAAuB;WACd;;WAET;;WAEA,YAAY;EAET,YAAA,iBAAiB,UAAU;;;cAS9B,gCAAgC;WACvB;EAEN,YAAA,iBAAiB,UAAU;;;;;;cAU9B,qBAAqB;WACrB;WACA;EAEG,YAAA,iBAAiB,UAAU;;;cAO9B,wBAAwB;WACf;EAEN,YAAA,iBAAiB,UAAU;;;cAO9B,wBAAwB;WACf;EAEN,YAAA,iBAAiB,UAAU;;;cAO9B,8BAA8B;WACrB;EAEN,YAAA,iBAAiB,UAAU;;;cAO9B,2BAA2B;WAClB;EAEN,YAAA,iBAAiB,UAAU;;;cAO9B,wBAAwB;WACf;EAEN,YAAA,iBAAiB,UAAU;;;cAO9B,4BAA4B;WACnB;EAEN,YAAA,iBAAiB,UAAU;;;cAO9B,gCAAgC;WACvB;EAEN,YAAA,iBAAiB,UAAU;;;;;;cAU9B,8BAA8B;WACrB;EAEN,YAAA,iBAAiB,UAAU;;;;;;cAU9B,wCAAwC;WAC/B;EAEN,YAAA,iBAAiB,UAAU;;;cAO9B,yBAAyB;WAChB;EAEN,YAAA,iBAAiB,UAAU;;;cAO9B,0BAA0B;WACjB;EAEN,YAAA,iBAAiB,UAAU;;;cAO9B,iCAAiC;WACxB;EAEN,YAAA,iBAAiB,UAAU;;;cAO9B,2BAA2B;WAClB;EAEN,YAAA,iBAAiB,UAAU;;;;;;cAU9B,yBAAyB;WAChB;EAEN,YAAA,iBAAiB,UAAU;;;cAO9B,mCAAmC;WAC1B;EAEN,YAAA,iBAAiB,UAAU;;;cAO9B,4BAA4B;WACnB;EAEN,YAAA,iBAAiB,UAAU;;;cAO9B,sCAAsC;WAC7B;EAEN,YAAA,iBAAiB,UAAU;;;cAO9B,mCAAmC;WAC1B;EAEN,YAAA,iBAAiB,UAAU;;;KAO/B;;;;;cAWC,6BAA6B;WAKzB,QAAQ;WAJH;EAGd,YAAA,iBACS,QAAQ,8BACjB,UAAU;;;;;;;cAYL,4BAA4B;WAC5B;WACA;EAEG,YAAA,iBAAiB,UAAU;;;;;;;iBAW3B,aAAa;;iBAKb,oBACZ,gBACA,iBACA,UAAU,wBACX"}
@@ -149,6 +149,17 @@ var RevisionConflictError = class extends PreconditionFailedError {
149
149
  this.name = "RevisionConflictError";
150
150
  }
151
151
  };
152
+ /**
153
+ * The subaccount authorization is expired, replaced by a newer challenge, replayed,
154
+ * or otherwise invalid. Request a fresh challenge via `subaccounts.createChallenge`.
155
+ */
156
+ var SubaccountChallengeInvalidError = class extends PreconditionFailedError {
157
+ code = "SUBACCOUNT_CHALLENGE_INVALID";
158
+ constructor(message, options) {
159
+ super(message, options);
160
+ this.name = "SubaccountChallengeInvalidError";
161
+ }
162
+ };
152
163
  /** The policy cannot be removed while accounts or API keys still use it. */
153
164
  var PolicyInUseError = class extends PreconditionFailedError {
154
165
  code = "POLICY_IN_USE";
@@ -272,6 +283,6 @@ function errorFromHttpStatus(status, message, options) {
272
283
  return new NetworkError(message, options);
273
284
  }
274
285
  //#endregion
275
- export { AlreadyExistsError, AuthenticationError, ConfigurationError, InternalServerError, MfaEnrollmentRequiredError, MfaLastFactorRequiredError, MfaRequiredError, MfaVerificationError, NetworkError, PermissionError, PolicyInUseError, PolicyLockedError, PolicyScopeMismatchError, PolyesterError, PreconditionFailedError, RateLimitError, RequestError, ResourceNotFoundError, RevisionConflictError, ServiceUnavailableError, SessionElevationRequiredError, StaleQuoteError, StepUpRequiredError, TimeoutError, TransientError, ValidationError, errorFromHttpStatus, isAbortError, normalizeErrorMessage };
286
+ export { AlreadyExistsError, AuthenticationError, ConfigurationError, InternalServerError, MfaEnrollmentRequiredError, MfaLastFactorRequiredError, MfaRequiredError, MfaVerificationError, NetworkError, PermissionError, PolicyInUseError, PolicyLockedError, PolicyScopeMismatchError, PolyesterError, PreconditionFailedError, RateLimitError, RequestError, ResourceNotFoundError, RevisionConflictError, ServiceUnavailableError, SessionElevationRequiredError, StaleQuoteError, StepUpRequiredError, SubaccountChallengeInvalidError, TimeoutError, TransientError, ValidationError, errorFromHttpStatus, isAbortError, normalizeErrorMessage };
276
287
 
277
288
  //# sourceMappingURL=errors.js.map