@polyester/sdk 0.19.3 → 0.20.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/CHANGELOG.md +20 -0
- package/dist/gen/auth/v1/social_verification_pb.d.ts +4 -2
- package/dist/gen/auth/v1/social_verification_pb.d.ts.map +1 -1
- package/dist/gen/auth/v1/social_verification_pb.js.map +1 -1
- package/dist/gen/auth/v1/subaccounts_pb.d.ts +1 -1
- package/dist/gen/auth/v1/subaccounts_pb.js +1 -1
- package/dist/gen/chain/withdraw/v1/withdraw_pb.d.ts +290 -2
- package/dist/gen/chain/withdraw/v1/withdraw_pb.d.ts.map +1 -1
- package/dist/gen/chain/withdraw/v1/withdraw_pb.js +288 -9
- package/dist/gen/chain/withdraw/v1/withdraw_pb.js.map +1 -1
- package/dist/gen/index.d.ts +10 -10
- package/dist/gen/index.js +7 -7
- package/dist/gen/ledger/read/v1/ledger_read_pb.d.ts +1 -1
- package/dist/gen/ledger/read/v1/ledger_read_pb.js +1 -1
- package/dist/gen/orderbook/v1/orderbook_pb.d.ts +5 -3
- package/dist/gen/orderbook/v1/orderbook_pb.d.ts.map +1 -1
- package/dist/gen/orderbook/v1/orderbook_pb.js.map +1 -1
- package/dist/gen/orders/v1/orders_pb.d.ts +14 -6
- package/dist/gen/orders/v1/orders_pb.d.ts.map +1 -1
- package/dist/gen/orders/v1/orders_pb.js +7 -1
- package/dist/gen/orders/v1/orders_pb.js.map +1 -1
- package/dist/gen/orders/v1/orders_read_pb.d.ts +1 -1
- package/dist/gen/orders/v1/orders_read_pb.js +2 -2
- package/dist/gen/transfer/v1/internal_transfer_pb.d.ts +200 -2
- package/dist/gen/transfer/v1/internal_transfer_pb.d.ts.map +1 -1
- package/dist/gen/transfer/v1/internal_transfer_pb.js +193 -4
- package/dist/gen/transfer/v1/internal_transfer_pb.js.map +1 -1
- package/dist/gen/triggers/v1/triggers_pb.d.ts +47 -2
- package/dist/gen/triggers/v1/triggers_pb.d.ts.map +1 -1
- package/dist/gen/triggers/v1/triggers_pb.js +1 -1
- package/dist/gen/triggers/v1/triggers_pb.js.map +1 -1
- package/dist/index.d.ts +3 -3
- package/dist/index.js +1 -2
- package/dist/services/auth/profile/profile.js +1 -1
- package/dist/services/balances/balances.js +1 -1
- package/dist/services/balances/balances.schemas.js +1 -1
- package/dist/services/candles/candles.schemas.d.ts +10 -10
- package/dist/services/heatmap/heatmap.schemas.d.ts +13 -13
- package/dist/services/internal-transfers/internal-transfers.js +1 -1
- package/dist/services/lifecycle/lifecycle.schemas.d.ts +42 -42
- package/dist/services/market-overview/market-overview.js +1 -1
- package/dist/services/market-overview/market-overview.schemas.d.ts +3 -3
- package/dist/services/market-overview/market-overview.schemas.js +1 -1
- package/dist/services/orderbook/orderbook.schemas.d.ts +1 -1
- package/dist/services/orders/index.d.ts +1 -1
- package/dist/services/orders/order-errors.schemas.d.ts +1 -1
- package/dist/services/orders/orders-batch.schemas.d.ts +20 -20
- package/dist/services/orders/orders-batch.schemas.js +1 -1
- package/dist/services/orders/orders-input.schemas.d.ts +7 -7
- package/dist/services/orders/orders-input.schemas.js +2 -2
- package/dist/services/orders/orders-input.schemas.js.map +1 -1
- package/dist/services/orders/orders-output.schemas.d.ts +6 -6
- package/dist/services/orders/orders.d.ts +1 -1
- package/dist/services/orders/orders.d.ts.map +1 -1
- package/dist/services/orders/orders.js +5 -3
- package/dist/services/orders/orders.js.map +1 -1
- package/dist/services/orders/orders.schemas.d.ts +1 -1
- package/dist/services/orders/orders.types.d.ts +1 -1
- package/dist/services/subaccounts/subaccounts.schemas.d.ts +4 -4
- package/dist/services/trading-withdraws/trading-withdraws.d.ts +1 -1
- package/dist/services/trading-withdraws/trading-withdraws.js +1 -1
- package/dist/services/trading-withdraws/trading-withdraws.schemas.js +1 -1
- package/dist/services/transfers/transfers.js +1 -1
- package/dist/services/transfers/transfers.schemas.js +1 -1
- package/dist/services/triggers/trigger-child-order.schemas.js +25 -4
- package/dist/services/triggers/trigger-child-order.schemas.js.map +1 -1
- package/dist/services/triggers/trigger-input.schemas.d.ts +39 -3
- package/dist/services/triggers/trigger-input.schemas.d.ts.map +1 -1
- package/dist/services/triggers/trigger-input.schemas.js +3 -26
- package/dist/services/triggers/trigger-input.schemas.js.map +1 -1
- package/dist/services/triggers/triggers-output.schemas.d.ts +92 -17
- package/dist/services/triggers/triggers-output.schemas.d.ts.map +1 -1
- package/dist/services/triggers/triggers-output.schemas.js +36 -25
- package/dist/services/triggers/triggers-output.schemas.js.map +1 -1
- package/dist/shared/connect-error-mapping.d.ts.map +1 -1
- package/dist/shared/connect-error-mapping.js +50 -50
- package/dist/shared/connect-error-mapping.js.map +1 -1
- package/dist/shared/error-detail.d.ts +37 -0
- package/dist/shared/error-detail.d.ts.map +1 -0
- package/dist/shared/error-detail.js +106 -0
- package/dist/shared/error-detail.js.map +1 -0
- package/dist/shared/errors.d.ts +11 -6
- package/dist/shared/errors.d.ts.map +1 -1
- package/dist/shared/errors.js +3 -1
- package/dist/shared/errors.js.map +1 -1
- package/dist/utils/errors.d.ts.map +1 -1
- package/dist/utils/errors.js +1 -15
- package/dist/utils/errors.js.map +1 -1
- package/dist/wired-services.js +5 -5
- package/package.json +1 -1
- package/dist/utils/connect-order-errors.d.ts +0 -15
- package/dist/utils/connect-order-errors.d.ts.map +0 -1
- package/dist/utils/connect-order-errors.js +0 -41
- package/dist/utils/connect-order-errors.js.map +0 -1
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import { AuthErrorCode, AuthErrorDetailSchema } from "../gen/auth/v1/auth_pb.js";
|
|
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";
|
|
8
|
+
import { OrderErrorDetailSchema } from "../services/orders/order-errors.schemas.js";
|
|
9
|
+
import { create, fromBinary } from "@bufbuild/protobuf";
|
|
10
|
+
import * as v from "valibot";
|
|
11
|
+
//#region src/shared/error-detail.ts
|
|
12
|
+
function codeName(codes, code) {
|
|
13
|
+
if (typeof code !== "number") return void 0;
|
|
14
|
+
const name = codes[code];
|
|
15
|
+
return typeof name === "string" ? name : void 0;
|
|
16
|
+
}
|
|
17
|
+
function decodeDetail(detail, schema) {
|
|
18
|
+
try {
|
|
19
|
+
if ("desc" in detail) return create(schema, detail.value);
|
|
20
|
+
return fromBinary(schema, detail.value);
|
|
21
|
+
} catch {
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
/** Decodes the first valid backend rejection detail, preserving wire-detail order. */
|
|
26
|
+
function parseConnectErrorDetail(error) {
|
|
27
|
+
for (const raw of error.details) switch ("desc" in raw ? raw.desc.typeName : raw.type) {
|
|
28
|
+
case AuthErrorDetailSchema.typeName: {
|
|
29
|
+
const auth = decodeDetail(raw, AuthErrorDetailSchema);
|
|
30
|
+
if (!auth) break;
|
|
31
|
+
const code = codeName(AuthErrorCode, auth.code);
|
|
32
|
+
if (code) return {
|
|
33
|
+
service: "auth",
|
|
34
|
+
code,
|
|
35
|
+
message: auth.message
|
|
36
|
+
};
|
|
37
|
+
break;
|
|
38
|
+
}
|
|
39
|
+
case ProfileErrorDetailSchema.typeName: {
|
|
40
|
+
const profile = decodeDetail(raw, ProfileErrorDetailSchema);
|
|
41
|
+
if (!profile) break;
|
|
42
|
+
const code = codeName(ProfileErrorCode, profile.code);
|
|
43
|
+
if (code) return {
|
|
44
|
+
service: "profile",
|
|
45
|
+
code,
|
|
46
|
+
field: profile.field,
|
|
47
|
+
message: profile.message
|
|
48
|
+
};
|
|
49
|
+
break;
|
|
50
|
+
}
|
|
51
|
+
case ErrorDetailSchema$3.typeName: {
|
|
52
|
+
const order = decodeDetail(raw, ErrorDetailSchema$3);
|
|
53
|
+
if (!order) break;
|
|
54
|
+
const parsed = v.safeParse(OrderErrorDetailSchema, order);
|
|
55
|
+
if (parsed.success) return {
|
|
56
|
+
service: "orders",
|
|
57
|
+
...parsed.output
|
|
58
|
+
};
|
|
59
|
+
break;
|
|
60
|
+
}
|
|
61
|
+
case ErrorDetailSchema.typeName: {
|
|
62
|
+
const withdraw = decodeDetail(raw, ErrorDetailSchema);
|
|
63
|
+
if (!withdraw) break;
|
|
64
|
+
const code = codeName(ErrorCode, withdraw.code);
|
|
65
|
+
if (code) return {
|
|
66
|
+
service: "withdraw",
|
|
67
|
+
code
|
|
68
|
+
};
|
|
69
|
+
break;
|
|
70
|
+
}
|
|
71
|
+
case ErrorDetailSchema$4.typeName: {
|
|
72
|
+
const transfer = decodeDetail(raw, ErrorDetailSchema$4);
|
|
73
|
+
if (!transfer) break;
|
|
74
|
+
const code = codeName(ErrorCode$3, transfer.code);
|
|
75
|
+
if (code) return {
|
|
76
|
+
service: "internal_transfer",
|
|
77
|
+
code
|
|
78
|
+
};
|
|
79
|
+
break;
|
|
80
|
+
}
|
|
81
|
+
case ErrorDetailSchema$1.typeName: {
|
|
82
|
+
const ledger = decodeDetail(raw, ErrorDetailSchema$1);
|
|
83
|
+
if (!ledger) break;
|
|
84
|
+
const code = codeName(ErrorCode$1, ledger.code);
|
|
85
|
+
if (code) return {
|
|
86
|
+
service: "ledger",
|
|
87
|
+
code
|
|
88
|
+
};
|
|
89
|
+
break;
|
|
90
|
+
}
|
|
91
|
+
case ErrorDetailSchema$2.typeName: {
|
|
92
|
+
const marketOverview = decodeDetail(raw, ErrorDetailSchema$2);
|
|
93
|
+
if (!marketOverview) break;
|
|
94
|
+
const code = codeName(ErrorCode$2, marketOverview.code);
|
|
95
|
+
if (code) return {
|
|
96
|
+
service: "market_overview",
|
|
97
|
+
code
|
|
98
|
+
};
|
|
99
|
+
break;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
//#endregion
|
|
104
|
+
export { parseConnectErrorDetail };
|
|
105
|
+
|
|
106
|
+
//# sourceMappingURL=error-detail.js.map
|
|
@@ -0,0 +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"}
|
package/dist/shared/errors.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { PolyesterErrorDetail } from "./error-detail.js";
|
|
1
2
|
import { RateLimitDetail } from "./rate-limit.schemas.js";
|
|
2
3
|
//#region src/shared/errors.d.ts
|
|
3
4
|
/**
|
|
@@ -16,21 +17,22 @@ import { RateLimitDetail } from "./rate-limit.schemas.js";
|
|
|
16
17
|
* │ └── ServiceUnavailableError SERVICE_UNAVAILABLE true
|
|
17
18
|
* ├── RequestError REQUEST_FAILED false
|
|
18
19
|
* │ ├── ValidationError VALIDATION_FAILED false
|
|
20
|
+
* │ │ ├── StaleQuoteError STALE_QUOTE
|
|
21
|
+
* │ │ └── PolicyScopeMismatchError POLICY_SCOPE_MISMATCH
|
|
19
22
|
* │ ├── ResourceNotFoundError RESOURCE_NOT_FOUND false
|
|
20
23
|
* │ ├── AlreadyExistsError ALREADY_EXISTS false
|
|
21
24
|
* │ ├── PermissionError PERMISSION_DENIED false
|
|
22
25
|
* │ ├── AuthenticationError UNAUTHENTICATED false
|
|
23
26
|
* │ ├── PreconditionFailedError PRECONDITION_FAILED false
|
|
24
|
-
* │ │ ├── RevisionConflictError
|
|
25
|
-
* │ │ ├── PolicyInUseError
|
|
26
|
-
* │ │
|
|
27
|
-
* │
|
|
27
|
+
* │ │ ├── RevisionConflictError REVISION_CONFLICT
|
|
28
|
+
* │ │ ├── PolicyInUseError POLICY_IN_USE
|
|
29
|
+
* │ │ ├── PolicyLockedError POLICY_LOCKED
|
|
30
|
+
* │ │ └── MfaLastFactorRequiredError MFA_LAST_FACTOR_REQUIRED
|
|
28
31
|
* │ ├── ConfigurationError INVALID_CONFIGURATION false
|
|
29
32
|
* │ ├── MfaRequiredError MFA_REQUIRED false
|
|
30
33
|
* │ │ ├── MfaEnrollmentRequiredError MFA_ENROLLMENT_REQUIRED
|
|
31
34
|
* │ │ ├── StepUpRequiredError STEP_UP_REQUIRED
|
|
32
35
|
* │ │ └── SessionElevationRequiredError SESSION_ELEVATION_REQUIRED
|
|
33
|
-
* │ ├── MfaLastFactorRequiredError MFA_LAST_FACTOR_REQUIRED false
|
|
34
36
|
* │ └── MfaVerificationError MFA_VERIFICATION_FAILED false
|
|
35
37
|
* └── InternalServerError INTERNAL_SERVER_ERROR false
|
|
36
38
|
* ```
|
|
@@ -57,6 +59,8 @@ type PolyesterErrorCode = "TRANSIENT_FAILURE" | "NETWORK_ERROR" | "TIMEOUT" | "R
|
|
|
57
59
|
interface PolyesterErrorOptions {
|
|
58
60
|
/** Underlying error, typically the original `ConnectError` for RPC failures. */
|
|
59
61
|
cause?: unknown;
|
|
62
|
+
/** Recognized structured backend rejection, decoded at the RPC boundary. */
|
|
63
|
+
detail?: PolyesterErrorDetail;
|
|
60
64
|
}
|
|
61
65
|
declare function normalizeErrorMessage(message: string): string;
|
|
62
66
|
/**
|
|
@@ -71,6 +75,7 @@ declare abstract class PolyesterError extends Error {
|
|
|
71
75
|
abstract readonly code: string;
|
|
72
76
|
/** Whether retrying the same operation may succeed. */
|
|
73
77
|
abstract readonly retryable: boolean;
|
|
78
|
+
readonly detail: PolyesterErrorDetail | undefined;
|
|
74
79
|
constructor(message: string, options?: PolyesterErrorOptions);
|
|
75
80
|
}
|
|
76
81
|
/**
|
|
@@ -243,5 +248,5 @@ declare function isAbortError(err: unknown): boolean;
|
|
|
243
248
|
/** Maps a plain HTTP status code onto the SDK error tree. */
|
|
244
249
|
declare function errorFromHttpStatus(status: number, message: string, options?: PolyesterErrorOptions): PolyesterError;
|
|
245
250
|
//#endregion
|
|
246
|
-
export { AlreadyExistsError, AuthenticationError, ConfigurationError, InternalServerError, MfaEnrollmentRequiredError, MfaLastFactorRequiredError, MfaRequiredError, MfaVerificationError, MfaVerificationFailureReason, NetworkError, PermissionError, PolicyInUseError, PolicyLockedError, PolicyScopeMismatchError, PolyesterError, PolyesterErrorCode, PolyesterErrorOptions, PreconditionFailedError, RateLimitError, RateLimitErrorOptions, RequestError, ResourceNotFoundError, RevisionConflictError, ServiceUnavailableError, SessionElevationRequiredError, StaleQuoteError, StepUpRequiredError, TimeoutError, TransientError, ValidationError, errorFromHttpStatus, isAbortError, normalizeErrorMessage };
|
|
251
|
+
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 };
|
|
247
252
|
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.d.ts","names":[],"sources":["../../src/shared/errors.ts"],"mappings":"
|
|
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;;;;;;;cAc9B,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"}
|
package/dist/shared/errors.js
CHANGED
|
@@ -10,10 +10,12 @@ function normalizeErrorMessage(message) {
|
|
|
10
10
|
* same call can be safely retried, and switch on `code` for exhaustive,
|
|
11
11
|
* minification-safe handling.
|
|
12
12
|
*/
|
|
13
|
-
var PolyesterError = class extends Error {
|
|
13
|
+
var PolyesterError = class PolyesterError extends Error {
|
|
14
|
+
detail;
|
|
14
15
|
constructor(message, options) {
|
|
15
16
|
super(normalizeErrorMessage(message), options);
|
|
16
17
|
this.name = "PolyesterError";
|
|
18
|
+
this.detail = options?.detail ?? (options?.cause instanceof PolyesterError ? options.cause.detail : void 0);
|
|
17
19
|
}
|
|
18
20
|
};
|
|
19
21
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.js","names":[],"sources":["../../src/shared/errors.ts"],"sourcesContent":["import type { RateLimitDetail } from \"./rate-limit.schemas.js\";\n\n/**\n * Typed error hierarchy for the Polyester SDK.\n *\n * Every error raised by the SDK extends {@link PolyesterError}, which carries a\n * stable machine-readable `code` and a `retryable` flag. The tree splits on\n * retryability so callers can triage with a single `instanceof` check:\n *\n * ```\n * PolyesterError code retryable\n * ├── TransientError TRANSIENT_FAILURE true\n * │ ├── NetworkError NETWORK_ERROR true\n * │ ├── TimeoutError TIMEOUT true\n * │ ├── RateLimitError RATE_LIMITED true\n * │ └── ServiceUnavailableError SERVICE_UNAVAILABLE true\n * ├── RequestError REQUEST_FAILED false\n * │ ├── ValidationError VALIDATION_FAILED false\n * │ ├── ResourceNotFoundError RESOURCE_NOT_FOUND false\n * │ ├── AlreadyExistsError ALREADY_EXISTS false\n * │ ├── PermissionError PERMISSION_DENIED false\n * │ ├── AuthenticationError UNAUTHENTICATED false\n * │ ├── PreconditionFailedError PRECONDITION_FAILED false\n * │ │ ├── RevisionConflictError REVISION_CONFLICT\n * │ │ ├── PolicyInUseError POLICY_IN_USE\n * │ │ └── PolicyLockedError POLICY_LOCKED\n * │ ├── PolicyScopeMismatchError POLICY_SCOPE_MISMATCH false\n * │ ├── ConfigurationError INVALID_CONFIGURATION false\n * │ ├── MfaRequiredError MFA_REQUIRED false\n * │ │ ├── MfaEnrollmentRequiredError MFA_ENROLLMENT_REQUIRED\n * │ │ ├── StepUpRequiredError STEP_UP_REQUIRED\n * │ │ └── SessionElevationRequiredError SESSION_ELEVATION_REQUIRED\n * │ ├── MfaLastFactorRequiredError MFA_LAST_FACTOR_REQUIRED false\n * │ └── MfaVerificationError MFA_VERIFICATION_FAILED false\n * └── InternalServerError INTERNAL_SERVER_ERROR false\n * ```\n *\n * Catalog errors (`CatalogLookupError`, `CatalogConversionError`, …) plug into\n * the same tree under `RequestError`/`ValidationError`.\n *\n * Errors mapped from RPC failures keep the original `ConnectError` as `cause`.\n *\n * @example\n * ```ts\n * try {\n * await client.orders.createSpotOrder(input);\n * } catch (err) {\n * if (err instanceof RateLimitError) await sleep(err.retryAfterMs ?? 1000);\n * else if (err instanceof TransientError) retry();\n * else if (err instanceof StepUpRequiredError) promptForMfa();\n * else throw err;\n * }\n * ```\n */\n\n/** Stable machine-readable codes carried by built-in SDK errors. */\nexport type PolyesterErrorCode =\n | \"TRANSIENT_FAILURE\"\n | \"NETWORK_ERROR\"\n | \"TIMEOUT\"\n | \"RATE_LIMITED\"\n | \"SERVICE_UNAVAILABLE\"\n | \"REQUEST_FAILED\"\n | \"VALIDATION_FAILED\"\n | \"STALE_QUOTE\"\n | \"RESOURCE_NOT_FOUND\"\n | \"ALREADY_EXISTS\"\n | \"PERMISSION_DENIED\"\n | \"UNAUTHENTICATED\"\n | \"PRECONDITION_FAILED\"\n | \"REVISION_CONFLICT\"\n | \"POLICY_IN_USE\"\n | \"POLICY_LOCKED\"\n | \"POLICY_SCOPE_MISMATCH\"\n | \"INVALID_CONFIGURATION\"\n | \"MFA_REQUIRED\"\n | \"MFA_ENROLLMENT_REQUIRED\"\n | \"STEP_UP_REQUIRED\"\n | \"SESSION_ELEVATION_REQUIRED\"\n | \"MFA_LAST_FACTOR_REQUIRED\"\n | \"MFA_VERIFICATION_FAILED\"\n | \"INTERNAL_SERVER_ERROR\"\n | \"CATALOG_LOOKUP_MISS\"\n | \"CATALOG_NOT_READY\"\n | \"CATALOG_CONVERSION_INVALID\"\n | \"CATALOG_VALIDATION_FAILED\";\n\nexport interface PolyesterErrorOptions {\n /** Underlying error, typically the original `ConnectError` for RPC failures. */\n cause?: unknown;\n}\n\nconst CONNECT_ERROR_PREFIX_RE = /^(?:\\[[a-z][a-z0-9_-]*]\\s*)+/i;\n\nexport function normalizeErrorMessage(message: string): string {\n return message.replace(CONNECT_ERROR_PREFIX_RE, \"\").trim();\n}\n\n/**\n * Base class for every error raised by the Polyester SDK.\n *\n * Check `retryable` (or `instanceof TransientError`) to decide whether the\n * same call can be safely retried, and switch on `code` for exhaustive,\n * minification-safe handling.\n */\nexport abstract class PolyesterError extends Error {\n /** Stable machine-readable error code, e.g. `\"RATE_LIMITED\"`. */\n abstract readonly code: string;\n /** Whether retrying the same operation may succeed. */\n abstract readonly retryable: boolean;\n\n constructor(message: string, options?: PolyesterErrorOptions) {\n super(normalizeErrorMessage(message), options);\n this.name = \"PolyesterError\";\n }\n}\n\n/**\n * A transient failure — the request may never have reached the backend or the\n * backend was temporarily unable to serve it. Safe to retry (use the same\n * `requestId`/`clientOrderId` for mutations; the backend dedupes).\n */\nexport class TransientError extends PolyesterError {\n readonly code: string = \"TRANSIENT_FAILURE\";\n readonly retryable = true;\n\n constructor(message: string, options?: PolyesterErrorOptions) {\n super(message, options);\n this.name = \"TransientError\";\n }\n}\n\n/** The request could not be sent or the connection failed mid-flight. */\nexport class NetworkError extends TransientError {\n override readonly code: string = \"NETWORK_ERROR\";\n\n constructor(message: string, options?: PolyesterErrorOptions) {\n super(message, options);\n this.name = \"NetworkError\";\n }\n}\n\n/** The request timed out before the backend produced a response. */\nexport class TimeoutError extends TransientError {\n override readonly code: string = \"TIMEOUT\";\n\n constructor(message: string, options?: PolyesterErrorOptions) {\n super(message, options);\n this.name = \"TimeoutError\";\n }\n}\n\nexport interface RateLimitErrorOptions extends PolyesterErrorOptions {\n /** Suggested wait before retrying, when the backend provided one. */\n retryAfterMs?: number;\n /** Structured quota state attached to the rejection, when provided. */\n rateLimit?: RateLimitDetail;\n}\n\n/** The backend rejected the request due to rate limiting. */\nexport class RateLimitError extends TransientError {\n override readonly code: string = \"RATE_LIMITED\";\n /** Suggested wait before retrying, in milliseconds, when known. */\n readonly retryAfterMs?: number;\n /** Structured quota state attached to the rejection, when provided. */\n readonly rateLimit?: RateLimitDetail;\n\n constructor(message: string, options?: RateLimitErrorOptions) {\n super(message, options);\n this.name = \"RateLimitError\";\n this.retryAfterMs = options?.retryAfterMs;\n this.rateLimit = options?.rateLimit;\n }\n}\n\n/** The backend is temporarily unavailable (e.g. overloaded or restarting). */\nexport class ServiceUnavailableError extends TransientError {\n override readonly code: string = \"SERVICE_UNAVAILABLE\";\n\n constructor(message: string, options?: PolyesterErrorOptions) {\n super(message, options);\n this.name = \"ServiceUnavailableError\";\n }\n}\n\n/**\n * The request itself was rejected — retrying the identical call will fail the\n * same way. Fix the input, authentication, or permissions first.\n */\nexport class RequestError extends PolyesterError {\n readonly code: string = \"REQUEST_FAILED\";\n readonly retryable = false;\n\n constructor(message: string, options?: PolyesterErrorOptions) {\n super(message, options);\n this.name = \"RequestError\";\n }\n}\n\n/** The request input failed validation (client- or server-side). */\nexport class ValidationError extends RequestError {\n override readonly code: string = \"VALIDATION_FAILED\";\n\n constructor(message: string, options?: PolyesterErrorOptions) {\n super(message, options);\n this.name = \"ValidationError\";\n }\n}\n\n/** The submitted client reference quote exceeded the market's configured drift limit. */\nexport class StaleQuoteError extends ValidationError {\n override readonly code = \"STALE_QUOTE\" as const;\n\n constructor(message: string, options?: PolyesterErrorOptions) {\n super(message, options);\n this.name = \"StaleQuoteError\";\n }\n}\n\n/** The requested resource does not exist (or is not visible to the caller). */\nexport class ResourceNotFoundError extends RequestError {\n override readonly code: string = \"RESOURCE_NOT_FOUND\";\n\n constructor(message: string, options?: PolyesterErrorOptions) {\n super(message, options);\n this.name = \"ResourceNotFoundError\";\n }\n}\n\n/** The resource already exists (e.g. a duplicate `clientOrderId`). */\nexport class AlreadyExistsError extends RequestError {\n override readonly code: string = \"ALREADY_EXISTS\";\n\n constructor(message: string, options?: PolyesterErrorOptions) {\n super(message, options);\n this.name = \"AlreadyExistsError\";\n }\n}\n\n/** The caller is authenticated but not allowed to perform this operation. */\nexport class PermissionError extends RequestError {\n override readonly code: string = \"PERMISSION_DENIED\";\n\n constructor(message: string, options?: PolyesterErrorOptions) {\n super(message, options);\n this.name = \"PermissionError\";\n }\n}\n\n/** The caller is not authenticated (missing, expired, or invalid credentials). */\nexport class AuthenticationError extends RequestError {\n override readonly code: string = \"UNAUTHENTICATED\";\n\n constructor(message: string, options?: PolyesterErrorOptions) {\n super(message, options);\n this.name = \"AuthenticationError\";\n }\n}\n\n/** The system is not in a state that allows this operation (e.g. insufficient balance). */\nexport class PreconditionFailedError extends RequestError {\n override readonly code: string = \"PRECONDITION_FAILED\";\n\n constructor(message: string, options?: PolyesterErrorOptions) {\n super(message, options);\n this.name = \"PreconditionFailedError\";\n }\n}\n\n/**\n * The resource changed after it was read, so the submitted expected revision\n * is stale. Refetch and let the caller reconcile; do not blindly retry.\n */\nexport class RevisionConflictError extends PreconditionFailedError {\n override readonly code: string = \"REVISION_CONFLICT\";\n\n constructor(message: string, options?: PolyesterErrorOptions) {\n super(message, options);\n this.name = \"RevisionConflictError\";\n }\n}\n\n/** The policy cannot be removed while accounts or API keys still use it. */\nexport class PolicyInUseError extends PreconditionFailedError {\n override readonly code: string = \"POLICY_IN_USE\";\n\n constructor(message: string, options?: PolyesterErrorOptions) {\n super(message, options);\n this.name = \"PolicyInUseError\";\n }\n}\n\n/** The policy is locked against the requested mutation. */\nexport class PolicyLockedError extends PreconditionFailedError {\n override readonly code: string = \"POLICY_LOCKED\";\n\n constructor(message: string, options?: PolyesterErrorOptions) {\n super(message, options);\n this.name = \"PolicyLockedError\";\n }\n}\n\n/** The policy does not belong to the account scope targeted by the request. */\nexport class PolicyScopeMismatchError extends ValidationError {\n override readonly code: string = \"POLICY_SCOPE_MISMATCH\";\n\n constructor(message: string, options?: PolyesterErrorOptions) {\n super(message, options);\n this.name = \"PolicyScopeMismatchError\";\n }\n}\n\n/** The SDK was configured incorrectly (bad environment, missing credentials, …). */\nexport class ConfigurationError extends RequestError {\n override readonly code: string = \"INVALID_CONFIGURATION\";\n\n constructor(message: string, options?: PolyesterErrorOptions) {\n super(message, options);\n this.name = \"ConfigurationError\";\n }\n}\n\n/**\n * The operation requires additional multi-factor authentication. Catch this\n * class to handle all MFA flows, or the subclasses to branch per flow.\n */\nexport class MfaRequiredError extends RequestError {\n override readonly code: string = \"MFA_REQUIRED\";\n\n constructor(message: string, options?: PolyesterErrorOptions) {\n super(message, options);\n this.name = \"MfaRequiredError\";\n }\n}\n\n/** The user must enroll in MFA before this operation can proceed. */\nexport class MfaEnrollmentRequiredError extends MfaRequiredError {\n override readonly code: string = \"MFA_ENROLLMENT_REQUIRED\";\n\n constructor(message: string, options?: PolyesterErrorOptions) {\n super(message, options);\n this.name = \"MfaEnrollmentRequiredError\";\n }\n}\n\n/** The operation requires a fresh MFA step-up proof (retry with `X-Auth-Step-Up`). */\nexport class StepUpRequiredError extends MfaRequiredError {\n override readonly code: string = \"STEP_UP_REQUIRED\";\n\n constructor(message: string, options?: PolyesterErrorOptions) {\n super(message, options);\n this.name = \"StepUpRequiredError\";\n }\n}\n\n/** The operation requires a recent MFA-elevated session, not a one-use step-up proof. */\nexport class SessionElevationRequiredError extends MfaRequiredError {\n override readonly code: string = \"SESSION_ELEVATION_REQUIRED\";\n\n constructor(message: string, options?: PolyesterErrorOptions) {\n super(message, options);\n this.name = \"SessionElevationRequiredError\";\n }\n}\n\n/** The requested deletion would leave the account without an active MFA factor. */\nexport class MfaLastFactorRequiredError extends PreconditionFailedError {\n override readonly code: string = \"MFA_LAST_FACTOR_REQUIRED\";\n\n constructor(message: string, options?: PolyesterErrorOptions) {\n super(message, options);\n this.name = \"MfaLastFactorRequiredError\";\n }\n}\n\n/** The reason an MFA challenge could not be completed. */\nexport type MfaVerificationFailureReason =\n | \"challenge-invalid\"\n | \"challenge-locked\"\n | \"otp-invalid\"\n | \"recovery-code-invalid\"\n | \"passkey-invalid\";\n\n/**\n * An expected MFA verification rejection. Callers should select their own\n * user-facing copy from `reason` instead of displaying the backend message.\n */\nexport class MfaVerificationError extends RequestError {\n override readonly code: string = \"MFA_VERIFICATION_FAILED\";\n\n constructor(\n message: string,\n readonly reason: MfaVerificationFailureReason,\n options?: PolyesterErrorOptions,\n ) {\n super(message, options);\n this.name = \"MfaVerificationError\";\n }\n}\n\n/**\n * The backend failed unexpectedly or returned a malformed response. Not\n * automatically retryable — the failure may recur and mutations may have\n * partially applied.\n */\nexport class InternalServerError extends PolyesterError {\n readonly code: string = \"INTERNAL_SERVER_ERROR\";\n readonly retryable = false;\n\n constructor(message: string, options?: PolyesterErrorOptions) {\n super(message, options);\n this.name = \"InternalServerError\";\n }\n}\n\n/**\n * Checks whether an error represents an aborted request (caller-initiated via\n * `AbortSignal`). Aborts are intentionally NOT part of the {@link PolyesterError}\n * tree and are never retryable.\n */\nexport function isAbortError(err: unknown): boolean {\n return err instanceof DOMException && err.name === \"AbortError\";\n}\n\n/** Maps a plain HTTP status code onto the SDK error tree. */\nexport function errorFromHttpStatus(\n status: number,\n message: string,\n options?: PolyesterErrorOptions,\n): PolyesterError {\n if (status === 401) return new AuthenticationError(message, options);\n if (status === 403) return new PermissionError(message, options);\n if (status === 404) return new ResourceNotFoundError(message, options);\n if (status === 408) return new TimeoutError(message, options);\n if (status === 409) return new AlreadyExistsError(message, options);\n if (status === 429) return new RateLimitError(message, options);\n if (status === 502 || status === 503 || status === 504) {\n return new ServiceUnavailableError(message, options);\n }\n if (status >= 500) return new InternalServerError(message, options);\n if (status >= 400) return new RequestError(message, options);\n return new NetworkError(message, options);\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"errors.js","names":[],"sources":["../../src/shared/errors.ts"],"sourcesContent":["import type { PolyesterErrorDetail } from \"./error-detail.js\";\nexport type { PolyesterErrorDetail } from \"./error-detail.js\";\nimport type { RateLimitDetail } from \"./rate-limit.schemas.js\";\n\n/**\n * Typed error hierarchy for the Polyester SDK.\n *\n * Every error raised by the SDK extends {@link PolyesterError}, which carries a\n * stable machine-readable `code` and a `retryable` flag. The tree splits on\n * retryability so callers can triage with a single `instanceof` check:\n *\n * ```\n * PolyesterError code retryable\n * ├── TransientError TRANSIENT_FAILURE true\n * │ ├── NetworkError NETWORK_ERROR true\n * │ ├── TimeoutError TIMEOUT true\n * │ ├── RateLimitError RATE_LIMITED true\n * │ └── ServiceUnavailableError SERVICE_UNAVAILABLE true\n * ├── RequestError REQUEST_FAILED false\n * │ ├── ValidationError VALIDATION_FAILED false\n * │ │ ├── StaleQuoteError STALE_QUOTE\n * │ │ └── PolicyScopeMismatchError POLICY_SCOPE_MISMATCH\n * │ ├── ResourceNotFoundError RESOURCE_NOT_FOUND false\n * │ ├── AlreadyExistsError ALREADY_EXISTS false\n * │ ├── PermissionError PERMISSION_DENIED false\n * │ ├── AuthenticationError UNAUTHENTICATED false\n * │ ├── PreconditionFailedError PRECONDITION_FAILED false\n * │ │ ├── RevisionConflictError REVISION_CONFLICT\n * │ │ ├── PolicyInUseError POLICY_IN_USE\n * │ │ ├── PolicyLockedError POLICY_LOCKED\n * │ │ └── MfaLastFactorRequiredError MFA_LAST_FACTOR_REQUIRED\n * │ ├── ConfigurationError INVALID_CONFIGURATION false\n * │ ├── MfaRequiredError MFA_REQUIRED false\n * │ │ ├── MfaEnrollmentRequiredError MFA_ENROLLMENT_REQUIRED\n * │ │ ├── StepUpRequiredError STEP_UP_REQUIRED\n * │ │ └── SessionElevationRequiredError SESSION_ELEVATION_REQUIRED\n * │ └── MfaVerificationError MFA_VERIFICATION_FAILED false\n * └── InternalServerError INTERNAL_SERVER_ERROR false\n * ```\n *\n * Catalog errors (`CatalogLookupError`, `CatalogConversionError`, …) plug into\n * the same tree under `RequestError`/`ValidationError`.\n *\n * Errors mapped from RPC failures keep the original `ConnectError` as `cause`.\n *\n * @example\n * ```ts\n * try {\n * await client.orders.createSpotOrder(input);\n * } catch (err) {\n * if (err instanceof RateLimitError) await sleep(err.retryAfterMs ?? 1000);\n * else if (err instanceof TransientError) retry();\n * else if (err instanceof StepUpRequiredError) promptForMfa();\n * else throw err;\n * }\n * ```\n */\n\n/** Stable machine-readable codes carried by built-in SDK errors. */\nexport type PolyesterErrorCode =\n | \"TRANSIENT_FAILURE\"\n | \"NETWORK_ERROR\"\n | \"TIMEOUT\"\n | \"RATE_LIMITED\"\n | \"SERVICE_UNAVAILABLE\"\n | \"REQUEST_FAILED\"\n | \"VALIDATION_FAILED\"\n | \"STALE_QUOTE\"\n | \"RESOURCE_NOT_FOUND\"\n | \"ALREADY_EXISTS\"\n | \"PERMISSION_DENIED\"\n | \"UNAUTHENTICATED\"\n | \"PRECONDITION_FAILED\"\n | \"REVISION_CONFLICT\"\n | \"POLICY_IN_USE\"\n | \"POLICY_LOCKED\"\n | \"POLICY_SCOPE_MISMATCH\"\n | \"INVALID_CONFIGURATION\"\n | \"MFA_REQUIRED\"\n | \"MFA_ENROLLMENT_REQUIRED\"\n | \"STEP_UP_REQUIRED\"\n | \"SESSION_ELEVATION_REQUIRED\"\n | \"MFA_LAST_FACTOR_REQUIRED\"\n | \"MFA_VERIFICATION_FAILED\"\n | \"INTERNAL_SERVER_ERROR\"\n | \"CATALOG_LOOKUP_MISS\"\n | \"CATALOG_NOT_READY\"\n | \"CATALOG_CONVERSION_INVALID\"\n | \"CATALOG_VALIDATION_FAILED\";\n\nexport interface PolyesterErrorOptions {\n /** Underlying error, typically the original `ConnectError` for RPC failures. */\n cause?: unknown;\n /** Recognized structured backend rejection, decoded at the RPC boundary. */\n detail?: PolyesterErrorDetail;\n}\n\nconst CONNECT_ERROR_PREFIX_RE = /^(?:\\[[a-z][a-z0-9_-]*]\\s*)+/i;\n\nexport function normalizeErrorMessage(message: string): string {\n return message.replace(CONNECT_ERROR_PREFIX_RE, \"\").trim();\n}\n\n/**\n * Base class for every error raised by the Polyester SDK.\n *\n * Check `retryable` (or `instanceof TransientError`) to decide whether the\n * same call can be safely retried, and switch on `code` for exhaustive,\n * minification-safe handling.\n */\nexport abstract class PolyesterError extends Error {\n /** Stable machine-readable error code, e.g. `\"RATE_LIMITED\"`. */\n abstract readonly code: string;\n /** Whether retrying the same operation may succeed. */\n abstract readonly retryable: boolean;\n readonly detail: PolyesterErrorDetail | undefined;\n\n constructor(message: string, options?: PolyesterErrorOptions) {\n super(normalizeErrorMessage(message), options);\n this.name = \"PolyesterError\";\n this.detail =\n options?.detail ??\n (options?.cause instanceof PolyesterError ? options.cause.detail : undefined);\n }\n}\n\n/**\n * A transient failure — the request may never have reached the backend or the\n * backend was temporarily unable to serve it. Safe to retry (use the same\n * `requestId`/`clientOrderId` for mutations; the backend dedupes).\n */\nexport class TransientError extends PolyesterError {\n readonly code: string = \"TRANSIENT_FAILURE\";\n readonly retryable = true;\n\n constructor(message: string, options?: PolyesterErrorOptions) {\n super(message, options);\n this.name = \"TransientError\";\n }\n}\n\n/** The request could not be sent or the connection failed mid-flight. */\nexport class NetworkError extends TransientError {\n override readonly code: string = \"NETWORK_ERROR\";\n\n constructor(message: string, options?: PolyesterErrorOptions) {\n super(message, options);\n this.name = \"NetworkError\";\n }\n}\n\n/** The request timed out before the backend produced a response. */\nexport class TimeoutError extends TransientError {\n override readonly code: string = \"TIMEOUT\";\n\n constructor(message: string, options?: PolyesterErrorOptions) {\n super(message, options);\n this.name = \"TimeoutError\";\n }\n}\n\nexport interface RateLimitErrorOptions extends PolyesterErrorOptions {\n /** Suggested wait before retrying, when the backend provided one. */\n retryAfterMs?: number;\n /** Structured quota state attached to the rejection, when provided. */\n rateLimit?: RateLimitDetail;\n}\n\n/** The backend rejected the request due to rate limiting. */\nexport class RateLimitError extends TransientError {\n override readonly code: string = \"RATE_LIMITED\";\n /** Suggested wait before retrying, in milliseconds, when known. */\n readonly retryAfterMs?: number;\n /** Structured quota state attached to the rejection, when provided. */\n readonly rateLimit?: RateLimitDetail;\n\n constructor(message: string, options?: RateLimitErrorOptions) {\n super(message, options);\n this.name = \"RateLimitError\";\n this.retryAfterMs = options?.retryAfterMs;\n this.rateLimit = options?.rateLimit;\n }\n}\n\n/** The backend is temporarily unavailable (e.g. overloaded or restarting). */\nexport class ServiceUnavailableError extends TransientError {\n override readonly code: string = \"SERVICE_UNAVAILABLE\";\n\n constructor(message: string, options?: PolyesterErrorOptions) {\n super(message, options);\n this.name = \"ServiceUnavailableError\";\n }\n}\n\n/**\n * The request itself was rejected — retrying the identical call will fail the\n * same way. Fix the input, authentication, or permissions first.\n */\nexport class RequestError extends PolyesterError {\n readonly code: string = \"REQUEST_FAILED\";\n readonly retryable = false;\n\n constructor(message: string, options?: PolyesterErrorOptions) {\n super(message, options);\n this.name = \"RequestError\";\n }\n}\n\n/** The request input failed validation (client- or server-side). */\nexport class ValidationError extends RequestError {\n override readonly code: string = \"VALIDATION_FAILED\";\n\n constructor(message: string, options?: PolyesterErrorOptions) {\n super(message, options);\n this.name = \"ValidationError\";\n }\n}\n\n/** The submitted client reference quote exceeded the market's configured drift limit. */\nexport class StaleQuoteError extends ValidationError {\n override readonly code = \"STALE_QUOTE\" as const;\n\n constructor(message: string, options?: PolyesterErrorOptions) {\n super(message, options);\n this.name = \"StaleQuoteError\";\n }\n}\n\n/** The requested resource does not exist (or is not visible to the caller). */\nexport class ResourceNotFoundError extends RequestError {\n override readonly code: string = \"RESOURCE_NOT_FOUND\";\n\n constructor(message: string, options?: PolyesterErrorOptions) {\n super(message, options);\n this.name = \"ResourceNotFoundError\";\n }\n}\n\n/** The resource already exists (e.g. a duplicate `clientOrderId`). */\nexport class AlreadyExistsError extends RequestError {\n override readonly code: string = \"ALREADY_EXISTS\";\n\n constructor(message: string, options?: PolyesterErrorOptions) {\n super(message, options);\n this.name = \"AlreadyExistsError\";\n }\n}\n\n/** The caller is authenticated but not allowed to perform this operation. */\nexport class PermissionError extends RequestError {\n override readonly code: string = \"PERMISSION_DENIED\";\n\n constructor(message: string, options?: PolyesterErrorOptions) {\n super(message, options);\n this.name = \"PermissionError\";\n }\n}\n\n/** The caller is not authenticated (missing, expired, or invalid credentials). */\nexport class AuthenticationError extends RequestError {\n override readonly code: string = \"UNAUTHENTICATED\";\n\n constructor(message: string, options?: PolyesterErrorOptions) {\n super(message, options);\n this.name = \"AuthenticationError\";\n }\n}\n\n/** The system is not in a state that allows this operation (e.g. insufficient balance). */\nexport class PreconditionFailedError extends RequestError {\n override readonly code: string = \"PRECONDITION_FAILED\";\n\n constructor(message: string, options?: PolyesterErrorOptions) {\n super(message, options);\n this.name = \"PreconditionFailedError\";\n }\n}\n\n/**\n * The resource changed after it was read, so the submitted expected revision\n * is stale. Refetch and let the caller reconcile; do not blindly retry.\n */\nexport class RevisionConflictError extends PreconditionFailedError {\n override readonly code: string = \"REVISION_CONFLICT\";\n\n constructor(message: string, options?: PolyesterErrorOptions) {\n super(message, options);\n this.name = \"RevisionConflictError\";\n }\n}\n\n/** The policy cannot be removed while accounts or API keys still use it. */\nexport class PolicyInUseError extends PreconditionFailedError {\n override readonly code: string = \"POLICY_IN_USE\";\n\n constructor(message: string, options?: PolyesterErrorOptions) {\n super(message, options);\n this.name = \"PolicyInUseError\";\n }\n}\n\n/** The policy is locked against the requested mutation. */\nexport class PolicyLockedError extends PreconditionFailedError {\n override readonly code: string = \"POLICY_LOCKED\";\n\n constructor(message: string, options?: PolyesterErrorOptions) {\n super(message, options);\n this.name = \"PolicyLockedError\";\n }\n}\n\n/** The policy does not belong to the account scope targeted by the request. */\nexport class PolicyScopeMismatchError extends ValidationError {\n override readonly code: string = \"POLICY_SCOPE_MISMATCH\";\n\n constructor(message: string, options?: PolyesterErrorOptions) {\n super(message, options);\n this.name = \"PolicyScopeMismatchError\";\n }\n}\n\n/** The SDK was configured incorrectly (bad environment, missing credentials, …). */\nexport class ConfigurationError extends RequestError {\n override readonly code: string = \"INVALID_CONFIGURATION\";\n\n constructor(message: string, options?: PolyesterErrorOptions) {\n super(message, options);\n this.name = \"ConfigurationError\";\n }\n}\n\n/**\n * The operation requires additional multi-factor authentication. Catch this\n * class to handle all MFA flows, or the subclasses to branch per flow.\n */\nexport class MfaRequiredError extends RequestError {\n override readonly code: string = \"MFA_REQUIRED\";\n\n constructor(message: string, options?: PolyesterErrorOptions) {\n super(message, options);\n this.name = \"MfaRequiredError\";\n }\n}\n\n/** The user must enroll in MFA before this operation can proceed. */\nexport class MfaEnrollmentRequiredError extends MfaRequiredError {\n override readonly code: string = \"MFA_ENROLLMENT_REQUIRED\";\n\n constructor(message: string, options?: PolyesterErrorOptions) {\n super(message, options);\n this.name = \"MfaEnrollmentRequiredError\";\n }\n}\n\n/** The operation requires a fresh MFA step-up proof (retry with `X-Auth-Step-Up`). */\nexport class StepUpRequiredError extends MfaRequiredError {\n override readonly code: string = \"STEP_UP_REQUIRED\";\n\n constructor(message: string, options?: PolyesterErrorOptions) {\n super(message, options);\n this.name = \"StepUpRequiredError\";\n }\n}\n\n/** The operation requires a recent MFA-elevated session, not a one-use step-up proof. */\nexport class SessionElevationRequiredError extends MfaRequiredError {\n override readonly code: string = \"SESSION_ELEVATION_REQUIRED\";\n\n constructor(message: string, options?: PolyesterErrorOptions) {\n super(message, options);\n this.name = \"SessionElevationRequiredError\";\n }\n}\n\n/** The requested deletion would leave the account without an active MFA factor. */\nexport class MfaLastFactorRequiredError extends PreconditionFailedError {\n override readonly code: string = \"MFA_LAST_FACTOR_REQUIRED\";\n\n constructor(message: string, options?: PolyesterErrorOptions) {\n super(message, options);\n this.name = \"MfaLastFactorRequiredError\";\n }\n}\n\n/** The reason an MFA challenge could not be completed. */\nexport type MfaVerificationFailureReason =\n | \"challenge-invalid\"\n | \"challenge-locked\"\n | \"otp-invalid\"\n | \"recovery-code-invalid\"\n | \"passkey-invalid\";\n\n/**\n * An expected MFA verification rejection. Callers should select their own\n * user-facing copy from `reason` instead of displaying the backend message.\n */\nexport class MfaVerificationError extends RequestError {\n override readonly code: string = \"MFA_VERIFICATION_FAILED\";\n\n constructor(\n message: string,\n readonly reason: MfaVerificationFailureReason,\n options?: PolyesterErrorOptions,\n ) {\n super(message, options);\n this.name = \"MfaVerificationError\";\n }\n}\n\n/**\n * The backend failed unexpectedly or returned a malformed response. Not\n * automatically retryable — the failure may recur and mutations may have\n * partially applied.\n */\nexport class InternalServerError extends PolyesterError {\n readonly code: string = \"INTERNAL_SERVER_ERROR\";\n readonly retryable = false;\n\n constructor(message: string, options?: PolyesterErrorOptions) {\n super(message, options);\n this.name = \"InternalServerError\";\n }\n}\n\n/**\n * Checks whether an error represents an aborted request (caller-initiated via\n * `AbortSignal`). Aborts are intentionally NOT part of the {@link PolyesterError}\n * tree and are never retryable.\n */\nexport function isAbortError(err: unknown): boolean {\n return err instanceof DOMException && err.name === \"AbortError\";\n}\n\n/** Maps a plain HTTP status code onto the SDK error tree. */\nexport function errorFromHttpStatus(\n status: number,\n message: string,\n options?: PolyesterErrorOptions,\n): PolyesterError {\n if (status === 401) return new AuthenticationError(message, options);\n if (status === 403) return new PermissionError(message, options);\n if (status === 404) return new ResourceNotFoundError(message, options);\n if (status === 408) return new TimeoutError(message, options);\n if (status === 409) return new AlreadyExistsError(message, options);\n if (status === 429) return new RateLimitError(message, options);\n if (status === 502 || status === 503 || status === 504) {\n return new ServiceUnavailableError(message, options);\n }\n if (status >= 500) return new InternalServerError(message, options);\n if (status >= 400) return new RequestError(message, options);\n return new NetworkError(message, options);\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.d.ts","names":[],"sources":["../../src/utils/errors.ts"],"mappings":";;;;;;
|
|
1
|
+
{"version":3,"file":"errors.d.ts","names":[],"sources":["../../src/utils/errors.ts"],"mappings":";;;;;;iBAqBgB,wBAAwB;;iBAaxB,wBAAwB;;iBAsBxB,mBAAmB;;iBAKnB,oBAAoB;;iBAKpB,2BAA2B;;;;;;iBAS3B,iBAAiB;;;;;;;;;;;iBAuBjB,mBACZ,cACA;iBA0CY,sBAAsB,gBAAgB"}
|
package/dist/utils/errors.js
CHANGED
|
@@ -1,18 +1,7 @@
|
|
|
1
1
|
import { NetworkError, PolicyInUseError, PolicyLockedError, PolicyScopeMismatchError, PolyesterError, RateLimitError, ResourceNotFoundError, RevisionConflictError, ServiceUnavailableError, TimeoutError, isAbortError } from "../shared/errors.js";
|
|
2
|
-
import { AuthErrorDetailSchema } from "../gen/auth/v1/auth_pb.js";
|
|
3
2
|
import { getNormalizedConnectMessage, toPolyesterError } from "../shared/connect-error-mapping.js";
|
|
4
3
|
import { Code, ConnectError } from "@connectrpc/connect";
|
|
5
4
|
//#region src/utils/errors.ts
|
|
6
|
-
function hasAuthErrorCode(err, code) {
|
|
7
|
-
return ConnectError.from(err).findDetails(AuthErrorDetailSchema).some((detail) => detail.code === code);
|
|
8
|
-
}
|
|
9
|
-
/**
|
|
10
|
-
* Unwraps a typed SDK error to the underlying `ConnectError` (kept as `cause`)
|
|
11
|
-
* so legacy heuristics keep working on raw backend details.
|
|
12
|
-
*/
|
|
13
|
-
function unwrapCause(err) {
|
|
14
|
-
return err instanceof PolyesterError && err.cause !== void 0 ? err.cause : err;
|
|
15
|
-
}
|
|
16
5
|
/**
|
|
17
6
|
* Whether the backend signalled that the requested resource does not exist.
|
|
18
7
|
* Prefer `err instanceof ResourceNotFoundError`; this predicate also covers
|
|
@@ -20,10 +9,7 @@ function unwrapCause(err) {
|
|
|
20
9
|
*/
|
|
21
10
|
function isResourceNotFoundError(err) {
|
|
22
11
|
const mapped = toPolyesterError(err);
|
|
23
|
-
|
|
24
|
-
if (mapped instanceof PolyesterError && mapped.cause === void 0) return false;
|
|
25
|
-
const target = unwrapCause(mapped);
|
|
26
|
-
return hasAuthErrorCode(target, 10) || ConnectError.from(target).code === Code.NotFound;
|
|
12
|
+
return mapped instanceof ResourceNotFoundError || mapped instanceof PolyesterError && mapped.detail?.service === "auth" && mapped.detail.code === "AUTH_RESOURCE_NOT_FOUND";
|
|
27
13
|
}
|
|
28
14
|
/** Whether an optimistic-concurrency update used a stale resource revision. */
|
|
29
15
|
function isRevisionConflictError(err) {
|
package/dist/utils/errors.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.js","names":[],"sources":["../../src/utils/errors.ts"],"sourcesContent":["import { Code, ConnectError } from \"@connectrpc/connect\";\nimport {
|
|
1
|
+
{"version":3,"file":"errors.js","names":[],"sources":["../../src/utils/errors.ts"],"sourcesContent":["import { Code, ConnectError } from \"@connectrpc/connect\";\nimport { getNormalizedConnectMessage, toPolyesterError } from \"../shared/connect-error-mapping.js\";\nimport {\n isAbortError,\n NetworkError,\n PolicyInUseError,\n PolicyLockedError,\n PolicyScopeMismatchError,\n PolyesterError,\n RateLimitError,\n ResourceNotFoundError,\n RevisionConflictError,\n ServiceUnavailableError,\n TimeoutError,\n} from \"../shared/errors.js\";\n\n/**\n * Whether the backend signalled that the requested resource does not exist.\n * Prefer `err instanceof ResourceNotFoundError`; this predicate also covers\n * raw `ConnectError`s (NotFound or the auth resource-not-found detail).\n */\nexport function isResourceNotFoundError(err: unknown): boolean {\n // Connect can re-wrap interceptor errors as an Unknown ConnectError whose\n // cause is the typed SDK error. Normalize first to recover that cause.\n const mapped = toPolyesterError(err);\n return (\n mapped instanceof ResourceNotFoundError ||\n (mapped instanceof PolyesterError &&\n mapped.detail?.service === \"auth\" &&\n mapped.detail.code === \"AUTH_RESOURCE_NOT_FOUND\")\n );\n}\n\n/** Whether an optimistic-concurrency update used a stale resource revision. */\nexport function isRevisionConflictError(err: unknown): boolean {\n const seen = new Set<unknown>();\n let current = err;\n while (current !== undefined && current !== null && !seen.has(current)) {\n seen.add(current);\n if (toPolyesterError(current) instanceof RevisionConflictError) return true;\n const connectError = ConnectError.from(current);\n if (\n (connectError.code === Code.Unknown || connectError.code === Code.Aborted) &&\n /\\brevision conflict\\b/i.test(getNormalizedConnectMessage(connectError))\n ) {\n return true;\n }\n current =\n typeof current === \"object\" && \"cause\" in current\n ? (current as { cause?: unknown }).cause\n : undefined;\n }\n return false;\n}\n\n/** Whether a policy mutation failed because the policy is still attached to a resource. */\nexport function isPolicyInUseError(err: unknown): boolean {\n return toPolyesterError(err) instanceof PolicyInUseError;\n}\n\n/** Whether a policy mutation failed because the policy is locked. */\nexport function isPolicyLockedError(err: unknown): boolean {\n return toPolyesterError(err) instanceof PolicyLockedError;\n}\n\n/** Whether the policy and target account belong to different scopes. */\nexport function isPolicyScopeMismatchError(err: unknown): boolean {\n return toPolyesterError(err) instanceof PolicyScopeMismatchError;\n}\n\n/**\n * Whether an error is retryable (network/timeout) for idempotent operations.\n * Uses same requestId on retry; backend dedupes within 2min.\n * Prefer `err instanceof TransientError` or `err.retryable` on typed errors.\n */\nexport function isRetryableError(err: unknown): boolean {\n if (isAbortError(err)) return false;\n const mapped = toPolyesterError(err);\n if (mapped instanceof PolyesterError) return mapped.retryable;\n const ce = ConnectError.from(mapped);\n return (\n ce.code === Code.Unavailable ||\n ce.code === Code.DeadlineExceeded ||\n ce.code === Code.ResourceExhausted ||\n ce.code === Code.Aborted\n );\n}\n\n/**\n * Diagnostic formatter for SDK and ConnectRPC errors.\n * Typed SDK errors already carry normalized messages; for raw ConnectErrors\n * this strips leading \"[CODE]\" prefixes. Falls back to a friendly default.\n * The returned message may contain backend implementation details. Never render\n * it to a user; use {@link formatUserFacingError} at presentation boundaries.\n * @param err - The error to format.\n * @param fallback - The fallback message when no message is available.\n * @returns The formatted error message.\n */\nexport function formatConnectError(\n err: unknown,\n fallback = \"Request failed. Please try again.\",\n): string {\n if (err == null) return fallback;\n if (err instanceof PolyesterError) return err.message || fallback;\n const withoutCode = getNormalizedConnectMessage(err);\n return withoutCode || fallback;\n}\n\n/**\n * Formats an untrusted failure for direct display to a user.\n *\n * This function never returns an exception or backend message. A small allowlist\n * of typed transport conditions receives SDK-owned copy; every other failure\n * returns the caller-owned fallback.\n */\nfunction userFacingTransportMessage(error: unknown): string | undefined {\n if (error instanceof RateLimitError) {\n return \"You've made too many requests. Wait a moment and try again.\";\n }\n if (error instanceof TimeoutError) return \"This is taking longer than expected. Try again.\";\n if (error instanceof ServiceUnavailableError) {\n return \"This service is temporarily unavailable. Try again in a few minutes.\";\n }\n if (error instanceof NetworkError) {\n return \"We couldn't connect. Check your internet connection and try again.\";\n }\n\n if (error instanceof ConnectError) {\n if (error.code === Code.ResourceExhausted) {\n return \"You've made too many requests. Wait a moment and try again.\";\n }\n if (error.code === Code.DeadlineExceeded) {\n return \"This is taking longer than expected. Try again.\";\n }\n if (error.code === Code.Unavailable) {\n return \"This service is temporarily unavailable. Try again in a few minutes.\";\n }\n }\n\n return undefined;\n}\n\nexport function formatUserFacingError(error: unknown, fallback: string): string {\n // Walk the cause chain and normalize ConnectErrors so wrapped submit failures\n // (e.g. Error → ConnectError[unknown] \"Service temporarily unavailable.\")\n // still hit the transport allowlist.\n let current: unknown = error;\n for (let depth = 0; depth < 5 && current != null; depth++) {\n const mapped = toPolyesterError(current);\n const fromMapped = userFacingTransportMessage(mapped);\n if (fromMapped !== undefined) return fromMapped;\n const fromCurrent = userFacingTransportMessage(current);\n if (fromCurrent !== undefined) return fromCurrent;\n\n current =\n typeof current === \"object\" && current !== null && \"cause\" in current\n ? (current as { cause?: unknown }).cause\n : undefined;\n }\n\n return fallback;\n}\n"],"mappings":";;;;;;;;;AAqBA,SAAgB,wBAAwB,KAAuB;CAG3D,MAAM,SAAS,iBAAiB,GAAG;CACnC,OACI,kBAAkB,yBACjB,kBAAkB,kBACf,OAAO,QAAQ,YAAY,UAC3B,OAAO,OAAO,SAAS;AAEnC;;AAGA,SAAgB,wBAAwB,KAAuB;CAC3D,MAAM,uBAAO,IAAI,IAAa;CAC9B,IAAI,UAAU;CACd,OAAO,YAAY,KAAA,KAAa,YAAY,QAAQ,CAAC,KAAK,IAAI,OAAO,GAAG;EACpE,KAAK,IAAI,OAAO;EAChB,IAAI,iBAAiB,OAAO,aAAa,uBAAuB,OAAO;EACvE,MAAM,eAAe,aAAa,KAAK,OAAO;EAC9C,KACK,aAAa,SAAS,KAAK,WAAW,aAAa,SAAS,KAAK,YAClE,yBAAyB,KAAK,4BAA4B,YAAY,CAAC,GAEvE,OAAO;EAEX,UACI,OAAO,YAAY,YAAY,WAAW,UACnC,QAAgC,QACjC,KAAA;CACd;CACA,OAAO;AACX;;AAGA,SAAgB,mBAAmB,KAAuB;CACtD,OAAO,iBAAiB,GAAG,aAAa;AAC5C;;AAGA,SAAgB,oBAAoB,KAAuB;CACvD,OAAO,iBAAiB,GAAG,aAAa;AAC5C;;AAGA,SAAgB,2BAA2B,KAAuB;CAC9D,OAAO,iBAAiB,GAAG,aAAa;AAC5C;;;;;;AAOA,SAAgB,iBAAiB,KAAuB;CACpD,IAAI,aAAa,GAAG,GAAG,OAAO;CAC9B,MAAM,SAAS,iBAAiB,GAAG;CACnC,IAAI,kBAAkB,gBAAgB,OAAO,OAAO;CACpD,MAAM,KAAK,aAAa,KAAK,MAAM;CACnC,OACI,GAAG,SAAS,KAAK,eACjB,GAAG,SAAS,KAAK,oBACjB,GAAG,SAAS,KAAK,qBACjB,GAAG,SAAS,KAAK;AAEzB;;;;;;;;;;;AAYA,SAAgB,mBACZ,KACA,WAAW,qCACL;CACN,IAAI,OAAO,MAAM,OAAO;CACxB,IAAI,eAAe,gBAAgB,OAAO,IAAI,WAAW;CAEzD,OADoB,4BAA4B,GAC/B,KAAK;AAC1B;;;;;;;;AASA,SAAS,2BAA2B,OAAoC;CACpE,IAAI,iBAAiB,gBACjB,OAAO;CAEX,IAAI,iBAAiB,cAAc,OAAO;CAC1C,IAAI,iBAAiB,yBACjB,OAAO;CAEX,IAAI,iBAAiB,cACjB,OAAO;CAGX,IAAI,iBAAiB,cAAc;EAC/B,IAAI,MAAM,SAAS,KAAK,mBACpB,OAAO;EAEX,IAAI,MAAM,SAAS,KAAK,kBACpB,OAAO;EAEX,IAAI,MAAM,SAAS,KAAK,aACpB,OAAO;CAEf;AAGJ;AAEA,SAAgB,sBAAsB,OAAgB,UAA0B;CAI5E,IAAI,UAAmB;CACvB,KAAK,IAAI,QAAQ,GAAG,QAAQ,KAAK,WAAW,MAAM,SAAS;EAEvD,MAAM,aAAa,2BADJ,iBAAiB,OACmB,CAAC;EACpD,IAAI,eAAe,KAAA,GAAW,OAAO;EACrC,MAAM,cAAc,2BAA2B,OAAO;EACtD,IAAI,gBAAgB,KAAA,GAAW,OAAO;EAEtC,UACI,OAAO,YAAY,YAAY,YAAY,QAAQ,WAAW,UACvD,QAAgC,QACjC,KAAA;CACd;CAEA,OAAO;AACX"}
|
package/dist/wired-services.js
CHANGED
|
@@ -1,22 +1,22 @@
|
|
|
1
1
|
import { MFAService } from "./gen/auth/v1/mfa_pb.js";
|
|
2
2
|
import { AuthService } from "./gen/auth/v1/auth_pb.js";
|
|
3
|
+
import { ProfileService } from "./gen/auth/v1/profile_pb.js";
|
|
4
|
+
import { WithdrawService } from "./gen/chain/withdraw/v1/withdraw_pb.js";
|
|
5
|
+
import { LedgerReadService } from "./gen/ledger/read/v1/ledger_read_pb.js";
|
|
6
|
+
import { MarketOverviewService } from "./gen/marketoverview/v1/marketoverview_pb.js";
|
|
3
7
|
import { OrdersService } from "./gen/orders/v1/orders_pb.js";
|
|
8
|
+
import { InternalTransferService } from "./gen/transfer/v1/internal_transfer_pb.js";
|
|
4
9
|
import { ResolveService } from "./gen/auth/v1/resolve_pb.js";
|
|
5
10
|
import { ApiKeyService } from "./gen/auth/v1/api_keys_pb.js";
|
|
6
11
|
import { PolicyService } from "./gen/auth/v1/policies_pb.js";
|
|
7
|
-
import { ProfileService } from "./gen/auth/v1/profile_pb.js";
|
|
8
|
-
import { LedgerReadService } from "./gen/ledger/read/v1/ledger_read_pb.js";
|
|
9
12
|
import { SubaccountRoleService, SubaccountService, SubaccountViewService } from "./gen/auth/v1/subaccounts_pb.js";
|
|
10
13
|
import { MarketDataService } from "./gen/marketdata/v1/marketdata_pb.js";
|
|
11
14
|
import { ChainAnalyticsService } from "./gen/chain/analytics/v1/analytics_read_pb.js";
|
|
12
|
-
import { MarketOverviewService } from "./gen/marketoverview/v1/marketoverview_pb.js";
|
|
13
15
|
import { OrderbookService } from "./gen/orderbook/v1/orderbook_pb.js";
|
|
14
16
|
import { HeatmapService } from "./gen/marketdata/v1/heatmap_pb.js";
|
|
15
17
|
import { LifecycleReadService } from "./gen/chain/lifecycle/v1/lifecycle_read_pb.js";
|
|
16
18
|
import { OrdersReadService } from "./gen/orders/v1/orders_read_pb.js";
|
|
17
19
|
import { TriggersService } from "./gen/triggers/v1/triggers_pb.js";
|
|
18
|
-
import { InternalTransferService } from "./gen/transfer/v1/internal_transfer_pb.js";
|
|
19
|
-
import { WithdrawService } from "./gen/chain/withdraw/v1/withdraw_pb.js";
|
|
20
20
|
import { DepositAddressService } from "./gen/chain/deposit/v1/deposit_pb.js";
|
|
21
21
|
import { AddressBookService } from "./gen/auth/v1/address_book_pb.js";
|
|
22
22
|
import { GuardSignerService } from "./gen/chain/guard/v1/guard_signer_pb.js";
|
package/package.json
CHANGED
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
import { OrderErrorDetail } from "../services/orders/order-errors.schemas.js";
|
|
2
|
-
//#region src/utils/connect-order-errors.d.ts
|
|
3
|
-
/**
|
|
4
|
-
* Returns the first structured Orders API rejection detail in an error cause chain.
|
|
5
|
-
* Invalid or unrelated details are ignored rather than exposing transport prose.
|
|
6
|
-
*/
|
|
7
|
-
declare function getOrderErrorDetail(error: unknown): OrderErrorDetail | undefined;
|
|
8
|
-
/**
|
|
9
|
-
* True when an order mutation was rejected because its client reference quote
|
|
10
|
-
* exceeded the backend's configured drift limit.
|
|
11
|
-
*/
|
|
12
|
-
declare function isStaleQuoteError(error: unknown): boolean;
|
|
13
|
-
//#endregion
|
|
14
|
-
export { getOrderErrorDetail, isStaleQuoteError };
|
|
15
|
-
//# sourceMappingURL=connect-order-errors.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"connect-order-errors.d.ts","names":[],"sources":["../../src/utils/connect-order-errors.ts"],"mappings":";;;;;;iBAcgB,oBAAoB,iBAAiB;;;;;iBAsBrC,kBAAkB"}
|
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
import { StaleQuoteError } from "../shared/errors.js";
|
|
2
|
-
import { ErrorDetailSchema } from "../gen/orders/v1/orders_pb.js";
|
|
3
|
-
import { toPolyesterError } from "../shared/connect-error-mapping.js";
|
|
4
|
-
import { OrderErrorDetailSchema } from "../services/orders/order-errors.schemas.js";
|
|
5
|
-
import { ConnectError } from "@connectrpc/connect";
|
|
6
|
-
import * as v from "valibot";
|
|
7
|
-
//#region src/utils/connect-order-errors.ts
|
|
8
|
-
/**
|
|
9
|
-
* Returns the first structured Orders API rejection detail in an error cause chain.
|
|
10
|
-
* Invalid or unrelated details are ignored rather than exposing transport prose.
|
|
11
|
-
*/
|
|
12
|
-
function getOrderErrorDetail(error) {
|
|
13
|
-
const seen = /* @__PURE__ */ new Set();
|
|
14
|
-
let current = error;
|
|
15
|
-
for (let depth = 0; depth < 5 && current != null && !seen.has(current); depth += 1) {
|
|
16
|
-
seen.add(current);
|
|
17
|
-
const details = ConnectError.from(current).findDetails(ErrorDetailSchema);
|
|
18
|
-
for (const detail of details) {
|
|
19
|
-
const parsed = v.safeParse(OrderErrorDetailSchema, detail);
|
|
20
|
-
if (parsed.success) return parsed.output;
|
|
21
|
-
}
|
|
22
|
-
current = current instanceof Error ? current.cause : void 0;
|
|
23
|
-
}
|
|
24
|
-
}
|
|
25
|
-
/**
|
|
26
|
-
* True when an order mutation was rejected because its client reference quote
|
|
27
|
-
* exceeded the backend's configured drift limit.
|
|
28
|
-
*/
|
|
29
|
-
function isStaleQuoteError(error) {
|
|
30
|
-
let current = error;
|
|
31
|
-
for (let depth = 0; depth < 5; depth += 1) {
|
|
32
|
-
if (toPolyesterError(current) instanceof StaleQuoteError) return true;
|
|
33
|
-
if (!(current instanceof Error) || current.cause === void 0) return false;
|
|
34
|
-
current = current.cause;
|
|
35
|
-
}
|
|
36
|
-
return false;
|
|
37
|
-
}
|
|
38
|
-
//#endregion
|
|
39
|
-
export { getOrderErrorDetail, isStaleQuoteError };
|
|
40
|
-
|
|
41
|
-
//# sourceMappingURL=connect-order-errors.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"connect-order-errors.js","names":[],"sources":["../../src/utils/connect-order-errors.ts"],"sourcesContent":["import { ConnectError } from \"@connectrpc/connect\";\nimport * as v from \"valibot\";\nimport { ErrorDetailSchema } from \"../gen/orders/v1/orders_pb.js\";\nimport {\n OrderErrorDetailSchema,\n type OrderErrorDetail,\n} from \"../services/orders/order-errors.schemas.js\";\nimport { toPolyesterError } from \"../shared/connect-error-mapping.js\";\nimport { StaleQuoteError } from \"../shared/errors.js\";\n\n/**\n * Returns the first structured Orders API rejection detail in an error cause chain.\n * Invalid or unrelated details are ignored rather than exposing transport prose.\n */\nexport function getOrderErrorDetail(error: unknown): OrderErrorDetail | undefined {\n const seen = new Set<unknown>();\n let current: unknown = error;\n\n for (let depth = 0; depth < 5 && current != null && !seen.has(current); depth += 1) {\n seen.add(current);\n const details = ConnectError.from(current).findDetails(ErrorDetailSchema);\n for (const detail of details) {\n const parsed = v.safeParse(OrderErrorDetailSchema, detail);\n if (parsed.success) return parsed.output;\n }\n\n current = current instanceof Error ? current.cause : undefined;\n }\n\n return undefined;\n}\n\n/**\n * True when an order mutation was rejected because its client reference quote\n * exceeded the backend's configured drift limit.\n */\nexport function isStaleQuoteError(error: unknown): boolean {\n let current = error;\n\n for (let depth = 0; depth < 5; depth += 1) {\n if (toPolyesterError(current) instanceof StaleQuoteError) return true;\n if (!(current instanceof Error) || current.cause === undefined) return false;\n current = current.cause;\n }\n\n return false;\n}\n"],"mappings":";;;;;;;;;;;AAcA,SAAgB,oBAAoB,OAA8C;CAC9E,MAAM,uBAAO,IAAI,IAAa;CAC9B,IAAI,UAAmB;CAEvB,KAAK,IAAI,QAAQ,GAAG,QAAQ,KAAK,WAAW,QAAQ,CAAC,KAAK,IAAI,OAAO,GAAG,SAAS,GAAG;EAChF,KAAK,IAAI,OAAO;EAChB,MAAM,UAAU,aAAa,KAAK,OAAO,CAAC,CAAC,YAAY,iBAAiB;EACxE,KAAK,MAAM,UAAU,SAAS;GAC1B,MAAM,SAAS,EAAE,UAAU,wBAAwB,MAAM;GACzD,IAAI,OAAO,SAAS,OAAO,OAAO;EACtC;EAEA,UAAU,mBAAmB,QAAQ,QAAQ,QAAQ,KAAA;CACzD;AAGJ;;;;;AAMA,SAAgB,kBAAkB,OAAyB;CACvD,IAAI,UAAU;CAEd,KAAK,IAAI,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG;EACvC,IAAI,iBAAiB,OAAO,aAAa,iBAAiB,OAAO;EACjE,IAAI,EAAE,mBAAmB,UAAU,QAAQ,UAAU,KAAA,GAAW,OAAO;EACvE,UAAU,QAAQ;CACtB;CAEA,OAAO;AACX"}
|