@zenglobal/api-client 5.0.9 → 5.0.11

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 (71) hide show
  1. package/README.md +36 -8
  2. package/dist/__tests__/mocks/handlers/loyalty.d.ts +2 -0
  3. package/dist/__tests__/mocks/handlers/loyalty.d.ts.map +1 -0
  4. package/dist/__tests__/mocks/handlers/loyalty.js +21 -0
  5. package/dist/__tests__/mocks/handlers/loyalty.js.map +1 -0
  6. package/dist/__tests__/mocks/handlers/ping.d.ts +2 -0
  7. package/dist/__tests__/mocks/handlers/ping.d.ts.map +1 -0
  8. package/dist/__tests__/mocks/handlers/ping.js +5 -0
  9. package/dist/__tests__/mocks/handlers/ping.js.map +1 -0
  10. package/dist/__tests__/mocks/handlers/voucher.d.ts +2 -0
  11. package/dist/__tests__/mocks/handlers/voucher.d.ts.map +1 -0
  12. package/dist/__tests__/mocks/handlers/voucher.js +33 -0
  13. package/dist/__tests__/mocks/handlers/voucher.js.map +1 -0
  14. package/dist/__tests__/mocks/handlers.d.ts +2 -0
  15. package/dist/__tests__/mocks/handlers.d.ts.map +1 -0
  16. package/dist/__tests__/mocks/handlers.js +9 -0
  17. package/dist/__tests__/mocks/handlers.js.map +1 -0
  18. package/dist/__tests__/mocks/node.d.ts +3 -0
  19. package/dist/__tests__/mocks/node.d.ts.map +1 -0
  20. package/dist/__tests__/mocks/node.js +5 -0
  21. package/dist/__tests__/mocks/node.js.map +1 -0
  22. package/dist/auth/__tests__/tokenManager.test.d.ts +2 -0
  23. package/dist/auth/__tests__/tokenManager.test.d.ts.map +1 -0
  24. package/dist/auth/__tests__/tokenManager.test.js +103 -0
  25. package/dist/auth/__tests__/tokenManager.test.js.map +1 -0
  26. package/dist/auth/tokenManager.d.ts +42 -0
  27. package/dist/auth/tokenManager.d.ts.map +1 -0
  28. package/dist/auth/tokenManager.js +108 -0
  29. package/dist/auth/tokenManager.js.map +1 -0
  30. package/dist/client/client/client.gen.d.ts.map +1 -1
  31. package/dist/client/client/client.gen.js +151 -119
  32. package/dist/client/client/client.gen.js.map +1 -1
  33. package/dist/client/client/index.d.ts +1 -1
  34. package/dist/client/client/index.d.ts.map +1 -1
  35. package/dist/client/client/index.js.map +1 -1
  36. package/dist/client/client/types.gen.d.ts +11 -34
  37. package/dist/client/client/types.gen.d.ts.map +1 -1
  38. package/dist/client/client/utils.gen.d.ts +7 -3
  39. package/dist/client/client/utils.gen.d.ts.map +1 -1
  40. package/dist/client/client/utils.gen.js +3 -3
  41. package/dist/client/client/utils.gen.js.map +1 -1
  42. package/dist/client/core/bodySerializer.gen.d.ts +4 -4
  43. package/dist/client/core/bodySerializer.gen.d.ts.map +1 -1
  44. package/dist/client/core/bodySerializer.gen.js.map +1 -1
  45. package/dist/client/core/params.gen.js +5 -5
  46. package/dist/client/core/params.gen.js.map +1 -1
  47. package/dist/client/core/serverSentEvents.gen.d.ts +1 -1
  48. package/dist/client/core/serverSentEvents.gen.d.ts.map +1 -1
  49. package/dist/client/core/serverSentEvents.gen.js +3 -4
  50. package/dist/client/core/serverSentEvents.gen.js.map +1 -1
  51. package/dist/client/core/types.gen.d.ts +1 -1
  52. package/dist/client/core/utils.gen.js +1 -1
  53. package/dist/client/core/utils.gen.js.map +1 -1
  54. package/dist/client/sdk.gen.d.ts +1 -1
  55. package/dist/client/sdk.gen.d.ts.map +1 -1
  56. package/dist/client/sdk.gen.js +109 -109
  57. package/dist/client/sdk.gen.js.map +1 -1
  58. package/dist/client/types.gen.d.ts +2 -2
  59. package/dist/configure.d.ts +43 -5
  60. package/dist/configure.d.ts.map +1 -1
  61. package/dist/configure.js +170 -20
  62. package/dist/configure.js.map +1 -1
  63. package/dist/errors.d.ts +15 -0
  64. package/dist/errors.d.ts.map +1 -1
  65. package/dist/errors.js +16 -0
  66. package/dist/errors.js.map +1 -1
  67. package/dist/index.d.ts +3 -3
  68. package/dist/index.d.ts.map +1 -1
  69. package/dist/index.js +2 -2
  70. package/dist/index.js.map +1 -1
  71. package/package.json +3 -3
package/README.md CHANGED
@@ -93,14 +93,42 @@ Both error classes extend `Error`, so `instanceof Error` works for catch-all han
93
93
 
94
94
  ## Configuration Options
95
95
 
96
- | Option | Type | Default | Description |
97
- | ---------- | ------------ | -------------- | ---------------------------------- |
98
- | `baseUrl` | `string` | — | Zen API base URL |
99
- | `username` | `string` | — | HTTP Basic Auth username |
100
- | `password` | `string` | — | HTTP Basic Auth password |
101
- | `partner` | `ZenPartner` | — | Partner identification (see below) |
102
- | `timeout` | `number` | `30000` | Request timeout in ms |
103
- | `retry` | `object` | `{ limit: 3 }` | Retry configuration |
96
+ | Option | Type | Default | Description |
97
+ | ---------- | ------------ | -------------- | ---------------------------------------------------------------------- |
98
+ | `baseUrl` | `string` | — | Zen API base URL |
99
+ | `username` | `string` | — | HTTP Basic Auth username (or use `auth`) |
100
+ | `password` | `string` | — | HTTP Basic Auth password (or use `auth`) |
101
+ | `auth` | `ZenAuth` | — | OAuth 2.0 client_credentials config (alternative to username/password) |
102
+ | `partner` | `ZenPartner` | | Partner identification (see below) |
103
+ | `timeout` | `number` | `30000` | Request timeout in ms |
104
+ | `retry` | `object` | `{ limit: 3 }` | Retry configuration |
105
+
106
+ ### OAuth client_credentials
107
+
108
+ Instead of HTTP Basic, the client can authenticate with the OAuth 2.0
109
+ `client_credentials` grant. The existing Partner API key **is**
110
+ the OAuth client (`clientId` = key username, `clientSecret` = key password).
111
+ The client mints a `zen-partner-api` Bearer token from the auth host, caches it
112
+ in memory, refreshes it before expiry, and (for idempotent requests) refreshes
113
+ and retries once on a 401.
114
+
115
+ ```typescript
116
+ configureZenClient({
117
+ baseUrl: "https://api.zenglobal.au/v1",
118
+ partner: { partnerId: "q74vzg9o", name: "my-pos-app", version: "1.0.0" },
119
+ auth: {
120
+ mode: "clientCredentials",
121
+ clientId: process.env.ZEN_CLIENT_ID,
122
+ clientSecret: process.env.ZEN_CLIENT_SECRET,
123
+ // scope: "read write", // optional; space-delimited
124
+ // tokenUrl: "https://auth.zendev.au/oauth/token", // override for dev/staging
125
+ },
126
+ });
127
+ ```
128
+
129
+ The token endpoint defaults to `https://auth.zenglobal.au/oauth/token` (a
130
+ separate host from `baseUrl`). Override it via `auth.tokenUrl` for local or
131
+ staging environments. Token-endpoint failures throw `ZenAuthError`.
104
132
 
105
133
  ### Partner Identification
106
134
 
@@ -0,0 +1,2 @@
1
+ export declare const handlers: import("msw").HttpHandler[];
2
+ //# sourceMappingURL=loyalty.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loyalty.d.ts","sourceRoot":"","sources":["../../../../src/__tests__/mocks/handlers/loyalty.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,QAAQ,6BAkBpB,CAAC"}
@@ -0,0 +1,21 @@
1
+ import { http, HttpResponse } from 'msw';
2
+ export const handlers = [
3
+ http.get('*/Loyalty/Card/:cardNumber', ({ params }) => {
4
+ const cardNumber = params.cardNumber;
5
+ if (cardNumber === 'NOT_FOUND') {
6
+ return HttpResponse.json({
7
+ result: 4,
8
+ errormessage: 'Card not found',
9
+ });
10
+ }
11
+ return HttpResponse.json({
12
+ result: 0,
13
+ CardNumber: cardNumber,
14
+ FirstName: 'Jane',
15
+ LastName: 'Doe',
16
+ Points: 500,
17
+ Status: 'Active',
18
+ });
19
+ }),
20
+ ];
21
+ //# sourceMappingURL=loyalty.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loyalty.js","sourceRoot":"","sources":["../../../../src/__tests__/mocks/handlers/loyalty.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,KAAK,CAAC;AAEzC,MAAM,CAAC,MAAM,QAAQ,GAAG;IACtB,IAAI,CAAC,GAAG,CAAC,4BAA4B,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE;QACpD,MAAM,UAAU,GAAG,MAAM,CAAC,UAAoB,CAAC;QAC/C,IAAI,UAAU,KAAK,WAAW,EAAE,CAAC;YAC/B,OAAO,YAAY,CAAC,IAAI,CAAC;gBACvB,MAAM,EAAE,CAAC;gBACT,YAAY,EAAE,gBAAgB;aAC/B,CAAC,CAAC;QACL,CAAC;QACD,OAAO,YAAY,CAAC,IAAI,CAAC;YACvB,MAAM,EAAE,CAAC;YACT,UAAU,EAAE,UAAU;YACtB,SAAS,EAAE,MAAM;YACjB,QAAQ,EAAE,KAAK;YACf,MAAM,EAAE,GAAG;YACX,MAAM,EAAE,QAAQ;SACjB,CAAC,CAAC;IACL,CAAC,CAAC;CACH,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare const handlers: import("msw").HttpHandler[];
2
+ //# sourceMappingURL=ping.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ping.d.ts","sourceRoot":"","sources":["../../../../src/__tests__/mocks/handlers/ping.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,QAAQ,6BAIpB,CAAC"}
@@ -0,0 +1,5 @@
1
+ import { http, HttpResponse } from 'msw';
2
+ export const handlers = [
3
+ http.get('*/ping', () => HttpResponse.json({ result: 0, version: '1.0.0' })),
4
+ ];
5
+ //# sourceMappingURL=ping.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ping.js","sourceRoot":"","sources":["../../../../src/__tests__/mocks/handlers/ping.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,KAAK,CAAC;AAEzC,MAAM,CAAC,MAAM,QAAQ,GAAG;IACtB,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,EAAE,CACtB,YAAY,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CACnD;CACF,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare const handlers: import("msw").HttpHandler[];
2
+ //# sourceMappingURL=voucher.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"voucher.d.ts","sourceRoot":"","sources":["../../../../src/__tests__/mocks/handlers/voucher.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,QAAQ,6BA+BpB,CAAC"}
@@ -0,0 +1,33 @@
1
+ import { http, HttpResponse } from 'msw';
2
+ export const handlers = [
3
+ http.post('*/voucher/:voucherType/enquire', async ({ request }) => {
4
+ const body = await request.json();
5
+ const serial = body?.voucher?.serialnumber;
6
+ if (serial === 'EXPIRED') {
7
+ return HttpResponse.json({
8
+ result: 9,
9
+ errormessage: 'Voucher has expired',
10
+ reason: 'Expired',
11
+ });
12
+ }
13
+ return HttpResponse.json({
14
+ result: 0,
15
+ voucher: {
16
+ serialnumber: serial,
17
+ balance: 50.0,
18
+ status: 'Active',
19
+ },
20
+ });
21
+ }),
22
+ http.post('*/SMS', async ({ request }) => {
23
+ const body = await request.json();
24
+ if (!body.sms) {
25
+ return HttpResponse.json({
26
+ result: 8,
27
+ errormessage: 'Body Missing',
28
+ });
29
+ }
30
+ return HttpResponse.json({ result: 0 });
31
+ }),
32
+ ];
33
+ //# sourceMappingURL=voucher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"voucher.js","sourceRoot":"","sources":["../../../../src/__tests__/mocks/handlers/voucher.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,KAAK,CAAC;AAEzC,MAAM,CAAC,MAAM,QAAQ,GAAG;IACtB,IAAI,CAAC,IAAI,CAAC,gCAAgC,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE;QAChE,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,IAAI,EAA6C,CAAC;QAC7E,MAAM,MAAM,GAAG,IAAI,EAAE,OAAO,EAAE,YAAY,CAAC;QAC3C,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YACzB,OAAO,YAAY,CAAC,IAAI,CAAC;gBACvB,MAAM,EAAE,CAAC;gBACT,YAAY,EAAE,qBAAqB;gBACnC,MAAM,EAAE,SAAS;aAClB,CAAC,CAAC;QACL,CAAC;QACD,OAAO,YAAY,CAAC,IAAI,CAAC;YACvB,MAAM,EAAE,CAAC;YACT,OAAO,EAAE;gBACP,YAAY,EAAE,MAAM;gBACpB,OAAO,EAAE,IAAI;gBACb,MAAM,EAAE,QAAQ;aACjB;SACF,CAAC,CAAC;IACL,CAAC,CAAC;IAEF,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE;QACvC,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,IAAI,EAA6B,CAAC;QAC7D,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;YACd,OAAO,YAAY,CAAC,IAAI,CAAC;gBACvB,MAAM,EAAE,CAAC;gBACT,YAAY,EAAE,cAAc;aAC7B,CAAC,CAAC;QACL,CAAC;QACD,OAAO,YAAY,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC;IAC1C,CAAC,CAAC;CACH,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare const handlers: import("msw").HttpHandler[];
2
+ //# sourceMappingURL=handlers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handlers.d.ts","sourceRoot":"","sources":["../../../src/__tests__/mocks/handlers.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,QAAQ,6BAIpB,CAAC"}
@@ -0,0 +1,9 @@
1
+ import { handlers as pingHandlers } from './handlers/ping.js';
2
+ import { handlers as loyaltyHandlers } from './handlers/loyalty.js';
3
+ import { handlers as voucherHandlers } from './handlers/voucher.js';
4
+ export const handlers = [
5
+ ...pingHandlers,
6
+ ...loyaltyHandlers,
7
+ ...voucherHandlers,
8
+ ];
9
+ //# sourceMappingURL=handlers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handlers.js","sourceRoot":"","sources":["../../../src/__tests__/mocks/handlers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,IAAI,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAC9D,OAAO,EAAE,QAAQ,IAAI,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACpE,OAAO,EAAE,QAAQ,IAAI,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAEpE,MAAM,CAAC,MAAM,QAAQ,GAAG;IACtB,GAAG,YAAY;IACf,GAAG,eAAe;IAClB,GAAG,eAAe;CACnB,CAAC"}
@@ -0,0 +1,3 @@
1
+ declare const server: import("msw/node").SetupServerApi;
2
+ export default server;
3
+ //# sourceMappingURL=node.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node.d.ts","sourceRoot":"","sources":["../../../src/__tests__/mocks/node.ts"],"names":[],"mappings":"AAGA,QAAA,MAAM,MAAM,mCAA2B,CAAC;AACxC,eAAe,MAAM,CAAC"}
@@ -0,0 +1,5 @@
1
+ import { setupServer } from 'msw/node';
2
+ import { handlers } from './handlers.js';
3
+ const server = setupServer(...handlers);
4
+ export default server;
5
+ //# sourceMappingURL=node.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node.js","sourceRoot":"","sources":["../../../src/__tests__/mocks/node.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AACvC,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAEzC,MAAM,MAAM,GAAG,WAAW,CAAC,GAAG,QAAQ,CAAC,CAAC;AACxC,eAAe,MAAM,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=tokenManager.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tokenManager.test.d.ts","sourceRoot":"","sources":["../../../src/auth/__tests__/tokenManager.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,103 @@
1
+ import { afterEach, describe, expect, it } from "vitest";
2
+ import { http, HttpResponse } from "msw";
3
+ import server from "../../__tests__/mocks/node.js";
4
+ import { TokenManager } from "../tokenManager.js";
5
+ import { ZenAuthError } from "../../errors.js";
6
+ const TOKEN_URL = "https://auth.test.example/oauth/token";
7
+ function tokenHandler(opts) {
8
+ return http.post(TOKEN_URL, async ({ request }) => {
9
+ const text = await request.text();
10
+ opts.onHit?.(new URLSearchParams(text));
11
+ if (opts.status && opts.status >= 400) {
12
+ return HttpResponse.json({ error: "invalid_client" }, { status: opts.status });
13
+ }
14
+ return HttpResponse.json({
15
+ access_token: opts.token ?? "tok-1",
16
+ token_type: "Bearer",
17
+ expires_in: opts.expiresIn ?? 3600,
18
+ });
19
+ });
20
+ }
21
+ const baseConfig = {
22
+ clientId: "key-user",
23
+ clientSecret: "key-secret",
24
+ tokenUrl: TOKEN_URL,
25
+ };
26
+ afterEach(() => server.resetHandlers());
27
+ describe("TokenManager", () => {
28
+ it("acquires a token with a client_credentials form body", async () => {
29
+ let seen;
30
+ server.use(tokenHandler({ token: "abc", onHit: (b) => (seen = b) }));
31
+ const tm = new TokenManager(baseConfig);
32
+ const token = await tm.getToken();
33
+ expect(token).toBe("abc");
34
+ expect(seen?.get("grant_type")).toBe("client_credentials");
35
+ expect(seen?.get("client_id")).toBe("key-user");
36
+ expect(seen?.get("client_secret")).toBe("key-secret");
37
+ expect(seen?.get("scope")).toBeNull();
38
+ });
39
+ it("includes scope when configured", async () => {
40
+ let seen;
41
+ server.use(tokenHandler({ onHit: (b) => (seen = b) }));
42
+ const tm = new TokenManager({ ...baseConfig, scope: "a b" });
43
+ await tm.getToken();
44
+ expect(seen?.get("scope")).toBe("a b");
45
+ });
46
+ it("caches the token and does not refetch before expiry", async () => {
47
+ let hits = 0;
48
+ server.use(tokenHandler({ onHit: () => (hits += 1) }));
49
+ let now = 0;
50
+ const tm = new TokenManager(baseConfig, { now: () => now });
51
+ await tm.getToken();
52
+ now = 1_000_000; // 1000s later, well inside a 3600s token
53
+ await tm.getToken();
54
+ expect(hits).toBe(1);
55
+ });
56
+ it("refetches once the skew window is entered", async () => {
57
+ let hits = 0;
58
+ server.use(tokenHandler({ expiresIn: 100, onHit: () => (hits += 1) }));
59
+ let now = 0;
60
+ const tm = new TokenManager(baseConfig, { now: () => now, skewMs: 30_000 });
61
+ await tm.getToken(); // expiresAt = 100_000ms
62
+ now = 71_000; // within 30s skew of expiry (100_000 - 30_000 = 70_000)
63
+ await tm.getToken();
64
+ expect(hits).toBe(2);
65
+ });
66
+ it("dedupes concurrent acquisitions into one fetch", async () => {
67
+ let hits = 0;
68
+ server.use(tokenHandler({ onHit: () => (hits += 1) }));
69
+ const tm = new TokenManager(baseConfig);
70
+ const [a, b] = await Promise.all([tm.getToken(), tm.getToken()]);
71
+ expect(a).toBe(b);
72
+ expect(hits).toBe(1);
73
+ });
74
+ it("refresh() forces a new fetch even within validity", async () => {
75
+ let hits = 0;
76
+ let token = "first";
77
+ server.use(http.post(TOKEN_URL, () => {
78
+ hits += 1;
79
+ const body = {
80
+ access_token: token,
81
+ token_type: "Bearer",
82
+ expires_in: 3600,
83
+ };
84
+ token = "second";
85
+ return HttpResponse.json(body);
86
+ }));
87
+ const tm = new TokenManager(baseConfig);
88
+ expect(await tm.getToken()).toBe("first");
89
+ expect(await tm.refresh()).toBe("second");
90
+ expect(hits).toBe(2);
91
+ });
92
+ it("throws ZenAuthError on a non-2xx token response", async () => {
93
+ server.use(tokenHandler({ status: 401 }));
94
+ const tm = new TokenManager(baseConfig);
95
+ await expect(tm.getToken()).rejects.toBeInstanceOf(ZenAuthError);
96
+ });
97
+ it("throws ZenAuthError when the token endpoint is unreachable", async () => {
98
+ server.use(http.post(TOKEN_URL, () => HttpResponse.error()));
99
+ const tm = new TokenManager(baseConfig);
100
+ await expect(tm.getToken()).rejects.toBeInstanceOf(ZenAuthError);
101
+ });
102
+ });
103
+ //# sourceMappingURL=tokenManager.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tokenManager.test.js","sourceRoot":"","sources":["../../../src/auth/__tests__/tokenManager.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,42 @@
1
+ export interface ClientCredentials {
2
+ /** OAuth client id (the Partner API key username under model C). */
3
+ clientId: string;
4
+ /** OAuth client secret (the Partner API key password). */
5
+ clientSecret: string;
6
+ /** Optional space-delimited scope string. */
7
+ scope?: string;
8
+ /** Fully-resolved token endpoint URL. */
9
+ tokenUrl: string;
10
+ }
11
+ interface TokenManagerOptions {
12
+ /** Override fetch (defaults to globalThis.fetch). */
13
+ fetch?: typeof globalThis.fetch;
14
+ /** Treat the token as expired this many ms before its real expiry. */
15
+ skewMs?: number;
16
+ /** Clock source (defaults to Date.now); injectable for tests. */
17
+ now?: () => number;
18
+ }
19
+ /**
20
+ * Owns the OAuth client_credentials token lifecycle for one client:
21
+ * acquisition, in-memory caching, proactive skew-based refresh, single
22
+ * in-flight de-duplication, and forced refresh after a 401.
23
+ */
24
+ export declare class TokenManager {
25
+ private readonly config;
26
+ private readonly fetchImpl;
27
+ private readonly skewMs;
28
+ private readonly now;
29
+ private token;
30
+ private expiresAt;
31
+ private inFlight;
32
+ constructor(config: ClientCredentials, opts?: TokenManagerOptions);
33
+ /** Return a valid token, fetching/refreshing only when needed. */
34
+ getToken(): Promise<string>;
35
+ /** Force a new token regardless of the cached one's validity. */
36
+ refresh(): Promise<string>;
37
+ private acquire;
38
+ private doFetch;
39
+ private safeBody;
40
+ }
41
+ export {};
42
+ //# sourceMappingURL=tokenManager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tokenManager.d.ts","sourceRoot":"","sources":["../../src/auth/tokenManager.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,iBAAiB;IAChC,oEAAoE;IACpE,QAAQ,EAAE,MAAM,CAAC;IACjB,0DAA0D;IAC1D,YAAY,EAAE,MAAM,CAAC;IACrB,6CAA6C;IAC7C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,yCAAyC;IACzC,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,UAAU,mBAAmB;IAC3B,qDAAqD;IACrD,KAAK,CAAC,EAAE,OAAO,UAAU,CAAC,KAAK,CAAC;IAChC,sEAAsE;IACtE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,iEAAiE;IACjE,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;CACpB;AAQD;;;;GAIG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAoB;IAC3C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA0B;IACpD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAe;IAEnC,OAAO,CAAC,KAAK,CAAuB;IACpC,OAAO,CAAC,SAAS,CAAK;IACtB,OAAO,CAAC,QAAQ,CAAgC;gBAEpC,MAAM,EAAE,iBAAiB,EAAE,IAAI,GAAE,mBAAwB;IAOrE,kEAAkE;IAC5D,QAAQ,IAAI,OAAO,CAAC,MAAM,CAAC;IAOjC,iEAAiE;IAC3D,OAAO,IAAI,OAAO,CAAC,MAAM,CAAC;IAKhC,OAAO,CAAC,OAAO;YAQD,OAAO;YAwDP,QAAQ;CAWvB"}
@@ -0,0 +1,108 @@
1
+ import { ZenAuthError } from "../errors.js";
2
+ /**
3
+ * Owns the OAuth client_credentials token lifecycle for one client:
4
+ * acquisition, in-memory caching, proactive skew-based refresh, single
5
+ * in-flight de-duplication, and forced refresh after a 401.
6
+ */
7
+ export class TokenManager {
8
+ config;
9
+ fetchImpl;
10
+ skewMs;
11
+ now;
12
+ token = null;
13
+ expiresAt = 0;
14
+ inFlight = null;
15
+ constructor(config, opts = {}) {
16
+ this.config = config;
17
+ this.fetchImpl = opts.fetch ?? globalThis.fetch;
18
+ this.skewMs = opts.skewMs ?? 30_000;
19
+ this.now = opts.now ?? Date.now;
20
+ }
21
+ /** Return a valid token, fetching/refreshing only when needed. */
22
+ async getToken() {
23
+ if (this.token !== null && this.now() < this.expiresAt - this.skewMs) {
24
+ return this.token;
25
+ }
26
+ return this.acquire();
27
+ }
28
+ /** Force a new token regardless of the cached one's validity. */
29
+ async refresh() {
30
+ this.token = null;
31
+ return this.acquire();
32
+ }
33
+ acquire() {
34
+ if (this.inFlight)
35
+ return this.inFlight;
36
+ this.inFlight = this.doFetch().finally(() => {
37
+ this.inFlight = null;
38
+ });
39
+ return this.inFlight;
40
+ }
41
+ async doFetch() {
42
+ const body = new URLSearchParams({
43
+ grant_type: "client_credentials",
44
+ client_id: this.config.clientId,
45
+ client_secret: this.config.clientSecret,
46
+ });
47
+ if (this.config.scope)
48
+ body.set("scope", this.config.scope);
49
+ let response;
50
+ try {
51
+ response = await this.fetchImpl(this.config.tokenUrl, {
52
+ method: "POST",
53
+ headers: {
54
+ "Content-Type": "application/x-www-form-urlencoded",
55
+ Accept: "application/json",
56
+ },
57
+ body,
58
+ });
59
+ }
60
+ catch (cause) {
61
+ throw new ZenAuthError({
62
+ message: `Token request to ${this.config.tokenUrl} failed: ${String(cause)}`,
63
+ });
64
+ }
65
+ if (!response.ok) {
66
+ const errBody = await this.safeBody(response);
67
+ throw new ZenAuthError({
68
+ message: `Token request failed with HTTP ${response.status}`,
69
+ status: response.status,
70
+ body: errBody,
71
+ });
72
+ }
73
+ let data;
74
+ try {
75
+ data = (await response.json());
76
+ }
77
+ catch (cause) {
78
+ throw new ZenAuthError({
79
+ message: `Token response was not valid JSON: ${String(cause)}`,
80
+ status: response.status,
81
+ });
82
+ }
83
+ if (!data.access_token || typeof data.expires_in !== "number") {
84
+ throw new ZenAuthError({
85
+ message: "Token response missing access_token or expires_in",
86
+ status: response.status,
87
+ body: data,
88
+ });
89
+ }
90
+ this.token = data.access_token;
91
+ this.expiresAt = this.now() + data.expires_in * 1000; // expires_in is seconds; convert to ms
92
+ return this.token;
93
+ }
94
+ async safeBody(response) {
95
+ try {
96
+ return await response.clone().json();
97
+ }
98
+ catch {
99
+ try {
100
+ return await response.text();
101
+ }
102
+ catch {
103
+ return undefined;
104
+ }
105
+ }
106
+ }
107
+ }
108
+ //# sourceMappingURL=tokenManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tokenManager.js","sourceRoot":"","sources":["../../src/auth/tokenManager.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"client.gen.d.ts","sourceRoot":"","sources":["../../../src/client/client/client.gen.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,EAAwD,MAAM,gBAAgB,CAAC;AAY3G,eAAO,MAAM,YAAY,GAAI,SAAQ,MAAW,KAAG,MA2SlD,CAAC"}
1
+ {"version":3,"file":"client.gen.d.ts","sourceRoot":"","sources":["../../../src/client/client/client.gen.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,EAA0C,MAAM,gBAAgB,CAAC;AAY7F,eAAO,MAAM,YAAY,GAAI,SAAQ,MAAW,KAAG,MAqVlD,CAAC"}