@uengage.io/platform-sdk 0.3.0 → 0.7.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.
@@ -0,0 +1,93 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.verifyAccessToken = verifyAccessToken;
37
+ exports._resetJwksCache = _resetJwksCache;
38
+ const errors_1 = require("../errors");
39
+ const issuer_1 = require("./issuer");
40
+ /**
41
+ * Cache of JWKS documents keyed by issuer URL. Lambda-style: cleared
42
+ * on cold start, reused for the lifetime of the process. 5-minute
43
+ * staleness is plenty: when a key is rotated the auth server keeps
44
+ * publishing both old + new for the access-token TTL window, so the
45
+ * SDK's slightly stale view never causes a verification miss.
46
+ */
47
+ const jwksCache = new Map();
48
+ const JWKS_TTL_MS = 5 * 60 * 1000;
49
+ async function getJwks(issuer) {
50
+ const cached = jwksCache.get(issuer);
51
+ if (cached && Date.now() - cached.cachedAt < JWKS_TTL_MS)
52
+ return cached.doc;
53
+ const res = await fetch(`${issuer}/jwks.json`);
54
+ if (!res.ok)
55
+ throw new errors_1.PlatformError(`JWKS fetch failed: HTTP ${res.status}`, { status: res.status });
56
+ const doc = (await res.json());
57
+ jwksCache.set(issuer, { doc, cachedAt: Date.now() });
58
+ return doc;
59
+ }
60
+ /**
61
+ * Verify an access token: fetches JWKS based on the token's `iss`,
62
+ * verifies the RSA signature, and returns the claims. Throws on any
63
+ * failure so callers can `try/catch` once instead of branching on a
64
+ * boolean.
65
+ *
66
+ * The verification itself happens via `jose`'s `jwtVerify`, but to
67
+ * keep this module lightweight (and to avoid pulling jose into the
68
+ * Browser bundle when consumers only want the URL helpers) we
69
+ * dynamic-import it. Tree-shakers will drop the import for code paths
70
+ * that never call `verifyAccessToken`.
71
+ */
72
+ async function verifyAccessToken(token, options) {
73
+ const issuer = (0, issuer_1.getIssuer)(token);
74
+ if (!issuer)
75
+ throw new errors_1.ConfigError('access token has no `iss` claim');
76
+ const { jwtVerify, createLocalJWKSet } = await Promise.resolve().then(() => __importStar(require('jose')));
77
+ const jwks = createLocalJWKSet({ keys: (await getJwks(issuer)).keys });
78
+ try {
79
+ const { payload } = await jwtVerify(token, jwks, {
80
+ issuer,
81
+ audience: options?.audience,
82
+ });
83
+ return payload;
84
+ }
85
+ catch (err) {
86
+ throw new errors_1.AuthenticationError('access token verification failed', { cause: err });
87
+ }
88
+ }
89
+ /** Test-only: clear the JWKS cache. */
90
+ function _resetJwksCache() {
91
+ jwksCache.clear();
92
+ }
93
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVyaWZ5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2F1dGgvdmVyaWZ5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBd0NBLDhDQWlCQztBQUdELDBDQUVDO0FBOURELHNDQUE0RTtBQUM1RSxxQ0FBcUM7QUFNckM7Ozs7OztHQU1HO0FBQ0gsTUFBTSxTQUFTLEdBQUcsSUFBSSxHQUFHLEVBQThDLENBQUM7QUFDeEUsTUFBTSxXQUFXLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUM7QUFFbEMsS0FBSyxVQUFVLE9BQU8sQ0FBQyxNQUFjO0lBQ25DLE1BQU0sTUFBTSxHQUFHLFNBQVMsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDckMsSUFBSSxNQUFNLElBQUksSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLE1BQU0sQ0FBQyxRQUFRLEdBQUcsV0FBVztRQUFFLE9BQU8sTUFBTSxDQUFDLEdBQUcsQ0FBQztJQUM1RSxNQUFNLEdBQUcsR0FBRyxNQUFNLEtBQUssQ0FBQyxHQUFHLE1BQU0sWUFBWSxDQUFDLENBQUM7SUFDL0MsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFO1FBQ1QsTUFBTSxJQUFJLHNCQUFhLENBQUMsMkJBQTJCLEdBQUcsQ0FBQyxNQUFNLEVBQUUsRUFBRSxFQUFFLE1BQU0sRUFBRSxHQUFHLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztJQUMzRixNQUFNLEdBQUcsR0FBRyxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksRUFBRSxDQUFZLENBQUM7SUFDMUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsRUFBRSxHQUFHLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDckQsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBRUQ7Ozs7Ozs7Ozs7O0dBV0c7QUFDSSxLQUFLLFVBQVUsaUJBQWlCLENBQ3JDLEtBQWEsRUFDYixPQUErQjtJQUUvQixNQUFNLE1BQU0sR0FBRyxJQUFBLGtCQUFTLEVBQUMsS0FBSyxDQUFDLENBQUM7SUFDaEMsSUFBSSxDQUFDLE1BQU07UUFBRSxNQUFNLElBQUksb0JBQVcsQ0FBQyxpQ0FBaUMsQ0FBQyxDQUFDO0lBQ3RFLE1BQU0sRUFBRSxTQUFTLEVBQUUsaUJBQWlCLEVBQUUsR0FBRyx3REFBYSxNQUFNLEdBQUMsQ0FBQztJQUM5RCxNQUFNLElBQUksR0FBRyxpQkFBaUIsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLE1BQU0sT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBYSxFQUFFLENBQUMsQ0FBQztJQUNoRixJQUFJLENBQUM7UUFDSCxNQUFNLEVBQUUsT0FBTyxFQUFFLEdBQUcsTUFBTSxTQUFTLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRTtZQUMvQyxNQUFNO1lBQ04sUUFBUSxFQUFFLE9BQU8sRUFBRSxRQUFRO1NBQzVCLENBQUMsQ0FBQztRQUNILE9BQU8sT0FBa0MsQ0FBQztJQUM1QyxDQUFDO0lBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztRQUNiLE1BQU0sSUFBSSw0QkFBbUIsQ0FBQyxrQ0FBa0MsRUFBRSxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO0lBQ3BGLENBQUM7QUFDSCxDQUFDO0FBRUQsdUNBQXVDO0FBQ3ZDLFNBQWdCLGVBQWU7SUFDN0IsU0FBUyxDQUFDLEtBQUssRUFBRSxDQUFDO0FBQ3BCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBdXRoZW50aWNhdGlvbkVycm9yLCBDb25maWdFcnJvciwgUGxhdGZvcm1FcnJvciB9IGZyb20gJy4uL2Vycm9ycyc7XG5pbXBvcnQgeyBnZXRJc3N1ZXIgfSBmcm9tICcuL2lzc3Vlcic7XG5cbmludGVyZmFjZSBKd2tzRG9jIHtcbiAga2V5czogQXJyYXk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+O1xufVxuXG4vKipcbiAqIENhY2hlIG9mIEpXS1MgZG9jdW1lbnRzIGtleWVkIGJ5IGlzc3VlciBVUkwuIExhbWJkYS1zdHlsZTogY2xlYXJlZFxuICogb24gY29sZCBzdGFydCwgcmV1c2VkIGZvciB0aGUgbGlmZXRpbWUgb2YgdGhlIHByb2Nlc3MuIDUtbWludXRlXG4gKiBzdGFsZW5lc3MgaXMgcGxlbnR5OiB3aGVuIGEga2V5IGlzIHJvdGF0ZWQgdGhlIGF1dGggc2VydmVyIGtlZXBzXG4gKiBwdWJsaXNoaW5nIGJvdGggb2xkICsgbmV3IGZvciB0aGUgYWNjZXNzLXRva2VuIFRUTCB3aW5kb3csIHNvIHRoZVxuICogU0RLJ3Mgc2xpZ2h0bHkgc3RhbGUgdmlldyBuZXZlciBjYXVzZXMgYSB2ZXJpZmljYXRpb24gbWlzcy5cbiAqL1xuY29uc3Qgandrc0NhY2hlID0gbmV3IE1hcDxzdHJpbmcsIHsgZG9jOiBKd2tzRG9jOyBjYWNoZWRBdDogbnVtYmVyIH0+KCk7XG5jb25zdCBKV0tTX1RUTF9NUyA9IDUgKiA2MCAqIDEwMDA7XG5cbmFzeW5jIGZ1bmN0aW9uIGdldEp3a3MoaXNzdWVyOiBzdHJpbmcpOiBQcm9taXNlPEp3a3NEb2M+IHtcbiAgY29uc3QgY2FjaGVkID0gandrc0NhY2hlLmdldChpc3N1ZXIpO1xuICBpZiAoY2FjaGVkICYmIERhdGUubm93KCkgLSBjYWNoZWQuY2FjaGVkQXQgPCBKV0tTX1RUTF9NUykgcmV0dXJuIGNhY2hlZC5kb2M7XG4gIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKGAke2lzc3Vlcn0vandrcy5qc29uYCk7XG4gIGlmICghcmVzLm9rKVxuICAgIHRocm93IG5ldyBQbGF0Zm9ybUVycm9yKGBKV0tTIGZldGNoIGZhaWxlZDogSFRUUCAke3Jlcy5zdGF0dXN9YCwgeyBzdGF0dXM6IHJlcy5zdGF0dXMgfSk7XG4gIGNvbnN0IGRvYyA9IChhd2FpdCByZXMuanNvbigpKSBhcyBKd2tzRG9jO1xuICBqd2tzQ2FjaGUuc2V0KGlzc3VlciwgeyBkb2MsIGNhY2hlZEF0OiBEYXRlLm5vdygpIH0pO1xuICByZXR1cm4gZG9jO1xufVxuXG4vKipcbiAqIFZlcmlmeSBhbiBhY2Nlc3MgdG9rZW46IGZldGNoZXMgSldLUyBiYXNlZCBvbiB0aGUgdG9rZW4ncyBgaXNzYCxcbiAqIHZlcmlmaWVzIHRoZSBSU0Egc2lnbmF0dXJlLCBhbmQgcmV0dXJucyB0aGUgY2xhaW1zLiBUaHJvd3Mgb24gYW55XG4gKiBmYWlsdXJlIHNvIGNhbGxlcnMgY2FuIGB0cnkvY2F0Y2hgIG9uY2UgaW5zdGVhZCBvZiBicmFuY2hpbmcgb24gYVxuICogYm9vbGVhbi5cbiAqXG4gKiBUaGUgdmVyaWZpY2F0aW9uIGl0c2VsZiBoYXBwZW5zIHZpYSBgam9zZWAncyBgand0VmVyaWZ5YCwgYnV0IHRvXG4gKiBrZWVwIHRoaXMgbW9kdWxlIGxpZ2h0d2VpZ2h0IChhbmQgdG8gYXZvaWQgcHVsbGluZyBqb3NlIGludG8gdGhlXG4gKiBCcm93c2VyIGJ1bmRsZSB3aGVuIGNvbnN1bWVycyBvbmx5IHdhbnQgdGhlIFVSTCBoZWxwZXJzKSB3ZVxuICogZHluYW1pYy1pbXBvcnQgaXQuIFRyZWUtc2hha2VycyB3aWxsIGRyb3AgdGhlIGltcG9ydCBmb3IgY29kZSBwYXRoc1xuICogdGhhdCBuZXZlciBjYWxsIGB2ZXJpZnlBY2Nlc3NUb2tlbmAuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB2ZXJpZnlBY2Nlc3NUb2tlbihcbiAgdG9rZW46IHN0cmluZyxcbiAgb3B0aW9ucz86IHsgYXVkaWVuY2U/OiBzdHJpbmcgfSxcbik6IFByb21pc2U8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+IHtcbiAgY29uc3QgaXNzdWVyID0gZ2V0SXNzdWVyKHRva2VuKTtcbiAgaWYgKCFpc3N1ZXIpIHRocm93IG5ldyBDb25maWdFcnJvcignYWNjZXNzIHRva2VuIGhhcyBubyBgaXNzYCBjbGFpbScpO1xuICBjb25zdCB7IGp3dFZlcmlmeSwgY3JlYXRlTG9jYWxKV0tTZXQgfSA9IGF3YWl0IGltcG9ydCgnam9zZScpO1xuICBjb25zdCBqd2tzID0gY3JlYXRlTG9jYWxKV0tTZXQoeyBrZXlzOiAoYXdhaXQgZ2V0Sndrcyhpc3N1ZXIpKS5rZXlzIGFzIG5ldmVyIH0pO1xuICB0cnkge1xuICAgIGNvbnN0IHsgcGF5bG9hZCB9ID0gYXdhaXQgand0VmVyaWZ5KHRva2VuLCBqd2tzLCB7XG4gICAgICBpc3N1ZXIsXG4gICAgICBhdWRpZW5jZTogb3B0aW9ucz8uYXVkaWVuY2UsXG4gICAgfSk7XG4gICAgcmV0dXJuIHBheWxvYWQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIHRocm93IG5ldyBBdXRoZW50aWNhdGlvbkVycm9yKCdhY2Nlc3MgdG9rZW4gdmVyaWZpY2F0aW9uIGZhaWxlZCcsIHsgY2F1c2U6IGVyciB9KTtcbiAgfVxufVxuXG4vKiogVGVzdC1vbmx5OiBjbGVhciB0aGUgSldLUyBjYWNoZS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBfcmVzZXRKd2tzQ2FjaGUoKTogdm9pZCB7XG4gIGp3a3NDYWNoZS5jbGVhcigpO1xufVxuIl19
@@ -4,6 +4,7 @@ exports.BusinessApiError = void 0;
4
4
  exports.createBusinessClient = createBusinessClient;
5
5
  const config_1 = require("../config");
6
6
  const http_1 = require("../http");
7
+ const token_source_1 = require("../token-source");
7
8
  class BusinessApiError extends Error {
8
9
  status;
9
10
  body;
@@ -34,10 +35,10 @@ function createBusinessClient(input = {}) {
34
35
  const path = `/v1/businesses/${id}`;
35
36
  const query = opts.groups?.length ? `?groups=${opts.groups.join(',')}` : '';
36
37
  const config = state.resolve();
37
- const headers = (0, http_1.buildHeaders)(config, { method: 'GET', path });
38
- const res = await config.fetchFn(`${config.baseUrl}${path}${query}`, {
38
+ const res = await sendWithAuthRetry(config, {
39
39
  method: 'GET',
40
- headers,
40
+ path,
41
+ url: `${config.baseUrl}${path}${query}`,
41
42
  });
42
43
  if (!res.ok) {
43
44
  throw new BusinessApiError(res.status, await res.text());
@@ -58,10 +59,10 @@ function createBusinessClient(input = {}) {
58
59
  if (opts.groups?.length)
59
60
  params.set('groups', opts.groups.join(','));
60
61
  const config = state.resolve();
61
- const headers = (0, http_1.buildHeaders)(config, { method: 'GET', path });
62
- const res = await config.fetchFn(`${config.baseUrl}${path}?${params.toString()}`, {
62
+ const res = await sendWithAuthRetry(config, {
63
63
  method: 'GET',
64
- headers,
64
+ path,
65
+ url: `${config.baseUrl}${path}?${params.toString()}`,
65
66
  });
66
67
  if (!res.ok) {
67
68
  throw new BusinessApiError(res.status, await res.text());
@@ -71,4 +72,36 @@ function createBusinessClient(input = {}) {
71
72
  };
72
73
  return client;
73
74
  }
74
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2J1c2luZXNzL2NsaWVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFrQ0Esb0RBd0RDO0FBMUZELHNDQUttQjtBQUNuQixrQ0FBdUM7QUFnQnZDLE1BQWEsZ0JBQWlCLFNBQVEsS0FBSztJQUNoQyxNQUFNLENBQVM7SUFDZixJQUFJLENBQVM7SUFFdEIsWUFBWSxNQUFjLEVBQUUsSUFBWTtRQUN0QyxLQUFLLENBQUMsZ0JBQWdCLE1BQU0sS0FBSyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQ3pDLElBQUksQ0FBQyxJQUFJLEdBQUcsa0JBQWtCLENBQUM7UUFDL0IsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7UUFDckIsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7SUFDbkIsQ0FBQztDQUNGO0FBVkQsNENBVUM7QUFFRCxTQUFnQixvQkFBb0IsQ0FBQyxRQUE2QixFQUFFO0lBQ2xFLE1BQU0sS0FBSyxHQUFHLElBQUksb0JBQVcsRUFBRSxDQUFDO0lBQ2hDLEtBQUssQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7SUFFbkIsTUFBTSxNQUFNLEdBQW1CO1FBQzdCLE1BQU0sQ0FBQyxJQUFJO1lBQ1QsS0FBSyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNsQixPQUFPLE1BQU0sQ0FBQztRQUNoQixDQUFDO1FBQ0QsSUFBSSxDQUFDLElBQUk7WUFDUCxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3BCLE9BQU8sTUFBTSxDQUFDO1FBQ2hCLENBQUM7UUFDRCxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxJQUFJLEdBQUcsRUFBRTtZQUNyQixJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxFQUFFLENBQUM7Z0JBQ3JDLE1BQU0sSUFBSSxL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SUFFRixPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ29uZmlnU3RhdGUsXG4gIHR5cGUgUGxhdGZvcm1BdXRoLFxuICB0eXBlIFBsYXRmb3JtQXV0aElucHV0LFxuICB0eXBlIFBsYXRmb3JtQ29uZmlnSW5wdXQsXG59IGZyb20gJy4uL2NvbmZpZyc7XG5pbXBvcnQgeyBidWlsZEhlYWRlcnMgfSBmcm9tICcuLi9odHRwJztcbmltcG9ydCB0eXBlIHsgQnVzaW5lc3NHcm91cE5hbWUsIEJ1c2luZXNzUmVjb3JkIH0gZnJvbSAnLi9zY2hlbWEnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEJ1c2luZXNzR2V0T3B0aW9ucyB7XG4gIGdyb3Vwcz86IHJlYWRvbmx5IEJ1c2luZXNzR3JvdXBOYW1lW107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQnVzaW5lc3NDbGllbnQge1xuICBjb25maWcoaW5wdXQ6IFBsYXRmb3JtQ29uZmlnSW5wdXQpOiBCdXNpbmVzc0NsaWVudDtcbiAgYXV0aChpbnB1dDogUGxhdGZvcm1BdXRoSW5wdXQgfCBQbGF0Zm9ybUF1dGgpOiBCdXNpbmVzc0NsaWVudDtcbiAgLyoqIEdFVCAvdjEvYnVzaW5lc3Nlcy86aWQgLSByZXR1cm5zIHRoZSByZWNvcmQgb3IgdGhyb3dzIEJ1c2luZXNzQXBpRXJyb3IuICovXG4gIGdldChpZDogbnVtYmVyLCBvcHRzPzogQnVzaW5lc3NHZXRPcHRpb25zKTogUHJvbWlzZTxCdXNpbmVzc1JlY29yZD47XG4gIC8qKiBHRVQgL3YxL2J1c2luZXNzZXM/aWRzPSAtIHJldHVybnMgbWF0Y2hlZCByZWNvcmRzIChtaXNzaW5nIGlkcyBkcm9wcGVkKS4gKi9cbiAgYnVsayhpZHM6IHJlYWRvbmx5IG51bWJlcltdLCBvcHRzPzogQnVzaW5lc3NHZXRPcHRpb25zKTogUHJvbWlzZTxCdXNpbmVzc1JlY29yZFtdPjtcbn1cblxuZXhwb3J0IGNsYXNzIEJ1c2luZXNzQXBpRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIHJlYWRvbmx5IHN0YXR1czogbnVtYmVyO1xuICByZWFkb25seSBib2R5OiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3Ioc3RhdHVzOiBudW1iZXIsIGJvZHk6IHN0cmluZykge1xuICAgIHN1cGVyKGBidXNpbmVzcyBBUEkgJHtzdGF0dXN9OiAke2JvZHl9YCk7XG4gICAgdGhpcy5uYW1lID0gJ0J1c2luZXNzQXBpRXJyb3InO1xuICAgIHRoaXMuc3RhdHVzID0gc3RhdHVzO1xuICAgIHRoaXMuYm9keSA9IGJvZHk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUJ1c2luZXNzQ2xpZW50KGlucHV0OiBQbGF0Zm9ybUNvbmZpZ0lucHV0ID0ge30pOiBCdXNpbmVzc0NsaWVudCB7XG4gIGNvbnN0IHN0YXRlID0gbmV3IENvbmZpZ1N0YXRlKCk7XG4gIHN0YXRlLmFwcGx5KGlucHV0KTtcblxuICBjb25zdCBjbGllbnQ6IEJ1c2luZXNzQ2xpZW50ID0ge1xuICAgIGNvbmZpZyhvcHRzKSB7XG4gICAgICBzdGF0ZS5hcHBseShvcHRzKTtcbiAgICAgIHJldHVybiBjbGllbnQ7XG4gICAgfSxcbiAgICBhdXRoKG9wdHMpIHtcbiAgICAgIHN0YXRlLnNldEF1dGgob3B0cyk7XG4gICAgICByZXR1cm4gY2xpZW50O1xuICAgIH0sXG4gICAgYXN5bmMgZ2V0KGlkLCBvcHRzID0ge30pIHtcbiAgICAgIGlmICghTnVtYmVyLmlzSW50ZWdlcihpZCkgfHwgaWQgPD0gMCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGJ1c2luZXNzLmdldDogaWQgbXVzdCBiZSBhIHBvc2l0aXZlIGludGVnZXIgKGdvdCAke2lkfSlgKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHBhdGggPSBgL3YxL2J1c2luZXNzZXMvJHtpZH1gO1xuICAgICAgY29uc3QgcXVlcnkgPSBvcHRzLmdyb3Vwcz8ubGVuZ3RoID8gYD9ncm91cHM9JHtvcHRzLmdyb3Vwcy5qb2luKCcsJyl9YCA6ICcnO1xuICAgICAgY29uc3QgY29uZmlnID0gc3RhdGUucmVzb2x2ZSgpO1xuICAgICAgY29uc3QgaGVhZGVycyA9IGJ1aWxkSGVhZGVycyhjb25maWcsIHsgbWV0aG9kOiAnR0VUJywgcGF0aCB9KTtcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGNvbmZpZy5mZXRjaEZuKGAke2NvbmZpZy5iYXNlVXJsfSR7cGF0aH0ke3F1ZXJ5fWAsIHtcbiAgICAgICAgbWV0aG9kOiAnR0VUJyxcbiAgICAgICAgaGVhZGVycyxcbiAgICAgIH0pO1xuICAgICAgaWYgKCFyZXMub2spIHtcbiAgICAgICAgdGhyb3cgbmV3IEJ1c2luZXNzQXBpRXJyb3IocmVzLnN0YXR1cywgYXdhaXQgcmVzLnRleHQoKSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gKGF3YWl0IHJlcy5qc29uKCkpIGFzIEJ1c2luZXNzUmVjb3JkO1xuICAgIH0sXG4gICAgYXN5bmMgYnVsayhpZHMsIG9wdHMgPSB7fSkge1xuICAgICAgaWYgKGlkcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdidXNpbmVzcy5idWxrOiBpZHMgbXVzdCBub3QgYmUgZW1wdHknKTtcbiAgICAgIH1cbiAgICAgIGZvciAoY29uc3QgbiBvZiBpZHMpIHtcbiAgICAgICAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKG4pIHx8IG4gPD0gMCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgYnVzaW5lc3MuYnVsazogZXZlcnkgaWQgbXVzdCBiZSBhIHBvc2l0aXZlIGludGVnZXIgKGdvdCAke259KWApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjb25zdCBwYXRoID0gJy92MS9idXNpbmVzc2VzJztcbiAgICAgIGNvbnN0IHBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMoeyBpZHM6IGlkcy5qb2luKCcsJykgfSk7XG4gICAgICBpZiAob3B0cy5ncm91cHM/Lmxlbmd0aCkgcGFyYW1zLnNldCgnZ3JvdXBzJywgb3B0cy5ncm91cHMuam9pbignLCcpKTtcbiAgICAgIGNvbnN0IGNvbmZpZyA9IHN0YXRlLnJlc29sdmUoKTtcbiAgICAgIGNvbnN0IGhlYWRlcnMgPSBidWlsZEhlYWRlcnMoY29uZmlnLCB7IG1ldGhvZDogJ0dFVCcsIHBhdGggfSk7XG4gICAgICBjb25zdCByZXMgPSBhd2FpdCBjb25maWcuZmV0Y2hGbihgJHtjb25maWcuYmFzZVVybH0ke3BhdGh9PyR7cGFyYW1zLnRvU3RyaW5nKCl9YCwge1xuICAgICAgICBtZXRob2Q6ICdHRVQnLFxuICAgICAgICBoZWFkZXJzLFxuICAgICAgfSk7XG4gICAgICBpZiAoIXJlcy5vaykge1xuICAgICAgICB0aHJvdyBuZXcgQnVzaW5lc3NBcGlFcnJvcihyZXMuc3RhdHVzLCBhd2FpdCByZXMudGV4dCgpKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiAoYXdhaXQgcmVzLmpzb24oKSkgYXMgQnVzaW5lc3NSZWNvcmRbXTtcbiAgICB9LFxuICB9O1xuXG4gIHJldHVybiBjbGllbnQ7XG59XG4iXX0=
75
+ /**
76
+ * Send a request with the SDK's standard 401-retry-once behaviour.
77
+ * Only retries when auth is `token-source`, since that's the case
78
+ * where the cached token may have expired server-side; HMAC and
79
+ * static bearer 401s mean the auth is misconfigured and a retry
80
+ * would just fail again.
81
+ */
82
+ async function sendWithAuthRetry(config, params) {
83
+ const headers = await (0, http_1.buildHeaders)(config, {
84
+ method: params.method,
85
+ path: params.path,
86
+ body: params.body,
87
+ });
88
+ const res = await config.fetchFn(params.url, {
89
+ method: params.method,
90
+ headers,
91
+ body: params.body,
92
+ });
93
+ if (res.status !== 401 || config.auth?.type !== 'token-source')
94
+ return res;
95
+ (0, token_source_1.invalidateToken)(config.auth.state);
96
+ const retryHeaders = await (0, http_1.buildHeaders)(config, {
97
+ method: params.method,
98
+ path: params.path,
99
+ body: params.body,
100
+ });
101
+ return config.fetchFn(params.url, {
102
+ method: params.method,
103
+ headers: retryHeaders,
104
+ body: params.body,
105
+ });
106
+ }
107
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2J1c2luZXNzL2NsaWVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFvQ0Esb0RBd0RDO0FBNUZELHNDQU1tQjtBQUNuQixrQ0FBdUM7QUFDdkMsa0RBQWtEO0FBZ0JsRCxNQUFhLGdCQUFpQixTQUFRLEtBQUs7SUFDaEMsTUFBTSxDQUFTO0lBQ2YsSUFBSSxDQUFTO0lBRXRCLFlBQVksTUFBYyxFQUFFLElBQVk7UUFDdEMsS0FBSyxDQUFDLGdCQUFnQixNQUFNLEtBQUssSUFBSSxFQUFFLENBQUMsQ0FBQztRQUN6QyxJQUFJLENBQUMsSUFBSSxHQUFHLGtCQUFrQixDQUFDO1FBQy9CLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO0lBQ25CLENBQUM7Q0FDRjtBQVZELDRDQVVDO0FBRUQsU0FBZ0Isb0JBQW9CLENBQUMsUUFBNkIsRUFBRTtJQUNsRSxNQUFNLEtBQUssR0FBRyxJQUFJLG9CQUFXLEVBQUUsQ0FBQztJQUNoQyxLQUFLLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBRW5CLE1BQU0sTUFBTSxHQUFtQjtRQUM3QixNQUFNLENBQUMsSUFBSTtZQUNULEtBQUssQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDbEIsT0FBTyxNQUFNLENBQUM7UUFDaEIsQ0FBQztRQUNELElBQUksQ0FBQyxJQUFJO1lBQ1AsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNwQixPQUFPLE1BQU0sQ0FBQztRQUNoQixDQUFDO1FBQ0QsS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsSUFBSSxHQUFHLEVBQUU7WUFDckIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDO2dCQUNy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O1FBQ3pDLE1BQU0sRUFBRSxNQUFNLENBQUMsTUFBTTtRQUNyQixJQUFJLEVBQUUsTUFBTSxDQUFDLElBQUk7UUFDakIsSUFBSSxFQUFFLE1BQU0sQ0FBQyxJQUFJO0tBQ2xCLENBQUMsQ0FBQztJQUNILE1BQU0sR0FBRyxHQUFHLE1BQU0sTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFO1FBQzNDLE1BQU0sRUFBRSxNQUFNLENBQUMsTUFBTTtRQUNyQixPQUFPO1FBQ1AsSUFBSSxFQUFFLE1BQU0sQ0FBQyxJQUFJO0tBQ2xCLENBQUMsQ0FBQztJQUNILElBQUksR0FBRyxDQUFDLE1BQU0sS0FBSyxHQUFHLElBQUksTUFBTSxDQUFDLElBQUksRUFBRSxJQUFJLEtBQUssY0FBYztRQUFFLE9BQU8sR0FBRyxDQUFDO0lBQzNFLElBQUEsOEJBQWUsRUFBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ25DLE1BQU0sWUFBWSxHQUFHLE1BQU0sSUFBQSxtQkFBWSxFQUFDLE1BQU0sRUFBRTtRQUM5QyxNQUFNLEVBQUUsTUFBTSxDQUFDLE1BQU07UUFDckIsSUFBSSxFQUFFLE1BQU0sQ0FBQyxJQUFJO1FBQ2pCLElBQUksRUFBRSxNQUFNLENBQUMsSUFBSTtLQUNsQixDQUFDLENBQUM7SUFDSCxPQUFPLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRTtRQUNoQyxNQUFNLEVBQUUsTUFBTSxDQUFDLE1BQU07UUFDckIsT0FBTyxFQUFFLFlBQVk7UUFDckIsSUFBSSxFQUFFLE1BQU0sQ0FBQyxJQUFJO0tBQ2xCLENBQUMsQ0FBQztBQUNMLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDb25maWdTdGF0ZSxcbiAgdHlwZSBQbGF0Zm9ybUF1dGgsXG4gIHR5cGUgUGxhdGZvcm1BdXRoSW5wdXQsXG4gIHR5cGUgUGxhdGZvcm1Db25maWcsXG4gIHR5cGUgUGxhdGZvcm1Db25maWdJbnB1dCxcbn0gZnJvbSAnLi4vY29uZmlnJztcbmltcG9ydCB7IGJ1aWxkSGVhZGVycyB9IGZyb20gJy4uL2h0dHAnO1xuaW1wb3J0IHsgaW52YWxpZGF0ZVRva2VuIH0gZnJvbSAnLi4vdG9rZW4tc291cmNlJztcbmltcG9ydCB0eXBlIHsgQnVzaW5lc3NHcm91cE5hbWUsIEJ1c2luZXNzUmVjb3JkIH0gZnJvbSAnLi9zY2hlbWEnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEJ1c2luZXNzR2V0T3B0aW9ucyB7XG4gIGdyb3Vwcz86IHJlYWRvbmx5IEJ1c2luZXNzR3JvdXBOYW1lW107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQnVzaW5lc3NDbGllbnQge1xuICBjb25maWcoaW5wdXQ6IFBsYXRmb3JtQ29uZmlnSW5wdXQpOiBCdXNpbmVzc0NsaWVudDtcbiAgYXV0aChpbnB1dDogUGxhdGZvcm1BdXRoSW5wdXQgfCBQbGF0Zm9ybUF1dGgpOiBCdXNpbmVzc0NsaWVudDtcbiAgLyoqIEdFVCAvdjEvYnVzaW5lc3Nlcy86aWQgLSByZXR1cm5zIHRoZSByZWNvcmQgb3IgdGhyb3dzIEJ1c2luZXNzQXBpRXJyb3IuICovXG4gIGdldChpZDogbnVtYmVyLCBvcHRzPzogQnVzaW5lc3NHZXRPcHRpb25zKTogUHJvbWlzZTxCdXNpbmVzc1JlY29yZD47XG4gIC8qKiBHRVQgL3YxL2J1c2luZXNzZXM/aWRzPSAtIHJldHVybnMgbWF0Y2hlZCByZWNvcmRzIChtaXNzaW5nIGlkcyBkcm9wcGVkKS4gKi9cbiAgYnVsayhpZHM6IHJlYWRvbmx5IG51bWJlcltdLCBvcHRzPzogQnVzaW5lc3NHZXRPcHRpb25zKTogUHJvbWlzZTxCdXNpbmVzc1JlY29yZFtdPjtcbn1cblxuZXhwb3J0IGNsYXNzIEJ1c2luZXNzQXBpRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIHJlYWRvbmx5IHN0YXR1czogbnVtYmVyO1xuICByZWFkb25seSBib2R5OiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3Ioc3RhdHVzOiBudW1iZXIsIGJvZHk6IHN0cmluZykge1xuICAgIHN1cGVyKGBidXNpbmVzcyBBUEkgJHtzdGF0dXN9OiAke2JvZHl9YCk7XG4gICAgdGhpcy5uYW1lID0gJ0J1c2luZXNzQXBpRXJyb3InO1xuICAgIHRoaXMuc3RhdHVzID0gc3RhdHVzO1xuICAgIHRoaXMuYm9keSA9IGJvZHk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUJ1c2luZXNzQ2xpZW50KGlucHV0OiBQbGF0Zm9ybUNvbmZpZ0lucHV0ID0ge30pOiBCdXNpbmVzc0NsaWVudCB7XG4gIGNvbnN0IHN0YXRlID0gbmV3IENvbmZpZ1N0YXRlKCk7XG4gIHN0YXRlLmFwcGx5KGlucHV0KTtcblxuICBjb25zdCBjbGllbnQ6IEJ1c2luZXNzQ2xpZW50ID0ge1xuICAgIGNvbmZpZyhvcHRzKSB7XG4gICAgICBzdGF0ZS5hcHBseShvcHRzKTtcbiAgICAgIHJldHVybiBjbGllbnQ7XG4gICAgfSxcbiAgICBhdXRoKG9wdHMpIHtcbiAgICAgIHN0YXRlLnNldEF1dGgob3B0cyk7XG4gICAgICByZXR1cm4gY2xpZW50O1xuICAgIH0sXG4gICAgYXN5bmMgZ2V0KGlkLCBvcHRzID0ge30pIHtcbiAgICAgIGlmICghTnVtYmVyLmlzSW50ZWdlcihpZCkgfHwgaWQgPD0gMCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGJ1c2luZXNzLmdldDogaWQgbXVzdCBiZSBhIHBvc2l0aXZlIGludGVnZXIgKGdvdCAke2lkfSlgKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHBhdGggPSBgL3YxL2J1c2luZXNzZXMvJHtpZH1gO1xuICAgICAgY29uc3QgcXVlcnkgPSBvcHRzLmdyb3Vwcz8ubGVuZ3RoID8gYD9ncm91cHM9JHtvcHRzLmdyb3Vwcy5qb2luKCcsJyl9YCA6ICcnO1xuICAgICAgY29uc3QgY29uZmlnID0gc3RhdGUucmVzb2x2ZSgpO1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgc2VuZFdpdGhBdXRoUmV0cnkoY29uZmlnLCB7XG4gICAgICAgIG1ldGhvZDogJ0dFVCcsXG4gICAgICAgIHBhdGgsXG4gICAgICAgIHVybDogYCR7Y29uZmlnLmJhc2VVcmx9JHtwYXRofSR7cXVlcnl9YCxcbiAgICAgIH0pO1xuICAgICAgaWYgKCFyZXMub2spIHtcbiAgICAgICAgdGhyb3cgbmV3IEJ1c2luZXNzQXBpRXJyb3IocmVzLnN0YXR1cywgYXdhaXQgcmVzLnRleHQoKSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gKGF3YWl0IHJlcy5qc29uKCkpIGFzIEJ1c2luZXNzUmVjb3JkO1xuICAgIH0sXG4gICAgYXN5bmMgYnVsayhpZHMsIG9wdHMgPSB7fSkge1xuICAgICAgaWYgKGlkcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdidXNpbmVzcy5idWxrOiBpZHMgbXVzdCBub3QgYmUgZW1wdHknKTtcbiAgICAgIH1cbiAgICAgIGZvciAoY29uc3QgbiBvZiBpZHMpIHtcbiAgICAgICAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKG4pIHx8IG4gPD0gMCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgYnVzaW5lc3MuYnVsazogZXZlcnkgaWQgbXVzdCBiZSBhIHBvc2l0aXZlIGludGVnZXIgKGdvdCAke259KWApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjb25zdCBwYXRoID0gJy92MS9idXNpbmVzc2VzJztcbiAgICAgIGNvbnN0IHBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMoeyBpZHM6IGlkcy5qb2luKCcsJykgfSk7XG4gICAgICBpZiAob3B0cy5ncm91cHM/Lmxlbmd0aCkgcGFyYW1zLnNldCgnZ3JvdXBzJywgb3B0cy5ncm91cHMuam9pbignLCcpKTtcbiAgICAgIGNvbnN0IGNvbmZpZyA9IHN0YXRlLnJlc29sdmUoKTtcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IHNlbmRXaXRoQXV0aFJldHJ5KGNvbmZpZywge1xuICAgICAgICBtZXRob2Q6ICdHRVQnLFxuICAgICAgICBwYXRoLFxuICAgICAgICB1cmw6IGAke2NvbmZpZy5iYXNlVXJsfSR7cGF0aH0/JHtwYXJhbXMudG9TdHJpbmcoKX1gLFxuICAgICAgfSk7XG4gICAgICBpZiAoIXJlcy5vaykge1xuICAgICAgICB0aHJvdyBuZXcgQnVzaW5lc3NBcGlFcnJvcihyZXMuc3RhdHVzLCBhd2FpdCByZXMudGV4dCgpKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiAoYXdhaXQgcmVzLmpzb24oKSkgYXMgQnVzaW5lc3NSZWNvcmRbXTtcbiAgICB9LFxuICB9O1xuXG4gIHJldHVybiBjbGllbnQ7XG59XG5cbi8qKlxuICogU2VuZCBhIHJlcXVlc3Qgd2l0aCB0aGUgU0RLJ3Mgc3RhbmRhcmQgNDAxLXJldHJ5LW9uY2UgYmVoYXZpb3VyLlxuICogT25seSByZXRyaWVzIHdoZW4gYXV0aCBpcyBgdG9rZW4tc291cmNlYCwgc2luY2UgdGhhdCdzIHRoZSBjYXNlXG4gKiB3aGVyZSB0aGUgY2FjaGVkIHRva2VuIG1heSBoYXZlIGV4cGlyZWQgc2VydmVyLXNpZGU7IEhNQUMgYW5kXG4gKiBzdGF0aWMgYmVhcmVyIDQwMXMgbWVhbiB0aGUgYXV0aCBpcyBtaXNjb25maWd1cmVkIGFuZCBhIHJldHJ5XG4gKiB3b3VsZCBqdXN0IGZhaWwgYWdhaW4uXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHNlbmRXaXRoQXV0aFJldHJ5KFxuICBjb25maWc6IFBsYXRmb3JtQ29uZmlnLFxuICBwYXJhbXM6IHsgbWV0aG9kOiBzdHJpbmc7IHBhdGg6IHN0cmluZzsgdXJsOiBzdHJpbmc7IGJvZHk/OiBzdHJpbmcgfSxcbik6IFByb21pc2U8UmVzcG9uc2U+IHtcbiAgY29uc3QgaGVhZGVycyA9IGF3YWl0IGJ1aWxkSGVhZGVycyhjb25maWcsIHtcbiAgICBtZXRob2Q6IHBhcmFtcy5tZXRob2QsXG4gICAgcGF0aDogcGFyYW1zLnBhdGgsXG4gICAgYm9keTogcGFyYW1zLmJvZHksXG4gIH0pO1xuICBjb25zdCByZXMgPSBhd2FpdCBjb25maWcuZmV0Y2hGbihwYXJhbXMudXJsLCB7XG4gICAgbWV0aG9kOiBwYXJhbXMubWV0aG9kLFxuICAgIGhlYWRlcnMsXG4gICAgYm9keTogcGFyYW1zLmJvZHksXG4gIH0pO1xuICBpZiAocmVzLnN0YXR1cyAhPT0gNDAxIHx8IGNvbmZpZy5hdXRoPy50eXBlICE9PSAndG9rZW4tc291cmNlJykgcmV0dXJuIHJlcztcbiAgaW52YWxpZGF0ZVRva2VuKGNvbmZpZy5hdXRoLnN0YXRlKTtcbiAgY29uc3QgcmV0cnlIZWFkZXJzID0gYXdhaXQgYnVpbGRIZWFkZXJzKGNvbmZpZywge1xuICAgIG1ldGhvZDogcGFyYW1zLm1ldGhvZCxcbiAgICBwYXRoOiBwYXJhbXMucGF0aCxcbiAgICBib2R5OiBwYXJhbXMuYm9keSxcbiAgfSk7XG4gIHJldHVybiBjb25maWcuZmV0Y2hGbihwYXJhbXMudXJsLCB7XG4gICAgbWV0aG9kOiBwYXJhbXMubWV0aG9kLFxuICAgIGhlYWRlcnM6IHJldHJ5SGVhZGVycyxcbiAgICBib2R5OiBwYXJhbXMuYm9keSxcbiAgfSk7XG59XG4iXX0=
@@ -0,0 +1,74 @@
1
+ import { type AuditClient } from './audit/client';
2
+ import { type BusinessClient } from './business/client';
3
+ import { auth } from './auth';
4
+ /**
5
+ * Caller-facing config for the unified `createClient(...)` factory and
6
+ * the `platform` singleton.
7
+ *
8
+ * Pick exactly one of:
9
+ * - `accessToken` (string or callback) for the static Bearer flow
10
+ * - `serviceId` + `serviceSecret` for OAuth2 client_credentials
11
+ *
12
+ * Without either, calls throw `ConfigError` on the first request.
13
+ */
14
+ export interface ClientConfig {
15
+ baseUrl?: string;
16
+ /**
17
+ * Auth surface base used to bootstrap the first client_credentials
18
+ * mint. Defaults to `${baseUrl}/auth/business`. Once a token exists,
19
+ * future auth calls follow the token's `iss` claim.
20
+ */
21
+ authBaseUrl?: string;
22
+ accessToken?: string | (() => string | Promise<string>);
23
+ serviceId?: string;
24
+ serviceSecret?: string;
25
+ /** Space-separated scope list to request when minting via client_credentials. */
26
+ scope?: string;
27
+ /**
28
+ * Service identifier the audit client should stamp into `actor.via`
29
+ * on emitted events. Defaults to `serviceId` when set; otherwise
30
+ * audit `record()` calls log an error and drop the event.
31
+ */
32
+ actorVia?: string;
33
+ expiryBufferMs?: number;
34
+ fetchFn?: typeof fetch;
35
+ }
36
+ export interface PlatformClient {
37
+ business: BusinessClient;
38
+ audit: AuditClient;
39
+ auth: typeof auth;
40
+ /**
41
+ * Return a derived client bound to the supplied access token.
42
+ * Inherits `baseUrl` and `fetchFn`; replaces the token source with
43
+ * the new one. Use case: BFF handlers that want to call the
44
+ * platform API as the end user instead of as the service.
45
+ */
46
+ withToken(token: string | (() => string | Promise<string>)): PlatformClient;
47
+ }
48
+ /**
49
+ * Build a fresh, isolated client from explicit config. Each call
50
+ * gets its own TokenSource state — concurrent `createClient(...)` use
51
+ * does not stampede the cache.
52
+ */
53
+ export declare function createClient(input?: ClientConfig): PlatformClient;
54
+ /**
55
+ * Default client. Reads config from environment variables on first
56
+ * property access (so test setups that mutate `process.env` after
57
+ * import work). Use `createClient(...)` when you need an isolated
58
+ * instance with explicit config.
59
+ *
60
+ * UENGAGE_BASE_URL defaults to https://api.platform.uengage.io
61
+ * UENGAGE_AUTH_BASE_URL auth surface override (default ${baseUrl}/auth/business)
62
+ * UENGAGE_AUTH_TOKEN static Bearer token (overrides client_credentials)
63
+ * UENGAGE_SERVICE_ID OAuth2 client_credentials clientId
64
+ * UENGAGE_SERVICE_SECRET OAuth2 client_credentials clientSecret
65
+ * UENGAGE_SERVICE_SCOPE optional space-separated scope list
66
+ */
67
+ export declare const platform: PlatformClient;
68
+ /** Test-only: drop the singleton cache between cases. */
69
+ export declare function _resetPlatformSingleton(): void;
70
+ /**
71
+ * Convenience: shorthand for `platform.withToken(token)`.
72
+ * BFF handlers commonly call this once per request.
73
+ */
74
+ export declare function withToken(token: string | (() => string | Promise<string>)): PlatformClient;
package/dist/client.js ADDED
@@ -0,0 +1,135 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.platform = void 0;
4
+ exports.createClient = createClient;
5
+ exports._resetPlatformSingleton = _resetPlatformSingleton;
6
+ exports.withToken = withToken;
7
+ const client_1 = require("./audit/client");
8
+ const client_2 = require("./business/client");
9
+ const token_source_1 = require("./token-source");
10
+ const DEFAULT_BASE_URL = 'https://api.platform.uengage.io';
11
+ /**
12
+ * Build a fresh, isolated client from explicit config. Each call
13
+ * gets its own TokenSource state — concurrent `createClient(...)` use
14
+ * does not stampede the cache.
15
+ */
16
+ function createClient(input = {}) {
17
+ warnIfBrowserSecret(input);
18
+ return buildClient(input);
19
+ }
20
+ function buildClient(input) {
21
+ const baseUrl = input.baseUrl ?? DEFAULT_BASE_URL;
22
+ const tokenSourceState = resolveTokenSource(input, baseUrl);
23
+ const auth = tokenSourceState
24
+ ? { type: 'token-source', state: tokenSourceState }
25
+ : undefined;
26
+ const businessClient = (0, client_2.createBusinessClient)({ baseUrl, fetchFn: input.fetchFn, auth });
27
+ const auditClient = (0, client_1.createAuditClient)({
28
+ baseUrl,
29
+ fetchFn: input.fetchFn,
30
+ auth,
31
+ actorVia: input.actorVia ?? input.serviceId,
32
+ });
33
+ const client = {
34
+ business: businessClient,
35
+ audit: auditClient,
36
+ auth: auth_1.auth,
37
+ withToken(token) {
38
+ return buildClient({
39
+ ...input,
40
+ accessToken: token,
41
+ // The new client should not also try to mint via
42
+ // client_credentials on top of the supplied user token.
43
+ serviceId: undefined,
44
+ serviceSecret: undefined,
45
+ scope: undefined,
46
+ });
47
+ },
48
+ };
49
+ return client;
50
+ }
51
+ const auth_1 = require("./auth");
52
+ function resolveTokenSource(input, baseUrl) {
53
+ const authBaseUrl = input.authBaseUrl ?? `${baseUrl}/auth/business`;
54
+ if (input.accessToken !== undefined) {
55
+ if (typeof input.accessToken === 'string') {
56
+ return (0, token_source_1.makeTokenSourceState)({ kind: 'static-string', token: input.accessToken }, { expiryBufferMs: input.expiryBufferMs, fetchFn: input.fetchFn });
57
+ }
58
+ return (0, token_source_1.makeTokenSourceState)({ kind: 'callback', getToken: input.accessToken }, { expiryBufferMs: input.expiryBufferMs, fetchFn: input.fetchFn });
59
+ }
60
+ if (input.serviceId && input.serviceSecret) {
61
+ return (0, token_source_1.makeTokenSourceState)({
62
+ kind: 'service-credentials',
63
+ clientId: input.serviceId,
64
+ clientSecret: input.serviceSecret,
65
+ authBaseUrl,
66
+ scope: input.scope,
67
+ }, { expiryBufferMs: input.expiryBufferMs, fetchFn: input.fetchFn });
68
+ }
69
+ return undefined;
70
+ }
71
+ function warnIfBrowserSecret(config) {
72
+ const g = globalThis;
73
+ const inBrowser = typeof g.window !== 'undefined' && typeof g.window.document !== 'undefined';
74
+ if (!inBrowser)
75
+ return;
76
+ if (config.serviceSecret) {
77
+ console.warn('[uengage-platform-sdk] serviceSecret should not be used in browser environments. ' +
78
+ 'Service credentials in browser bundles are publicly visible. ' +
79
+ 'Use `accessToken` with a token obtained via OAuth (or `withToken(...)` on a server-built client) instead.');
80
+ }
81
+ }
82
+ // ─── Default singleton ─────────────────────────────────────────────────────
83
+ //
84
+ // Resolved lazily on first property access (Proxy) so consumers that
85
+ // mutate `process.env` after import still pick up the right values.
86
+ let cachedSingleton;
87
+ function singleton() {
88
+ if (!cachedSingleton)
89
+ cachedSingleton = buildClient(envClientConfig());
90
+ return cachedSingleton;
91
+ }
92
+ function envClientConfig() {
93
+ if (typeof process === 'undefined')
94
+ return {};
95
+ const e = process.env ?? {};
96
+ return {
97
+ baseUrl: e.UENGAGE_BASE_URL,
98
+ authBaseUrl: e.UENGAGE_AUTH_BASE_URL,
99
+ accessToken: e.UENGAGE_AUTH_TOKEN,
100
+ serviceId: e.UENGAGE_SERVICE_ID,
101
+ serviceSecret: e.UENGAGE_SERVICE_SECRET,
102
+ scope: e.UENGAGE_SERVICE_SCOPE,
103
+ };
104
+ }
105
+ /**
106
+ * Default client. Reads config from environment variables on first
107
+ * property access (so test setups that mutate `process.env` after
108
+ * import work). Use `createClient(...)` when you need an isolated
109
+ * instance with explicit config.
110
+ *
111
+ * UENGAGE_BASE_URL defaults to https://api.platform.uengage.io
112
+ * UENGAGE_AUTH_BASE_URL auth surface override (default ${baseUrl}/auth/business)
113
+ * UENGAGE_AUTH_TOKEN static Bearer token (overrides client_credentials)
114
+ * UENGAGE_SERVICE_ID OAuth2 client_credentials clientId
115
+ * UENGAGE_SERVICE_SECRET OAuth2 client_credentials clientSecret
116
+ * UENGAGE_SERVICE_SCOPE optional space-separated scope list
117
+ */
118
+ exports.platform = new Proxy({}, {
119
+ get(_, prop) {
120
+ const s = singleton();
121
+ return s[prop];
122
+ },
123
+ });
124
+ /** Test-only: drop the singleton cache between cases. */
125
+ function _resetPlatformSingleton() {
126
+ cachedSingleton = undefined;
127
+ }
128
+ /**
129
+ * Convenience: shorthand for `platform.withToken(token)`.
130
+ * BFF handlers commonly call this once per request.
131
+ */
132
+ function withToken(token) {
133
+ return singleton().withToken(token);
134
+ }
135
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2NsaWVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUEyREEsb0NBR0M7QUE2SEQsMERBRUM7QUFNRCw4QkFFQztBQXJNRCwyQ0FBcUU7QUFDckUsOENBQThFO0FBRTlFLGlEQUE2RTtBQWlEN0UsTUFBTSxnQkFBZ0IsR0FBRyxpQ0FBaUMsQ0FBQztBQUUzRDs7OztHQUlHO0FBQ0gsU0FBZ0IsWUFBWSxDQUFDLFFBQXNCLEVBQUU7SUFDbkQsbUJBQW1CLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDM0IsT0FBTyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDNUIsQ0FBQztBQUVELFNBQVMsV0FBVyxDQUFDLEtBQW1CO0lBQ3RDLE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxPQUFPLElBQUksZ0JBQWdCLENBQUM7SUFDbEQsTUFBTSxnQkFBZ0IsR0FBRyxrQkFBa0IsQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDNUQsTUFBTSxJQUFJLEdBQTZCLGdCQUFnQjtRQUNyRCxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsY0FBYyxFQUFFLEtBQUssRUFBRSxnQkFBZ0IsRUFBRTtRQUNuRCxDQUFDLENBQUMsU0FBUyxDQUFDO0lBRWQsTUFBTSxjQUFjLEdBQUcsSUFBQSw2QkFBb0IsRUFBQyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsS0FBSyxDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQ3ZGLE1BQU0sV0FBVyxHQUFHLElBQUEsMEJBQWlCLEVBQUM7UUFDcEMsT0FBTztRQUNQLE9BQU8sRUFBRSxLQUFLLENBQUMsT0FBTztRQUN0QixJQUFJO1FBQ0osUUFBUSxFQUFFLEtBQUssQ0FBQyxRQUFRLElBQUksS0FBSyxDQUFDLFNBQVM7S0FDNUMsQ0FBQyxDQUFDO0lBRUgsTUFBTSxNQUFNLEdBQW1CO1FBQzdCLFFBQVEsRUFBRSxjQUFjO1FB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QUM5RSxPQUFPO1FBQ0wsT0FBTyxFQUFFLENBQUMsQ0FBQyxnQkFBZ0I7UUFDM0IsV0FBVyxFQUFFLENBQUMsQ0FBQyxxQkFBcUI7UUFDcEMsV0FBVyxFQUFFLENBQUMsQ0FBQyxrQkFBa0I7UUFDakMsU0FBUyxFQUFFLENBQUMsQ0FBQyxrQkFBa0I7UUFDL0IsYUFBYSxFQUFFLENBQUMsQ0FBQyxzQkFBc0I7UUFDdkMsS0FBSyxFQUFFLENBQUMsQ0FBQyxxQkFBcUI7S0FDL0IsQ0FBQztBQUNKLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7O0dBWUc7QUFDVSxRQUFBLFFBQVEsR0FBbUIsSUFBSSxLQUFLLENBQUMsRUFBb0IsRUFBRTtJQUN0RSxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUk7UUFDVCxNQUFNLENBQUMsR0FBRyxTQUFTLEVBQTZDLENBQUM7UUFDakUsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDakIsQ0FBQztDQUNGLENBQUMsQ0FBQztBQUVILHlEQUF5RDtBQUN6RCxTQUFnQix1QkFBdUI7SUFDckMsZUFBZSxHQUFHLFNBQVMsQ0FBQztBQUM5QixDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsU0FBZ0IsU0FBUyxDQUFDLEtBQWdEO0lBQ3hFLE9BQU8sU0FBUyxFQUFFLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQ3RDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjcmVhdGVBdWRpdENsaWVudCwgdHlwZSBBdWRpdENsaWVudCB9IGZyb20gJy4vYXVkaXQvY2xpZW50JztcbmltcG9ydCB7IGNyZWF0ZUJ1c2luZXNzQ2xpZW50LCB0eXBlIEJ1c2luZXNzQ2xpZW50IH0gZnJvbSAnLi9idXNpbmVzcy9jbGllbnQnO1xuaW1wb3J0IHsgYXV0aCB9IGZyb20gJy4vYXV0aCc7XG5pbXBvcnQgeyBtYWtlVG9rZW5Tb3VyY2VTdGF0ZSwgdHlwZSBUb2tlblNvdXJjZVN0YXRlIH0gZnJvbSAnLi90b2tlbi1zb3VyY2UnO1xuaW1wb3J0IHR5cGUgeyBQbGF0Zm9ybUF1dGggfSBmcm9tICcuL2NvbmZpZyc7XG5cbi8qKlxuICogQ2FsbGVyLWZhY2luZyBjb25maWcgZm9yIHRoZSB1bmlmaWVkIGBjcmVhdGVDbGllbnQoLi4uKWAgZmFjdG9yeSBhbmRcbiAqIHRoZSBgcGxhdGZvcm1gIHNpbmdsZXRvbi5cbiAqXG4gKiBQaWNrIGV4YWN0bHkgb25lIG9mOlxuICogICAtIGBhY2Nlc3NUb2tlbmAgKHN0cmluZyBvciBjYWxsYmFjaykgZm9yIHRoZSBzdGF0aWMgQmVhcmVyIGZsb3dcbiAqICAgLSBgc2VydmljZUlkYCArIGBzZXJ2aWNlU2VjcmV0YCBmb3IgT0F1dGgyIGNsaWVudF9jcmVkZW50aWFsc1xuICpcbiAqIFdpdGhvdXQgZWl0aGVyLCBjYWxscyB0aHJvdyBgQ29uZmlnRXJyb3JgIG9uIHRoZSBmaXJzdCByZXF1ZXN0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENsaWVudENvbmZpZyB7XG4gIGJhc2VVcmw/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBBdXRoIHN1cmZhY2UgYmFzZSB1c2VkIHRvIGJvb3RzdHJhcCB0aGUgZmlyc3QgY2xpZW50X2NyZWRlbnRpYWxzXG4gICAqIG1pbnQuIERlZmF1bHRzIHRvIGAke2Jhc2VVcmx9L2F1dGgvYnVzaW5lc3NgLiBPbmNlIGEgdG9rZW4gZXhpc3RzLFxuICAgKiBmdXR1cmUgYXV0aCBjYWxscyBmb2xsb3cgdGhlIHRva2VuJ3MgYGlzc2AgY2xhaW0uXG4gICAqL1xuICBhdXRoQmFzZVVybD86IHN0cmluZztcbiAgYWNjZXNzVG9rZW4/OiBzdHJpbmcgfCAoKCkgPT4gc3RyaW5nIHwgUHJvbWlzZTxzdHJpbmc+KTtcbiAgc2VydmljZUlkPzogc3RyaW5nO1xuICBzZXJ2aWNlU2VjcmV0Pzogc3RyaW5nO1xuICAvKiogU3BhY2Utc2VwYXJhdGVkIHNjb3BlIGxpc3QgdG8gcmVxdWVzdCB3aGVuIG1pbnRpbmcgdmlhIGNsaWVudF9jcmVkZW50aWFscy4gKi9cbiAgc2NvcGU/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBTZXJ2aWNlIGlkZW50aWZpZXIgdGhlIGF1ZGl0IGNsaWVudCBzaG91bGQgc3RhbXAgaW50byBgYWN0b3IudmlhYFxuICAgKiBvbiBlbWl0dGVkIGV2ZW50cy4gRGVmYXVsdHMgdG8gYHNlcnZpY2VJZGAgd2hlbiBzZXQ7IG90aGVyd2lzZVxuICAgKiBhdWRpdCBgcmVjb3JkKClgIGNhbGxzIGxvZyBhbiBlcnJvciBhbmQgZHJvcCB0aGUgZXZlbnQuXG4gICAqL1xuICBhY3RvclZpYT86IHN0cmluZztcbiAgZXhwaXJ5QnVmZmVyTXM/OiBudW1iZXI7XG4gIGZldGNoRm4/OiB0eXBlb2YgZmV0Y2g7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGxhdGZvcm1DbGllbnQge1xuICBidXNpbmVzczogQnVzaW5lc3NDbGllbnQ7XG4gIGF1ZGl0OiBBdWRpdENsaWVudDtcbiAgYXV0aDogdHlwZW9mIGF1dGg7XG4gIC8qKlxuICAgKiBSZXR1cm4gYSBkZXJpdmVkIGNsaWVudCBib3VuZCB0byB0aGUgc3VwcGxpZWQgYWNjZXNzIHRva2VuLlxuICAgKiBJbmhlcml0cyBgYmFzZVVybGAgYW5kIGBmZXRjaEZuYDsgcmVwbGFjZXMgdGhlIHRva2VuIHNvdXJjZSB3aXRoXG4gICAqIHRoZSBuZXcgb25lLiBVc2UgY2FzZTogQkZGIGhhbmRsZXJzIHRoYXQgd2FudCB0byBjYWxsIHRoZVxuICAgKiBwbGF0Zm9ybSBBUEkgYXMgdGhlIGVuZCB1c2VyIGluc3RlYWQgb2YgYXMgdGhlIHNlcnZpY2UuXG4gICAqL1xuICB3aXRoVG9rZW4odG9rZW46IHN0cmluZyB8ICgoKSA9PiBzdHJpbmcgfCBQcm9taXNlPHN0cmluZz4pKTogUGxhdGZvcm1DbGllbnQ7XG59XG5cbmNvbnN0IERFRkFVTFRfQkFTRV9VUkwgPSAnaHR0cHM6Ly9hcGkucGxhdGZvcm0udWVuZ2FnZS5pbyc7XG5cbi8qKlxuICogQnVpbGQgYSBmcmVzaCwgaXNvbGF0ZWQgY2xpZW50IGZyb20gZXhwbGljaXQgY29uZmlnLiBFYWNoIGNhbGxcbiAqIGdldHMgaXRzIG93biBUb2tlblNvdXJjZSBzdGF0ZSDigJQgY29uY3VycmVudCBgY3JlYXRlQ2xpZW50KC4uLilgIHVzZVxuICogZG9lcyBub3Qgc3RhbXBlZGUgdGhlIGNhY2hlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlQ2xpZW50KGlucHV0OiBDbGllbnRDb25maWcgPSB7fSk6IFBsYXRmb3JtQ2xpZW50IHtcbiAgd2FybklmQnJvd3NlclNlY3JldChpbnB1dCk7XG4gIHJldHVybiBidWlsZENsaWVudChpbnB1dCk7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkQ2xpZW50KGlucHV0OiBDbGllbnRDb25maWcpOiBQbGF0Zm9ybUNsaWVudCB7XG4gIGNvbnN0IGJhc2VVcmwgPSBpbnB1dC5iYXNlVXJsID8/IERFRkFVTFRfQkFTRV9VUkw7XG4gIGNvbnN0IHRva2VuU291cmNlU3RhdGUgPSByZXNvbHZlVG9rZW5Tb3VyY2UoaW5wdXQsIGJhc2VVcmwpO1xuICBjb25zdCBhdXRoOiBQbGF0Zm9ybUF1dGggfCB1bmRlZmluZWQgPSB0b2tlblNvdXJjZVN0YXRlXG4gICAgPyB7IHR5cGU6ICd0b2tlbi1zb3VyY2UnLCBzdGF0ZTogdG9rZW5Tb3VyY2VTdGF0ZSB9XG4gICAgOiB1bmRlZmluZWQ7XG5cbiAgY29uc3QgYnVzaW5lc3NDbGllbnQgPSBjcmVhdGVCdXNpbmVzc0NsaWVudCh7IGJhc2VVcmwsIGZldGNoRm46IGlucHV0LmZldGNoRm4sIGF1dGggfSk7XG4gIGNvbnN0IGF1ZGl0Q2xpZW50ID0gY3JlYXRlQXVkaXRDbGllbnQoe1xuICAgIGJhc2VVcmwsXG4gICAgZmV0Y2hGbjogaW5wdXQuZmV0Y2hGbixcbiAgICBhdXRoLFxuICAgIGFjdG9yVmlhOiBpbnB1dC5hY3RvclZpYSA/PyBpbnB1dC5zZXJ2aWNlSWQsXG4gIH0pO1xuXG4gIGNvbnN0IGNsaWVudDogUGxhdGZvcm1DbGllbnQgPSB7XG4gICAgYnVzaW5lc3M6IGJ1c2luZXNzQ2xpZW50LFxuICAgIGF1ZGl0OiBhdWRpdENsaWVudCxcbiAgICBhdXRoOiBhdXRoTmFtZXNwYWNlLFxuICAgIHdpdGhUb2tlbih0b2tlbikge1xuICAgICAgcmV0dXJuIGJ1aWxkQ2xpZW50KHtcbiAgICAgICAgLi4uaW5wdXQsXG4gICAgICAgIGFjY2Vzc1Rva2VuOiB0b2tlbixcbiAgICAgICAgLy8gVGhlIG5ldyBjbGllbnQgc2hvdWxkIG5vdCBhbHNvIHRyeSB0byBtaW50IHZpYVxuICAgICAgICAvLyBjbGllbnRfY3JlZGVudGlhbHMgb24gdG9wIG9mIHRoZSBzdXBwbGllZCB1c2VyIHRva2VuLlxuICAgICAgICBzZXJ2aWNlSWQ6IHVuZGVmaW5lZCxcbiAgICAgICAgc2VydmljZVNlY3JldDogdW5kZWZpbmVkLFxuICAgICAgICBzY29wZTogdW5kZWZpbmVkLFxuICAgICAgfSk7XG4gICAgfSxcbiAgfTtcbiAgcmV0dXJuIGNsaWVudDtcbn1cblxuaW1wb3J0IHsgYXV0aCBhcyBhdXRoTmFtZXNwYWNlIH0gZnJvbSAnLi9hdXRoJztcblxuZnVuY3Rpb24gcmVzb2x2ZVRva2VuU291cmNlKGlucHV0OiBDbGllbnRDb25maWcsIGJhc2VVcmw6IHN0cmluZyk6IFRva2VuU291cmNlU3RhdGUgfCB1bmRlZmluZWQge1xuICBjb25zdCBhdXRoQmFzZVVybCA9IGlucHV0LmF1dGhCYXNlVXJsID8/IGAke2Jhc2VVcmx9L2F1dGgvYnVzaW5lc3NgO1xuICBpZiAoaW5wdXQuYWNjZXNzVG9rZW4gIT09IHVuZGVmaW5lZCkge1xuICAgIGlmICh0eXBlb2YgaW5wdXQuYWNjZXNzVG9rZW4gPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gbWFrZVRva2VuU291cmNlU3RhdGUoXG4gICAgICAgIHsga2luZDogJ3N0YXRpYy1zdHJpbmcnLCB0b2tlbjogaW5wdXQuYWNjZXNzVG9rZW4gfSxcbiAgICAgICAgeyBleHBpcnlCdWZmZXJNczogaW5wdXQuZXhwaXJ5QnVmZmVyTXMsIGZldGNoRm46IGlucHV0LmZldGNoRm4gfSxcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBtYWtlVG9rZW5Tb3VyY2VTdGF0ZShcbiAgICAgIHsga2luZDogJ2NhbGxiYWNrJywgZ2V0VG9rZW46IGlucHV0LmFjY2Vzc1Rva2VuIH0sXG4gICAgICB7IGV4cGlyeUJ1ZmZlck1zOiBpbnB1dC5leHBpcnlCdWZmZXJNcywgZmV0Y2hGbjogaW5wdXQuZmV0Y2hGbiB9LFxuICAgICk7XG4gIH1cbiAgaWYgKGlucHV0LnNlcnZpY2VJZCAmJiBpbnB1dC5zZXJ2aWNlU2VjcmV0KSB7XG4gICAgcmV0dXJuIG1ha2VUb2tlblNvdXJjZVN0YXRlKFxuICAgICAge1xuICAgICAgICBraW5kOiAnc2VydmljZS1jcmVkZW50aWFscycsXG4gICAgICAgIGNsaWVudElkOiBpbnB1dC5zZXJ2aWNlSWQsXG4gICAgICAgIGNsaWVudFNlY3JldDogaW5wdXQuc2VydmljZVNlY3JldCxcbiAgICAgICAgYXV0aEJhc2VVcmwsXG4gICAgICAgIHNjb3BlOiBpbnB1dC5zY29wZSxcbiAgICAgIH0sXG4gICAgICB7IGV4cGlyeUJ1ZmZlck1zOiBpbnB1dC5leHBpcnlCdWZmZXJNcywgZmV0Y2hGbjogaW5wdXQuZmV0Y2hGbiB9LFxuICAgICk7XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gd2FybklmQnJvd3NlclNlY3JldChjb25maWc6IENsaWVudENvbmZpZyk6IHZvaWQge1xuICBjb25zdCBnID0gZ2xvYmFsVGhpcyBhcyB7IHdpbmRvdz86IHsgZG9jdW1lbnQ/OiB1bmtub3duIH0gfTtcbiAgY29uc3QgaW5Ccm93c2VyID0gdHlwZW9mIGcud2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgZy53aW5kb3cuZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnO1xuICBpZiAoIWluQnJvd3NlcikgcmV0dXJuO1xuICBpZiAoY29uZmlnLnNlcnZpY2VTZWNyZXQpIHtcbiAgICBjb25zb2xlLndhcm4oXG4gICAgICAnW3VlbmdhZ2UtcGxhdGZvcm0tc2RrXSBzZXJ2aWNlU2VjcmV0IHNob3VsZCBub3QgYmUgdXNlZCBpbiBicm93c2VyIGVudmlyb25tZW50cy4gJyArXG4gICAgICAgICdTZXJ2aWNlIGNyZWRlbnRpYWxzIGluIGJyb3dzZXIgYnVuZGxlcyBhcmUgcHVibGljbHkgdmlzaWJsZS4gJyArXG4gICAgICAgICdVc2UgYGFjY2Vzc1Rva2VuYCB3aXRoIGEgdG9rZW4gb2J0YWluZWQgdmlhIE9BdXRoIChvciBgd2l0aFRva2VuKC4uLilgIG9uIGEgc2VydmVyLWJ1aWx0IGNsaWVudCkgaW5zdGVhZC4nLFxuICAgICk7XG4gIH1cbn1cblxuLy8g4pSA4pSA4pSAIERlZmF1bHQgc2luZ2xldG9uIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuLy9cbi8vIFJlc29sdmVkIGxhemlseSBvbiBmaXJzdCBwcm9wZXJ0eSBhY2Nlc3MgKFByb3h5KSBzbyBjb25zdW1lcnMgdGhhdFxuLy8gbXV0YXRlIGBwcm9jZXNzLmVudmAgYWZ0ZXIgaW1wb3J0IHN0aWxsIHBpY2sgdXAgdGhlIHJpZ2h0IHZhbHVlcy5cblxubGV0IGNhY2hlZFNpbmdsZXRvbjogUGxhdGZvcm1DbGllbnQgfCB1bmRlZmluZWQ7XG5mdW5jdGlvbiBzaW5nbGV0b24oKTogUGxhdGZvcm1DbGllbnQge1xuICBpZiAoIWNhY2hlZFNpbmdsZXRvbikgY2FjaGVkU2luZ2xldG9uID0gYnVpbGRDbGllbnQoZW52Q2xpZW50Q29uZmlnKCkpO1xuICByZXR1cm4gY2FjaGVkU2luZ2xldG9uO1xufVxuXG5mdW5jdGlvbiBlbnZDbGllbnRDb25maWcoKTogQ2xpZW50Q29uZmlnIHtcbiAgaWYgKHR5cGVvZiBwcm9jZXNzID09PSAndW5kZWZpbmVkJykgcmV0dXJuIHt9O1xuICBjb25zdCBlID0gKHByb2Nlc3MgYXMgeyBlbnY/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+IH0pLmVudiA/PyB7fTtcbiAgcmV0dXJuIHtcbiAgICBiYXNlVXJsOiBlLlVFTkdBR0VfQkFTRV9VUkwsXG4gICAgYXV0aEJhc2VVcmw6IGUuVUVOR0FHRV9BVVRIX0JBU0VfVVJMLFxuICAgIGFjY2Vzc1Rva2VuOiBlLlVFTkdBR0VfQVVUSF9UT0tFTixcbiAgICBzZXJ2aWNlSWQ6IGUuVUVOR0FHRV9TRVJWSUNFX0lELFxuICAgIHNlcnZpY2VTZWNyZXQ6IGUuVUVOR0FHRV9TRVJWSUNFX1NFQ1JFVCxcbiAgICBzY29wZTogZS5VRU5HQUdFX1NFUlZJQ0VfU0NPUEUsXG4gIH07XG59XG5cbi8qKlxuICogRGVmYXVsdCBjbGllbnQuIFJlYWRzIGNvbmZpZyBmcm9tIGVudmlyb25tZW50IHZhcmlhYmxlcyBvbiBmaXJzdFxuICogcHJvcGVydHkgYWNjZXNzIChzbyB0ZXN0IHNldHVwcyB0aGF0IG11dGF0ZSBgcHJvY2Vzcy5lbnZgIGFmdGVyXG4gKiBpbXBvcnQgd29yaykuIFVzZSBgY3JlYXRlQ2xpZW50KC4uLilgIHdoZW4geW91IG5lZWQgYW4gaXNvbGF0ZWRcbiAqIGluc3RhbmNlIHdpdGggZXhwbGljaXQgY29uZmlnLlxuICpcbiAqICAgVUVOR0FHRV9CQVNFX1VSTCAgICAgICAgIGRlZmF1bHRzIHRvIGh0dHBzOi8vYXBpLnBsYXRmb3JtLnVlbmdhZ2UuaW9cbiAqICAgVUVOR0FHRV9BVVRIX0JBU0VfVVJMICAgIGF1dGggc3VyZmFjZSBvdmVycmlkZSAoZGVmYXVsdCAke2Jhc2VVcmx9L2F1dGgvYnVzaW5lc3MpXG4gKiAgIFVFTkdBR0VfQVVUSF9UT0tFTiAgICAgICBzdGF0aWMgQmVhcmVyIHRva2VuIChvdmVycmlkZXMgY2xpZW50X2NyZWRlbnRpYWxzKVxuICogICBVRU5HQUdFX1NFUlZJQ0VfSUQgICAgICAgT0F1dGgyIGNsaWVudF9jcmVkZW50aWFscyBjbGllbnRJZFxuICogICBVRU5HQUdFX1NFUlZJQ0VfU0VDUkVUICAgT0F1dGgyIGNsaWVudF9jcmVkZW50aWFscyBjbGllbnRTZWNyZXRcbiAqICAgVUVOR0FHRV9TRVJWSUNFX1NDT1BFICAgIG9wdGlvbmFsIHNwYWNlLXNlcGFyYXRlZCBzY29wZSBsaXN0XG4gKi9cbmV4cG9ydCBjb25zdCBwbGF0Zm9ybTogUGxhdGZvcm1DbGllbnQgPSBuZXcgUHJveHkoe30gYXMgUGxhdGZvcm1DbGllbnQsIHtcbiAgZ2V0KF8sIHByb3ApIHtcbiAgICBjb25zdCBzID0gc2luZ2xldG9uKCkgYXMgdW5rbm93biBhcyBSZWNvcmQ8UHJvcGVydHlLZXksIHVua25vd24+O1xuICAgIHJldHVybiBzW3Byb3BdO1xuICB9LFxufSk7XG5cbi8qKiBUZXN0LW9ubHk6IGRyb3AgdGhlIHNpbmdsZXRvbiBjYWNoZSBiZXR3ZWVuIGNhc2VzLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIF9yZXNldFBsYXRmb3JtU2luZ2xldG9uKCk6IHZvaWQge1xuICBjYWNoZWRTaW5nbGV0b24gPSB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogQ29udmVuaWVuY2U6IHNob3J0aGFuZCBmb3IgYHBsYXRmb3JtLndpdGhUb2tlbih0b2tlbilgLlxuICogQkZGIGhhbmRsZXJzIGNvbW1vbmx5IGNhbGwgdGhpcyBvbmNlIHBlciByZXF1ZXN0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gd2l0aFRva2VuKHRva2VuOiBzdHJpbmcgfCAoKCkgPT4gc3RyaW5nIHwgUHJvbWlzZTxzdHJpbmc+KSk6IFBsYXRmb3JtQ2xpZW50IHtcbiAgcmV0dXJuIHNpbmdsZXRvbigpLndpdGhUb2tlbih0b2tlbik7XG59XG4iXX0=
package/dist/config.d.ts CHANGED
@@ -1,15 +1,15 @@
1
1
  import type { Logger } from '@uengage.io/js-logger';
2
+ import type { TokenSourceState } from './token-source';
2
3
  export declare const DEFAULT_BASE_URL = "https://api.platform.uengage.io";
3
4
  /**
4
5
  * Resolved auth state. Discriminated by `type` so consumers can narrow.
5
6
  */
6
7
  export type PlatformAuth = {
7
- type: 'hmac';
8
- secret: string;
9
- serviceId: string;
10
- } | {
11
8
  type: 'bearer';
12
9
  token: string;
10
+ } | {
11
+ type: 'token-source';
12
+ state: TokenSourceState;
13
13
  };
14
14
  export interface PlatformConfig {
15
15
  baseUrl: string;
@@ -17,11 +17,6 @@ export interface PlatformConfig {
17
17
  fetchFn: typeof fetch;
18
18
  logger?: Logger;
19
19
  }
20
- /**
21
- * Caller-facing input shape. `auth` accepts either a discriminated
22
- * PlatformAuth or the looser PlatformAuthInput - the looser form is
23
- * also what `.auth()` accepts.
24
- */
25
20
  export interface PlatformConfigInput {
26
21
  baseUrl?: string;
27
22
  auth?: PlatformAuthInput | PlatformAuth;
@@ -29,13 +24,12 @@ export interface PlatformConfigInput {
29
24
  logger?: Logger;
30
25
  }
31
26
  /**
32
- * `.auth()` shape. Pass either `{token}` (Bearer) or `{secret, serviceId}`
33
- * (HMAC). Mixing both throws.
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()`.
34
30
  */
35
31
  export interface PlatformAuthInput {
36
32
  token?: string;
37
- secret?: string;
38
- serviceId?: string;
39
33
  }
40
34
  /**
41
35
  * Resolve env-defaulted config. Re-read on every call so that callers can
@@ -44,8 +38,13 @@ export interface PlatformAuthInput {
44
38
  */
45
39
  export declare function envDefaults(): PlatformConfig;
46
40
  /**
47
- * Coerce `.auth()` input or `config({auth})` input into a typed PlatformAuth.
48
- * Throws if the input has no usable credentials or mixes HMAC + Bearer.
41
+ * Coerce `.auth()` input or `config({auth})` input into a typed
42
+ * PlatformAuth. Throws when the input has no usable credentials.
43
+ *
44
+ * Today this only accepts `{token}` or a pre-shaped `PlatformAuth`.
45
+ * For OAuth2 client_credentials use `createClient({serviceId, serviceSecret})`
46
+ * instead — that builds a TokenSource which mints + caches Bearer
47
+ * tokens.
49
48
  */
50
49
  export declare function normalizeAuth(input: PlatformAuthInput | PlatformAuth): PlatformAuth;
51
50
  /**
package/dist/config.js CHANGED
@@ -11,38 +11,33 @@ exports.DEFAULT_BASE_URL = 'https://api.platform.uengage.io';
11
11
  */
12
12
  function envDefaults() {
13
13
  return {
14
- baseUrl: process.env.PLATFORM_BASE_URL ?? exports.DEFAULT_BASE_URL,
14
+ baseUrl: process.env.UENGAGE_BASE_URL ?? exports.DEFAULT_BASE_URL,
15
15
  auth: envAuth(),
16
16
  fetchFn: globalThis.fetch,
17
17
  };
18
18
  }
19
19
  function envAuth() {
20
- const secret = process.env.PLATFORM_SIGNING_SECRET;
21
- const serviceId = process.env.PLATFORM_SERVICE_ID;
22
- const token = process.env.PLATFORM_AUTH_TOKEN;
20
+ const token = process.env.UENGAGE_AUTH_TOKEN;
23
21
  if (token)
24
22
  return { type: 'bearer', token };
25
- if (secret && serviceId)
26
- return { type: 'hmac', secret, serviceId };
27
23
  return undefined;
28
24
  }
29
25
  /**
30
- * Coerce `.auth()` input or `config({auth})` input into a typed PlatformAuth.
31
- * Throws if the input has no usable credentials or mixes HMAC + Bearer.
26
+ * Coerce `.auth()` input or `config({auth})` input into a typed
27
+ * PlatformAuth. Throws when the input has no usable credentials.
28
+ *
29
+ * Today this only accepts `{token}` or a pre-shaped `PlatformAuth`.
30
+ * For OAuth2 client_credentials use `createClient({serviceId, serviceSecret})`
31
+ * instead — that builds a TokenSource which mints + caches Bearer
32
+ * tokens.
32
33
  */
33
34
  function normalizeAuth(input) {
34
35
  if ('type' in input)
35
36
  return input;
36
37
  if (input.token) {
37
- if (input.secret || input.serviceId) {
38
- throw new Error('auth(): pass either {token} or {secret, serviceId}, not both');
39
- }
40
38
  return { type: 'bearer', token: input.token };
41
39
  }
42
- if (input.secret && input.serviceId) {
43
- return { type: 'hmac', secret: input.secret, serviceId: input.serviceId };
44
- }
45
- throw new Error('auth(): must provide either {token} or {secret, serviceId}');
40
+ throw new Error('auth(): pass {token} for a static Bearer access token, or use createClient({serviceId, serviceSecret}) for OAuth2 client_credentials');
46
41
  }
47
42
  /**
48
43
  * Mutable config shared by clients. `apply()` and `setAuth()` are how the
@@ -81,4 +76,4 @@ class ConfigState {
81
76
  }
82
77
  }
83
78
  exports.ConfigState = ConfigState;
84
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2NvbmZpZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUE2Q0Esa0NBTUM7QUFlRCxzQ0FZQztBQTVFWSxRQUFBLGdCQUFnQixHQUFHLGlDQUFpQyxDQUFDO0FBc0NsRTs7OztHQUlHO0FBQ0gsU0FBZ0IsV0FBVztJQUN6QixPQUFPO1FBQ0wsT0FBTyxFQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsaUJBQWlCLElBQUksd0JBQWdCO1FBQzFELElBQUksRUFBRSxPQUFPLEVBQUU7UUFDZixPQUFPLEVBQUUsVUFBVSxDQUFDLEtBQXFCO0tBQzFDLENBQUM7QUFDSixDQUFDO0FBRUQsU0FBUyxPQUFPO0lBQ2QsTUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyx1QkFBdUIsQ0FBQztJQUNuRCxNQUFNLFNBQVMsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLG1CQUFtQixDQUFDO0lBQ2xELE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsbUJBQW1CLENBQUM7SUFDOUMsSUFBSSxLQUFLO1FBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLENBQUM7SUFDNUMsSUFBSSxNQUFNLElBQUksU0FBUztRQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsQ0FBQztJQUNwRSxPQUFPLFNBQVMsQ0FBQztBQUNuQixDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsU0FBZ0IsYUFBYSxDQUFDLEtBQXVDO0lBQ25FLElBQUksTUFBTSxJQUFJLEtBQUs7UUFBRSxPQUFPLEtBQUssQ0FBQztJQUNsQyxJQUFJLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNoQixJQUFJLEtBQUssQ0FBQyxNQUFNLElBQUksS0FBSyxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ3BDLE1BQU0sSUFBSSxLQUFLLENBQUMsOERBQThELENBQUMsQ0FBQztRQUNsRixDQUFDO1FBQ0QsT0FBTyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUNoRCxDQUFDO0lBQ0QsSUFBSSxLQUFLLENBQUMsTUFBTSxJQUFJLEtBQUssQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUNwQyxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsS0FBSyxDQUFDLE1BQU0sRUFBRSxTQUFTLEVBQUUsS0FBSyxDQUFDLFNBQVMsRUFBRSxDQUFDO0lBQzVFLENBQUM7SUFDRCxNQUFNLElBQUksS0FBSyxDQUFDLDREQUE0RCxDQUFDLENBQUM7QUFDaEYsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsTUFBYSxXQUFXO0lBQ2QsU0FBUyxHQUF3QixFQUFFLENBQUM7SUFDcEMsWUFBWSxDQUEyQjtJQUN2QyxlQUFlLEdBQUcsS0FBSyxDQUFDO0lBRWhDLEtBQUssQ0FBQyxLQUEwQjtRQUM5QixJQUFJLEtBQUssQ0FBQyxPQUFPLEtBQUssU0FBUztZQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUM7UUFDeEUsSUFBSSxLQUFLLENBQUMsT0FBTyxLQUFLLFNBQVM7WUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDO1FBQ3hFLElBQUksS0FBSyxDQUFDLE1BQU0sS0FBSyxTQUFTO1lBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQztRQUNyRSxJQUFJLEtBQUssQ0FBQyxJQUFJLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDN0IsSUFBSSxDQUFDLFlBQVksR0FBRyxhQUFhLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzlDLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDO1FBQzlCLENBQUM7SUFDSCxDQUFDO0lBRUQsT0FBTyxDQUFDLEtBQXVDO1FBQzdDLElBQUksQ0FBQyxZQUFZLEdBQUcsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3pDLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDO0lBQzlCLENBQUM7SUFFRCxPQUFPO1FBQ0wsTUFBTSxHQUFHLEdBQUcsV0FBVyxFQUFFLENBQUM7UUFDMUIsT0FBTztZQUNMLE9BQU8sRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sSUFBSSxHQUFHLENBQUMsT0FBTztZQUM5QyxJQUFJLEVBQUUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUk7WUFDekQsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLElBQUksR0FBRyxDQUFDLE9BQU8sQ0FBaUI7WUFDaEUsTUFBTSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBNEI7U0FDcEQsQ0FBQztJQUNKLENBQUM7Q0FDRjtBQTdCRCxrQ0E2QkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IExvZ2dlciB9IGZyb20gJ0B1ZW5nYWdlLmlvL2pzLWxvZ2dlcic7XG5cbmV4cG9ydCBjb25zdCBERUZBVUxUX0JBU0VfVVJMID0gJ2h0dHBzOi8vYXBpLnBsYXRmb3JtLnVlbmdhZ2UuaW8nO1xuXG4vKipcbiAqIFJlc29sdmVkIGF1dGggc3RhdGUuIERpc2NyaW1pbmF0ZWQgYnkgYHR5cGVgIHNvIGNvbnN1bWVycyBjYW4gbmFycm93LlxuICovXG5leHBvcnQgdHlwZSBQbGF0Zm9ybUF1dGggPVxuICB8IHsgdHlwZTogJ2htYWMnOyBzZWNyZXQ6IHN0cmluZzsgc2VydmljZUlkOiBzdHJpbmcgfVxuICB8IHsgdHlwZTogJ2JlYXJlcic7IHRva2VuOiBzdHJpbmcgfTtcblxuZXhwb3J0IGludGVyZmFjZSBQbGF0Zm9ybUNvbmZpZyB7XG4gIGJhc2VVcmw6IHN0cmluZztcbiAgYXV0aD86IFBsYXRmb3JtQXV0aDtcbiAgZmV0Y2hGbjogdHlwZW9mIGZldGNoO1xuICBsb2dnZXI/OiBMb2dnZXI7XG59XG5cbi8qKlxuICogQ2FsbGVyLWZhY2luZyBpbnB1dCBzaGFwZS4gYGF1dGhgIGFjY2VwdHMgZWl0aGVyIGEgZGlzY3JpbWluYXRlZFxuICogUGxhdGZvcm1BdXRoIG9yIHRoZSBsb29zZXIgUGxhdGZvcm1BdXRoSW5wdXQgLSB0aGUgbG9vc2VyIGZvcm0gaXNcbiAqIGFsc28gd2hhdCBgLmF1dGgoKWAgYWNjZXB0cy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQbGF0Zm9ybUNvbmZpZ0lucHV0IHtcbiAgYmFzZVVybD86IHN0cmluZztcbiAgYXV0aD86IFBsYXRmb3JtQXV0aElucHV0IHwgUGxhdGZvcm1BdXRoO1xuICBmZXRjaEZuPzogdHlwZW9mIGZldGNoO1xuICBsb2dnZXI/OiBMb2dnZXI7XG59XG5cbi8qKlxuICogYC5hdXRoKClgIHNoYXBlLiBQYXNzIGVpdGhlciBge3Rva2VufWAgKEJlYXJlcikgb3IgYHtzZWNyZXQsIHNlcnZpY2VJZH1gXG4gKiAoSE1BQykuIE1peGluZyBib3RoIHRocm93cy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQbGF0Zm9ybUF1dGhJbnB1dCB7XG4gIHRva2VuPzogc3RyaW5nO1xuICBzZWNyZXQ/OiBzdHJpbmc7XG4gIHNlcnZpY2VJZD86IHN0cmluZztcbn1cblxuLyoqXG4gKiBSZXNvbHZlIGVudi1kZWZhdWx0ZWQgY29uZmlnLiBSZS1yZWFkIG9uIGV2ZXJ5IGNhbGwgc28gdGhhdCBjYWxsZXJzIGNhblxuICogc2V0IGVudiB2YXJzIGFmdGVyIHRoZSBTREsgaGFzIGJlZW4gaW1wb3J0ZWQgYW5kIHN0aWxsIHBpY2sgdGhlbSB1cCBvblxuICogdGhlIG5leHQgcmVxdWVzdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVudkRlZmF1bHRzKCk6IFBsYXRmb3JtQ29uZmlnIHtcbiAgcmV0dXJuIHtcbiAgICBiYXNlVXJsOiBwcm9jZXNzLmVudi5QTEFURk9STV9CQVNFX1VSTCA/PyBERUZBVUxUX0JBU0VfVVJMLFxuICAgIGF1dGg6IGVudkF1dGgoKSxcbiAgICBmZXRjaEZuOiBnbG9iYWxUaGlzLmZldGNoIGFzIHR5cGVvZiBmZXRjaCxcbiAgfTtcbn1cblxuZnVuY3Rpb24gZW52QXV0aCgpOiBQbGF0Zm9ybUF1dGggfCB1bmRlZmluZWQge1xuICBjb25zdCBzZWNyZXQgPSBwcm9jZXNzLmVudi5QTEFURk9STV9TSUdOSU5HX1NFQ1JFVDtcbiAgY29uc3Qgc2VydmljZUlkID0gcHJvY2Vzcy5lbnYuUExBVEZPUk1fU0VSVklDRV9JRDtcbiAgY29uc3QgdG9rZW4gPSBwcm9jZXNzLmVudi5QTEFURk9STV9BVVRIX1RPS0VOO1xuICBpZiAodG9rZW4pIHJldHVybiB7IHR5cGU6ICdiZWFyZXInLCB0b2tlbiB9O1xuICBpZiAoc2VjcmV0ICYmIHNlcnZpY2VJZCkgcmV0dXJuIHsgdHlwZTogJ2htYWMnLCBzZWNyZXQsIHNlcnZpY2VJZCB9O1xuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIENvZXJjZSBgLmF1dGgoKWAgaW5wdXQgb3IgYGNvbmZpZyh7YXV0aH0pYCBpbnB1dCBpbnRvIGEgdHlwZWQgUGxhdGZvcm1BdXRoLlxuICogVGhyb3dzIGlmIHRoZSBpbnB1dCBoYXMgbm8gdXNhYmxlIGNyZWRlbnRpYWxzIG9yIG1peGVzIEhNQUMgKyBCZWFyZXIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVBdXRoKGlucHV0OiBQbGF0Zm9ybUF1dGhJbnB1dCB8IFBsYXRmb3JtQXV0aCk6IFBsYXRmb3JtQXV0aCB7XG4gIGlmICgndHlwZScgaW4gaW5wdXQpIHJldHVybiBpbnB1dDtcbiAgaWYgKGlucHV0LnRva2VuKSB7XG4gICAgaWYgKGlucHV0LnNlY3JldCB8fCBpbnB1dC5zZXJ2aWNlSWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignYXV0aCgpOiBwYXNzIGVpdGhlciB7dG9rZW59IG9yIHtzZWNyZXQsIHNlcnZpY2VJZH0sIG5vdCBib3RoJyk7XG4gICAgfVxuICAgIHJldHVybiB7IHR5cGU6ICdiZWFyZXInLCB0b2tlbjogaW5wdXQudG9rZW4gfTtcbiAgfVxuICBpZiAoaW5wdXQuc2VjcmV0ICYmIGlucHV0LnNlcnZpY2VJZCkge1xuICAgIHJldHVybiB7IHR5cGU6ICdobWFjJywgc2VjcmV0OiBpbnB1dC5zZWNyZXQsIHNlcnZpY2VJZDogaW5wdXQuc2VydmljZUlkIH07XG4gIH1cbiAgdGhyb3cgbmV3IEVycm9yKCdhdXRoKCk6IG11c3QgcHJvdmlkZSBlaXRoZXIge3Rva2VufSBvciB7c2VjcmV0LCBzZXJ2aWNlSWR9Jyk7XG59XG5cbi8qKlxuICogTXV0YWJsZSBjb25maWcgc2hhcmVkIGJ5IGNsaWVudHMuIGBhcHBseSgpYCBhbmQgYHNldEF1dGgoKWAgYXJlIGhvdyB0aGVcbiAqIGNoYWluYWJsZSBgLmNvbmZpZygpYCAvIGAuYXV0aCgpYCBtZXRob2RzIHdyaXRlIGJhY2suIGByZXNvbHZlKClgIHByb2R1Y2VzXG4gKiB0aGUgZWZmZWN0aXZlIGNvbmZpZyBmb3Igb25lIHJlcXVlc3QsIGZhbGxpbmcgYmFjayB0byBjdXJyZW50IGVudiBzdGF0ZVxuICogZm9yIGZpZWxkcyB0aGUgY2FsbGVyIGhhc24ndCBwaW5uZWQuXG4gKi9cbmV4cG9ydCBjbGFzcyBDb25maWdTdGF0ZSB7XG4gIHByaXZhdGUgb3ZlcnJpZGVzOiBQbGF0Zm9ybUNvbmZpZ0lucHV0ID0ge307XG4gIHByaXZhdGUgZXhwbGljaXRBdXRoOiBQbGF0Zm9ybUF1dGggfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgaGFzRXhwbGljaXRBdXRoID0gZmFsc2U7XG5cbiAgYXBwbHkoaW5wdXQ6IFBsYXRmb3JtQ29uZmlnSW5wdXQpOiB2b2lkIHtcbiAgICBpZiAoaW5wdXQuYmFzZVVybCAhPT0gdW5kZWZpbmVkKSB0aGlzLm92ZXJyaWRlcy5iYXNlVXJsID0gaW5wdXQuYmFzZVVybDtcbiAgICBpZiAoaW5wdXQuZmV0Y2hGbiAhPT0gdW5kZWZpbmVkKSB0aGlzLm92ZXJyaWRlcy5mZXRjaEZuID0gaW5wdXQuZmV0Y2hGbjtcbiAgICBpZiAoaW5wdXQubG9nZ2VyICE9PSB1bmRlZmluZWQpIHRoaXMub3ZlcnJpZGVzLmxvZ2dlciA9IGlucHV0LmxvZ2dlcjtcbiAgICBpZiAoaW5wdXQuYXV0aCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmV4cGxpY2l0QXV0aCA9IG5vcm1hbGl6ZUF1dGgoaW5wdXQuYXV0aCk7XG4gICAgICB0aGlzLmhhc0V4cGxpY2l0QXV0aCA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgc2V0QXV0aChpbnB1dDogUGxhdGZvcm1BdXRoSW5wdXQgfCBQbGF0Zm9ybUF1dGgpOiB2b2lkIHtcbiAgICB0aGlzLmV4cGxpY2l0QXV0aCA9IG5vcm1hbGl6ZUF1dGgoaW5wdXQpO1xuICAgIHRoaXMuaGFzRXhwbGljaXRBdXRoID0gdHJ1ZTtcbiAgfVxuXG4gIHJlc29sdmUoKTogUGxhdGZvcm1Db25maWcge1xuICAgIGNvbnN0IGVudiA9IGVudkRlZmF1bHRzKCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGJhc2VVcmw6IHRoaXMub3ZlcnJpZGVzLmJhc2VVcmwgPz8gZW52LmJhc2VVcmwsXG4gICAgICBhdXRoOiB0aGlzLmhhc0V4cGxpY2l0QXV0aCA/IHRoaXMuZXhwbGljaXRBdXRoIDogZW52LmF1dGgsXG4gICAgICBmZXRjaEZuOiAodGhpcy5vdmVycmlkZXMuZmV0Y2hGbiA/PyBlbnYuZmV0Y2hGbikgYXMgdHlwZW9mIGZldGNoLFxuICAgICAgbG9nZ2VyOiB0aGlzLm92ZXJyaWRlcy5sb2dnZXIgYXMgTG9nZ2VyIHwgdW5kZWZpbmVkLFxuICAgIH07XG4gIH1cbn1cbiJdfQ==
79
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2NvbmZpZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUF3Q0Esa0NBTUM7QUFpQkQsc0NBUUM7QUFwRVksUUFBQSxnQkFBZ0IsR0FBRyxpQ0FBaUMsQ0FBQztBQWdDbEU7Ozs7R0FJRztBQUNILFNBQWdCLFdBQVc7SUFDekIsT0FBTztRQUNMLE9BQU8sRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLGdCQUFnQixJQUFJLHdCQUFnQjtRQUN6RCxJQUFJLEVBQUUsT0FBTyxFQUFFO1FBQ2YsT0FBTyxFQUFFLFVBQVUsQ0FBQyxLQUFxQjtLQUMxQyxDQUFDO0FBQ0osQ0FBQztBQUVELFNBQVMsT0FBTztJQUNkLE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsa0JBQWtCLENBQUM7SUFDN0MsSUFBSSxLQUFLO1FBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLENBQUM7SUFDNUMsT0FBTyxTQUFTLENBQUM7QUFDbkIsQ0FBQztBQUVEOzs7Ozs7OztHQVFHO0FBQ0gsU0FBZ0IsYUFBYSxDQUFDLEtBQXVDO0lBQ25FLElBQUksTUFBTSxJQUFJLEtBQUs7UUFBRSxPQUFPLEtBQUssQ0FBQztJQUNsQyxJQUFJLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNoQixPQUFPLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQ2hELENBQUM7SUFDRCxNQUFNLElBQUksS0FBSyxDQUNiLHNJQUFzSSxDQUN2SSxDQUFDO0FBQ0osQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsTUFBYSxXQUFXO0lBQ2QsU0FBUyxHQUF3QixFQUFFLENBQUM7SUFDcEMsWUFBWSxDQUEyQjtJQUN2QyxlQUFlLEdBQUcsS0FBSyxDQUFDO0lBRWhDLEtBQUssQ0FBQyxLQUEwQjtRQUM5QixJQUFJLEtBQUssQ0FBQyxPQUFPLEtBQUssU0FBUztZQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUM7UUFDeEUsSUFBSSxLQUFLLENBQUMsT0FBTyxLQUFLLFNBQVM7WUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDO1FBQ3hFLElBQUksS0FBSyxDQUFDLE1BQU0sS0FBSyxTQUFTO1lBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQztRQUNyRSxJQUFJLEtBQUssQ0FBQyxJQUFJLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDN0IsSUFBSSxDQUFDLFlBQVksR0FBRyxhQUFhLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzlDLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDO1FBQzlCLENBQUM7SUFDSCxDQUFDO0lBRUQsT0FBTyxDQUFDLEtBQXVDO1FBQzdDLElBQUksQ0FBQyxZQUFZLEdBQUcsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3pDLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDO0lBQzlCLENBQUM7SUFFRCxPQUFPO1FBQ0wsTUFBTSxHQUFHLEdBQUcsV0FBVyxFQUFFLENBQUM7UUFDMUIsT0FBTztZQUNMLE9BQU8sRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sSUFBSSxHQUFHLENBQUMsT0FBTztZQUM5QyxJQUFJLEVBQUUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUk7WUFDekQsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLElBQUksR0FBRyxDQUFDLE9BQU8sQ0FBaUI7WUFDaEUsTUFBTSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBNEI7U0FDcEQsQ0FBQztJQUNKLENBQUM7Q0FDRjtBQTdCRCxrQ0E2QkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IExvZ2dlciB9IGZyb20gJ0B1ZW5nYWdlLmlvL2pzLWxvZ2dlcic7XG5pbXBvcnQgdHlwZSB7IFRva2VuU291cmNlU3RhdGUgfSBmcm9tICcuL3Rva2VuLXNvdXJjZSc7XG5cbmV4cG9ydCBjb25zdCBERUZBVUxUX0JBU0VfVVJMID0gJ2h0dHBzOi8vYXBpLnBsYXRmb3JtLnVlbmdhZ2UuaW8nO1xuXG4vKipcbiAqIFJlc29sdmVkIGF1dGggc3RhdGUuIERpc2NyaW1pbmF0ZWQgYnkgYHR5cGVgIHNvIGNvbnN1bWVycyBjYW4gbmFycm93LlxuICovXG5leHBvcnQgdHlwZSBQbGF0Zm9ybUF1dGggPVxuICB8IHsgdHlwZTogJ2JlYXJlcic7IHRva2VuOiBzdHJpbmcgfVxuICB8IHsgdHlwZTogJ3Rva2VuLXNvdXJjZSc7IHN0YXRlOiBUb2tlblNvdXJjZVN0YXRlIH07XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGxhdGZvcm1Db25maWcge1xuICBiYXNlVXJsOiBzdHJpbmc7XG4gIGF1dGg/OiBQbGF0Zm9ybUF1dGg7XG4gIGZldGNoRm46IHR5cGVvZiBmZXRjaDtcbiAgbG9nZ2VyPzogTG9nZ2VyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFBsYXRmb3JtQ29uZmlnSW5wdXQge1xuICBiYXNlVXJsPzogc3RyaW5nO1xuICBhdXRoPzogUGxhdGZvcm1BdXRoSW5wdXQgfCBQbGF0Zm9ybUF1dGg7XG4gIGZldGNoRm4/OiB0eXBlb2YgZmV0Y2g7XG4gIGxvZ2dlcj86IExvZ2dlcjtcbn1cblxuLyoqXG4gKiBgLmF1dGgoKWAgc2hhcGUuIFBhc3MgYHt0b2tlbn1gIGZvciBhIHN0YXRpYyBCZWFyZXIgYWNjZXNzIHRva2VuLlxuICogT0F1dGgyIGNsaWVudF9jcmVkZW50aWFscyBsaXZlIGF0IGBjcmVhdGVDbGllbnQoKWAgY29uZmlnLXRpbWVcbiAqIChgc2VydmljZUlkYCArIGBzZXJ2aWNlU2VjcmV0YCBmaWVsZHMpLCBub3QgdmlhIGAuYXV0aCgpYC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQbGF0Zm9ybUF1dGhJbnB1dCB7XG4gIHRva2VuPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIFJlc29sdmUgZW52LWRlZmF1bHRlZCBjb25maWcuIFJlLXJlYWQgb24gZXZlcnkgY2FsbCBzbyB0aGF0IGNhbGxlcnMgY2FuXG4gKiBzZXQgZW52IHZhcnMgYWZ0ZXIgdGhlIFNESyBoYXMgYmVlbiBpbXBvcnRlZCBhbmQgc3RpbGwgcGljayB0aGVtIHVwIG9uXG4gKiB0aGUgbmV4dCByZXF1ZXN0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZW52RGVmYXVsdHMoKTogUGxhdGZvcm1Db25maWcge1xuICByZXR1cm4ge1xuICAgIGJhc2VVcmw6IHByb2Nlc3MuZW52LlVFTkdBR0VfQkFTRV9VUkwgPz8gREVGQVVMVF9CQVNFX1VSTCxcbiAgICBhdXRoOiBlbnZBdXRoKCksXG4gICAgZmV0Y2hGbjogZ2xvYmFsVGhpcy5mZXRjaCBhcyB0eXBlb2YgZmV0Y2gsXG4gIH07XG59XG5cbmZ1bmN0aW9uIGVudkF1dGgoKTogUGxhdGZvcm1BdXRoIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgdG9rZW4gPSBwcm9jZXNzLmVudi5VRU5HQUdFX0FVVEhfVE9LRU47XG4gIGlmICh0b2tlbikgcmV0dXJuIHsgdHlwZTogJ2JlYXJlcicsIHRva2VuIH07XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogQ29lcmNlIGAuYXV0aCgpYCBpbnB1dCBvciBgY29uZmlnKHthdXRofSlgIGlucHV0IGludG8gYSB0eXBlZFxuICogUGxhdGZvcm1BdXRoLiBUaHJvd3Mgd2hlbiB0aGUgaW5wdXQgaGFzIG5vIHVzYWJsZSBjcmVkZW50aWFscy5cbiAqXG4gKiBUb2RheSB0aGlzIG9ubHkgYWNjZXB0cyBge3Rva2VufWAgb3IgYSBwcmUtc2hhcGVkIGBQbGF0Zm9ybUF1dGhgLlxuICogRm9yIE9BdXRoMiBjbGllbnRfY3JlZGVudGlhbHMgdXNlIGBjcmVhdGVDbGllbnQoe3NlcnZpY2VJZCwgc2VydmljZVNlY3JldH0pYFxuICogaW5zdGVhZCDigJQgdGhhdCBidWlsZHMgYSBUb2tlblNvdXJjZSB3aGljaCBtaW50cyArIGNhY2hlcyBCZWFyZXJcbiAqIHRva2Vucy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZUF1dGgoaW5wdXQ6IFBsYXRmb3JtQXV0aElucHV0IHwgUGxhdGZvcm1BdXRoKTogUGxhdGZvcm1BdXRoIHtcbiAgaWYgKCd0eXBlJyBpbiBpbnB1dCkgcmV0dXJuIGlucHV0O1xuICBpZiAoaW5wdXQudG9rZW4pIHtcbiAgICByZXR1cm4geyB0eXBlOiAnYmVhcmVyJywgdG9rZW46IGlucHV0LnRva2VuIH07XG4gIH1cbiAgdGhyb3cgbmV3IEVycm9yKFxuICAgICdhdXRoKCk6IHBhc3Mge3Rva2VufSBmb3IgYSBzdGF0aWMgQmVhcmVyIGFjY2VzcyB0b2tlbiwgb3IgdXNlIGNyZWF0ZUNsaWVudCh7c2VydmljZUlkLCBzZXJ2aWNlU2VjcmV0fSkgZm9yIE9BdXRoMiBjbGllbnRfY3JlZGVudGlhbHMnLFxuICApO1xufVxuXG4vKipcbiAqIE11dGFibGUgY29uZmlnIHNoYXJlZCBieSBjbGllbnRzLiBgYXBwbHkoKWAgYW5kIGBzZXRBdXRoKClgIGFyZSBob3cgdGhlXG4gKiBjaGFpbmFibGUgYC5jb25maWcoKWAgLyBgLmF1dGgoKWAgbWV0aG9kcyB3cml0ZSBiYWNrLiBgcmVzb2x2ZSgpYCBwcm9kdWNlc1xuICogdGhlIGVmZmVjdGl2ZSBjb25maWcgZm9yIG9uZSByZXF1ZXN0LCBmYWxsaW5nIGJhY2sgdG8gY3VycmVudCBlbnYgc3RhdGVcbiAqIGZvciBmaWVsZHMgdGhlIGNhbGxlciBoYXNuJ3QgcGlubmVkLlxuICovXG5leHBvcnQgY2xhc3MgQ29uZmlnU3RhdGUge1xuICBwcml2YXRlIG92ZXJyaWRlczogUGxhdGZvcm1Db25maWdJbnB1dCA9IHt9O1xuICBwcml2YXRlIGV4cGxpY2l0QXV0aDogUGxhdGZvcm1BdXRoIHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIGhhc0V4cGxpY2l0QXV0aCA9IGZhbHNlO1xuXG4gIGFwcGx5KGlucHV0OiBQbGF0Zm9ybUNvbmZpZ0lucHV0KTogdm9pZCB7XG4gICAgaWYgKGlucHV0LmJhc2VVcmwgIT09IHVuZGVmaW5lZCkgdGhpcy5vdmVycmlkZXMuYmFzZVVybCA9IGlucHV0LmJhc2VVcmw7XG4gICAgaWYgKGlucHV0LmZldGNoRm4gIT09IHVuZGVmaW5lZCkgdGhpcy5vdmVycmlkZXMuZmV0Y2hGbiA9IGlucHV0LmZldGNoRm47XG4gICAgaWYgKGlucHV0LmxvZ2dlciAhPT0gdW5kZWZpbmVkKSB0aGlzLm92ZXJyaWRlcy5sb2dnZXIgPSBpbnB1dC5sb2dnZXI7XG4gICAgaWYgKGlucHV0LmF1dGggIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5leHBsaWNpdEF1dGggPSBub3JtYWxpemVBdXRoKGlucHV0LmF1dGgpO1xuICAgICAgdGhpcy5oYXNFeHBsaWNpdEF1dGggPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIHNldEF1dGgoaW5wdXQ6IFBsYXRmb3JtQXV0aElucHV0IHwgUGxhdGZvcm1BdXRoKTogdm9pZCB7XG4gICAgdGhpcy5leHBsaWNpdEF1dGggPSBub3JtYWxpemVBdXRoKGlucHV0KTtcbiAgICB0aGlzLmhhc0V4cGxpY2l0QXV0aCA9IHRydWU7XG4gIH1cblxuICByZXNvbHZlKCk6IFBsYXRmb3JtQ29uZmlnIHtcbiAgICBjb25zdCBlbnYgPSBlbnZEZWZhdWx0cygpO1xuICAgIHJldHVybiB7XG4gICAgICBiYXNlVXJsOiB0aGlzLm92ZXJyaWRlcy5iYXNlVXJsID8/IGVudi5iYXNlVXJsLFxuICAgICAgYXV0aDogdGhpcy5oYXNFeHBsaWNpdEF1dGggPyB0aGlzLmV4cGxpY2l0QXV0aCA6IGVudi5hdXRoLFxuICAgICAgZmV0Y2hGbjogKHRoaXMub3ZlcnJpZGVzLmZldGNoRm4gPz8gZW52LmZldGNoRm4pIGFzIHR5cGVvZiBmZXRjaCxcbiAgICAgIGxvZ2dlcjogdGhpcy5vdmVycmlkZXMubG9nZ2VyIGFzIExvZ2dlciB8IHVuZGVmaW5lZCxcbiAgICB9O1xuICB9XG59XG4iXX0=