@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.
- package/README.md +36 -8
- package/dist/__tests__/mocks/handlers/loyalty.d.ts +2 -0
- package/dist/__tests__/mocks/handlers/loyalty.d.ts.map +1 -0
- package/dist/__tests__/mocks/handlers/loyalty.js +21 -0
- package/dist/__tests__/mocks/handlers/loyalty.js.map +1 -0
- package/dist/__tests__/mocks/handlers/ping.d.ts +2 -0
- package/dist/__tests__/mocks/handlers/ping.d.ts.map +1 -0
- package/dist/__tests__/mocks/handlers/ping.js +5 -0
- package/dist/__tests__/mocks/handlers/ping.js.map +1 -0
- package/dist/__tests__/mocks/handlers/voucher.d.ts +2 -0
- package/dist/__tests__/mocks/handlers/voucher.d.ts.map +1 -0
- package/dist/__tests__/mocks/handlers/voucher.js +33 -0
- package/dist/__tests__/mocks/handlers/voucher.js.map +1 -0
- package/dist/__tests__/mocks/handlers.d.ts +2 -0
- package/dist/__tests__/mocks/handlers.d.ts.map +1 -0
- package/dist/__tests__/mocks/handlers.js +9 -0
- package/dist/__tests__/mocks/handlers.js.map +1 -0
- package/dist/__tests__/mocks/node.d.ts +3 -0
- package/dist/__tests__/mocks/node.d.ts.map +1 -0
- package/dist/__tests__/mocks/node.js +5 -0
- package/dist/__tests__/mocks/node.js.map +1 -0
- package/dist/auth/__tests__/tokenManager.test.d.ts +2 -0
- package/dist/auth/__tests__/tokenManager.test.d.ts.map +1 -0
- package/dist/auth/__tests__/tokenManager.test.js +103 -0
- package/dist/auth/__tests__/tokenManager.test.js.map +1 -0
- package/dist/auth/tokenManager.d.ts +42 -0
- package/dist/auth/tokenManager.d.ts.map +1 -0
- package/dist/auth/tokenManager.js +108 -0
- package/dist/auth/tokenManager.js.map +1 -0
- package/dist/client/client/client.gen.d.ts.map +1 -1
- package/dist/client/client/client.gen.js +151 -119
- package/dist/client/client/client.gen.js.map +1 -1
- package/dist/client/client/index.d.ts +1 -1
- package/dist/client/client/index.d.ts.map +1 -1
- package/dist/client/client/index.js.map +1 -1
- package/dist/client/client/types.gen.d.ts +11 -34
- package/dist/client/client/types.gen.d.ts.map +1 -1
- package/dist/client/client/utils.gen.d.ts +7 -3
- package/dist/client/client/utils.gen.d.ts.map +1 -1
- package/dist/client/client/utils.gen.js +3 -3
- package/dist/client/client/utils.gen.js.map +1 -1
- package/dist/client/core/bodySerializer.gen.d.ts +4 -4
- package/dist/client/core/bodySerializer.gen.d.ts.map +1 -1
- package/dist/client/core/bodySerializer.gen.js.map +1 -1
- package/dist/client/core/params.gen.js +5 -5
- package/dist/client/core/params.gen.js.map +1 -1
- package/dist/client/core/serverSentEvents.gen.d.ts +1 -1
- package/dist/client/core/serverSentEvents.gen.d.ts.map +1 -1
- package/dist/client/core/serverSentEvents.gen.js +3 -4
- package/dist/client/core/serverSentEvents.gen.js.map +1 -1
- package/dist/client/core/types.gen.d.ts +1 -1
- package/dist/client/core/utils.gen.js +1 -1
- package/dist/client/core/utils.gen.js.map +1 -1
- package/dist/client/sdk.gen.d.ts +1 -1
- package/dist/client/sdk.gen.d.ts.map +1 -1
- package/dist/client/sdk.gen.js +109 -109
- package/dist/client/sdk.gen.js.map +1 -1
- package/dist/client/types.gen.d.ts +2 -2
- package/dist/configure.d.ts +43 -5
- package/dist/configure.d.ts.map +1 -1
- package/dist/configure.js +170 -20
- package/dist/configure.js.map +1 -1
- package/dist/errors.d.ts +15 -0
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +16 -0
- package/dist/errors.js.map +1 -1
- package/dist/index.d.ts +3 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- 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
|
-
| `
|
|
102
|
-
| `
|
|
103
|
-
| `
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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,
|
|
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"}
|