@uengage.io/platform-sdk 2.1.0 → 2.3.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/README.md CHANGED
@@ -33,6 +33,7 @@ const { balance, balanceMinor, currency } = await wallet.getBalance();
33
33
  // wallet.debit({ referenceId, amountMinor, service: Services.FLASH_DELIVERY, description }) — idempotent on referenceId
34
34
  // wallet.credit({ ..., reversalOf }) refund capped by that debit; ({ ..., isRefund: true }) uncapped
35
35
  // wallet.listTransactions({...}); wallet.getTransaction(id)
36
+ // wallet.getOverview() — wallet balance or credit line? See Wallet client below.
36
37
  // Legacy-ledger passthroughs, written as top-level ledger fields:
37
38
  // taskId, rto (debit), units, serviceBaseCost, paymentId (credit), updatedBy,
38
39
  // occurredAt — IST 'YYYY-MM-DD HH:mm:ss', dates the CHARGE not the write
@@ -229,6 +230,158 @@ const many = await client.business.bulk([123, 124], { groups: ['profile'] });
229
230
  - The `profile` group (just `name`) is public; other groups need
230
231
  matching `business.<group>:read` capability for the calling service id.
231
232
 
233
+ ## Wallet client
234
+
235
+ `getWallet(...)` is a lightweight handle — no I/O. The wallet is resolved
236
+ server-side on the first operation, so a routing miss surfaces from the
237
+ operation, not from `getWallet()`.
238
+
239
+ ### Which billing model? — start here
240
+
241
+ Prepaid wallets and merchant credit lines coexist, and which one a
242
+ merchant is on decides what a dashboard renders and which calls are even
243
+ legal. `getOverview()` settles it with a discriminated union:
244
+
245
+ ```ts
246
+ const o = await wallet.getOverview();
247
+
248
+ if (o.mode === 'credit') {
249
+ o.creditLine.limit; // { amount, amountMinor } — net of GST
250
+ o.creditLine.band; // 'normal' | 'warning' | 'critical' | 'blocked'
251
+ } else {
252
+ o.balance.balanceMinor; // prepaid: the wallet balance
253
+ }
254
+ ```
255
+
256
+ - `balance` is on **both** arms and means the same thing either way: what
257
+ the merchant can still spend. Available credit on the credit arm.
258
+ - One request for a prepaid merchant, two for a credit one, and never a
259
+ 404 on the happy path — it reads `getBalance().source` rather than
260
+ calling `getCreditLine()` and catching its 404, which would make the
261
+ normal state of a prepaid merchant an error on every page load.
262
+ - A wallet service older than the credit line (no `source`) reads as
263
+ prepaid rather than throwing.
264
+ - **The credit arm needs `wallet.credit:read` on top of
265
+ `wallet.balance:read`.** A token with only the latter gets a
266
+ `WalletApiError` with `status === 403` from the second call — not a
267
+ fallback to `prepaid`, which would render the frozen `wallet_balance`
268
+ these merchants no longer spend from.
269
+ - Not a guaranteed 200: `WalletNotFoundError` (no wallet document for the
270
+ resolved identity) and `UnresolvableWalletError` (routing cannot name
271
+ one) both propagate, because both mean there is nothing to render.
272
+
273
+ ### Credit line
274
+
275
+ The ceiling is per **merchant**, not per wallet, so an outlet's id and its
276
+ parent's id return the same line.
277
+
278
+ ```ts
279
+ const line = await wallet.getCreditLine(); // 404 CreditLineNotFoundError if prepaid
280
+ line.consumed; // net, UNPAID — spans months, not a calendar figure
281
+ line.available; // limit − consumed
282
+ line.estimatedInvoice.total; // exact, from recorded GST — not consumed × 1.18
283
+
284
+ await wallet.setCreditLimit({
285
+ referenceId: 'admin:limit:1200:2026-09-02', // idempotency key
286
+ limitMinor: 10_000_000, // ₹1,00,000, NET of GST; 0 blocks
287
+ onBehalfOf: 'user:4471', // required — the trail names the human
288
+ reason: 'Q3 volume increase',
289
+ // enabled: false → take them off the credit line
290
+ });
291
+
292
+ await wallet.settleInvoice({
293
+ invoiceRef: 'invoice:2026-04:88213', // idempotency key
294
+ netMinor: 500_000, // the NET figure — what frees credit
295
+ gstMinor: 90_000, // recorded, not released
296
+ onBehalfOf: 'user:9',
297
+ });
298
+ await wallet.reverseSettlement({ invoiceRef: '…', onBehalfOf: 'user:9' });
299
+ // Correcting a settled amount: reverse, then settle again with the right
300
+ // figures AND a `reason` — different figures on a reversed invoice
301
+ // release against the merchant's whole outstanding consumption, so the
302
+ // service requires the correction to say what it is correcting.
303
+
304
+ await wallet.listCreditEvents(); // limit changes + settlements, newest first
305
+ await wallet.listCreditEvents({ limit: 200 }); // the service defaults to 50
306
+ await client.wallet.getCreditUtilisation({ band: 'warning' }); // cross-merchant
307
+ ```
308
+
309
+ - **Charges on a credit-line merchant must carry `breakup`** — consumption
310
+ is tracked net of GST, so a missing split is
311
+ `CreditBreakupRequiredError` rather than a guessed rate. `allowNegative`
312
+ is refused (`CreditOverrideRefusedError`): it disables the balance guard
313
+ for migration paths, and on a credit line it would disable the limit.
314
+ - **The merchant pays gross; settlement releases net.** A ₹5,900 invoice
315
+ on ₹5,000 of consumption frees ₹5,000. Passing gross hands back 18% too
316
+ much — and it looks right in a test, since both figures sit on the same
317
+ invoice row.
318
+ - **Setting a limit never touches consumption**, so raising one hands back
319
+ exactly the difference. Lowering below what is consumed blocks charges
320
+ immediately.
321
+ - **`enabled: false` is refused while the merchant owes** —
322
+ `CreditLineHasOutstandingError`, carrying `consumedMinor` so you can say
323
+ how much to settle. Disabling moves them back to a wallet balance, which
324
+ with a balance owed abandons it. To _stop_ a merchant trading use
325
+ `limitMinor: 0`; to move them _off_, settle first.
326
+ - Reusing an idempotency key with **different** figures is
327
+ `CreditIdempotencyConflictError`, not a silent replay. To correct a
328
+ settled amount, reverse it and settle again rather than inventing a new
329
+ ref — a new ref leaves the original settlement standing.
330
+ - **A plain `credit()` is refused** — `CreditTopUpRefusedError`. These
331
+ merchants have no balance to top up: `wallet_balance` is the fiction the
332
+ line replaces and is frozen, so the write would move nothing while
333
+ answering 201. Credit comes back through `settleInvoice`. A genuine
334
+ refund is accepted — send `reversalOf` or `isRefund` and it releases
335
+ what the original charge consumed.
336
+ - `getCreditUtilisation` hangs off the **client**, not a wallet handle: it
337
+ is the one wallet call not scoped to a business.
338
+
339
+ ### Errors
340
+
341
+ All extend `WalletApiError` (`.status`, `.body`).
342
+
343
+ `CreditLimitReachedError` carries `limitMinor` / `consumedMinor` /
344
+ `availableMinor` / `requestedMinor`, and that is the point of it — three
345
+ situations share the code and need different merchant copy:
346
+
347
+ ```ts
348
+ if (e instanceof CreditLimitReachedError) {
349
+ if (e.availableMinor === undefined) {
350
+ // No figures in the response (trimmed or proxied body) — generic
351
+ // copy. Not the same as 0, which is the "used up" sentinel below.
352
+ } else if (e.availableMinor > 0) {
353
+ // Limit NOT used up — this one charge is larger than what is left.
354
+ // A smaller order would go through; do not send them to their KAM.
355
+ }
356
+ // Otherwise the ceiling is reached — which can be unpaid invoices
357
+ // rather than this month's spend. getCreditLine() tells you which.
358
+ }
359
+ ```
360
+
361
+ The figures are optional for that reason: coercing an absent
362
+ `availableMinor` to `0` would silently claim the limit is used up.
363
+
364
+ Also: `CreditLineNotFoundError` (404 — a prepaid merchant, not a
365
+ failure), `CreditBreakupRequiredError`, `CreditOverrideRefusedError`,
366
+ `CreditTopUpRefusedError`, `CreditIdempotencyConflictError`,
367
+ `CreditCorrectionReasonRequiredError` (400 — a reversed invoice is being
368
+ re-settled for different figures; pass `reason`),
369
+ `CreditCurrencyConflictError` and `CreditCurrencyMismatchError` (409 —
370
+ neither is caller-retryable; see their docblocks),
371
+ `SettlementNotFoundError`, plus the
372
+ pre-existing `InsufficientBalanceError`, `OverRefundError`,
373
+ `InvalidReversalError`, `IdempotencyConflictError`,
374
+ `WalletIdentityMismatchError`, `UnresolvableWalletError`,
375
+ `WalletNotFoundError`.
376
+
377
+ ### Money
378
+
379
+ Every figure is `{ amount, amountMinor }`. **Compute in `amountMinor`**
380
+ (integer paise); `amount` is for display. On a ledger row `amount` is
381
+ **gross** and `breakup.subTotalMinor` is what consumed the ceiling —
382
+ `creditMerchantId` present means the row's `balanceBefore`/`balanceAfter`
383
+ are available credit rather than a wallet balance.
384
+
232
385
  ## Auth helpers
233
386
 
234
387
  ```ts
@@ -3,40 +3,55 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.getIssuer = getIssuer;
4
4
  exports.getExpiry = getExpiry;
5
5
  /**
6
- * Decode (without verifying) a JWT and return its `iss` claim. Used by
7
- * the SDK to route subsequent auth-related calls (refresh, future
8
- * logout) at `${iss}/...`, so tokens from different issuers are
9
- * routed correctly when customer-auth ships alongside business-auth.
6
+ * Base64url-decode a JWT segment, in Node and in a browser.
7
+ *
8
+ * `Buffer` is a Node global. In a browser or React Native it is simply not
9
+ * defined, and touching it throws a ReferenceError rather than yielding
10
+ * undefined — which the callers below used to swallow, so every expiry read
11
+ * silently returned null off-Node. That mattered once a browser-reachable
12
+ * token source started caching against `exp`: the cache fell back to a flat
13
+ * five minutes and nothing said why. `atob` covers those runtimes.
10
14
  */
11
- function getIssuer(token) {
15
+ function decodeSegment(segment) {
16
+ const base64 = segment.replace(/-/g, '+').replace(/_/g, '/');
17
+ const padded = base64.padEnd(base64.length + ((4 - (base64.length % 4)) % 4), '=');
18
+ if (typeof Buffer !== 'undefined') {
19
+ return Buffer.from(padded, 'base64').toString('utf8');
20
+ }
21
+ // atob yields one byte per character; re-decode as UTF-8 so a non-ASCII
22
+ // claim (a merchant name, say) does not come back mojibake.
23
+ const binary = atob(padded);
24
+ const bytes = Uint8Array.from(binary, (ch) => ch.charCodeAt(0));
25
+ return new TextDecoder().decode(bytes);
26
+ }
27
+ function claimsOf(token) {
12
28
  const parts = token.split('.');
13
29
  if (parts.length !== 3)
14
30
  return null;
15
31
  try {
16
- const payload = parts[1].replace(/-/g, '+').replace(/_/g, '/');
17
- const padded = payload.padEnd(payload.length + ((4 - (payload.length % 4)) % 4), '=');
18
- const json = Buffer.from(padded, 'base64').toString('utf8');
19
- const claims = JSON.parse(json);
20
- return typeof claims.iss === 'string' ? claims.iss : null;
32
+ return JSON.parse(decodeSegment(parts[1]));
21
33
  }
22
34
  catch {
23
35
  return null;
24
36
  }
25
37
  }
38
+ /**
39
+ * Decode (without verifying) a JWT and return its `iss` claim. Used by
40
+ * the SDK to route subsequent auth-related calls (refresh, future
41
+ * logout) at `${iss}/...`, so tokens from different issuers are
42
+ * routed correctly when customer-auth ships alongside business-auth.
43
+ */
44
+ function getIssuer(token) {
45
+ const claims = claimsOf(token);
46
+ if (!claims)
47
+ return null;
48
+ return typeof claims.iss === 'string' ? claims.iss : null;
49
+ }
26
50
  /** Decode (without verifying) a JWT and return its `exp` claim (unix seconds). */
27
51
  function getExpiry(token) {
28
- const parts = token.split('.');
29
- if (parts.length !== 3)
52
+ const claims = claimsOf(token);
53
+ if (!claims)
30
54
  return null;
31
- try {
32
- const payload = parts[1].replace(/-/g, '+').replace(/_/g, '/');
33
- const padded = payload.padEnd(payload.length + ((4 - (payload.length % 4)) % 4), '=');
34
- const json = Buffer.from(padded, 'base64').toString('utf8');
35
- const claims = JSON.parse(json);
36
- return typeof claims.exp === 'number' ? claims.exp : null;
37
- }
38
- catch {
39
- return null;
40
- }
55
+ return typeof claims.exp === 'number' ? claims.exp : null;
41
56
  }
42
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaXNzdWVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2F1dGgvaXNzdWVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBTUEsOEJBWUM7QUFHRCw4QkFZQztBQWpDRDs7Ozs7R0FLRztBQUNILFNBQWdCLFNBQVMsQ0FBQyxLQUFhO0lBQ3JDLE1BQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDL0IsSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUM7UUFBRSxPQUFPLElBQUksQ0FBQztJQUNwQyxJQUFJLENBQUM7UUFDSCxNQUFNLE9BQU8sR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQy9ELE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ3RGLE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUM1RCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBNEIsQ0FBQztRQUMzRCxPQUFPLE9BQU8sTUFBTSxDQUFDLEdBQUcsS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztJQUM1RCxDQUFDO0lBQUMsTUFBTSxDQUFDO1FBQ1AsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0FBQ0gsQ0FBQztBQUVELGtGQUFrRjtBQUNsRixTQUFnQixTQUFTLENBQUMsS0FBYTtJQUNyQyxNQUFNLEtBQUssR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQy9CLElBQUksS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDO1FBQUUsT0FBTyxJQUFJLENBQUM7SUFDcEMsSUFBSSxDQUFDO1FBQ0gsTUFBTSxPQUFPLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQztRQUMvRCxNQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUN0RixNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDNUQsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQTRCLENBQUM7UUFDM0QsT0FBTyxPQUFPLE1BQU0sQ0FBQyxHQUFHLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDNUQsQ0FBQztJQUFDLE1BQU0sQ0FBQztRQUNQLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIERlY29kZSAod2l0aG91dCB2ZXJpZnlpbmcpIGEgSldUIGFuZCByZXR1cm4gaXRzIGBpc3NgIGNsYWltLiBVc2VkIGJ5XG4gKiB0aGUgU0RLIHRvIHJvdXRlIHN1YnNlcXVlbnQgYXV0aC1yZWxhdGVkIGNhbGxzIChyZWZyZXNoLCBmdXR1cmVcbiAqIGxvZ291dCkgYXQgYCR7aXNzfS8uLi5gLCBzbyB0b2tlbnMgZnJvbSBkaWZmZXJlbnQgaXNzdWVycyBhcmVcbiAqIHJvdXRlZCBjb3JyZWN0bHkgd2hlbiBjdXN0b21lci1hdXRoIHNoaXBzIGFsb25nc2lkZSBidXNpbmVzcy1hdXRoLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0SXNzdWVyKHRva2VuOiBzdHJpbmcpOiBzdHJpbmcgfCBudWxsIHtcbiAgY29uc3QgcGFydHMgPSB0b2tlbi5zcGxpdCgnLicpO1xuICBpZiAocGFydHMubGVuZ3RoICE9PSAzKSByZXR1cm4gbnVsbDtcbiAgdHJ5IHtcbiAgICBjb25zdCBwYXlsb2FkID0gcGFydHNbMV0ucmVwbGFjZSgvLS9nLCAnKycpLnJlcGxhY2UoL18vZywgJy8nKTtcbiAgICBjb25zdCBwYWRkZWQgPSBwYXlsb2FkLnBhZEVuZChwYXlsb2FkLmxlbmd0aCArICgoNCAtIChwYXlsb2FkLmxlbmd0aCAlIDQpKSAlIDQpLCAnPScpO1xuICAgIGNvbnN0IGpzb24gPSBCdWZmZXIuZnJvbShwYWRkZWQsICdiYXNlNjQnKS50b1N0cmluZygndXRmOCcpO1xuICAgIGNvbnN0IGNsYWltcyA9IEpTT04ucGFyc2UoanNvbikgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgcmV0dXJuIHR5cGVvZiBjbGFpbXMuaXNzID09PSAnc3RyaW5nJyA/IGNsYWltcy5pc3MgOiBudWxsO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG4vKiogRGVjb2RlICh3aXRob3V0IHZlcmlmeWluZykgYSBKV1QgYW5kIHJldHVybiBpdHMgYGV4cGAgY2xhaW0gKHVuaXggc2Vjb25kcykuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RXhwaXJ5KHRva2VuOiBzdHJpbmcpOiBudW1iZXIgfCBudWxsIHtcbiAgY29uc3QgcGFydHMgPSB0b2tlbi5zcGxpdCgnLicpO1xuICBpZiAocGFydHMubGVuZ3RoICE9PSAzKSByZXR1cm4gbnVsbDtcbiAgdHJ5IHtcbiAgICBjb25zdCBwYXlsb2FkID0gcGFydHNbMV0ucmVwbGFjZSgvLS9nLCAnKycpLnJlcGxhY2UoL18vZywgJy8nKTtcbiAgICBjb25zdCBwYWRkZWQgPSBwYXlsb2FkLnBhZEVuZChwYXlsb2FkLmxlbmd0aCArICgoNCAtIChwYXlsb2FkLmxlbmd0aCAlIDQpKSAlIDQpLCAnPScpO1xuICAgIGNvbnN0IGpzb24gPSBCdWZmZXIuZnJvbShwYWRkZWQsICdiYXNlNjQnKS50b1N0cmluZygndXRmOCcpO1xuICAgIGNvbnN0IGNsYWltcyA9IEpTT04ucGFyc2UoanNvbikgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgcmV0dXJuIHR5cGVvZiBjbGFpbXMuZXhwID09PSAnbnVtYmVyJyA/IGNsYWltcy5leHAgOiBudWxsO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuIl19
57
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaXNzdWVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2F1dGgvaXNzdWVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBeUNBLDhCQUlDO0FBR0QsOEJBSUM7QUFwREQ7Ozs7Ozs7OztHQVNHO0FBQ0gsU0FBUyxhQUFhLENBQUMsT0FBZTtJQUNwQyxNQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQzdELE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBRW5GLElBQUksT0FBTyxNQUFNLEtBQUssV0FBVyxFQUFFLENBQUM7UUFDbEMsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDeEQsQ0FBQztJQUVELHdFQUF3RTtJQUN4RSw0REFBNEQ7SUFDNUQsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzVCLE1BQU0sS0FBSyxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDaEUsT0FBTyxJQUFJLFdBQVcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUN6QyxDQUFDO0FBRUQsU0FBUyxRQUFRLENBQUMsS0FBYTtJQUM3QixNQUFNLEtBQUssR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQy9CLElBQUksS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDO1FBQUUsT0FBTyxJQUFJLENBQUM7SUFDcEMsSUFBSSxDQUFDO1FBQ0gsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBNEIsQ0FBQztJQUN4RSxDQUFDO0lBQUMsTUFBTSxDQUFDO1FBQ1AsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0FBQ0gsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsU0FBZ0IsU0FBUyxDQUFDLEtBQWE7SUFDckMsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQy9CLElBQUksQ0FBQyxNQUFNO1FBQUUsT0FBTyxJQUFJLENBQUM7SUFDekIsT0FBTyxPQUFPLE1BQU0sQ0FBQyxHQUFHLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7QUFDNUQsQ0FBQztBQUVELGtGQUFrRjtBQUNsRixTQUFnQixTQUFTLENBQUMsS0FBYTtJQUNyQyxNQUFNLE1BQU0sR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDL0IsSUFBSSxDQUFDLE1BQU07UUFBRSxPQUFPLElBQUksQ0FBQztJQUN6QixPQUFPLE9BQU8sTUFBTSxDQUFDLEdBQUcsS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztBQUM1RCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBCYXNlNjR1cmwtZGVjb2RlIGEgSldUIHNlZ21lbnQsIGluIE5vZGUgYW5kIGluIGEgYnJvd3Nlci5cbiAqXG4gKiBgQnVmZmVyYCBpcyBhIE5vZGUgZ2xvYmFsLiBJbiBhIGJyb3dzZXIgb3IgUmVhY3QgTmF0aXZlIGl0IGlzIHNpbXBseSBub3RcbiAqIGRlZmluZWQsIGFuZCB0b3VjaGluZyBpdCB0aHJvd3MgYSBSZWZlcmVuY2VFcnJvciByYXRoZXIgdGhhbiB5aWVsZGluZ1xuICogdW5kZWZpbmVkIOKAlCB3aGljaCB0aGUgY2FsbGVycyBiZWxvdyB1c2VkIHRvIHN3YWxsb3csIHNvIGV2ZXJ5IGV4cGlyeSByZWFkXG4gKiBzaWxlbnRseSByZXR1cm5lZCBudWxsIG9mZi1Ob2RlLiBUaGF0IG1hdHRlcmVkIG9uY2UgYSBicm93c2VyLXJlYWNoYWJsZVxuICogdG9rZW4gc291cmNlIHN0YXJ0ZWQgY2FjaGluZyBhZ2FpbnN0IGBleHBgOiB0aGUgY2FjaGUgZmVsbCBiYWNrIHRvIGEgZmxhdFxuICogZml2ZSBtaW51dGVzIGFuZCBub3RoaW5nIHNhaWQgd2h5LiBgYXRvYmAgY292ZXJzIHRob3NlIHJ1bnRpbWVzLlxuICovXG5mdW5jdGlvbiBkZWNvZGVTZWdtZW50KHNlZ21lbnQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IGJhc2U2NCA9IHNlZ21lbnQucmVwbGFjZSgvLS9nLCAnKycpLnJlcGxhY2UoL18vZywgJy8nKTtcbiAgY29uc3QgcGFkZGVkID0gYmFzZTY0LnBhZEVuZChiYXNlNjQubGVuZ3RoICsgKCg0IC0gKGJhc2U2NC5sZW5ndGggJSA0KSkgJSA0KSwgJz0nKTtcblxuICBpZiAodHlwZW9mIEJ1ZmZlciAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICByZXR1cm4gQnVmZmVyLmZyb20ocGFkZGVkLCAnYmFzZTY0JykudG9TdHJpbmcoJ3V0ZjgnKTtcbiAgfVxuXG4gIC8vIGF0b2IgeWllbGRzIG9uZSBieXRlIHBlciBjaGFyYWN0ZXI7IHJlLWRlY29kZSBhcyBVVEYtOCBzbyBhIG5vbi1BU0NJSVxuICAvLyBjbGFpbSAoYSBtZXJjaGFudCBuYW1lLCBzYXkpIGRvZXMgbm90IGNvbWUgYmFjayBtb2ppYmFrZS5cbiAgY29uc3QgYmluYXJ5ID0gYXRvYihwYWRkZWQpO1xuICBjb25zdCBieXRlcyA9IFVpbnQ4QXJyYXkuZnJvbShiaW5hcnksIChjaCkgPT4gY2guY2hhckNvZGVBdCgwKSk7XG4gIHJldHVybiBuZXcgVGV4dERlY29kZXIoKS5kZWNvZGUoYnl0ZXMpO1xufVxuXG5mdW5jdGlvbiBjbGFpbXNPZih0b2tlbjogc3RyaW5nKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCBudWxsIHtcbiAgY29uc3QgcGFydHMgPSB0b2tlbi5zcGxpdCgnLicpO1xuICBpZiAocGFydHMubGVuZ3RoICE9PSAzKSByZXR1cm4gbnVsbDtcbiAgdHJ5IHtcbiAgICByZXR1cm4gSlNPTi5wYXJzZShkZWNvZGVTZWdtZW50KHBhcnRzWzFdKSkgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBudWxsO1xuICB9XG59XG5cbi8qKlxuICogRGVjb2RlICh3aXRob3V0IHZlcmlmeWluZykgYSBKV1QgYW5kIHJldHVybiBpdHMgYGlzc2AgY2xhaW0uIFVzZWQgYnlcbiAqIHRoZSBTREsgdG8gcm91dGUgc3Vic2VxdWVudCBhdXRoLXJlbGF0ZWQgY2FsbHMgKHJlZnJlc2gsIGZ1dHVyZVxuICogbG9nb3V0KSBhdCBgJHtpc3N9Ly4uLmAsIHNvIHRva2VucyBmcm9tIGRpZmZlcmVudCBpc3N1ZXJzIGFyZVxuICogcm91dGVkIGNvcnJlY3RseSB3aGVuIGN1c3RvbWVyLWF1dGggc2hpcHMgYWxvbmdzaWRlIGJ1c2luZXNzLWF1dGguXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRJc3N1ZXIodG9rZW46IHN0cmluZyk6IHN0cmluZyB8IG51bGwge1xuICBjb25zdCBjbGFpbXMgPSBjbGFpbXNPZih0b2tlbik7XG4gIGlmICghY2xhaW1zKSByZXR1cm4gbnVsbDtcbiAgcmV0dXJuIHR5cGVvZiBjbGFpbXMuaXNzID09PSAnc3RyaW5nJyA/IGNsYWltcy5pc3MgOiBudWxsO1xufVxuXG4vKiogRGVjb2RlICh3aXRob3V0IHZlcmlmeWluZykgYSBKV1QgYW5kIHJldHVybiBpdHMgYGV4cGAgY2xhaW0gKHVuaXggc2Vjb25kcykuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RXhwaXJ5KHRva2VuOiBzdHJpbmcpOiBudW1iZXIgfCBudWxsIHtcbiAgY29uc3QgY2xhaW1zID0gY2xhaW1zT2YodG9rZW4pO1xuICBpZiAoIWNsYWltcykgcmV0dXJuIG51bGw7XG4gIHJldHVybiB0eXBlb2YgY2xhaW1zLmV4cCA9PT0gJ251bWJlcicgPyBjbGFpbXMuZXhwIDogbnVsbDtcbn1cbiJdfQ==
package/dist/config.d.ts CHANGED
@@ -24,9 +24,14 @@ export interface PlatformConfigInput {
24
24
  logger?: Logger;
25
25
  }
26
26
  /**
27
- * `.auth()` shape. Pass `{token}` for a static Bearer access token.
28
- * OAuth2 client_credentials live at `createClient()` config-time
29
- * (`serviceId` + `serviceSecret` fields), not via `.auth()`.
27
+ * `.auth()` shape. Pass `{token}` for a static Bearer access token — used
28
+ * until its `exp` passes, after which requests fail, because the SDK cannot
29
+ * refresh a bare string.
30
+ *
31
+ * For anything that needs renewal, do not use this: pass `serviceId` +
32
+ * `serviceSecret` or `tokenUrl` to `upsell.createClient()` (and the
33
+ * equivalents on `createClient()`), which build a token source that mints,
34
+ * caches and renews. Those options mirror the realtime SDK's names.
30
35
  */
31
36
  export interface PlatformAuthInput {
32
37
  token?: string;
package/dist/config.js CHANGED
@@ -48,7 +48,7 @@ function normalizeAuth(input) {
48
48
  if (input.token) {
49
49
  return { type: 'bearer', token: input.token };
50
50
  }
51
- throw new Error('auth(): pass {token} for a static Bearer access token, or use createClient({serviceId, serviceSecret}) for OAuth2 client_credentials');
51
+ throw new Error('auth(): pass {token} for a static Bearer access token, or use createClient({serviceId, serviceSecret}) / upsell.createClient({tokenUrl}) for a token the SDK renews itself');
52
52
  }
53
53
  /**
54
54
  * Mutable config shared by clients. `apply()` and `setAuth()` are how the
@@ -87,4 +87,4 @@ class ConfigState {
87
87
  }
88
88
  }
89
89
  exports.ConfigState = ConfigState;
90
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2NvbmZpZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFtREEsa0NBTUM7QUFpQkQsc0NBUUM7QUEvRVksUUFBQSxnQkFBZ0IsR0FBRyxpQ0FBaUMsQ0FBQztBQWdDbEU7Ozs7R0FJRztBQUNIOzs7OztHQUtHO0FBQ0gsU0FBUyxHQUFHLENBQUMsSUFBWTtJQUN2QixJQUFJLE9BQU8sT0FBTyxLQUFLLFdBQVc7UUFBRSxPQUFPLFNBQVMsQ0FBQztJQUNyRCxPQUFRLE9BQXdELENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDL0UsQ0FBQztBQUVELFNBQWdCLFdBQVc7SUFDekIsT0FBTztRQUNMLE9BQU8sRUFBRSxHQUFHLENBQUMsa0JBQWtCLENBQUMsSUFBSSx3QkFBZ0I7UUFDcEQsSUFBSSxFQUFFLE9BQU8sRUFBRTtRQUNmLE9BQU8sRUFBRSxVQUFVLENBQUMsS0FBcUI7S0FDMUMsQ0FBQztBQUNKLENBQUM7QUFFRCxTQUFTLE9BQU87SUFDZCxNQUFNLEtBQUssR0FBRyxHQUFHLENBQUMsb0JBQW9CLENBQUMsQ0FBQztJQUN4QyxJQUFJLEtBQUs7UUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsQ0FBQztJQUM1QyxPQUFPLFNBQVMsQ0FBQztBQUNuQixDQUFDO0FBRUQ7Ozs7Ozs7O0dBUUc7QUFDSCxTQUFnQixhQUFhLENBQUMsS0FBdUM7SUFDbkUsSUFBSSxNQUFNLElBQUksS0FBSztRQUFFLE9BQU8sS0FBSyxDQUFDO0lBQ2xDLElBQUksS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ2hCLE9BQU8sRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDaEQsQ0FBQztJQUNELE1BQU0sSUFBSSxLQUFLLENBQ2Isc0lBQXNJLENBQ3ZJLENBQUM7QUFDSixDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxNQUFhLFdBQVc7SUFDZCxTQUFTLEdBQXdCLEVBQUUsQ0FBQztJQUNwQyxZQUFZLENBQTJCO0lBQ3ZDLGVBQWUsR0FBRyxLQUFLLENBQUM7SUFFaEMsS0FBSyxDQUFDLEtBQTBCO1FBQzlCLElBQUksS0FBSyxDQUFDLE9BQU8sS0FBSyxTQUFTO1lBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQztRQUN4RSxJQUFJLEtBQUssQ0FBQyxPQUFPLEtBQUssU0FBUztZQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUM7UUFDeEUsSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLFNBQVM7WUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDO1FBQ3JFLElBQUksS0FBSyxDQUFDLElBQUksS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUM3QixJQUFJLENBQUMsWUFBWSxHQUFHLGFBQWEsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDOUMsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUM7UUFDOUIsQ0FBQztJQUNILENBQUM7SUFFRCxPQUFPLENBQUMsS0FBdUM7UUFDN0MsSUFBSSxDQUFDLFlBQVksR0FBRyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDekMsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUM7SUFDOUIsQ0FBQztJQUVELE9BQU87UUFDTCxNQUFNLEdBQUcsR0FBRyxXQUFXLEVBQUUsQ0FBQztRQUMxQixPQUFPO1lBQ0wsT0FBTyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxJQUFJLEdBQUcsQ0FBQyxPQUFPO1lBQzlDLElBQUksRUFBRSxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSTtZQUN6RCxPQUFPLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sSUFBSSxHQUFHLENBQUMsT0FBTyxDQUFpQjtZQUNoRSxNQUFNLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUE0QjtTQUNwRCxDQUFDO0lBQ0osQ0FBQztDQUNGO0FBN0JELGtDQTZCQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgTG9nZ2VyIH0gZnJvbSAnQHVlbmdhZ2UuaW8vanMtbG9nZ2VyJztcbmltcG9ydCB0eXBlIHsgVG9rZW5Tb3VyY2VTdGF0ZSB9IGZyb20gJy4vdG9rZW4tc291cmNlJztcblxuZXhwb3J0IGNvbnN0IERFRkFVTFRfQkFTRV9VUkwgPSAnaHR0cHM6Ly9hcGkucGxhdGZvcm0udWVuZ2FnZS5pbyc7XG5cbi8qKlxuICogUmVzb2x2ZWQgYXV0aCBzdGF0ZS4gRGlzY3JpbWluYXRlZCBieSBgdHlwZWAgc28gY29uc3VtZXJzIGNhbiBuYXJyb3cuXG4gKi9cbmV4cG9ydCB0eXBlIFBsYXRmb3JtQXV0aCA9XG4gIHwgeyB0eXBlOiAnYmVhcmVyJzsgdG9rZW46IHN0cmluZyB9XG4gIHwgeyB0eXBlOiAndG9rZW4tc291cmNlJzsgc3RhdGU6IFRva2VuU291cmNlU3RhdGUgfTtcblxuZXhwb3J0IGludGVyZmFjZSBQbGF0Zm9ybUNvbmZpZyB7XG4gIGJhc2VVcmw6IHN0cmluZztcbiAgYXV0aD86IFBsYXRmb3JtQXV0aDtcbiAgZmV0Y2hGbjogdHlwZW9mIGZldGNoO1xuICBsb2dnZXI/OiBMb2dnZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGxhdGZvcm1Db25maWdJbnB1dCB7XG4gIGJhc2VVcmw/OiBzdHJpbmc7XG4gIGF1dGg/OiBQbGF0Zm9ybUF1dGhJbnB1dCB8IFBsYXRmb3JtQXV0aDtcbiAgZmV0Y2hGbj86IHR5cGVvZiBmZXRjaDtcbiAgbG9nZ2VyPzogTG9nZ2VyO1xufVxuXG4vKipcbiAqIGAuYXV0aCgpYCBzaGFwZS4gUGFzcyBge3Rva2VufWAgZm9yIGEgc3RhdGljIEJlYXJlciBhY2Nlc3MgdG9rZW4uXG4gKiBPQXV0aDIgY2xpZW50X2NyZWRlbnRpYWxzIGxpdmUgYXQgYGNyZWF0ZUNsaWVudCgpYCBjb25maWctdGltZVxuICogKGBzZXJ2aWNlSWRgICsgYHNlcnZpY2VTZWNyZXRgIGZpZWxkcyksIG5vdCB2aWEgYC5hdXRoKClgLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBsYXRmb3JtQXV0aElucHV0IHtcbiAgdG9rZW4/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogUmVzb2x2ZSBlbnYtZGVmYXVsdGVkIGNvbmZpZy4gUmUtcmVhZCBvbiBldmVyeSBjYWxsIHNvIHRoYXQgY2FsbGVycyBjYW5cbiAqIHNldCBlbnYgdmFycyBhZnRlciB0aGUgU0RLIGhhcyBiZWVuIGltcG9ydGVkIGFuZCBzdGlsbCBwaWNrIHRoZW0gdXAgb25cbiAqIHRoZSBuZXh0IHJlcXVlc3QuXG4gKi9cbi8qKlxuICogUmVhZCBgcHJvY2Vzcy5lbnZgIGRlZmVuc2l2ZWx5OiBpbiBhIGJyb3dzZXIgYnVuZGxlIGBwcm9jZXNzYCBpcyBub3RcbiAqIGRlZmluZWQgYXQgYWxsLCBhbmQgdG91Y2hpbmcgaXQgdGhyb3dzIGEgUmVmZXJlbmNlRXJyb3IgcmF0aGVyIHRoYW5cbiAqIHlpZWxkaW5nIHVuZGVmaW5lZC4gVGhlIFNESyBpcyB1c2VkIGZyb20gYnJvd3NlcnMgKHRoZVxuICogYHdoaXRlbGFiZWxfd2ViYCBjaGFubmVsKSwgc28gZXZlcnkgZW52IHJlYWQgZ29lcyB0aHJvdWdoIGhlcmUuXG4gKi9cbmZ1bmN0aW9uIGVudihuYW1lOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAodHlwZW9mIHByb2Nlc3MgPT09ICd1bmRlZmluZWQnKSByZXR1cm4gdW5kZWZpbmVkO1xuICByZXR1cm4gKHByb2Nlc3MgYXMgeyBlbnY/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+IH0pLmVudj8uW25hbWVdO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZW52RGVmYXVsdHMoKTogUGxhdGZvcm1Db25maWcge1xuICByZXR1cm4ge1xuICAgIGJhc2VVcmw6IGVudignVUVOR0FHRV9CQVNFX1VSTCcpID8/IERFRkFVTFRfQkFTRV9VUkwsXG4gICAgYXV0aDogZW52QXV0aCgpLFxuICAgIGZldGNoRm46IGdsb2JhbFRoaXMuZmV0Y2ggYXMgdHlwZW9mIGZldGNoLFxuICB9O1xufVxuXG5mdW5jdGlvbiBlbnZBdXRoKCk6IFBsYXRmb3JtQXV0aCB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHRva2VuID0gZW52KCdVRU5HQUdFX0FVVEhfVE9LRU4nKTtcbiAgaWYgKHRva2VuKSByZXR1cm4geyB0eXBlOiAnYmVhcmVyJywgdG9rZW4gfTtcbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBDb2VyY2UgYC5hdXRoKClgIGlucHV0IG9yIGBjb25maWcoe2F1dGh9KWAgaW5wdXQgaW50byBhIHR5cGVkXG4gKiBQbGF0Zm9ybUF1dGguIFRocm93cyB3aGVuIHRoZSBpbnB1dCBoYXMgbm8gdXNhYmxlIGNyZWRlbnRpYWxzLlxuICpcbiAqIFRvZGF5IHRoaXMgb25seSBhY2NlcHRzIGB7dG9rZW59YCBvciBhIHByZS1zaGFwZWQgYFBsYXRmb3JtQXV0aGAuXG4gKiBGb3IgT0F1dGgyIGNsaWVudF9jcmVkZW50aWFscyB1c2UgYGNyZWF0ZUNsaWVudCh7c2VydmljZUlkLCBzZXJ2aWNlU2VjcmV0fSlgXG4gKiBpbnN0ZWFkIOKAlCB0aGF0IGJ1aWxkcyBhIFRva2VuU291cmNlIHdoaWNoIG1pbnRzICsgY2FjaGVzIEJlYXJlclxuICogdG9rZW5zLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplQXV0aChpbnB1dDogUGxhdGZvcm1BdXRoSW5wdXQgfCBQbGF0Zm9ybUF1dGgpOiBQbGF0Zm9ybUF1dGgge1xuICBpZiAoJ3R5cGUnIGluIGlucHV0KSByZXR1cm4gaW5wdXQ7XG4gIGlmIChpbnB1dC50b2tlbikge1xuICAgIHJldHVybiB7IHR5cGU6ICdiZWFyZXInLCB0b2tlbjogaW5wdXQudG9rZW4gfTtcbiAgfVxuICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgJ2F1dGgoKTogcGFzcyB7dG9rZW59IGZvciBhIHN0YXRpYyBCZWFyZXIgYWNjZXNzIHRva2VuLCBvciB1c2UgY3JlYXRlQ2xpZW50KHtzZXJ2aWNlSWQsIHNlcnZpY2VTZWNyZXR9KSBmb3IgT0F1dGgyIGNsaWVudF9jcmVkZW50aWFscycsXG4gICk7XG59XG5cbi8qKlxuICogTXV0YWJsZSBjb25maWcgc2hhcmVkIGJ5IGNsaWVudHMuIGBhcHBseSgpYCBhbmQgYHNldEF1dGgoKWAgYXJlIGhvdyB0aGVcbiAqIGNoYWluYWJsZSBgLmNvbmZpZygpYCAvIGAuYXV0aCgpYCBtZXRob2RzIHdyaXRlIGJhY2suIGByZXNvbHZlKClgIHByb2R1Y2VzXG4gKiB0aGUgZWZmZWN0aXZlIGNvbmZpZyBmb3Igb25lIHJlcXVlc3QsIGZhbGxpbmcgYmFjayB0byBjdXJyZW50IGVudiBzdGF0ZVxuICogZm9yIGZpZWxkcyB0aGUgY2FsbGVyIGhhc24ndCBwaW5uZWQuXG4gKi9cbmV4cG9ydCBjbGFzcyBDb25maWdTdGF0ZSB7XG4gIHByaXZhdGUgb3ZlcnJpZGVzOiBQbGF0Zm9ybUNvbmZpZ0lucHV0ID0ge307XG4gIHByaXZhdGUgZXhwbGljaXRBdXRoOiBQbGF0Zm9ybUF1dGggfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgaGFzRXhwbGljaXRBdXRoID0gZmFsc2U7XG5cbiAgYXBwbHkoaW5wdXQ6IFBsYXRmb3JtQ29uZmlnSW5wdXQpOiB2b2lkIHtcbiAgICBpZiAoaW5wdXQuYmFzZVVybCAhPT0gdW5kZWZpbmVkKSB0aGlzLm92ZXJyaWRlcy5iYXNlVXJsID0gaW5wdXQuYmFzZVVybDtcbiAgICBpZiAoaW5wdXQuZmV0Y2hGbiAhPT0gdW5kZWZpbmVkKSB0aGlzLm92ZXJyaWRlcy5mZXRjaEZuID0gaW5wdXQuZmV0Y2hGbjtcbiAgICBpZiAoaW5wdXQubG9nZ2VyICE9PSB1bmRlZmluZWQpIHRoaXMub3ZlcnJpZGVzLmxvZ2dlciA9IGlucHV0LmxvZ2dlcjtcbiAgICBpZiAoaW5wdXQuYXV0aCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmV4cGxpY2l0QXV0aCA9IG5vcm1hbGl6ZUF1dGgoaW5wdXQuYXV0aCk7XG4gICAgICB0aGlzLmhhc0V4cGxpY2l0QXV0aCA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgc2V0QXV0aChpbnB1dDogUGxhdGZvcm1BdXRoSW5wdXQgfCBQbGF0Zm9ybUF1dGgpOiB2b2lkIHtcbiAgICB0aGlzLmV4cGxpY2l0QXV0aCA9IG5vcm1hbGl6ZUF1dGgoaW5wdXQpO1xuICAgIHRoaXMuaGFzRXhwbGljaXRBdXRoID0gdHJ1ZTtcbiAgfVxuXG4gIHJlc29sdmUoKTogUGxhdGZvcm1Db25maWcge1xuICAgIGNvbnN0IGVudiA9IGVudkRlZmF1bHRzKCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGJhc2VVcmw6IHRoaXMub3ZlcnJpZGVzLmJhc2VVcmwgPz8gZW52LmJhc2VVcmwsXG4gICAgICBhdXRoOiB0aGlzLmhhc0V4cGxpY2l0QXV0aCA/IHRoaXMuZXhwbGljaXRBdXRoIDogZW52LmF1dGgsXG4gICAgICBmZXRjaEZuOiAodGhpcy5vdmVycmlkZXMuZmV0Y2hGbiA/PyBlbnYuZmV0Y2hGbikgYXMgdHlwZW9mIGZldGNoLFxuICAgICAgbG9nZ2VyOiB0aGlzLm92ZXJyaWRlcy5sb2dnZXIgYXMgTG9nZ2VyIHwgdW5kZWZpbmVkLFxuICAgIH07XG4gIH1cbn1cbiJdfQ==
90
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2NvbmZpZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUF3REEsa0NBTUM7QUFpQkQsc0NBUUM7QUFwRlksUUFBQSxnQkFBZ0IsR0FBRyxpQ0FBaUMsQ0FBQztBQXFDbEU7Ozs7R0FJRztBQUNIOzs7OztHQUtHO0FBQ0gsU0FBUyxHQUFHLENBQUMsSUFBWTtJQUN2QixJQUFJLE9BQU8sT0FBTyxLQUFLLFdBQVc7UUFBRSxPQUFPLFNBQVMsQ0FBQztJQUNyRCxPQUFRLE9BQXdELENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDL0UsQ0FBQztBQUVELFNBQWdCLFdBQVc7SUFDekIsT0FBTztRQUNMLE9BQU8sRUFBRSxHQUFHLENBQUMsa0JBQWtCLENBQUMsSUFBSSx3QkFBZ0I7UUFDcEQsSUFBSSxFQUFFLE9BQU8sRUFBRTtRQUNmLE9BQU8sRUFBRSxVQUFVLENBQUMsS0FBcUI7S0FDMUMsQ0FBQztBQUNKLENBQUM7QUFFRCxTQUFTLE9BQU87SUFDZCxNQUFNLEtBQUssR0FBRyxHQUFHLENBQUMsb0JBQW9CLENBQUMsQ0FBQztJQUN4QyxJQUFJLEtBQUs7UUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsQ0FBQztJQUM1QyxPQUFPLFNBQVMsQ0FBQztBQUNuQixDQUFDO0FBRUQ7Ozs7Ozs7O0dBUUc7QUFDSCxTQUFnQixhQUFhLENBQUMsS0FBdUM7SUFDbkUsSUFBSSxNQUFNLElBQUksS0FBSztRQUFFLE9BQU8sS0FBSyxDQUFDO0lBQ2xDLElBQUksS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ2hCLE9BQU8sRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDaEQsQ0FBQztJQUNELE1BQU0sSUFBSSxLQUFLLENBQ2IsNEtBQTRLLENBQzdLLENBQUM7QUFDSixDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxNQUFhLFdBQVc7SUFDZCxTQUFTLEdBQXdCLEVBQUUsQ0FBQztJQUNwQyxZQUFZLENBQTJCO0lBQ3ZDLGVBQWUsR0FBRyxLQUFLLENBQUM7SUFFaEMsS0FBSyxDQUFDLEtBQTBCO1FBQzlCLElBQUksS0FBSyxDQUFDLE9BQU8sS0FBSyxTQUFTO1lBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQztRQUN4RSxJQUFJLEtBQUssQ0FBQyxPQUFPLEtBQUssU0FBUztZQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUM7UUFDeEUsSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLFNBQVM7WUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDO1FBQ3JFLElBQUksS0FBSyxDQUFDLElBQUksS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUM3QixJQUFJLENBQUMsWUFBWSxHQUFHLGFBQWEsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDOUMsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUM7UUFDOUIsQ0FBQztJQUNILENBQUM7SUFFRCxPQUFPLENBQUMsS0FBdUM7UUFDN0MsSUFBSSxDQUFDLFlBQVksR0FBRyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDekMsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUM7SUFDOUIsQ0FBQztJQUVELE9BQU87UUFDTCxNQUFNLEdBQUcsR0FBRyxXQUFXLEVBQUUsQ0FBQztRQUMxQixPQUFPO1lBQ0wsT0FBTyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxJQUFJLEdBQUcsQ0FBQyxPQUFPO1lBQzlDLElBQUksRUFBRSxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSTtZQUN6RCxPQUFPLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sSUFBSSxHQUFHLENBQUMsT0FBTyxDQUFpQjtZQUNoRSxNQUFNLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUE0QjtTQUNwRCxDQUFDO0lBQ0osQ0FBQztDQUNGO0FBN0JELGtDQTZCQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgTG9nZ2VyIH0gZnJvbSAnQHVlbmdhZ2UuaW8vanMtbG9nZ2VyJztcbmltcG9ydCB0eXBlIHsgVG9rZW5Tb3VyY2VTdGF0ZSB9IGZyb20gJy4vdG9rZW4tc291cmNlJztcblxuZXhwb3J0IGNvbnN0IERFRkFVTFRfQkFTRV9VUkwgPSAnaHR0cHM6Ly9hcGkucGxhdGZvcm0udWVuZ2FnZS5pbyc7XG5cbi8qKlxuICogUmVzb2x2ZWQgYXV0aCBzdGF0ZS4gRGlzY3JpbWluYXRlZCBieSBgdHlwZWAgc28gY29uc3VtZXJzIGNhbiBuYXJyb3cuXG4gKi9cbmV4cG9ydCB0eXBlIFBsYXRmb3JtQXV0aCA9XG4gIHwgeyB0eXBlOiAnYmVhcmVyJzsgdG9rZW46IHN0cmluZyB9XG4gIHwgeyB0eXBlOiAndG9rZW4tc291cmNlJzsgc3RhdGU6IFRva2VuU291cmNlU3RhdGUgfTtcblxuZXhwb3J0IGludGVyZmFjZSBQbGF0Zm9ybUNvbmZpZyB7XG4gIGJhc2VVcmw6IHN0cmluZztcbiAgYXV0aD86IFBsYXRmb3JtQXV0aDtcbiAgZmV0Y2hGbjogdHlwZW9mIGZldGNoO1xuICBsb2dnZXI/OiBMb2dnZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGxhdGZvcm1Db25maWdJbnB1dCB7XG4gIGJhc2VVcmw/OiBzdHJpbmc7XG4gIGF1dGg/OiBQbGF0Zm9ybUF1dGhJbnB1dCB8IFBsYXRmb3JtQXV0aDtcbiAgZmV0Y2hGbj86IHR5cGVvZiBmZXRjaDtcbiAgbG9nZ2VyPzogTG9nZ2VyO1xufVxuXG4vKipcbiAqIGAuYXV0aCgpYCBzaGFwZS4gUGFzcyBge3Rva2VufWAgZm9yIGEgc3RhdGljIEJlYXJlciBhY2Nlc3MgdG9rZW4g4oCUIHVzZWRcbiAqIHVudGlsIGl0cyBgZXhwYCBwYXNzZXMsIGFmdGVyIHdoaWNoIHJlcXVlc3RzIGZhaWwsIGJlY2F1c2UgdGhlIFNESyBjYW5ub3RcbiAqIHJlZnJlc2ggYSBiYXJlIHN0cmluZy5cbiAqXG4gKiBGb3IgYW55dGhpbmcgdGhhdCBuZWVkcyByZW5ld2FsLCBkbyBub3QgdXNlIHRoaXM6IHBhc3MgYHNlcnZpY2VJZGAgK1xuICogYHNlcnZpY2VTZWNyZXRgIG9yIGB0b2tlblVybGAgdG8gYHVwc2VsbC5jcmVhdGVDbGllbnQoKWAgKGFuZCB0aGVcbiAqIGVxdWl2YWxlbnRzIG9uIGBjcmVhdGVDbGllbnQoKWApLCB3aGljaCBidWlsZCBhIHRva2VuIHNvdXJjZSB0aGF0IG1pbnRzLFxuICogY2FjaGVzIGFuZCByZW5ld3MuIFRob3NlIG9wdGlvbnMgbWlycm9yIHRoZSByZWFsdGltZSBTREsncyBuYW1lcy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQbGF0Zm9ybUF1dGhJbnB1dCB7XG4gIHRva2VuPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIFJlc29sdmUgZW52LWRlZmF1bHRlZCBjb25maWcuIFJlLXJlYWQgb24gZXZlcnkgY2FsbCBzbyB0aGF0IGNhbGxlcnMgY2FuXG4gKiBzZXQgZW52IHZhcnMgYWZ0ZXIgdGhlIFNESyBoYXMgYmVlbiBpbXBvcnRlZCBhbmQgc3RpbGwgcGljayB0aGVtIHVwIG9uXG4gKiB0aGUgbmV4dCByZXF1ZXN0LlxuICovXG4vKipcbiAqIFJlYWQgYHByb2Nlc3MuZW52YCBkZWZlbnNpdmVseTogaW4gYSBicm93c2VyIGJ1bmRsZSBgcHJvY2Vzc2AgaXMgbm90XG4gKiBkZWZpbmVkIGF0IGFsbCwgYW5kIHRvdWNoaW5nIGl0IHRocm93cyBhIFJlZmVyZW5jZUVycm9yIHJhdGhlciB0aGFuXG4gKiB5aWVsZGluZyB1bmRlZmluZWQuIFRoZSBTREsgaXMgdXNlZCBmcm9tIGJyb3dzZXJzICh0aGVcbiAqIGB3aGl0ZWxhYmVsX3dlYmAgY2hhbm5lbCksIHNvIGV2ZXJ5IGVudiByZWFkIGdvZXMgdGhyb3VnaCBoZXJlLlxuICovXG5mdW5jdGlvbiBlbnYobmFtZTogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKHR5cGVvZiBwcm9jZXNzID09PSAndW5kZWZpbmVkJykgcmV0dXJuIHVuZGVmaW5lZDtcbiAgcmV0dXJuIChwcm9jZXNzIGFzIHsgZW52PzogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPiB9KS5lbnY/LltuYW1lXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGVudkRlZmF1bHRzKCk6IFBsYXRmb3JtQ29uZmlnIHtcbiAgcmV0dXJuIHtcbiAgICBiYXNlVXJsOiBlbnYoJ1VFTkdBR0VfQkFTRV9VUkwnKSA/PyBERUZBVUxUX0JBU0VfVVJMLFxuICAgIGF1dGg6IGVudkF1dGgoKSxcbiAgICBmZXRjaEZuOiBnbG9iYWxUaGlzLmZldGNoIGFzIHR5cGVvZiBmZXRjaCxcbiAgfTtcbn1cblxuZnVuY3Rpb24gZW52QXV0aCgpOiBQbGF0Zm9ybUF1dGggfCB1bmRlZmluZWQge1xuICBjb25zdCB0b2tlbiA9IGVudignVUVOR0FHRV9BVVRIX1RPS0VOJyk7XG4gIGlmICh0b2tlbikgcmV0dXJuIHsgdHlwZTogJ2JlYXJlcicsIHRva2VuIH07XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogQ29lcmNlIGAuYXV0aCgpYCBpbnB1dCBvciBgY29uZmlnKHthdXRofSlgIGlucHV0IGludG8gYSB0eXBlZFxuICogUGxhdGZvcm1BdXRoLiBUaHJvd3Mgd2hlbiB0aGUgaW5wdXQgaGFzIG5vIHVzYWJsZSBjcmVkZW50aWFscy5cbiAqXG4gKiBUb2RheSB0aGlzIG9ubHkgYWNjZXB0cyBge3Rva2VufWAgb3IgYSBwcmUtc2hhcGVkIGBQbGF0Zm9ybUF1dGhgLlxuICogRm9yIE9BdXRoMiBjbGllbnRfY3JlZGVudGlhbHMgdXNlIGBjcmVhdGVDbGllbnQoe3NlcnZpY2VJZCwgc2VydmljZVNlY3JldH0pYFxuICogaW5zdGVhZCDigJQgdGhhdCBidWlsZHMgYSBUb2tlblNvdXJjZSB3aGljaCBtaW50cyArIGNhY2hlcyBCZWFyZXJcbiAqIHRva2Vucy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZUF1dGgoaW5wdXQ6IFBsYXRmb3JtQXV0aElucHV0IHwgUGxhdGZvcm1BdXRoKTogUGxhdGZvcm1BdXRoIHtcbiAgaWYgKCd0eXBlJyBpbiBpbnB1dCkgcmV0dXJuIGlucHV0O1xuICBpZiAoaW5wdXQudG9rZW4pIHtcbiAgICByZXR1cm4geyB0eXBlOiAnYmVhcmVyJywgdG9rZW46IGlucHV0LnRva2VuIH07XG4gIH1cbiAgdGhyb3cgbmV3IEVycm9yKFxuICAgICdhdXRoKCk6IHBhc3Mge3Rva2VufSBmb3IgYSBzdGF0aWMgQmVhcmVyIGFjY2VzcyB0b2tlbiwgb3IgdXNlIGNyZWF0ZUNsaWVudCh7c2VydmljZUlkLCBzZXJ2aWNlU2VjcmV0fSkgLyB1cHNlbGwuY3JlYXRlQ2xpZW50KHt0b2tlblVybH0pIGZvciBhIHRva2VuIHRoZSBTREsgcmVuZXdzIGl0c2VsZicsXG4gICk7XG59XG5cbi8qKlxuICogTXV0YWJsZSBjb25maWcgc2hhcmVkIGJ5IGNsaWVudHMuIGBhcHBseSgpYCBhbmQgYHNldEF1dGgoKWAgYXJlIGhvdyB0aGVcbiAqIGNoYWluYWJsZSBgLmNvbmZpZygpYCAvIGAuYXV0aCgpYCBtZXRob2RzIHdyaXRlIGJhY2suIGByZXNvbHZlKClgIHByb2R1Y2VzXG4gKiB0aGUgZWZmZWN0aXZlIGNvbmZpZyBmb3Igb25lIHJlcXVlc3QsIGZhbGxpbmcgYmFjayB0byBjdXJyZW50IGVudiBzdGF0ZVxuICogZm9yIGZpZWxkcyB0aGUgY2FsbGVyIGhhc24ndCBwaW5uZWQuXG4gKi9cbmV4cG9ydCBjbGFzcyBDb25maWdTdGF0ZSB7XG4gIHByaXZhdGUgb3ZlcnJpZGVzOiBQbGF0Zm9ybUNvbmZpZ0lucHV0ID0ge307XG4gIHByaXZhdGUgZXhwbGljaXRBdXRoOiBQbGF0Zm9ybUF1dGggfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgaGFzRXhwbGljaXRBdXRoID0gZmFsc2U7XG5cbiAgYXBwbHkoaW5wdXQ6IFBsYXRmb3JtQ29uZmlnSW5wdXQpOiB2b2lkIHtcbiAgICBpZiAoaW5wdXQuYmFzZVVybCAhPT0gdW5kZWZpbmVkKSB0aGlzLm92ZXJyaWRlcy5iYXNlVXJsID0gaW5wdXQuYmFzZVVybDtcbiAgICBpZiAoaW5wdXQuZmV0Y2hGbiAhPT0gdW5kZWZpbmVkKSB0aGlzLm92ZXJyaWRlcy5mZXRjaEZuID0gaW5wdXQuZmV0Y2hGbjtcbiAgICBpZiAoaW5wdXQubG9nZ2VyICE9PSB1bmRlZmluZWQpIHRoaXMub3ZlcnJpZGVzLmxvZ2dlciA9IGlucHV0LmxvZ2dlcjtcbiAgICBpZiAoaW5wdXQuYXV0aCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmV4cGxpY2l0QXV0aCA9IG5vcm1hbGl6ZUF1dGgoaW5wdXQuYXV0aCk7XG4gICAgICB0aGlzLmhhc0V4cGxpY2l0QXV0aCA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgc2V0QXV0aChpbnB1dDogUGxhdGZvcm1BdXRoSW5wdXQgfCBQbGF0Zm9ybUF1dGgpOiB2b2lkIHtcbiAgICB0aGlzLmV4cGxpY2l0QXV0aCA9IG5vcm1hbGl6ZUF1dGgoaW5wdXQpO1xuICAgIHRoaXMuaGFzRXhwbGljaXRBdXRoID0gdHJ1ZTtcbiAgfVxuXG4gIHJlc29sdmUoKTogUGxhdGZvcm1Db25maWcge1xuICAgIGNvbnN0IGVudiA9IGVudkRlZmF1bHRzKCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGJhc2VVcmw6IHRoaXMub3ZlcnJpZGVzLmJhc2VVcmwgPz8gZW52LmJhc2VVcmwsXG4gICAgICBhdXRoOiB0aGlzLmhhc0V4cGxpY2l0QXV0aCA/IHRoaXMuZXhwbGljaXRBdXRoIDogZW52LmF1dGgsXG4gICAgICBmZXRjaEZuOiAodGhpcy5vdmVycmlkZXMuZmV0Y2hGbiA/PyBlbnYuZmV0Y2hGbikgYXMgdHlwZW9mIGZldGNoLFxuICAgICAgbG9nZ2VyOiB0aGlzLm92ZXJyaWRlcy5sb2dnZXIgYXMgTG9nZ2VyIHwgdW5kZWZpbmVkLFxuICAgIH07XG4gIH1cbn1cbiJdfQ==
package/dist/http.js CHANGED
@@ -11,9 +11,20 @@ const MUTATING_METHODS = new Set(['POST', 'PUT', 'PATCH', 'DELETE']);
11
11
  * The SDK runs in browsers as well as Lambdas — `whitelabel_web` is a
12
12
  * first-class channel — and a static `node:crypto` import breaks any
13
13
  * browser bundler that does not shim it. `crypto.randomUUID` is present
14
- * in Node >= 19 and every current browser; the manual fallback covers
15
- * older runtimes and non-secure contexts, where the value is only used
16
- * as an idempotency key and needs uniqueness, not unguessability.
14
+ * in Node >= 19 and every current browser; `getRandomValues` covers older
15
+ * runtimes and non-secure contexts.
16
+ *
17
+ * The last fallback exists for React Native: Hermes provides NO
18
+ * `globalThis.crypto` at all, and `mobile_app` is a first-class channel.
19
+ * Throwing there made `suggest()` and `reportEvents()` — both POSTs —
20
+ * unusable in an app until the consumer added a polyfill, which is the
21
+ * wrong trade twice over: nothing on the platform reads this header, and
22
+ * as stated above the value needs uniqueness, not unguessability. A
23
+ * request that fails is strictly worse than a key that is merely unique.
24
+ *
25
+ * The fallback mixes the clock and a process counter into the first six
26
+ * bytes so that two calls in the same millisecond still differ even under
27
+ * a poor `Math.random`.
17
28
  */
18
29
  function randomUUID() {
19
30
  const c = globalThis.crypto;
@@ -26,7 +37,35 @@ function randomUUID() {
26
37
  const hex = [...b].map((x) => x.toString(16).padStart(2, '0')).join('');
27
38
  return `${hex.slice(0, 8)}-${hex.slice(8, 12)}-${hex.slice(12, 16)}-${hex.slice(16, 20)}-${hex.slice(20)}`;
28
39
  }
29
- throw new Error('No crypto source available for idempotency-key generation');
40
+ return uniqueUUID();
41
+ }
42
+ /** Monotonic within the process; wraps well above any per-millisecond burst. */
43
+ let uuidCounter = 0;
44
+ /**
45
+ * A v4-SHAPED identifier built without any crypto source. Unique, not
46
+ * unguessable — see the note on randomUUID for why that is the right
47
+ * requirement for this header.
48
+ */
49
+ function uniqueUUID() {
50
+ const b = new Uint8Array(16);
51
+ for (let i = 0; i < 16; i += 1)
52
+ b[i] = Math.floor(Math.random() * 256);
53
+ // Bytes 0-3: the clock, so keys are ordered and cannot repeat across
54
+ // milliseconds however weak Math.random is.
55
+ const t = Date.now();
56
+ b[0] = (t >>> 24) & 0xff;
57
+ b[1] = (t >>> 16) & 0xff;
58
+ b[2] = (t >>> 8) & 0xff;
59
+ b[3] = t & 0xff;
60
+ // Bytes 4-5: a per-process counter, so a burst inside one millisecond
61
+ // still differs.
62
+ uuidCounter = (uuidCounter + 1) & 0xffff;
63
+ b[4] = (uuidCounter >>> 8) & 0xff;
64
+ b[5] = uuidCounter & 0xff;
65
+ b[6] = (b[6] & 0x0f) | 0x40; // version 4
66
+ b[8] = (b[8] & 0x3f) | 0x80; // variant
67
+ const hex = [...b].map((x) => x.toString(16).padStart(2, '0')).join('');
68
+ return `${hex.slice(0, 8)}-${hex.slice(8, 12)}-${hex.slice(12, 16)}-${hex.slice(16, 20)}-${hex.slice(20)}`;
30
69
  }
31
70
  /**
32
71
  * Build the headers for a request to the platform API.
@@ -100,4 +139,4 @@ async function sendWithAuthRetry(config, params) {
100
139
  body: params.body,
101
140
  });
102
141
  }
103
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHR0cC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9odHRwLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBd0RBLG9DQXVCQztBQXdCRCw4Q0EwQkM7QUFoSUQsaURBQWlFO0FBQ2pFLHVDQUF3QztBQVV4QyxNQUFNLGdCQUFnQixHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQztBQUVyRTs7Ozs7Ozs7O0dBU0c7QUFDSCxTQUFTLFVBQVU7SUFDakIsTUFBTSxDQUFDLEdBQ0wsVUFHRCxDQUFDLE1BQU0sQ0FBQztJQUNULElBQUksQ0FBQyxFQUFFLFVBQVU7UUFBRSxPQUFPLENBQUMsQ0FBQyxVQUFVLEVBQUUsQ0FBQztJQUN6QyxJQUFJLENBQUMsRUFBRSxlQUFlLEVBQUUsQ0FBQztRQUN2QixNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsZUFBZSxDQUFDLElBQUksVUFBVSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDaEQsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQztRQUM1QixDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDO1FBQzVCLE1BQU0sR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUN4RSxPQUFPLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFD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QUFDO0FBQ0wsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgUGxhdGZvcm1Db25maWcgfSBmcm9tICcuL2NvbmZpZyc7XG5pbXBvcnQgeyBnZXRBY2Nlc3NUb2tlbiwgaW52YWxpZGF0ZVRva2VuIH0gZnJvbSAnLi90b2tlbi1zb3VyY2UnO1xuaW1wb3J0IHsgU0RLX1ZFUlNJT04gfSBmcm9tICcuL3ZlcnNpb24nO1xuXG5leHBvcnQgaW50ZXJmYWNlIFNpZ25lZEhlYWRlclBhcmFtcyB7XG4gIG1ldGhvZDogc3RyaW5nO1xuICAvKiogVVJMIHBhdGhuYW1lIG9ubHksIHdpdGhvdXQgcXVlcnkgc3RyaW5nLiBNdXN0IG1hdGNoIGBjLnJlcS5wYXRoYCBzZXJ2ZXItc2lkZS4gKi9cbiAgcGF0aDogc3RyaW5nO1xuICAvKiogUmF3IEpTT04gYm9keSBzdHJpbmcsIG9yIGVtcHR5IGZvciBub25lLiAqL1xuICBib2R5Pzogc3RyaW5nO1xufVxuXG5jb25zdCBNVVRBVElOR19NRVRIT0RTID0gbmV3IFNldChbJ1BPU1QnLCAnUFVUJywgJ1BBVENIJywgJ0RFTEVURSddKTtcblxuLyoqXG4gKiBVVUlEIHY0IHdpdGhvdXQgYSBgbm9kZTpjcnlwdG9gIGltcG9ydC5cbiAqXG4gKiBUaGUgU0RLIHJ1bnMgaW4gYnJvd3NlcnMgYXMgd2VsbCBhcyBMYW1iZGFzIOKAlCBgd2hpdGVsYWJlbF93ZWJgIGlzIGFcbiAqIGZpcnN0LWNsYXNzIGNoYW5uZWwg4oCUIGFuZCBhIHN0YXRpYyBgbm9kZTpjcnlwdG9gIGltcG9ydCBicmVha3MgYW55XG4gKiBicm93c2VyIGJ1bmRsZXIgdGhhdCBkb2VzIG5vdCBzaGltIGl0LiBgY3J5cHRvLnJhbmRvbVVVSURgIGlzIHByZXNlbnRcbiAqIGluIE5vZGUgPj0gMTkgYW5kIGV2ZXJ5IGN1cnJlbnQgYnJvd3NlcjsgdGhlIG1hbnVhbCBmYWxsYmFjayBjb3ZlcnNcbiAqIG9sZGVyIHJ1bnRpbWVzIGFuZCBub24tc2VjdXJlIGNvbnRleHRzLCB3aGVyZSB0aGUgdmFsdWUgaXMgb25seSB1c2VkXG4gKiBhcyBhbiBpZGVtcG90ZW5jeSBrZXkgYW5kIG5lZWRzIHVuaXF1ZW5lc3MsIG5vdCB1bmd1ZXNzYWJpbGl0eS5cbiAqL1xuZnVuY3Rpb24gcmFuZG9tVVVJRCgpOiBzdHJpbmcge1xuICBjb25zdCBjID0gKFxuICAgIGdsb2JhbFRoaXMgYXMge1xuICAgICAgY3J5cHRvPzogeyByYW5kb21VVUlEPzogKCkgPT4gc3RyaW5nOyBnZXRSYW5kb21WYWx1ZXM/OiAoYTogVWludDhBcnJheSkgPT4gVWludDhBcnJheSB9O1xuICAgIH1cbiAgKS5jcnlwdG87XG4gIGlmIChjPy5yYW5kb21VVUlEKSByZXR1cm4gYy5yYW5kb21VVUlEKCk7XG4gIGlmIChjPy5nZXRSYW5kb21WYWx1ZXMpIHtcbiAgICBjb25zdCBiID0gYy5nZXRSYW5kb21WYWx1ZXMobmV3IFVpbnQ4QXJyYXkoMTYpKTtcbiAgICBiWzZdID0gKGJbNl0gJiAweDBmKSB8IDB4NDA7XG4gICAgYls4XSA9IChiWzhdICYgMHgzZikgfCAweDgwO1xuICAgIGNvbnN0IGhleCA9IFsuLi5iXS5tYXAoKHgpID0+IHgudG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDIsICcwJykpLmpvaW4oJycpO1xuICAgIHJldHVybiBgJHtoZXguc2xpY2UoMCwgOCl9LSR7aGV4LnNsaWNlKDgsIDEyKX0tJHtoZXguc2xpY2UoMTIsIDE2KX0tJHtoZXguc2xpY2UoMTYsIDIwKX0tJHtoZXguc2xpY2UoMjApfWA7XG4gIH1cbiAgdGhyb3cgbmV3IEVycm9yKCdObyBjcnlwdG8gc291cmNlIGF2YWlsYWJsZSBmb3IgaWRlbXBvdGVuY3kta2V5IGdlbmVyYXRpb24nKTtcbn1cblxuLyoqXG4gKiBCdWlsZCB0aGUgaGVhZGVycyBmb3IgYSByZXF1ZXN0IHRvIHRoZSBwbGF0Zm9ybSBBUEkuXG4gKlxuICogQWRkcyB0aHJlZSBwbGF0Zm9ybS13aWRlIGhlYWRlcnMgYXV0b21hdGljYWxseTpcbiAqICAgLSBgVXNlci1BZ2VudGAgc28gdGhlIGdhdGV3YXkgY2FuIGF0dHJpYnV0ZSB0cmFmZmljIHRvIFNESyB2ZXJzaW9uXG4gKiAgIC0gYElkZW1wb3RlbmN5LUtleWAgKFVVSUQgdjQpIG9uIG11dGF0aW5nIG1ldGhvZHMsIHNvIGNhbGxlcnMgZG9uJ3RcbiAqICAgICBoYXZlIHRvIGdlbmVyYXRlIG9uZSBwZXIgY2FsbFxuICogICAtIGBjb250ZW50LXR5cGU6IGFwcGxpY2F0aW9uL2pzb25gIHdoZW4gYSBib2R5IGlzIHN1cHBsaWVkXG4gKlxuICogQXV0aCBjb21lcyBmcm9tIGBjb25maWcuYXV0aGA6XG4gKiAgIC0gYGJlYXJlcmA6IHRoZSB0b2tlbiBpcyBzZW50IHZlcmJhdGltIChjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yXG4gKiAgICAgZnJlc2huZXNzOyBTREsgdGhyb3dzIFRva2VuRXhwaXJlZEVycm9yIG9uIGxvY2FsLWRldGVjdGVkIGV4cGlyeSlcbiAqICAgLSBgdG9rZW4tc291cmNlYDogU0RLIG1pbnRzICsgY2FjaGVzIHZpYSBPQXV0aDIgY2xpZW50X2NyZWRlbnRpYWxzXG4gKiAgICAgYW5kIHJlZnJlc2hlcyBvbiBleHBpcnkgLyA0MDFcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGJ1aWxkSGVhZGVycyhcbiAgY29uZmlnOiBQbGF0Zm9ybUNvbmZpZyxcbiAgcGFyYW1zOiBTaWduZWRIZWFkZXJQYXJhbXMsXG4pOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIHN0cmluZz4+IHtcbiAgY29uc3QgaGVhZGVyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAndXNlci1hZ2VudCc6IGB1ZW5nYWdlLXBsYXRmb3JtLXNkay8ke1NES19WRVJTSU9OfWAsXG4gIH07XG4gIGlmIChwYXJhbXMuYm9keSAhPT0gdW5kZWZpbmVkKSBoZWFkZXJzWydjb250ZW50LXR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcbiAgaWYgKE1VVEFUSU5HX01FVEhPRFMuaGFzKHBhcmFtcy5tZXRob2QudG9VcHBlckNhc2UoKSkpIHtcbiAgICBoZWFkZXJzWydpZGVtcG90ZW5jeS1rZXknXSA9IHJhbmRvbVVVSUQoKTtcbiAgfVxuXG4gIGlmICghY29uZmlnLmF1dGgpIHJldHVybiBoZWFkZXJzO1xuXG4gIGlmIChjb25maWcuYXV0aC50eXBlID09PSAnYmVhcmVyJykge1xuICAgIGhlYWRlcnNbJ2F1dGhvcml6YXRpb24nXSA9IGBCZWFyZXIgJHtjb25maWcuYXV0aC50b2tlbn1gO1xuICAgIHJldHVybiBoZWFkZXJzO1xuICB9XG5cbiAgLy8gdG9rZW4tc291cmNlOiBtaW50ICsgY2FjaGUgKyByZWZyZXNoLWRlZHVwIGhhcHBlbnMgaW4gZ2V0QWNjZXNzVG9rZW5cbiAgY29uc3QgdG9rZW4gPSBhd2FpdCBnZXRBY2Nlc3NUb2tlbihjb25maWcuYXV0aC5zdGF0ZSk7XG4gIGhlYWRlcnNbJ2F1dGhvcml6YXRpb24nXSA9IGBCZWFyZXIgJHt0b2tlbn1gO1xuICByZXR1cm4gaGVhZGVycztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTZW5kUmVxdWVzdFBhcmFtcyB7XG4gIG1ldGhvZDogc3RyaW5nO1xuICAvKiogVVJMIHBhdGhuYW1lIG9ubHksIHdpdGhvdXQgcXVlcnkgc3RyaW5nLiBNdXN0IG1hdGNoIGBjLnJlcS5wYXRoYCBzZXJ2ZXItc2lkZS4gKi9cbiAgcGF0aDogc3RyaW5nO1xuICAvKiogRnVsbHktcXVhbGlmaWVkIFVSTCB0aGUgZmV0Y2ggaXMgc2VudCB0byAoYmFzZSArIHBhdGggKyBxdWVyeXN0cmluZykuICovXG4gIHVybDogc3RyaW5nO1xuICAvKiogUmF3IEpTT04gYm9keSBzdHJpbmcsIG9yIHVuZGVmaW5lZCBmb3Igbm9uZS4gKi9cbiAgYm9keT86IHN0cmluZztcbn1cblxuLyoqXG4gKiBTZW5kIGEgcmVxdWVzdCB3aXRoIHRoZSBTREsncyBzdGFuZGFyZCA0MDEtcmV0cnktb25jZSBiZWhhdmlvdXIuXG4gKlxuICogT25seSByZXRyaWVzIHdoZW4gYXV0aCBpcyBgdG9rZW4tc291cmNlYCwgc2luY2UgdGhhdCdzIHRoZSBjYXNlXG4gKiB3aGVyZSB0aGUgY2FjaGVkIHRva2VuIG1heSBoYXZlIGV4cGlyZWQgc2VydmVyLXNpZGUuIEhNQUMgYW5kXG4gKiBzdGF0aWMgYmVhcmVyIDQwMXMgbWVhbiB0aGUgYXV0aCBpcyBtaXNjb25maWd1cmVkIGFuZCBhIHJldHJ5XG4gKiB3b3VsZCBqdXN0IGZhaWwgYWdhaW4uIEJ1YmJsZSB0aGUgcmVzcG9uc2Ugc28gdGhlIGNhbGxlciBzdXJmYWNlcyBpdC5cbiAqXG4gKiBTaGFyZWQgYnkgZXZlcnkgbmFtZXNwYWNlIGNsaWVudCAoYnVzaW5lc3MsIGF1ZGl0LCB6b25lcywgLi4uKSBzb1xuICogdGhlIHJldHJ5IHNlbWFudGljcyBhcmUgdW5pZm9ybS4gTGlmdGVkIG91dCBvZiBgYnVzaW5lc3MvY2xpZW50LnRzYFxuICogd2l0aCBubyBiZWhhdmlvdXIgY2hhbmdlLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2VuZFdpdGhBdXRoUmV0cnkoXG4gIGNvbmZpZzogUGxhdGZvcm1Db25maWcsXG4gIHBhcmFtczogU2VuZFJlcXVlc3RQYXJhbXMsXG4pOiBQcm9taXNlPFJlc3BvbnNlPiB7XG4gIGNvbnN0IGhlYWRlcnMgPSBhd2FpdCBidWlsZEhlYWRlcnMoY29uZmlnLCB7XG4gICAgbWV0aG9kOiBwYXJhbXMubWV0aG9kLFxuICAgIHBhdGg6IHBhcmFtcy5wYXRoLFxuICAgIGJvZHk6IHBhcmFtcy5ib2R5LFxuICB9KTtcbiAgY29uc3QgcmVzID0gYXdhaXQgY29uZmlnLmZldGNoRm4ocGFyYW1zLnVybCwge1xuICAgIG1ldGhvZDogcGFyYW1zLm1ldGhvZCxcbiAgICBoZWFkZXJzLFxuICAgIGJvZHk6IHBhcmFtcy5ib2R5LFxuICB9KTtcbiAgaWYgKHJlcy5zdGF0dXMgIT09IDQwMSB8fCBjb25maWcuYXV0aD8udHlwZSAhPT0gJ3Rva2VuLXNvdXJjZScpIHJldHVybiByZXM7XG4gIGludmFsaWRhdGVUb2tlbihjb25maWcuYXV0aC5zdGF0ZSk7XG4gIGNvbnN0IHJldHJ5SGVhZGVycyA9IGF3YWl0IGJ1aWxkSGVhZGVycyhjb25maWcsIHtcbiAgICBtZXRob2Q6IHBhcmFtcy5tZXRob2QsXG4gICAgcGF0aDogcGFyYW1zLnBhdGgsXG4gICAgYm9keTogcGFyYW1zLmJvZHksXG4gIH0pO1xuICByZXR1cm4gY29uZmlnLmZldGNoRm4ocGFyYW1zLnVybCwge1xuICAgIG1ldGhvZDogcGFyYW1zLm1ldGhvZCxcbiAgICBoZWFkZXJzOiByZXRyeUhlYWRlcnMsXG4gICAgYm9keTogcGFyYW1zLmJvZHksXG4gIH0pO1xufVxuIl19
142
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHR0cC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9odHRwLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBb0dBLG9DQXVCQztBQXdCRCw4Q0EwQkM7QUE1S0QsaURBQWlFO0FBQ2pFLHVDQUF3QztBQVV4QyxNQUFNLGdCQUFnQixHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQztBQUVyRTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FvQkc7QUFDSCxTQUFTLFVBQVU7SUFDakIsTUFBTSxDQUFDLEdBQ0wsVUFHRCxDQUFDLE1BQU0sQ0FBQztJQUNULElBQUksQ0FBQyxFQUFFLFVBQVU7UUFBRSxPQUFPLENBQUMsQ0FBQyxVQUFVLEVBQUUsQ0FBQztJQUN6QyxJQUFJLENBQUMsRUFBRSxlQUFlLEVBQUUsQ0FBQztRQUN2QixNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsZUFBZSxDQUFDLElBQUksVUFBVSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDaEQsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQztRQUM1QixDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDO1FBQzVCLE1BQU0sR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUN4RSxPQUFPLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVB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QUMzQyxNQUFNLEVBQUUsTUFBTSxDQUFDLE1BQU07UUFDckIsT0FBTztRQUNQLElBQUksRUFBRSxNQUFNLENBQUMsSUFBSTtLQUNsQixDQUFDLENBQUM7SUFDSCxJQUFJLEdBQUcsQ0FBQyxNQUFNLEtBQUssR0FBRyxJQUFJLE1BQU0sQ0FBQyxJQUFJLEVBQUUsSUFBSSxLQUFLLGNBQWM7UUFBRSxPQUFPLEdBQUcsQ0FBQztJQUMzRSxJQUFBLDhCQUFlLEVBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNuQyxNQUFNLFlBQVksR0FBRyxNQUFNLFlBQVksQ0FBQyxNQUFNLEVBQUU7UUFDOUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxNQUFNO1FBQ3JCLElBQUksRUFBRSxNQUFNLENBQUMsSUFBSTtRQUNqQixJQUFJLEVBQUUsTUFBTSxDQUFDLElBQUk7S0FDbEIsQ0FBQyxDQUFDO0lBQ0gsT0FBTyxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUU7UUFDaEMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxNQUFNO1FBQ3JCLE9BQU8sRUFBRSxZQUFZO1FBQ3JCLElBQUksRUFBRSxNQUFNLENBQUMsSUFBSTtLQUNsQixDQUFDLENBQUM7QUFDTCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBQbGF0Zm9ybUNvbmZpZyB9IGZyb20gJy4vY29uZmlnJztcbmltcG9ydCB7IGdldEFjY2Vzc1Rva2VuLCBpbnZhbGlkYXRlVG9rZW4gfSBmcm9tICcuL3Rva2VuLXNvdXJjZSc7XG5pbXBvcnQgeyBTREtfVkVSU0lPTiB9IGZyb20gJy4vdmVyc2lvbic7XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2lnbmVkSGVhZGVyUGFyYW1zIHtcbiAgbWV0aG9kOiBzdHJpbmc7XG4gIC8qKiBVUkwgcGF0aG5hbWUgb25seSwgd2l0aG91dCBxdWVyeSBzdHJpbmcuIE11c3QgbWF0Y2ggYGMucmVxLnBhdGhgIHNlcnZlci1zaWRlLiAqL1xuICBwYXRoOiBzdHJpbmc7XG4gIC8qKiBSYXcgSlNPTiBib2R5IHN0cmluZywgb3IgZW1wdHkgZm9yIG5vbmUuICovXG4gIGJvZHk/OiBzdHJpbmc7XG59XG5cbmNvbnN0IE1VVEFUSU5HX01FVEhPRFMgPSBuZXcgU2V0KFsnUE9TVCcsICdQVVQnLCAnUEFUQ0gnLCAnREVMRVRFJ10pO1xuXG4vKipcbiAqIFVVSUQgdjQgd2l0aG91dCBhIGBub2RlOmNyeXB0b2AgaW1wb3J0LlxuICpcbiAqIFRoZSBTREsgcnVucyBpbiBicm93c2VycyBhcyB3ZWxsIGFzIExhbWJkYXMg4oCUIGB3aGl0ZWxhYmVsX3dlYmAgaXMgYVxuICogZmlyc3QtY2xhc3MgY2hhbm5lbCDigJQgYW5kIGEgc3RhdGljIGBub2RlOmNyeXB0b2AgaW1wb3J0IGJyZWFrcyBhbnlcbiAqIGJyb3dzZXIgYnVuZGxlciB0aGF0IGRvZXMgbm90IHNoaW0gaXQuIGBjcnlwdG8ucmFuZG9tVVVJRGAgaXMgcHJlc2VudFxuICogaW4gTm9kZSA+PSAxOSBhbmQgZXZlcnkgY3VycmVudCBicm93c2VyOyBgZ2V0UmFuZG9tVmFsdWVzYCBjb3ZlcnMgb2xkZXJcbiAqIHJ1bnRpbWVzIGFuZCBub24tc2VjdXJlIGNvbnRleHRzLlxuICpcbiAqIFRoZSBsYXN0IGZhbGxiYWNrIGV4aXN0cyBmb3IgUmVhY3QgTmF0aXZlOiBIZXJtZXMgcHJvdmlkZXMgTk9cbiAqIGBnbG9iYWxUaGlzLmNyeXB0b2AgYXQgYWxsLCBhbmQgYG1vYmlsZV9hcHBgIGlzIGEgZmlyc3QtY2xhc3MgY2hhbm5lbC5cbiAqIFRocm93aW5nIHRoZXJlIG1hZGUgYHN1Z2dlc3QoKWAgYW5kIGByZXBvcnRFdmVudHMoKWAg4oCUIGJvdGggUE9TVHMg4oCUXG4gKiB1bnVzYWJsZSBpbiBhbiBhcHAgdW50aWwgdGhlIGNvbnN1bWVyIGFkZGVkIGEgcG9seWZpbGwsIHdoaWNoIGlzIHRoZVxuICogd3JvbmcgdHJhZGUgdHdpY2Ugb3Zlcjogbm90aGluZyBvbiB0aGUgcGxhdGZvcm0gcmVhZHMgdGhpcyBoZWFkZXIsIGFuZFxuICogYXMgc3RhdGVkIGFib3ZlIHRoZSB2YWx1ZSBuZWVkcyB1bmlxdWVuZXNzLCBub3QgdW5ndWVzc2FiaWxpdHkuIEFcbiAqIHJlcXVlc3QgdGhhdCBmYWlscyBpcyBzdHJpY3RseSB3b3JzZSB0aGFuIGEga2V5IHRoYXQgaXMgbWVyZWx5IHVuaXF1ZS5cbiAqXG4gKiBUaGUgZmFsbGJhY2sgbWl4ZXMgdGhlIGNsb2NrIGFuZCBhIHByb2Nlc3MgY291bnRlciBpbnRvIHRoZSBmaXJzdCBzaXhcbiAqIGJ5dGVzIHNvIHRoYXQgdHdvIGNhbGxzIGluIHRoZSBzYW1lIG1pbGxpc2Vjb25kIHN0aWxsIGRpZmZlciBldmVuIHVuZGVyXG4gKiBhIHBvb3IgYE1hdGgucmFuZG9tYC5cbiAqL1xuZnVuY3Rpb24gcmFuZG9tVVVJRCgpOiBzdHJpbmcge1xuICBjb25zdCBjID0gKFxuICAgIGdsb2JhbFRoaXMgYXMge1xuICAgICAgY3J5cHRvPzogeyByYW5kb21VVUlEPzogKCkgPT4gc3RyaW5nOyBnZXRSYW5kb21WYWx1ZXM/OiAoYTogVWludDhBcnJheSkgPT4gVWludDhBcnJheSB9O1xuICAgIH1cbiAgKS5jcnlwdG87XG4gIGlmIChjPy5yYW5kb21VVUlEKSByZXR1cm4gYy5yYW5kb21VVUlEKCk7XG4gIGlmIChjPy5nZXRSYW5kb21WYWx1ZXMpIHtcbiAgICBjb25zdCBiID0gYy5nZXRSYW5kb21WYWx1ZXMobmV3IFVpbnQ4QXJyYXkoMTYpKTtcbiAgICBiWzZdID0gKGJbNl0gJiAweDBmKSB8IDB4NDA7XG4gICAgYls4XSA9IChiWzhdICYgMHgzZikgfCAweDgwO1xuICAgIGNvbnN0IGhleCA9IFsuLi5iXS5tYXAoKHgpID0+IHgudG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDIsICcwJykpLmpvaW4oJycpO1xuICAgIHJldHVybiBgJHtoZXguc2xpY2UoMCwgOCl9LSR7aGV4LnNsaWNlKDgsIDEyKX0tJHtoZXguc2xpY2UoMTIsIDE2KX0tJHtoZXguc2xpY2UoMTYsIDIwKX0tJHtoZXguc2xpY2UoMjApfWA7XG4gIH1cbiAgcmV0dXJuIHVuaXF1ZVVVSUQoKTtcbn1cblxuLyoqIE1vbm90b25pYyB3aXRoaW4gdGhlIHByb2Nlc3M7IHdyYXBzIHdlbGwgYWJvdmUgYW55IHBlci1taWxsaXNlY29uZCBidXJzdC4gKi9cbmxldCB1dWlkQ291bnRlciA9IDA7XG5cbi8qKlxuICogQSB2NC1TSEFQRUQgaWRlbnRpZmllciBidWlsdCB3aXRob3V0IGFueSBjcnlwdG8gc291cmNlLiBVbmlxdWUsIG5vdFxuICogdW5ndWVzc2FibGUg4oCUIHNlZSB0aGUgbm90ZSBvbiByYW5kb21VVUlEIGZvciB3aHkgdGhhdCBpcyB0aGUgcmlnaHRcbiAqIHJlcXVpcmVtZW50IGZvciB0aGlzIGhlYWRlci5cbiAqL1xuZnVuY3Rpb24gdW5pcXVlVVVJRCgpOiBzdHJpbmcge1xuICBjb25zdCBiID0gbmV3IFVpbnQ4QXJyYXkoMTYpO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IDE2OyBpICs9IDEpIGJbaV0gPSBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAyNTYpO1xuXG4gIC8vIEJ5dGVzIDAtMzogdGhlIGNsb2NrLCBzbyBrZXlzIGFyZSBvcmRlcmVkIGFuZCBjYW5ub3QgcmVwZWF0IGFjcm9zc1xuICAvLyBtaWxsaXNlY29uZHMgaG93ZXZlciB3ZWFrIE1hdGgucmFuZG9tIGlzLlxuICBjb25zdCB0ID0gRGF0ZS5ub3coKTtcbiAgYlswXSA9ICh0ID4+PiAyNCkgJiAweGZmO1xuICBiWzFdID0gKHQgPj4+IDE2KSAmIDB4ZmY7XG4gIGJbMl0gPSAodCA+Pj4gOCkgJiAweGZmO1xuICBiWzNdID0gdCAmIDB4ZmY7XG5cbiAgLy8gQnl0ZXMgNC01OiBhIHBlci1wcm9jZXNzIGNvdW50ZXIsIHNvIGEgYnVyc3QgaW5zaWRlIG9uZSBtaWxsaXNlY29uZFxuICAvLyBzdGlsbCBkaWZmZXJzLlxuICB1dWlkQ291bnRlciA9ICh1dWlkQ291bnRlciArIDEpICYgMHhmZmZmO1xuICBiWzRdID0gKHV1aWRDb3VudGVyID4+PiA4KSAmIDB4ZmY7XG4gIGJbNV0gPSB1dWlkQ291bnRlciAmIDB4ZmY7XG5cbiAgYls2XSA9IChiWzZdICYgMHgwZikgfCAweDQwOyAvLyB2ZXJzaW9uIDRcbiAgYls4XSA9IChiWzhdICYgMHgzZikgfCAweDgwOyAvLyB2YXJpYW50XG5cbiAgY29uc3QgaGV4ID0gWy4uLmJdLm1hcCgoeCkgPT4geC50b1N0cmluZygxNikucGFkU3RhcnQoMiwgJzAnKSkuam9pbignJyk7XG4gIHJldHVybiBgJHtoZXguc2xpY2UoMCwgOCl9LSR7aGV4LnNsaWNlKDgsIDEyKX0tJHtoZXguc2xpY2UoMTIsIDE2KX0tJHtoZXguc2xpY2UoMTYsIDIwKX0tJHtoZXguc2xpY2UoMjApfWA7XG59XG5cbi8qKlxuICogQnVpbGQgdGhlIGhlYWRlcnMgZm9yIGEgcmVxdWVzdCB0byB0aGUgcGxhdGZvcm0gQVBJLlxuICpcbiAqIEFkZHMgdGhyZWUgcGxhdGZvcm0td2lkZSBoZWFkZXJzIGF1dG9tYXRpY2FsbHk6XG4gKiAgIC0gYFVzZXItQWdlbnRgIHNvIHRoZSBnYXRld2F5IGNhbiBhdHRyaWJ1dGUgdHJhZmZpYyB0byBTREsgdmVyc2lvblxuICogICAtIGBJZGVtcG90ZW5jeS1LZXlgIChVVUlEIHY0KSBvbiBtdXRhdGluZyBtZXRob2RzLCBzbyBjYWxsZXJzIGRvbid0XG4gKiAgICAgaGF2ZSB0byBnZW5lcmF0ZSBvbmUgcGVyIGNhbGxcbiAqICAgLSBgY29udGVudC10eXBlOiBhcHBsaWNhdGlvbi9qc29uYCB3aGVuIGEgYm9keSBpcyBzdXBwbGllZFxuICpcbiAqIEF1dGggY29tZXMgZnJvbSBgY29uZmlnLmF1dGhgOlxuICogICAtIGBiZWFyZXJgOiB0aGUgdG9rZW4gaXMgc2VudCB2ZXJiYXRpbSAoY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvclxuICogICAgIGZyZXNobmVzczsgU0RLIHRocm93cyBUb2tlbkV4cGlyZWRFcnJvciBvbiBsb2NhbC1kZXRlY3RlZCBleHBpcnkpXG4gKiAgIC0gYHRva2VuLXNvdXJjZWA6IFNESyBtaW50cyArIGNhY2hlcyB2aWEgT0F1dGgyIGNsaWVudF9jcmVkZW50aWFsc1xuICogICAgIGFuZCByZWZyZXNoZXMgb24gZXhwaXJ5IC8gNDAxXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBidWlsZEhlYWRlcnMoXG4gIGNvbmZpZzogUGxhdGZvcm1Db25maWcsXG4gIHBhcmFtczogU2lnbmVkSGVhZGVyUGFyYW1zLFxuKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PiB7XG4gIGNvbnN0IGhlYWRlcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgJ3VzZXItYWdlbnQnOiBgdWVuZ2FnZS1wbGF0Zm9ybS1zZGsvJHtTREtfVkVSU0lPTn1gLFxuICB9O1xuICBpZiAocGFyYW1zLmJvZHkgIT09IHVuZGVmaW5lZCkgaGVhZGVyc1snY29udGVudC10eXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG4gIGlmIChNVVRBVElOR19NRVRIT0RTLmhhcyhwYXJhbXMubWV0aG9kLnRvVXBwZXJDYXNlKCkpKSB7XG4gICAgaGVhZGVyc1snaWRlbXBvdGVuY3kta2V5J10gPSByYW5kb21VVUlEKCk7XG4gIH1cblxuICBpZiAoIWNvbmZpZy5hdXRoKSByZXR1cm4gaGVhZGVycztcblxuICBpZiAoY29uZmlnLmF1dGgudHlwZSA9PT0gJ2JlYXJlcicpIHtcbiAgICBoZWFkZXJzWydhdXRob3JpemF0aW9uJ10gPSBgQmVhcmVyICR7Y29uZmlnLmF1dGgudG9rZW59YDtcbiAgICByZXR1cm4gaGVhZGVycztcbiAgfVxuXG4gIC8vIHRva2VuLXNvdXJjZTogbWludCArIGNhY2hlICsgcmVmcmVzaC1kZWR1cCBoYXBwZW5zIGluIGdldEFjY2Vzc1Rva2VuXG4gIGNvbnN0IHRva2VuID0gYXdhaXQgZ2V0QWNjZXNzVG9rZW4oY29uZmlnLmF1dGguc3RhdGUpO1xuICBoZWFkZXJzWydhdXRob3JpemF0aW9uJ10gPSBgQmVhcmVyICR7dG9rZW59YDtcbiAgcmV0dXJuIGhlYWRlcnM7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2VuZFJlcXVlc3RQYXJhbXMge1xuICBtZXRob2Q6IHN0cmluZztcbiAgLyoqIFVSTCBwYXRobmFtZSBvbmx5LCB3aXRob3V0IHF1ZXJ5IHN0cmluZy4gTXVzdCBtYXRjaCBgYy5yZXEucGF0aGAgc2VydmVyLXNpZGUuICovXG4gIHBhdGg6IHN0cmluZztcbiAgLyoqIEZ1bGx5LXF1YWxpZmllZCBVUkwgdGhlIGZldGNoIGlzIHNlbnQgdG8gKGJhc2UgKyBwYXRoICsgcXVlcnlzdHJpbmcpLiAqL1xuICB1cmw6IHN0cmluZztcbiAgLyoqIFJhdyBKU09OIGJvZHkgc3RyaW5nLCBvciB1bmRlZmluZWQgZm9yIG5vbmUuICovXG4gIGJvZHk/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogU2VuZCBhIHJlcXVlc3Qgd2l0aCB0aGUgU0RLJ3Mgc3RhbmRhcmQgNDAxLXJldHJ5LW9uY2UgYmVoYXZpb3VyLlxuICpcbiAqIE9ubHkgcmV0cmllcyB3aGVuIGF1dGggaXMgYHRva2VuLXNvdXJjZWAsIHNpbmNlIHRoYXQncyB0aGUgY2FzZVxuICogd2hlcmUgdGhlIGNhY2hlZCB0b2tlbiBtYXkgaGF2ZSBleHBpcmVkIHNlcnZlci1zaWRlLiBITUFDIGFuZFxuICogc3RhdGljIGJlYXJlciA0MDFzIG1lYW4gdGhlIGF1dGggaXMgbWlzY29uZmlndXJlZCBhbmQgYSByZXRyeVxuICogd291bGQganVzdCBmYWlsIGFnYWluLiBCdWJibGUgdGhlIHJlc3BvbnNlIHNvIHRoZSBjYWxsZXIgc3VyZmFjZXMgaXQuXG4gKlxuICogU2hhcmVkIGJ5IGV2ZXJ5IG5hbWVzcGFjZSBjbGllbnQgKGJ1c2luZXNzLCBhdWRpdCwgem9uZXMsIC4uLikgc29cbiAqIHRoZSByZXRyeSBzZW1hbnRpY3MgYXJlIHVuaWZvcm0uIExpZnRlZCBvdXQgb2YgYGJ1c2luZXNzL2NsaWVudC50c2BcbiAqIHdpdGggbm8gYmVoYXZpb3VyIGNoYW5nZS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNlbmRXaXRoQXV0aFJldHJ5KFxuICBjb25maWc6IFBsYXRmb3JtQ29uZmlnLFxuICBwYXJhbXM6IFNlbmRSZXF1ZXN0UGFyYW1zLFxuKTogUHJvbWlzZTxSZXNwb25zZT4ge1xuICBjb25zdCBoZWFkZXJzID0gYXdhaXQgYnVpbGRIZWFkZXJzKGNvbmZpZywge1xuICAgIG1ldGhvZDogcGFyYW1zLm1ldGhvZCxcbiAgICBwYXRoOiBwYXJhbXMucGF0aCxcbiAgICBib2R5OiBwYXJhbXMuYm9keSxcbiAgfSk7XG4gIGNvbnN0IHJlcyA9IGF3YWl0IGNvbmZpZy5mZXRjaEZuKHBhcmFtcy51cmwsIHtcbiAgICBtZXRob2Q6IHBhcmFtcy5tZXRob2QsXG4gICAgaGVhZGVycyxcbiAgICBib2R5OiBwYXJhbXMuYm9keSxcbiAgfSk7XG4gIGlmIChyZXMuc3RhdHVzICE9PSA0MDEgfHwgY29uZmlnLmF1dGg/LnR5cGUgIT09ICd0b2tlbi1zb3VyY2UnKSByZXR1cm4gcmVzO1xuICBpbnZhbGlkYXRlVG9rZW4oY29uZmlnLmF1dGguc3RhdGUpO1xuICBjb25zdCByZXRyeUhlYWRlcnMgPSBhd2FpdCBidWlsZEhlYWRlcnMoY29uZmlnLCB7XG4gICAgbWV0aG9kOiBwYXJhbXMubWV0aG9kLFxuICAgIHBhdGg6IHBhcmFtcy5wYXRoLFxuICAgIGJvZHk6IHBhcmFtcy5ib2R5LFxuICB9KTtcbiAgcmV0dXJuIGNvbmZpZy5mZXRjaEZuKHBhcmFtcy51cmwsIHtcbiAgICBtZXRob2Q6IHBhcmFtcy5tZXRob2QsXG4gICAgaGVhZGVyczogcmV0cnlIZWFkZXJzLFxuICAgIGJvZHk6IHBhcmFtcy5ib2R5LFxuICB9KTtcbn1cbiJdfQ==
@@ -7,9 +7,9 @@
7
7
  * AppSync assigns the Event API's DNS names at create time
8
8
  * (`<apiId>.appsync-api.<region>.amazonaws.com` and the matching
9
9
  * `appsync-realtime-api` host), so they cannot be known before the stack
10
- * is deployed. Until `services/realtime` has been deployed to an
11
- * environment its entry stays null and `connect({ env })` throws with
12
- * instructions; `connect({ endpoints })` always works.
10
+ * is deployed. An environment without a deployed stack stays null and
11
+ * `connect({ env })` throws with instructions; `connect({ endpoints })`
12
+ * always works.
13
13
  */
14
14
  export interface RealtimeEndpoints {
15
15
  /** AppSync Event API HTTP domain. Also the `host` in the auth header. */
@@ -3,15 +3,30 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.API_BASE = void 0;
4
4
  exports.endpointsFor = endpointsFor;
5
5
  /**
6
- * TODO(event-bus): populate `httpDomain` / `realtimeDomain` per
7
- * environment from the `RealtimeEventApiHttpDns-{env}` and
8
- * `RealtimeEventApiRealtimeDns-{env}` outputs of `UengageRealtimeService-{env}`
9
- * once the stack has been deployed there.
6
+ * AppSync assigns these at Event API create time and the prefix is NOT the
7
+ * API id, so they cannot be constructed — they are copied from the
8
+ * `RealtimeEventApiHttpDns-{env}` / `RealtimeEventApiRealtimeDns-{env}`
9
+ * outputs of `UengageRealtimeService-{env}`.
10
+ *
11
+ * Because a cached browser bundle carries these values, recreating an Event
12
+ * API is a breaking change for every pinned consumer. The `browser-sdk`
13
+ * release job asserts the prod pair still matches the live stack exports and
14
+ * fails the release on drift, so this table cannot rot silently.
15
+ *
16
+ * `dev` stays null — the realtime stack is not deployed there.
10
17
  */
11
18
  const ENDPOINTS = {
12
19
  dev: null,
13
- uat: null,
14
- prod: null,
20
+ uat: {
21
+ httpDomain: 'zl2kormwrjexbglkbpsy44xye4.appsync-api.ap-south-1.amazonaws.com',
22
+ realtimeDomain: 'zl2kormwrjexbglkbpsy44xye4.appsync-realtime-api.ap-south-1.amazonaws.com',
23
+ apiBase: 'https://api.uat.platform.uengage.io',
24
+ },
25
+ prod: {
26
+ httpDomain: '6dhfjtlvyjfalku7umbusuilha.appsync-api.ap-south-1.amazonaws.com',
27
+ realtimeDomain: '6dhfjtlvyjfalku7umbusuilha.appsync-realtime-api.ap-south-1.amazonaws.com',
28
+ apiBase: 'https://api.platform.uengage.io',
29
+ },
15
30
  };
16
31
  /** Platform API base per environment — known ahead of any deploy. */
17
32
  exports.API_BASE = {
@@ -28,4 +43,4 @@ function endpointsFor(env) {
28
43
  }
29
44
  return found;
30
45
  }
31
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW5kcG9pbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3JlYWx0aW1lL2VuZHBvaW50cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUEyQ0Esb0NBVUM7QUE3QkQ7Ozs7O0dBS0c7QUFDSCxNQUFNLFNBQVMsR0FBa0Q7SUFDL0QsR0FBRyxFQUFFLElBQUk7SUFDVCxHQUFHLEVBQUUsSUFBSTtJQUNULElBQUksRUFBRSxJQUFJO0NBQ1gsQ0FBQztBQUVGLHFFQUFxRTtBQUN4RCxRQUFBLFFBQVEsR0FBZ0M7SUFDbkQsR0FBRyxFQUFFLHFDQUFxQztJQUMxQyxHQUFHLEVBQUUscUNBQXFDO0lBQzFDLElBQUksRUFBRSxpQ0FBaUM7Q0FDeEMsQ0FBQztBQUVGLFNBQWdCLFlBQVksQ0FBQyxHQUFnQjtJQUMzQyxNQUFNLEtBQUssR0FBRyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDN0IsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ1gsTUFBTSxJQUFJLEtBQUssQ0FDYixzREFBc0QsR0FBRyxLQUFLO1lBQzVELGlGQUFpRjtZQUNqRixtRkFBbUYsQ0FDdEYsQ0FBQztJQUNKLENBQUM7SUFDRCxPQUFPLEtBQUssQ0FBQztBQUNmLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFBlci1lbnZpcm9ubWVudCByZWFsdGltZSBlbmRwb2ludHMuXG4gKlxuICogRnJvbnRlbmRzIHBhc3MgYGNvbm5lY3QoeyBlbnY6ICdwcm9kJyB9KWAgYW5kIGdldCBVUkxzIGZyb20gaGVyZSDigJQgbm9cbiAqIGhvc3RuYW1lcyBvciBBUk5zIGluIGFwcCBjb2RlLlxuICpcbiAqIEFwcFN5bmMgYXNzaWducyB0aGUgRXZlbnQgQVBJJ3MgRE5TIG5hbWVzIGF0IGNyZWF0ZSB0aW1lXG4gKiAoYDxhcGlJZD4uYXBwc3luYy1hcGkuPHJlZ2lvbj4uYW1hem9uYXdzLmNvbWAgYW5kIHRoZSBtYXRjaGluZ1xuICogYGFwcHN5bmMtcmVhbHRpbWUtYXBpYCBob3N0KSwgc28gdGhleSBjYW5ub3QgYmUga25vd24gYmVmb3JlIHRoZSBzdGFja1xuICogaXMgZGVwbG95ZWQuIFVudGlsIGBzZXJ2aWNlcy9yZWFsdGltZWAgaGFzIGJlZW4gZGVwbG95ZWQgdG8gYW5cbiAqIGVudmlyb25tZW50IGl0cyBlbnRyeSBzdGF5cyBudWxsIGFuZCBgY29ubmVjdCh7IGVudiB9KWAgdGhyb3dzIHdpdGhcbiAqIGluc3RydWN0aW9uczsgYGNvbm5lY3QoeyBlbmRwb2ludHMgfSlgIGFsd2F5cyB3b3Jrcy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZWFsdGltZUVuZHBvaW50cyB7XG4gIC8qKiBBcHBTeW5jIEV2ZW50IEFQSSBIVFRQIGRvbWFpbi4gQWxzbyB0aGUgYGhvc3RgIGluIHRoZSBhdXRoIGhlYWRlci4gKi9cbiAgaHR0cERvbWFpbjogc3RyaW5nO1xuICAvKiogQXBwU3luYyBFdmVudCBBUEkgcmVhbHRpbWUgKFdlYlNvY2tldCkgZG9tYWluLiAqL1xuICByZWFsdGltZURvbWFpbjogc3RyaW5nO1xuICAvKiogUGxhdGZvcm0gQVBJIGJhc2UgVVJMLCB1c2VkIGZvciB0aGUgbGFzdC12YWx1ZSBzbmFwc2hvdCBmZXRjaC4gKi9cbiAgYXBpQmFzZTogc3RyaW5nO1xufVxuXG5leHBvcnQgdHlwZSBSZWFsdGltZUVudiA9ICdkZXYnIHwgJ3VhdCcgfCAncHJvZCc7XG5cbi8qKlxuICogVE9ETyhldmVudC1idXMpOiBwb3B1bGF0ZSBgaHR0cERvbWFpbmAgLyBgcmVhbHRpbWVEb21haW5gIHBlclxuICogZW52aXJvbm1lbnQgZnJvbSB0aGUgYFJlYWx0aW1lRXZlbnRBcGlIdHRwRG5zLXtlbnZ9YCBhbmRcbiAqIGBSZWFsdGltZUV2ZW50QXBpUmVhbHRpbWVEbnMte2Vudn1gIG91dHB1dHMgb2YgYFVlbmdhZ2VSZWFsdGltZVNlcnZpY2Ute2Vudn1gXG4gKiBvbmNlIHRoZSBzdGFjayBoYXMgYmVlbiBkZXBsb3llZCB0aGVyZS5cbiAqL1xuY29uc3QgRU5EUE9JTlRTOiBSZWNvcmQ8UmVhbHRpbWVFbnYsIFJlYWx0aW1lRW5kcG9pbnRzIHwgbnVsbD4gPSB7XG4gIGRldjogbnVsbCxcbiAgdWF0OiBudWxsLFxuICBwcm9kOiBudWxsLFxufTtcblxuLyoqIFBsYXRmb3JtIEFQSSBiYXNlIHBlciBlbnZpcm9ubWVudCDigJQga25vd24gYWhlYWQgb2YgYW55IGRlcGxveS4gKi9cbmV4cG9ydCBjb25zdCBBUElfQkFTRTogUmVjb3JkPFJlYWx0aW1lRW52LCBzdHJpbmc+ID0ge1xuICBkZXY6ICdodHRwczovL2FwaS5kZXYucGxhdGZvcm0udWVuZ2FnZS5pbycsXG4gIHVhdDogJ2h0dHBzOi8vYXBpLnVhdC5wbGF0Zm9ybS51ZW5nYWdlLmlvJyxcbiAgcHJvZDogJ2h0dHBzOi8vYXBpLnBsYXRmb3JtLnVlbmdhZ2UuaW8nLFxufTtcblxuZXhwb3J0IGZ1bmN0aW9uIGVuZHBvaW50c0ZvcihlbnY6IFJlYWx0aW1lRW52KTogUmVhbHRpbWVFbmRwb2ludHMge1xuICBjb25zdCBmb3VuZCA9IEVORFBPSU5UU1tlbnZdO1xuICBpZiAoIWZvdW5kKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYHJlYWx0aW1lLmNvbm5lY3Q6IG5vIGVuZHBvaW50cyByZWdpc3RlcmVkIGZvciBlbnYgXCIke2Vudn1cIi4gYCArXG4gICAgICAgICdQYXNzIHtlbmRwb2ludHM6IHtodHRwRG9tYWluLCByZWFsdGltZURvbWFpbiwgYXBpQmFzZX19IGV4cGxpY2l0bHksIG9yIGZpbGwgaW4gJyArXG4gICAgICAgIFwic3JjL3JlYWx0aW1lL2VuZHBvaW50cy50cyBmcm9tIHRoZSByZWFsdGltZSBzdGFjaydzIFJlYWx0aW1lRXZlbnRBcGkqRG5zIG91dHB1dHMuXCIsXG4gICAgKTtcbiAgfVxuICByZXR1cm4gZm91bmQ7XG59XG4iXX0=
46
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW5kcG9pbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3JlYWx0aW1lL2VuZHBvaW50cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUEwREEsb0NBVUM7QUE1Q0Q7Ozs7Ozs7Ozs7OztHQVlHO0FBQ0gsTUFBTSxTQUFTLEdBQWtEO0lBQy9ELEdBQUcsRUFBRSxJQUFJO0lBQ1QsR0FBRyxFQUFFO1FBQ0gsVUFBVSxFQUFFLGlFQUFpRTtRQUM3RSxjQUFjLEVBQUUsMEVBQTBFO1FBQzFGLE9BQU8sRUFBRSxxQ0FBcUM7S0FDL0M7SUFDRCxJQUFJLEVBQUU7UUFDSixVQUFVLEVBQUUsaUVBQWlFO1FBQzdFLGNBQWMsRUFBRSwwRUFBMEU7UUFDMUYsT0FBTyxFQUFFLGlDQUFpQztLQUMzQztDQUNGLENBQUM7QUFFRixxRUFBcUU7QUFDeEQsUUFBQSxRQUFRLEdBQWdDO0lBQ25ELEdBQUcsRUFBRSxxQ0FBcUM7SUFDMUMsR0FBRyxFQUFFLHFDQUFxQztJQUMxQyxJQUFJLEVBQUUsaUNBQWlDO0NBQ3hDLENBQUM7QUFFRixTQUFnQixZQUFZLENBQUMsR0FBZ0I7SUFDM0MsTUFBTSxLQUFLLEdBQUcsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzdCLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNYLE1BQU0sSUFBSSxLQUFLLENBQ2Isc0RBQXNELEdBQUcsS0FBSztZQUM1RCxpRkFBaUY7WUFDakYsbUZBQW1GLENBQ3RGLENBQUM7SUFDSixDQUFDO0lBQ0QsT0FBTyxLQUFLLENBQUM7QUFDZixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBQZXItZW52aXJvbm1lbnQgcmVhbHRpbWUgZW5kcG9pbnRzLlxuICpcbiAqIEZyb250ZW5kcyBwYXNzIGBjb25uZWN0KHsgZW52OiAncHJvZCcgfSlgIGFuZCBnZXQgVVJMcyBmcm9tIGhlcmUg4oCUIG5vXG4gKiBob3N0bmFtZXMgb3IgQVJOcyBpbiBhcHAgY29kZS5cbiAqXG4gKiBBcHBTeW5jIGFzc2lnbnMgdGhlIEV2ZW50IEFQSSdzIEROUyBuYW1lcyBhdCBjcmVhdGUgdGltZVxuICogKGA8YXBpSWQ+LmFwcHN5bmMtYXBpLjxyZWdpb24+LmFtYXpvbmF3cy5jb21gIGFuZCB0aGUgbWF0Y2hpbmdcbiAqIGBhcHBzeW5jLXJlYWx0aW1lLWFwaWAgaG9zdCksIHNvIHRoZXkgY2Fubm90IGJlIGtub3duIGJlZm9yZSB0aGUgc3RhY2tcbiAqIGlzIGRlcGxveWVkLiBBbiBlbnZpcm9ubWVudCB3aXRob3V0IGEgZGVwbG95ZWQgc3RhY2sgc3RheXMgbnVsbCBhbmRcbiAqIGBjb25uZWN0KHsgZW52IH0pYCB0aHJvd3Mgd2l0aCBpbnN0cnVjdGlvbnM7IGBjb25uZWN0KHsgZW5kcG9pbnRzIH0pYFxuICogYWx3YXlzIHdvcmtzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlYWx0aW1lRW5kcG9pbnRzIHtcbiAgLyoqIEFwcFN5bmMgRXZlbnQgQVBJIEhUVFAgZG9tYWluLiBBbHNvIHRoZSBgaG9zdGAgaW4gdGhlIGF1dGggaGVhZGVyLiAqL1xuICBodHRwRG9tYWluOiBzdHJpbmc7XG4gIC8qKiBBcHBTeW5jIEV2ZW50IEFQSSByZWFsdGltZSAoV2ViU29ja2V0KSBkb21haW4uICovXG4gIHJlYWx0aW1lRG9tYWluOiBzdHJpbmc7XG4gIC8qKiBQbGF0Zm9ybSBBUEkgYmFzZSBVUkwsIHVzZWQgZm9yIHRoZSBsYXN0LXZhbHVlIHNuYXBzaG90IGZldGNoLiAqL1xuICBhcGlCYXNlOiBzdHJpbmc7XG59XG5cbmV4cG9ydCB0eXBlIFJlYWx0aW1lRW52ID0gJ2RldicgfCAndWF0JyB8ICdwcm9kJztcblxuLyoqXG4gKiBBcHBTeW5jIGFzc2lnbnMgdGhlc2UgYXQgRXZlbnQgQVBJIGNyZWF0ZSB0aW1lIGFuZCB0aGUgcHJlZml4IGlzIE5PVCB0aGVcbiAqIEFQSSBpZCwgc28gdGhleSBjYW5ub3QgYmUgY29uc3RydWN0ZWQg4oCUIHRoZXkgYXJlIGNvcGllZCBmcm9tIHRoZVxuICogYFJlYWx0aW1lRXZlbnRBcGlIdHRwRG5zLXtlbnZ9YCAvIGBSZWFsdGltZUV2ZW50QXBpUmVhbHRpbWVEbnMte2Vudn1gXG4gKiBvdXRwdXRzIG9mIGBVZW5nYWdlUmVhbHRpbWVTZXJ2aWNlLXtlbnZ9YC5cbiAqXG4gKiBCZWNhdXNlIGEgY2FjaGVkIGJyb3dzZXIgYnVuZGxlIGNhcnJpZXMgdGhlc2UgdmFsdWVzLCByZWNyZWF0aW5nIGFuIEV2ZW50XG4gKiBBUEkgaXMgYSBicmVha2luZyBjaGFuZ2UgZm9yIGV2ZXJ5IHBpbm5lZCBjb25zdW1lci4gVGhlIGBicm93c2VyLXNka2BcbiAqIHJlbGVhc2Ugam9iIGFzc2VydHMgdGhlIHByb2QgcGFpciBzdGlsbCBtYXRjaGVzIHRoZSBsaXZlIHN0YWNrIGV4cG9ydHMgYW5kXG4gKiBmYWlscyB0aGUgcmVsZWFzZSBvbiBkcmlmdCwgc28gdGhpcyB0YWJsZSBjYW5ub3Qgcm90IHNpbGVudGx5LlxuICpcbiAqIGBkZXZgIHN0YXlzIG51bGwg4oCUIHRoZSByZWFsdGltZSBzdGFjayBpcyBub3QgZGVwbG95ZWQgdGhlcmUuXG4gKi9cbmNvbnN0IEVORFBPSU5UUzogUmVjb3JkPFJlYWx0aW1lRW52LCBSZWFsdGltZUVuZHBvaW50cyB8IG51bGw+ID0ge1xuICBkZXY6IG51bGwsXG4gIHVhdDoge1xuICAgIGh0dHBEb21haW46ICd6bDJrb3Jtd3JqZXhiZ2xrYnBzeTQ0eHllNC5hcHBzeW5jLWFwaS5hcC1zb3V0aC0xLmFtYXpvbmF3cy5jb20nLFxuICAgIHJlYWx0aW1lRG9tYWluOiAnemwya29ybXdyamV4Ymdsa2Jwc3k0NHh5ZTQuYXBwc3luYy1yZWFsdGltZS1hcGkuYXAtc291dGgtMS5hbWF6b25hd3MuY29tJyxcbiAgICBhcGlCYXNlOiAnaHR0cHM6Ly9hcGkudWF0LnBsYXRmb3JtLnVlbmdhZ2UuaW8nLFxuICB9LFxuICBwcm9kOiB7XG4gICAgaHR0cERvbWFpbjogJzZkaGZqdGx2eWpmYWxrdTd1bWJ1c3VpbGhhLmFwcHN5bmMtYXBpLmFwLXNvdXRoLTEuYW1hem9uYXdzLmNvbScsXG4gICAgcmVhbHRpbWVEb21haW46ICc2ZGhmanRsdnlqZmFsa3U3dW1idXN1aWxoYS5hcHBzeW5jLXJlYWx0aW1lLWFwaS5hcC1zb3V0aC0xLmFtYXpvbmF3cy5jb20nLFxuICAgIGFwaUJhc2U6ICdodHRwczovL2FwaS5wbGF0Zm9ybS51ZW5nYWdlLmlvJyxcbiAgfSxcbn07XG5cbi8qKiBQbGF0Zm9ybSBBUEkgYmFzZSBwZXIgZW52aXJvbm1lbnQg4oCUIGtub3duIGFoZWFkIG9mIGFueSBkZXBsb3kuICovXG5leHBvcnQgY29uc3QgQVBJX0JBU0U6IFJlY29yZDxSZWFsdGltZUVudiwgc3RyaW5nPiA9IHtcbiAgZGV2OiAnaHR0cHM6Ly9hcGkuZGV2LnBsYXRmb3JtLnVlbmdhZ2UuaW8nLFxuICB1YXQ6ICdodHRwczovL2FwaS51YXQucGxhdGZvcm0udWVuZ2FnZS5pbycsXG4gIHByb2Q6ICdodHRwczovL2FwaS5wbGF0Zm9ybS51ZW5nYWdlLmlvJyxcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBlbmRwb2ludHNGb3IoZW52OiBSZWFsdGltZUVudik6IFJlYWx0aW1lRW5kcG9pbnRzIHtcbiAgY29uc3QgZm91bmQgPSBFTkRQT0lOVFNbZW52XTtcbiAgaWYgKCFmb3VuZCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGByZWFsdGltZS5jb25uZWN0OiBubyBlbmRwb2ludHMgcmVnaXN0ZXJlZCBmb3IgZW52IFwiJHtlbnZ9XCIuIGAgK1xuICAgICAgICAnUGFzcyB7ZW5kcG9pbnRzOiB7aHR0cERvbWFpbiwgcmVhbHRpbWVEb21haW4sIGFwaUJhc2V9fSBleHBsaWNpdGx5LCBvciBmaWxsIGluICcgK1xuICAgICAgICBcInNyYy9yZWFsdGltZS9lbmRwb2ludHMudHMgZnJvbSB0aGUgcmVhbHRpbWUgc3RhY2sncyBSZWFsdGltZUV2ZW50QXBpKkRucyBvdXRwdXRzLlwiLFxuICAgICk7XG4gIH1cbiAgcmV0dXJuIGZvdW5kO1xufVxuIl19
@@ -20,6 +20,20 @@ export type TokenSource = {
20
20
  } | {
21
21
  kind: 'callback';
22
22
  getToken: () => string | Promise<string>;
23
+ } | {
24
+ /**
25
+ * `tokenUrl` — a route on the CALLER's own server that returns
26
+ * `{ token, expiresIn }`. Mirrors the realtime SDK option of the
27
+ * same name, and exists for the same reason: it keeps the client
28
+ * secret on the caller's server instead of in a page or an app
29
+ * bundle.
30
+ *
31
+ * `expiresIn` is seconds from receipt, per the realtime contract.
32
+ * It is trusted over the JWT's own `exp` because the caller's
33
+ * server may deliberately hand out a shorter-lived slice.
34
+ */
35
+ kind: 'token-url';
36
+ tokenUrl: string;
23
37
  } | {
24
38
  kind: 'service-credentials';
25
39
  clientId: string;