@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.
@@ -11,6 +11,14 @@ export type AuditEventInput = Omit<AuditEvent, 'event_id' | 'occurred_at' | 'act
11
11
  actor: Omit<AuditEvent['actor'], 'via'>;
12
12
  };
13
13
  export interface AuditClientInput extends PlatformConfigInput {
14
+ /**
15
+ * Service identifier the producer is acting as. Stamped into
16
+ * `actor.via` on every event. Required because the audit schema's
17
+ * `actor.via` field is non-optional; OAuth Bearer tokens carry the
18
+ * identity in `sub` but the SDK doesn't decode them on the hot
19
+ * path. Pin this once at construction; do not change per-call.
20
+ */
21
+ actorVia?: string;
14
22
  /** Default 5000. */
15
23
  flushIntervalMs?: number;
16
24
  /** Default 50. */
@@ -22,24 +22,19 @@ function createAuditClient(input = {}) {
22
22
  const maxBatchSize = input.maxBatchSize ?? 50;
23
23
  const maxQueueSize = input.maxQueueSize ?? 1000;
24
24
  const enableTimer = input.enableTimer ?? true;
25
- const { flushIntervalMs: _f, maxBatchSize: _b, maxQueueSize: _q, enableTimer: _t, ...rest } = input;
25
+ const actorVia = input.actorVia;
26
+ const { flushIntervalMs: _f, maxBatchSize: _b, maxQueueSize: _q, enableTimer: _t, actorVia: _v, ...rest } = input;
26
27
  void _f;
27
28
  void _b;
28
29
  void _q;
29
30
  void _t;
31
+ void _v;
30
32
  state.apply(rest);
31
33
  const queue = [];
32
34
  const inflight = [];
33
35
  function getLogger() {
34
36
  return state.resolve().logger ?? NOOP_LOGGER;
35
37
  }
36
- function getServiceId() {
37
- const config = state.resolve();
38
- if (!config.auth || config.auth.type !== 'hmac') {
39
- throw new Error('audit client requires HMAC auth (set PLATFORM_SIGNING_SECRET + PLATFORM_SERVICE_ID, or call .auth({secret, serviceId}))');
40
- }
41
- return config.auth.serviceId;
42
- }
43
38
  const client = {
44
39
  config(opts) {
45
40
  state.apply(opts);
@@ -51,14 +46,12 @@ function createAuditClient(input = {}) {
51
46
  },
52
47
  record(input) {
53
48
  const logger = getLogger();
54
- let serviceId;
55
- try {
56
- serviceId = getServiceId();
57
- }
58
- catch (err) {
59
- logger.error('audit_sdk.no_auth', {
60
- error: { code: 'AUDIT_NO_AUTH', category: 'engineering' },
61
- context: { message: err.message },
49
+ if (!actorVia) {
50
+ logger.error('audit_sdk.missing_actor_via', {
51
+ error: { code: 'AUDIT_MISSING_ACTOR_VIA', category: 'engineering' },
52
+ context: {
53
+ message: 'audit client requires `actorVia` config (the service identifier this producer acts as). Pass {actorVia: "<your-service>"} to createAuditClient or createClient.',
54
+ },
62
55
  });
63
56
  return;
64
57
  }
@@ -66,7 +59,7 @@ function createAuditClient(input = {}) {
66
59
  ...input,
67
60
  event_id: (0, ulid_1.ulid)(),
68
61
  occurred_at: new Date().toISOString().replace(/\.\d{3}Z$/, 'Z'),
69
- actor: { ...input.actor, via: serviceId },
62
+ actor: { ...input.actor, via: actorVia },
70
63
  };
71
64
  const result = schema_1.auditEventSchema.safeParse(candidate);
72
65
  if (!result.success) {
@@ -136,7 +129,7 @@ function createAuditClient(input = {}) {
136
129
  async function sendOnce(body) {
137
130
  const config = state.resolve();
138
131
  const logger = getLogger();
139
- const headers = (0, http_1.buildHeaders)(config, { method: 'POST', path: PATH, body });
132
+ const headers = await (0, http_1.buildHeaders)(config, { method: 'POST', path: PATH, body });
140
133
  const res = await config.fetchFn(`${config.baseUrl}${PATH}`, {
141
134
  method: 'POST',
142
135
  headers,
@@ -166,4 +159,4 @@ function createAuditClient(input = {}) {
166
159
  function sleep(ms) {
167
160
  return new Promise((r) => setTimeout(r, ms));
168
161
  }
169
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2F1ZGl0L2NsaWVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQXFEQSw4Q0E4SkM7QUFuTkQsK0JBQTRCO0FBRTVCLHNDQUttQjtBQUNuQixrQ0FBdUM7QUFDdkMscUNBQTZEO0FBK0I3RCxNQUFNLElBQUksR0FBRyxrQkFBa0IsQ0FBQztBQUNoQyxNQUFNLGVBQWUsR0FBRyxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFFMUMsTUFBTSxXQUFXLEdBQUc7SUFDbEIsS0FBSyxFQUFFLEdBQUcsRUFBRSxHQUFFLENBQUM7SUFDZixJQUFJLEVBQUUsR0FBRyxFQUFFLEdBQUUsQ0FBQztJQUNkLElBQUksRUFBRSxHQUFHLEVBQUUsR0FBRSxDQUFDO0lBQ2QsS0FBSyxFQUFFLEdBQUcsRUFBRSxHQUFFLENBQUM7SUFDZixLQUFLO1FBQ0gsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0NBQ21CLENBQUM7QUFFdkIsU0FBZ0IsaUJBQWlCLENBQUMsUUFBMEIsRUFBRTtJQUM1RCxNQUFNLEtBQUssR0FBRyxJQUFJLG9CQUFXLEVBQUUsQ0FBQztJQUNoQyxNQUFNLGVBQWUsR0FBRyxLQUFLLENBQUMsZUFBZSxJQUFJLElBQUksQ0FBQztJQUN0RCxNQUFNLFlBQVksR0FBRyxLQUFLLENBQUMsWUFBWSxJQUFJLEVBQUUsQ0FBQztJQUM5QyxNQUFNLFlBQVksR0FBRyxLQUFLLENBQUMsWUFBWSxJQUFJLElBQUksQ0FBQztJQUNoRCxNQUFNLFdBQVcsR0FBRyxLQUFLLENBQUMsV0FBVyxJQUFJLElBQUksQ0FBQztJQUU5QyxNQUFNLEVBQ0osZUFBZSxFQUFFLEVBQUUsRUFDbkIsWUFBWSxFQUFFLEVBQUUsRUFDaEIsWUFBWSxFQUFFLEVBQUUsRUFDaEIsV0FBVyxFQUFFLEVBQUUsRUFDZixHQUFHLElBQUksRUFDUixHQUFHLEtBQUssQ0FBQztJQUNW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LEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDL0MsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHVsaWQgfSBmcm9tICd1bGlkJztcbmltcG9ydCB0eXBlIHsgTG9nZ2VyIH0gZnJvbSAnQHVlbmdhZ2UuaW8vanMtbG9nZ2VyJztcbmltcG9ydCB7XG4gIENvbmZpZ1N0YXRlLFxuICB0eXBlIFBsYXRmb3JtQXV0aCxcbiAgdHlwZSBQbGF0Zm9ybUF1dGhJbnB1dCxcbiAgdHlwZSBQbGF0Zm9ybUNvbmZpZ0lucHV0LFxufSBmcm9tICcuLi9jb25maWcnO1xuaW1wb3J0IHsgYnVpbGRIZWFkZXJzIH0gZnJvbSAnLi4vaHR0cCc7XG5pbXBvcnQgeyBhdWRpdEV2ZW50U2NoZW1hLCB0eXBlIEF1ZGl0RXZlbnQgfSBmcm9tICcuL3NjaGVtYSc7XG5cbi8qKlxuICogQ2FsbGVyLWZhY2luZyBldmVudCBzaGFwZS4gVGhlIFNESyBmaWxsczpcbiAqICAgLSBgZXZlbnRfaWRgICAgKFVMSUQsIGdlbmVyYXRlZCBwZXIgY2FsbClcbiAqICAgLSBgb2NjdXJyZWRfYXRgIChVVEMgSVNPIDg2MDEgYXQgdGhlIHRpbWUgb2YgYHJlY29yZCgpYClcbiAqICAgLSBgYWN0b3IudmlhYCAgKGFsd2F5cyBzZXQgdG8gdGhlIGNvbmZpZ3VyZWQgc2VydmljZUlkLCBzbyBjYWxsZXJzXG4gKiAgICAgICAgICAgICAgICAgICBjYW4ndCBkcmlmdCBmcm9tIHRoZSBzZXJ2aWNlIGlkZW50aXR5IHVzZWQgZm9yIGF1dGgpXG4gKi9cbmV4cG9ydCB0eXBlIEF1ZGl0RXZlbnRJbnB1dCA9IE9taXQ8QXVkaXRFdmVudCwgJ2V2ZW50X2lkJyB8ICdvY2N1cnJlZF9hdCcgfCAnYWN0b3InPiAmIHtcbiAgYWN0b3I6IE9taXQ8QXVkaXRFdmVudFsnYWN0b3InXSwgJ3ZpYSc+O1xufTtcblxuZXhwb3J0IGludGVyZmFjZSBBdWRpdENsaWVudElucHV0IGV4dGVuZHMgUGxhdGZvcm1Db25maWdJbnB1dCB7XG4gIC8qKiBEZWZhdWx0IDUwMDAuICovXG4gIGZsdXNoSW50ZXJ2YWxNcz86IG51bWJlcjtcbiAgLyoqIERlZmF1bHQgNTAuICovXG4gIG1heEJhdGNoU2l6ZT86IG51bWJlcjtcbiAgLyoqIERlZmF1bHQgMTAwMC4gTmV3IGV2ZW50cyBwYXN0IHRoaXMgYXJlIGRyb3BwZWQgd2l0aCBhIHdhcm5pbmcuICovXG4gIG1heFF1ZXVlU2l6ZT86IG51bWJlcjtcbiAgLyoqIERlZmF1bHQgdHJ1ZS4gU2V0IGZhbHNlIHRvIGRpc2FibGUgdGhlIGF1dG8tZmx1c2ggdGltZXIgKHRlc3Qgb25seSkuICovXG4gIGVuYWJsZVRpbWVyPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBBdWRpdENsaWVudCB7XG4gIGNvbmZpZyhpbnB1dDogUGxhdGZvcm1Db25maWdJbnB1dCk6IEF1ZGl0Q2xpZW50O1xuICBhdXRoKGlucHV0OiBQbGF0Zm9ybUF1dGhJbnB1dCB8IFBsYXRmb3JtQXV0aCk6IEF1ZGl0Q2xpZW50O1xuICByZWNvcmQoZXZlbnQ6IEF1ZGl0RXZlbnRJbnB1dCk6IHZvaWQ7XG4gIGZsdXNoKCk6IFByb21pc2U8dm9pZD47XG59XG5cbmNvbnN0IFBBVEggPSAnL3YxL2F1ZGl0L2V2ZW50cyc7XG5jb25zdCBSRVRSWV9ERUxBWVNfTVMgPSBbNTAwLCAyMDAwLCA4MDAwXTtcblxuY29uc3QgTk9PUF9MT0dHRVIgPSB7XG4gIGVycm9yOiAoKSA9PiB7fSxcbiAgd2FybjogKCkgPT4ge30sXG4gIGluZm86ICgpID0+IHt9LFxuICBkZWJ1ZzogKCkgPT4ge30sXG4gIGNoaWxkKCkge1xuICAgIHJldHVybiB0aGlzO1xuICB9LFxufSBhcyB1bmtub3duIGFzIExvZ2dlcjtcblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUF1ZGl0Q2xpZW50KGlucHV0OiBBdWRpdENsaWVudElucHV0ID0ge30pOiBBdWRpdENsaWVudCB7XG4gIGNvbnN0IHN0YXRlID0gbmV3IENvbmZpZ1N0YXRlKCk7XG4gIGNvbnN0IGZsdXNoSW50ZXJ2YWxNcyA9IGlucHV0LmZsdXNoSW50ZXJ2YWxNcyA/PyA1MDAwO1xuICBjb25zdCBtYXhCYXRjaFNpemUgPSBpbnB1dC5tYXhCYXRjaFNpemUgPz8gNTA7XG4gIGNvbnN0IG1heFF1ZXVlU2l6ZSA9IGlucHV0Lm1heFF1ZXVlU2l6ZSA/PyAxMDAwO1xuICBjb25zdCBlbmFibGVUaW1lciA9IGlucHV0LmVuYWJsZVRpbWVyID8/IHRydWU7XG5cbiAgY29uc3Qge1xuICAgIGZsdXNoSW50ZXJ2YWxNczogX2YsXG4gICAgbWF4QmF0Y2hTaXplOiBfYixcbiAgICBtYXhRdWV1ZVNpemU6IF9xLFxuICAgIGVuYWJsZVRpbWVyOiBfdCxcbiAgICAuLi5yZXN0XG4gIH0gPSBpbnB1dDtcbiAgdm9pZCBfZjtcbiAgdm9pZCBfYjtcbiAgdm9pZCBfcTtcbiAgdm9pZCBfdDtcbiAgc3RhdGUuYXBwbHkocmVzdCk7XG5cbiAgY29uc3QgcXVldWU6IEF1ZGl0RXZlbnRbXSA9IFtdO1xuICBjb25zdCBpbmZsaWdodDogUHJvbWlzZTx2b2lkPltdID0gW107XG5cbiAgZnVuY3Rpb24gZ2V0TG9nZ2VyKCk6IExvZ2dlciB7XG4gICAgcmV0dXJuIHN0YXRlLnJlc29sdmUoKS5sb2dnZXIgPz8gTk9PUF9MT0dHRVI7XG4gIH1cblxuICBmdW5jdGlvbiBnZXRTZXJ2aWNlSWQoKTogc3RyaW5nIHtcbiAgICBjb25zdCBjb25maWcgPSBzdGF0ZS5yZXNvbHZlKCk7XG4gICAgaWYgKCFjb25maWcuYXV0aCB8fCBjb25maWcuYXV0aC50eXBlICE9PSAnaG1hYycpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ2F1ZGl0IGNsaWVudCByZXF1aXJlcyBITUFDIGF1dGggKHNldCBQTEFURk9STV9TSUdOSU5HX1NFQ1JFVCArIFBMQVRGT1JNX1NFUlZJQ0VfSUQsIG9yIGNhbGwgLmF1dGgoe3NlY3JldCwgc2VydmljZUlkfSkpJyxcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBjb25maWcuYXV0aC5zZXJ2aWNlSWQ7XG4gIH1cblxuICBjb25zdCBjbGllbnQ6IEF1ZGl0Q2xpZW50ID0ge1xuICAgIGNvbmZpZyhvcHRzKSB7XG4gICAgICBzdGF0ZS5hcHBseShvcHRzKTtcbiAgICAgIHJldHVybiBjbGllbnQ7XG4gICAgfSxcbiAgICBhdXRoKG9wdHMpIHtcbiAgICAgIHN0YXRlLnNldEF1dGgob3B0cyk7XG4gICAgICByZXR1cm4gY2xpZW50O1xuICAgIH0sXG4gICAgcmVjb3JkKGlucHV0KSB7XG4gICAgICBjb25zdCBsb2dnZXIgPSBnZXRMb2dnZXIoKTtcbiAgICAgIGxldCBzZXJ2aWNlSWQ6IHN0cmluZztcbiAgICAgIHRyeSB7XG4gICAgICAgIHNlcnZpY2VJZCA9IGdldFNlcnZpY2VJZCgpO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGxvZ2dlci5lcnJvcignYXVkaXRfc2RrLm5vX2F1dGgnLCB7XG4gICAgICAgICAgZXJyb3I6IHsgY29kZTogJ0FVRElUX05PX0FVVEgnLCBjYXRlZ29yeTogJ2VuZ2luZWVyaW5nJyB9LFxuICAgICAgICAgIGNvbnRleHQ6IHsgbWVzc2FnZTogKGVyciBhcyBFcnJvcikubWVzc2FnZSB9LFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBjYW5kaWRhdGU6IEF1ZGl0RXZlbnQgPSB7XG4gICAgICAgIC4uLmlucHV0LFxuICAgICAgICBldmVudF9pZDogdWxpZCgpLFxuICAgICAgICBvY2N1cnJlZF9hdDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLnJlcGxhY2UoL1xcLlxcZHszfVokLywgJ1onKSxcbiAgICAgICAgYWN0b3I6IHsgLi4uaW5wdXQuYWN0b3IsIHZpYTogc2VydmljZUlkIH0sXG4gICAgICB9O1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXVkaXRFdmVudFNjaGVtYS5zYWZlUGFyc2UoY2FuZGlkYXRlKTtcbiAgICAgIGlmICghcmVzdWx0LnN1Y2Nlc3MpIHtcbiAgICAgICAgbG9nZ2VyLmVycm9yKCdhdWRpdF9zZGsuaW52YWxpZF9ldmVudCcsIHtcbiAgICAgICAgICBlcnJvcjogeyBjb2RlOiAnQVVESVRfSU5WQUxJRF9FVkVOVCcsIGNhdGVnb3J5OiAnZW5naW5lZXJpbmcnIH0sXG4gICAgICAgICAgY29udGV4dDogeyBpc3N1ZXM6IHJlc3VsdC5lcnJvci5pc3N1ZXMsIGV2ZW50OiBjYW5kaWRhdGUgfSxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChxdWV1ZS5sZW5ndGggPj0gbWF4UXVldWVTaXplKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKCdhdWRpdF9zZGsucXVldWVfZnVsbCcsIHtcbiAgICAgICAgICBjb250ZXh0OiB7IGRyb3BwZWRfZXZlbnRfaWQ6IGNhbmRpZGF0ZS5ldmVudF9pZCwgbWF4X3F1ZXVlX3NpemU6IG1heFF1ZXVlU2l6ZSB9LFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgcXVldWUucHVzaChyZXN1bHQuZGF0YSk7XG4gICAgICBpZiAocXVldWUubGVuZ3RoID49IG1heEJhdGNoU2l6ZSkge1xuICAgICAgICB2b2lkIHNjaGVkdWxlU2VuZCgpO1xuICAgICAgfVxuICAgIH0sXG4gICAgYXN5bmMgZmx1c2goKSB7XG4gICAgICBhd2FpdCBzY2hlZHVsZVNlbmQoKTtcbiAgICAgIHdoaWxlIChpbmZsaWdodC5sZW5ndGggPiAwKSB7XG4gICAgICAgIGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChbLi4uaW5mbGlnaHRdKTtcbiAgICAgIH1cbiAgICB9LFxuICB9O1xuXG4gIGFzeW5jIGZ1bmN0aW9uIHNjaGVkdWxlU2VuZCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB3aGlsZSAocXVldWUubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgYmF0Y2ggPSBxdWV1ZS5zcGxpY2UoMCwgbWF4QmF0Y2hTaXplKTtcbiAgICAgIGNvbnN0IHNlbmQgPSBzZW5kV2l0aFJldHJpZXMoYmF0Y2gpO1xuICAgICAgaW5mbGlnaHQucHVzaChzZW5kKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHNlbmQ7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBjb25zdCBpZHggPSBpbmZsaWdodC5pbmRleE9mKHNlbmQpO1xuICAgICAgICBpZiAoaWR4ICE9PSAtMSkgaW5mbGlnaHQuc3BsaWNlKGlkeCwgMSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gc2VuZFdpdGhSZXRyaWVzKGV2ZW50czogQXVkaXRFdmVudFtdKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgbG9nZ2VyID0gZ2V0TG9nZ2VyKCk7XG4gICAgY29uc3QgYm9keSA9IEpTT04uc3RyaW5naWZ5KHsgZXZlbnRzIH0pO1xuICAgIGZvciAobGV0IGF0dGVtcHQgPSAwOyBhdHRlbXB0IDw9IFJFVFJZX0RFTEFZU19NUy5sZW5ndGg7IGF0dGVtcHQrKykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3Qgb2sgPSBhd2FpdCBzZW5kT25jZShib2R5KTtcbiAgICAgICAgaWYgKG9rKSByZXR1cm47XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgY29uc3QgZSA9IGVyciBhcyBFcnJvcjtcbiAgICAgICAgbG9nZ2VyLndhcm4oJ2F1ZGl0X3Nkay5zZW5kX2Vycm9yJywge1xuICAgICAgICAgIGNvbnRleHQ6IHsgYXR0ZW1wdCwgbWVzc2FnZTogZS5tZXNzYWdlLCBiYXRjaF9zaXplOiBldmVudHMubGVuZ3RoIH0sXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgaWYgKGF0dGVtcHQgPCBSRVRSWV9ERUxBWVNfTVMubGVuZ3RoKSB7XG4gICAgICAgIGF3YWl0IHNsZWVwKFJFVFJZX0RFTEFZU19NU1thdHRlbXB0XSk7XG4gICAgICB9XG4gICAgfVxuICAgIGxvZ2dlci5lcnJvcignYXVkaXRfc2RrLnNlbmRfZmFpbGVkJywge1xuICAgICAgZXJyb3I6IHsgY29kZTogJ0FVRElUX1NFTkRfRkFJTEVEJywgY2F0ZWdvcnk6ICdlbmdpbmVlcmluZycgfSxcbiAgICAgIGNvbnRleHQ6IHsgYmF0Y2hfc2l6ZTogZXZlbnRzLmxlbmd0aCwgZXZlbnRzIH0sXG4gICAgfSk7XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiBzZW5kT25jZShib2R5OiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCBjb25maWcgPSBzdGF0ZS5yZXNvbHZlKCk7XG4gICAgY29uc3QgbG9nZ2VyID0gZ2V0TG9nZ2VyKCk7XG4gICAgY29uc3QgaGVhZGVycyA9IGJ1aWxkSGVhZGVycyhjb25maWcsIHsgbWV0aG9kOiAnUE9TVCcsIHBhdGg6IFBBVEgsIGJvZHkgfSk7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgY29uZmlnLmZldGNoRm4oYCR7Y29uZmlnLmJhc2VVcmx9JHtQQVRIfWAsIHtcbiAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgaGVhZGVycyxcbiAgICAgIGJvZHksXG4gICAgfSk7XG4gICAgaWYgKHJlcy5zdGF0dXMgPj0gNTAwKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKCFyZXMub2sgJiYgcmVzLnN0YXR1cyAhPT0gMjAyKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoJ2F1ZGl0X3Nkay5yZWplY3RlZCcsIHtcbiAgICAgICAgZXJyb3I6IHsgY29kZTogJ0FVRElUX1JFSkVDVEVEJywgY2F0ZWdvcnk6ICdlbmdpbmVlcmluZycgfSxcbiAgICAgICAgY29udGV4dDogeyBzdGF0dXM6IHJlcy5zdGF0dXMgfSxcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgbGV0IHRpbWVyOiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRJbnRlcnZhbD4gfCB1bmRlZmluZWQ7XG4gIGlmIChlbmFibGVUaW1lcikge1xuICAgIHRpbWVyID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgICAgdm9pZCBzY2hlZHVsZVNlbmQoKTtcbiAgICB9LCBmbHVzaEludGVydmFsTXMpO1xuICAgIGlmICh0eXBlb2YgdGltZXIudW5yZWYgPT09ICdmdW5jdGlvbicpIHRpbWVyLnVucmVmKCk7XG4gIH1cblxuICByZXR1cm4gY2xpZW50O1xufVxuXG5mdW5jdGlvbiBzbGVlcChtczogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocikgPT4gc2V0VGltZW91dChyLCBtcykpO1xufVxuIl19
162
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2F1ZGl0L2NsaWVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQTZEQSw4Q0F1SkM7QUFwTkQsK0JBQTRCO0FBRTVCLHNDQUttQjtBQUNuQixrQ0FBdUM7QUFDdkMscUNBQTZEO0FBdUM3RCxNQUFNLElBQUksR0FBRyxrQkFBa0IsQ0FBQztBQUNoQyxNQUFNLGVBQWUsR0FBRyxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFFMUMsTUFBTSxXQUFXLEdBQUc7SUFDbEIsS0FBSyxFQUFFLEdBQUcsRUFBRSxHQUFFLENBQUM7SUFDZixJQUFJLEVBQUUsR0FBRyxFQUFFLEdBQUUsQ0FBQztJQUNkLElBQUksRUFBRSxHQUFHLEVBQUUsR0FBRSxDQUFDO0lBQ2QsS0FBSyxFQUFFLEdBQUcsRUFBRSxHQUFFLENBQUM7SUFDZixLQUFLO1FBQ0gsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0NBQ21CLENBQUM7QUFFdkIsU0FBZ0IsaUJBQWlCLENBQUMsUUFBMEIsRUFBRTtJQUM1RCxNQUFNLEtBQUssR0FBRyxJQUFJLG9CQUFXLEVBQUUsQ0FBQztJQUNoQyxNQUFNLGVBQWUsR0FBRyxLQUFLLENBQUMsZUFBZSxJQUFJLElBQUksQ0FBQztJQUN0RCxNQUFNLFlBQVksR0FBRyxLQUFLLENBQUMsWUFBWSxJQUFJLEVBQUUsQ0FBQztJQUM5QyxNQUFNLFlBQVksR0FBRyxLQUFLLENBQUMsWUFBWSxJQUFJLElBQUksQ0FBQztJQUNoRCxNQUFNLFdBQVcsR0FBRyxLQUFLLENBQUMsV0FBVyxJQUFJLElBQUksQ0FBQztJQUM5QyxNQUFNLFFBQVEsR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFDO0lBRWhDLE1BQU0sRUFDSixlQUFlLEVBQUUsRUFBRSxFQUNuQixZQUFZLEVBQUUsRUFBRSxFQUNoQixZQUFZLEVBQUUsRUFBRSxFQUNoQixXQUFXLEVBQUUsRUFB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TyxLQUFLLENBQUM7UUFDcEMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLElBQUksR0FBRyxDQUFDLE1BQU0sS0FBSyxHQUFHLEVBQUUsQ0FBQztZQUNsQyxNQUFNLENBQUMsS0FBSyxDQUFDLG9CQUFvQixFQUFFO2dCQUNqQyxLQUFLLEVBQUUsRUFBRSxJQUFJLEVBQUUsZ0JBQWdCLEVBQUUsUUFBUSxFQUFFLGFBQWEsRUFBRTtnQkFDMUQsT0FBTyxFQUFFLEVBQUUsTUFBTSxFQUFFLEdBQUcsQ0FBQyxNQUFNLEVBQUU7YUFDaEMsQ0FBQyxDQUFDO1lBQ0gsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsSUFBSSxLQUFpRCxDQUFDO0lBQ3RELElBQUksV0FBVyxFQUFFLENBQUM7UUFDaEIsS0FBSyxHQUFHLFdBQVcsQ0FBQyxHQUFHLEVBQUU7WUFDdkIsS0FBSyxZQUFZLEVBQUUsQ0FBQztRQUN0QixDQUFDLEVBQUUsZUFBZSxDQUFDLENBQUM7UUFDcEIsSUFBSSxPQUFPLEtBQUssQ0FBQyxLQUFLLEtBQUssVUFBVTtZQUFFLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUN2RCxDQUFDO0lBRUQsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQztBQUVELFNBQVMsS0FBSyxDQUFDLEVBQVU7SUFDdkIsT0FBTyxJQUFJLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsVUFBVSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQy9DLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyB1bGlkIH0gZnJvbSAndWxpZCc7XG5pbXBvcnQgdHlwZSB7IExvZ2dlciB9IGZyb20gJ0B1ZW5nYWdlLmlvL2pzLWxvZ2dlcic7XG5pbXBvcnQge1xuICBDb25maWdTdGF0ZSxcbiAgdHlwZSBQbGF0Zm9ybUF1dGgsXG4gIHR5cGUgUGxhdGZvcm1BdXRoSW5wdXQsXG4gIHR5cGUgUGxhdGZvcm1Db25maWdJbnB1dCxcbn0gZnJvbSAnLi4vY29uZmlnJztcbmltcG9ydCB7IGJ1aWxkSGVhZGVycyB9IGZyb20gJy4uL2h0dHAnO1xuaW1wb3J0IHsgYXVkaXRFdmVudFNjaGVtYSwgdHlwZSBBdWRpdEV2ZW50IH0gZnJvbSAnLi9zY2hlbWEnO1xuXG4vKipcbiAqIENhbGxlci1mYWNpbmcgZXZlbnQgc2hhcGUuIFRoZSBTREsgZmlsbHM6XG4gKiAgIC0gYGV2ZW50X2lkYCAgIChVTElELCBnZW5lcmF0ZWQgcGVyIGNhbGwpXG4gKiAgIC0gYG9jY3VycmVkX2F0YCAoVVRDIElTTyA4NjAxIGF0IHRoZSB0aW1lIG9mIGByZWNvcmQoKWApXG4gKiAgIC0gYGFjdG9yLnZpYWAgIChhbHdheXMgc2V0IHRvIHRoZSBjb25maWd1cmVkIHNlcnZpY2VJZCwgc28gY2FsbGVyc1xuICogICAgICAgICAgICAgICAgICAgY2FuJ3QgZHJpZnQgZnJvbSB0aGUgc2VydmljZSBpZGVudGl0eSB1c2VkIGZvciBhdXRoKVxuICovXG5leHBvcnQgdHlwZSBBdWRpdEV2ZW50SW5wdXQgPSBPbWl0PEF1ZGl0RXZlbnQsICdldmVudF9pZCcgfCAnb2NjdXJyZWRfYXQnIHwgJ2FjdG9yJz4gJiB7XG4gIGFjdG9yOiBPbWl0PEF1ZGl0RXZlbnRbJ2FjdG9yJ10sICd2aWEnPjtcbn07XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXVkaXRDbGllbnRJbnB1dCBleHRlbmRzIFBsYXRmb3JtQ29uZmlnSW5wdXQge1xuICAvKipcbiAgICogU2VydmljZSBpZGVudGlmaWVyIHRoZSBwcm9kdWNlciBpcyBhY3RpbmcgYXMuIFN0YW1wZWQgaW50b1xuICAgKiBgYWN0b3IudmlhYCBvbiBldmVyeSBldmVudC4gUmVxdWlyZWQgYmVjYXVzZSB0aGUgYXVkaXQgc2NoZW1hJ3NcbiAgICogYGFjdG9yLnZpYWAgZmllbGQgaXMgbm9uLW9wdGlvbmFsOyBPQXV0aCBCZWFyZXIgdG9rZW5zIGNhcnJ5IHRoZVxuICAgKiBpZGVudGl0eSBpbiBgc3ViYCBidXQgdGhlIFNESyBkb2Vzbid0IGRlY29kZSB0aGVtIG9uIHRoZSBob3RcbiAgICogcGF0aC4gUGluIHRoaXMgb25jZSBhdCBjb25zdHJ1Y3Rpb247IGRvIG5vdCBjaGFuZ2UgcGVyLWNhbGwuXG4gICAqL1xuICBhY3RvclZpYT86IHN0cmluZztcbiAgLyoqIERlZmF1bHQgNTAwMC4gKi9cbiAgZmx1c2hJbnRlcnZhbE1zPzogbnVtYmVyO1xuICAvKiogRGVmYXVsdCA1MC4gKi9cbiAgbWF4QmF0Y2hTaXplPzogbnVtYmVyO1xuICAvKiogRGVmYXVsdCAxMDAwLiBOZXcgZXZlbnRzIHBhc3QgdGhpcyBhcmUgZHJvcHBlZCB3aXRoIGEgd2FybmluZy4gKi9cbiAgbWF4UXVldWVTaXplPzogbnVtYmVyO1xuICAvKiogRGVmYXVsdCB0cnVlLiBTZXQgZmFsc2UgdG8gZGlzYWJsZSB0aGUgYXV0by1mbHVzaCB0aW1lciAodGVzdCBvbmx5KS4gKi9cbiAgZW5hYmxlVGltZXI/OiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEF1ZGl0Q2xpZW50IHtcbiAgY29uZmlnKGlucHV0OiBQbGF0Zm9ybUNvbmZpZ0lucHV0KTogQXVkaXRDbGllbnQ7XG4gIGF1dGgoaW5wdXQ6IFBsYXRmb3JtQXV0aElucHV0IHwgUGxhdGZvcm1BdXRoKTogQXVkaXRDbGllbnQ7XG4gIHJlY29yZChldmVudDogQXVkaXRFdmVudElucHV0KTogdm9pZDtcbiAgZmx1c2goKTogUHJvbWlzZTx2b2lkPjtcbn1cblxuY29uc3QgUEFUSCA9ICcvdjEvYXVkaXQvZXZlbnRzJztcbmNvbnN0IFJFVFJZX0RFTEFZU19NUyA9IFs1MDAsIDIwMDAsIDgwMDBdO1xuXG5jb25zdCBOT09QX0xPR0dFUiA9IHtcbiAgZXJyb3I6ICgpID0+IHt9LFxuICB3YXJuOiAoKSA9PiB7fSxcbiAgaW5mbzogKCkgPT4ge30sXG4gIGRlYnVnOiAoKSA9PiB7fSxcbiAgY2hpbGQoKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG59IGFzIHVua25vd24gYXMgTG9nZ2VyO1xuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlQXVkaXRDbGllbnQoaW5wdXQ6IEF1ZGl0Q2xpZW50SW5wdXQgPSB7fSk6IEF1ZGl0Q2xpZW50IHtcbiAgY29uc3Qgc3RhdGUgPSBuZXcgQ29uZmlnU3RhdGUoKTtcbiAgY29uc3QgZmx1c2hJbnRlcnZhbE1zID0gaW5wdXQuZmx1c2hJbnRlcnZhbE1zID8/IDUwMDA7XG4gIGNvbnN0IG1heEJhdGNoU2l6ZSA9IGlucHV0Lm1heEJhdGNoU2l6ZSA/PyA1MDtcbiAgY29uc3QgbWF4UXVldWVTaXplID0gaW5wdXQubWF4UXVldWVTaXplID8/IDEwMDA7XG4gIGNvbnN0IGVuYWJsZVRpbWVyID0gaW5wdXQuZW5hYmxlVGltZXIgPz8gdHJ1ZTtcbiAgY29uc3QgYWN0b3JWaWEgPSBpbnB1dC5hY3RvclZpYTtcblxuICBjb25zdCB7XG4gICAgZmx1c2hJbnRlcnZhbE1zOiBfZixcbiAgICBtYXhCYXRjaFNpemU6IF9iLFxuICAgIG1heFF1ZXVlU2l6ZTogX3EsXG4gICAgZW5hYmxlVGltZXI6IF90LFxuICAgIGFjdG9yVmlhOiBfdixcbiAgICAuLi5yZXN0XG4gIH0gPSBpbnB1dDtcbiAgdm9pZCBfZjtcbiAgdm9pZCBfYjtcbiAgdm9pZCBfcTtcbiAgdm9pZCBfdDtcbiAgdm9pZCBfdjtcbiAgc3RhdGUuYXBwbHkocmVzdCk7XG5cbiAgY29uc3QgcXVldWU6IEF1ZGl0RXZlbnRbXSA9IFtdO1xuICBjb25zdCBpbmZsaWdodDogUHJvbWlzZTx2b2lkPltdID0gW107XG5cbiAgZnVuY3Rpb24gZ2V0TG9nZ2VyKCk6IExvZ2dlciB7XG4gICAgcmV0dXJuIHN0YXRlLnJlc29sdmUoKS5sb2dnZXIgPz8gTk9PUF9MT0dHRVI7XG4gIH1cblxuICBjb25zdCBjbGllbnQ6IEF1ZGl0Q2xpZW50ID0ge1xuICAgIGNvbmZpZyhvcHRzKSB7XG4gICAgICBzdGF0ZS5hcHBseShvcHRzKTtcbiAgICAgIHJldHVybiBjbGllbnQ7XG4gICAgfSxcbiAgICBhdXRoKG9wdHMpIHtcbiAgICAgIHN0YXRlLnNldEF1dGgob3B0cyk7XG4gICAgICByZXR1cm4gY2xpZW50O1xuICAgIH0sXG4gICAgcmVjb3JkKGlucHV0KSB7XG4gICAgICBjb25zdCBsb2dnZXIgPSBnZXRMb2dnZXIoKTtcbiAgICAgIGlmICghYWN0b3JWaWEpIHtcbiAgICAgICAgbG9nZ2VyLmVycm9yKCdhdWRpdF9zZGsubWlzc2luZ19hY3Rvcl92aWEnLCB7XG4gICAgICAgICAgZXJyb3I6IHsgY29kZTogJ0FVRElUX01JU1NJTkdfQUNUT1JfVklBJywgY2F0ZWdvcnk6ICdlbmdpbmVlcmluZycgfSxcbiAgICAgICAgICBjb250ZXh0OiB7XG4gICAgICAgICAgICBtZXNzYWdlOlxuICAgICAgICAgICAgICAnYXVkaXQgY2xpZW50IHJlcXVpcmVzIGBhY3RvclZpYWAgY29uZmlnICh0aGUgc2VydmljZSBpZGVudGlmaWVyIHRoaXMgcHJvZHVjZXIgYWN0cyBhcykuIFBhc3Mge2FjdG9yVmlhOiBcIjx5b3VyLXNlcnZpY2U+XCJ9IHRvIGNyZWF0ZUF1ZGl0Q2xpZW50IG9yIGNyZWF0ZUNsaWVudC4nLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGNhbmRpZGF0ZTogQXVkaXRFdmVudCA9IHtcbiAgICAgICAgLi4uaW5wdXQsXG4gICAgICAgIGV2ZW50X2lkOiB1bGlkKCksXG4gICAgICAgIG9jY3VycmVkX2F0OiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCkucmVwbGFjZSgvXFwuXFxkezN9WiQvLCAnWicpLFxuICAgICAgICBhY3RvcjogeyAuLi5pbnB1dC5hY3RvciwgdmlhOiBhY3RvclZpYSB9LFxuICAgICAgfTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF1ZGl0RXZlbnRTY2hlbWEuc2FmZVBhcnNlKGNhbmRpZGF0ZSk7XG4gICAgICBpZiAoIXJlc3VsdC5zdWNjZXNzKSB7XG4gICAgICAgIGxvZ2dlci5lcnJvcignYXVkaXRfc2RrLmludmFsaWRfZXZlbnQnLCB7XG4gICAgICAgICAgZXJyb3I6IHsgY29kZTogJ0FVRElUX0lOVkFMSURfRVZFTlQnLCBjYXRlZ29yeTogJ2VuZ2luZWVyaW5nJyB9LFxuICAgICAgICAgIGNvbnRleHQ6IHsgaXNzdWVzOiByZXN1bHQuZXJyb3IuaXNzdWVzLCBldmVudDogY2FuZGlkYXRlIH0sXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAocXVldWUubGVuZ3RoID49IG1heFF1ZXVlU2l6ZSkge1xuICAgICAgICBsb2dnZXIud2FybignYXVkaXRfc2RrLnF1ZXVlX2Z1bGwnLCB7XG4gICAgICAgICAgY29udGV4dDogeyBkcm9wcGVkX2V2ZW50X2lkOiBjYW5kaWRhdGUuZXZlbnRfaWQsIG1heF9xdWV1ZV9zaXplOiBtYXhRdWV1ZVNpemUgfSxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHF1ZXVlLnB1c2gocmVzdWx0LmRhdGEpO1xuICAgICAgaWYgKHF1ZXVlLmxlbmd0aCA+PSBtYXhCYXRjaFNpemUpIHtcbiAgICAgICAgdm9pZCBzY2hlZHVsZVNlbmQoKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIGFzeW5jIGZsdXNoKCkge1xuICAgICAgYXdhaXQgc2NoZWR1bGVTZW5kKCk7XG4gICAgICB3aGlsZSAoaW5mbGlnaHQubGVuZ3RoID4gMCkge1xuICAgICAgICBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQoWy4uLmluZmxpZ2h0XSk7XG4gICAgICB9XG4gICAgfSxcbiAgfTtcblxuICBhc3luYyBmdW5jdGlvbiBzY2hlZHVsZVNlbmQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgd2hpbGUgKHF1ZXVlLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGJhdGNoID0gcXVldWUuc3BsaWNlKDAsIG1heEJhdGNoU2l6ZSk7XG4gICAgICBjb25zdCBzZW5kID0gc2VuZFdpdGhSZXRyaWVzKGJhdGNoKTtcbiAgICAgIGluZmxpZ2h0LnB1c2goc2VuZCk7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBzZW5kO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgY29uc3QgaWR4ID0gaW5mbGlnaHQuaW5kZXhPZihzZW5kKTtcbiAgICAgICAgaWYgKGlkeCAhPT0gLTEpIGluZmxpZ2h0LnNwbGljZShpZHgsIDEpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIHNlbmRXaXRoUmV0cmllcyhldmVudHM6IEF1ZGl0RXZlbnRbXSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGxvZ2dlciA9IGdldExvZ2dlcigpO1xuICAgIGNvbnN0IGJvZHkgPSBKU09OLnN0cmluZ2lmeSh7IGV2ZW50cyB9KTtcbiAgICBmb3IgKGxldCBhdHRlbXB0ID0gMDsgYXR0ZW1wdCA8PSBSRVRSWV9ERUxBWVNfTVMubGVuZ3RoOyBhdHRlbXB0KyspIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IG9rID0gYXdhaXQgc2VuZE9uY2UoYm9keSk7XG4gICAgICAgIGlmIChvaykgcmV0dXJuO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGNvbnN0IGUgPSBlcnIgYXMgRXJyb3I7XG4gICAgICAgIGxvZ2dlci53YXJuKCdhdWRpdF9zZGsuc2VuZF9lcnJvcicsIHtcbiAgICAgICAgICBjb250ZXh0OiB7IGF0dGVtcHQsIG1lc3NhZ2U6IGUubWVzc2FnZSwgYmF0Y2hfc2l6ZTogZXZlbnRzLmxlbmd0aCB9LFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGlmIChhdHRlbXB0IDwgUkVUUllfREVMQVlTX01TLmxlbmd0aCkge1xuICAgICAgICBhd2FpdCBzbGVlcChSRVRSWV9ERUxBWVNfTVNbYXR0ZW1wdF0pO1xuICAgICAgfVxuICAgIH1cbiAgICBsb2dnZXIuZXJyb3IoJ2F1ZGl0X3Nkay5zZW5kX2ZhaWxlZCcsIHtcbiAgICAgIGVycm9yOiB7IGNvZGU6ICdBVURJVF9TRU5EX0ZBSUxFRCcsIGNhdGVnb3J5OiAnZW5naW5lZXJpbmcnIH0sXG4gICAgICBjb250ZXh0OiB7IGJhdGNoX3NpemU6IGV2ZW50cy5sZW5ndGgsIGV2ZW50cyB9LFxuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gc2VuZE9uY2UoYm9keTogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3QgY29uZmlnID0gc3RhdGUucmVzb2x2ZSgpO1xuICAgIGNvbnN0IGxvZ2dlciA9IGdldExvZ2dlcigpO1xuICAgIGNvbnN0IGhlYWRlcnMgPSBhd2FpdCBidWlsZEhlYWRlcnMoY29uZmlnLCB7IG1ldGhvZDogJ1BPU1QnLCBwYXRoOiBQQVRILCBib2R5IH0pO1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGNvbmZpZy5mZXRjaEZuKGAke2NvbmZpZy5iYXNlVXJsfSR7UEFUSH1gLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgIGhlYWRlcnMsXG4gICAgICBib2R5LFxuICAgIH0pO1xuICAgIGlmIChyZXMuc3RhdHVzID49IDUwMCkgcmV0dXJuIGZhbHNlO1xuICAgIGlmICghcmVzLm9rICYmIHJlcy5zdGF0dXMgIT09IDIwMikge1xuICAgICAgbG9nZ2VyLmVycm9yKCdhdWRpdF9zZGsucmVqZWN0ZWQnLCB7XG4gICAgICAgIGVycm9yOiB7IGNvZGU6ICdBVURJVF9SRUpFQ1RFRCcsIGNhdGVnb3J5OiAnZW5naW5lZXJpbmcnIH0sXG4gICAgICAgIGNvbnRleHQ6IHsgc3RhdHVzOiByZXMuc3RhdHVzIH0sXG4gICAgICB9KTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGxldCB0aW1lcjogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0SW50ZXJ2YWw+IHwgdW5kZWZpbmVkO1xuICBpZiAoZW5hYmxlVGltZXIpIHtcbiAgICB0aW1lciA9IHNldEludGVydmFsKCgpID0+IHtcbiAgICAgIHZvaWQgc2NoZWR1bGVTZW5kKCk7XG4gICAgfSwgZmx1c2hJbnRlcnZhbE1zKTtcbiAgICBpZiAodHlwZW9mIHRpbWVyLnVucmVmID09PSAnZnVuY3Rpb24nKSB0aW1lci51bnJlZigpO1xuICB9XG5cbiAgcmV0dXJuIGNsaWVudDtcbn1cblxuZnVuY3Rpb24gc2xlZXAobXM6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHIpID0+IHNldFRpbWVvdXQociwgbXMpKTtcbn1cbiJdfQ==
@@ -1,3 +1,2 @@
1
1
  export { auditEventSchema, auditBatchSchema, type AuditEvent, type AuditBatch } from './schema';
2
- export { signRequest, type SignRequestParams } from './sign';
3
2
  export { createAuditClient, type AuditClient, type AuditClientInput, type AuditEventInput, } from './client';
@@ -1,11 +1,9 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.createAuditClient = exports.signRequest = exports.auditBatchSchema = exports.auditEventSchema = void 0;
3
+ exports.createAuditClient = exports.auditBatchSchema = exports.auditEventSchema = void 0;
4
4
  var schema_1 = require("./schema");
5
5
  Object.defineProperty(exports, "auditEventSchema", { enumerable: true, get: function () { return schema_1.auditEventSchema; } });
6
6
  Object.defineProperty(exports, "auditBatchSchema", { enumerable: true, get: function () { return schema_1.auditBatchSchema; } });
7
- var sign_1 = require("./sign");
8
- Object.defineProperty(exports, "signRequest", { enumerable: true, get: function () { return sign_1.signRequest; } });
9
7
  var client_1 = require("./client");
10
8
  Object.defineProperty(exports, "createAuditClient", { enumerable: true, get: function () { return client_1.createAuditClient; } });
11
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYXVkaXQvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsbUNBQWdHO0FBQXZGLDBHQUFBLGdCQUFnQixPQUFBO0FBQUUsMEdBQUEsZ0JBQWdCLE9BQUE7QUFDM0MsK0JBQTZEO0FBQXBELG1HQUFBLFdBQVcsT0FBQTtBQUNwQixtQ0FLa0I7QUFKaEIsMkdBQUEsaUJBQWlCLE9BQUEiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgeyBhdWRpdEV2ZW50U2NoZW1hLCBhdWRpdEJhdGNoU2NoZW1hLCB0eXBlIEF1ZGl0RXZlbnQsIHR5cGUgQXVkaXRCYXRjaCB9IGZyb20gJy4vc2NoZW1hJztcbmV4cG9ydCB7IHNpZ25SZXF1ZXN0LCB0eXBlIFNpZ25SZXF1ZXN0UGFyYW1zIH0gZnJvbSAnLi9zaWduJztcbmV4cG9ydCB7XG4gIGNyZWF0ZUF1ZGl0Q2xpZW50LFxuICB0eXBlIEF1ZGl0Q2xpZW50LFxuICB0eXBlIEF1ZGl0Q2xpZW50SW5wdXQsXG4gIHR5cGUgQXVkaXRFdmVudElucHV0LFxufSBmcm9tICcuL2NsaWVudCc7XG4iXX0=
9
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYXVkaXQvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsbUNBQWdHO0FBQXZGLDBHQUFBLGdCQUFnQixPQUFBO0FBQUUsMEdBQUEsZ0JBQWdCLE9BQUE7QUFDM0MsbUNBS2tCO0FBSmhCLDJHQUFBLGlCQUFpQixPQUFBIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IHsgYXVkaXRFdmVudFNjaGVtYSwgYXVkaXRCYXRjaFNjaGVtYSwgdHlwZSBBdWRpdEV2ZW50LCB0eXBlIEF1ZGl0QmF0Y2ggfSBmcm9tICcuL3NjaGVtYSc7XG5leHBvcnQge1xuICBjcmVhdGVBdWRpdENsaWVudCxcbiAgdHlwZSBBdWRpdENsaWVudCxcbiAgdHlwZSBBdWRpdENsaWVudElucHV0LFxuICB0eXBlIEF1ZGl0RXZlbnRJbnB1dCxcbn0gZnJvbSAnLi9jbGllbnQnO1xuIl19
@@ -0,0 +1,18 @@
1
+ export interface AuthorizeUrlInput {
2
+ authBaseUrl?: string;
3
+ clientId: string;
4
+ redirectUri: string;
5
+ scope?: string;
6
+ tenant: string;
7
+ state?: string;
8
+ codeChallenge: string;
9
+ codeChallengeMethod?: 'S256';
10
+ nonce?: string;
11
+ }
12
+ /**
13
+ * Build the `/authorize` URL the browser should be redirected to. The
14
+ * caller is responsible for storing `codeVerifier` (from `generatePKCE`)
15
+ * to round-trip into `exchangeCode` after the redirect comes back with
16
+ * `?code=...`.
17
+ */
18
+ export declare function createAuthorizeUrl(input: AuthorizeUrlInput): string;
@@ -0,0 +1,31 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createAuthorizeUrl = createAuthorizeUrl;
4
+ const errors_1 = require("../errors");
5
+ const DEFAULT_AUTH_BASE_URL = 'https://api.platform.uengage.io/auth/business';
6
+ /**
7
+ * Build the `/authorize` URL the browser should be redirected to. The
8
+ * caller is responsible for storing `codeVerifier` (from `generatePKCE`)
9
+ * to round-trip into `exchangeCode` after the redirect comes back with
10
+ * `?code=...`.
11
+ */
12
+ function createAuthorizeUrl(input) {
13
+ if (!input.clientId || !input.redirectUri || !input.tenant || !input.codeChallenge) {
14
+ throw new errors_1.ConfigError('createAuthorizeUrl requires clientId, redirectUri, tenant and codeChallenge');
15
+ }
16
+ const url = new URL(`${input.authBaseUrl ?? DEFAULT_AUTH_BASE_URL}/authorize`);
17
+ url.searchParams.set('response_type', 'code');
18
+ url.searchParams.set('client_id', input.clientId);
19
+ url.searchParams.set('redirect_uri', input.redirectUri);
20
+ if (input.scope)
21
+ url.searchParams.set('scope', input.scope);
22
+ url.searchParams.set('tenant', input.tenant);
23
+ if (input.state)
24
+ url.searchParams.set('state', input.state);
25
+ url.searchParams.set('code_challenge', input.codeChallenge);
26
+ url.searchParams.set('code_challenge_method', input.codeChallengeMethod ?? 'S256');
27
+ if (input.nonce)
28
+ url.searchParams.set('nonce', input.nonce);
29
+ return url.toString();
30
+ }
31
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aG9yaXplLXVybC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hdXRoL2F1dGhvcml6ZS11cmwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFzQkEsZ0RBaUJDO0FBdkNELHNDQUF3QztBQWN4QyxNQUFNLHFCQUFxQixHQUFHLCtDQUErQyxDQUFDO0FBRTlFOzs7OztHQUtHO0FBQ0gsU0FBZ0Isa0JBQWtCLENBQUMsS0FBd0I7SUFDekQsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUNuRixNQUFNLElBQUksb0JBQVcsQ0FDbkIsNkVBQTZFLENBQzlFLENBQUM7SUFDSixDQUFDO0lBQ0QsTUFBTSxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUMsR0FBRyxLQUFLLENBQUMsV0FBVyxJQUFJLHFCQUFxQixZQUFZLENBQUMsQ0FBQztJQUMvRSxHQUFHLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxlQUFlLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDOUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsV0FBVyxFQUFFLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNsRCxHQUFHLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxjQUFjLEVBQUUsS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQ3hELElBQUksS0FBSyxDQUFDLEtBQUs7UUFBRSxHQUFHLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzVELEdBQUcsQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDN0MsSUFBSSxLQUFLLENBQUMsS0FBSztRQUFFLEdBQUcsQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDNUQsR0FBRyxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLEVBQUUsS0FBSyxDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBQzVELEdBQUcsQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLHVCQUF1QixFQUFFLEtBQUssQ0FBQyxtQkFBbUIsSUFBSSxNQUFNLENBQUMsQ0FBQztJQUNuRixJQUFJLEtBQUssQ0FBQyxLQUFLO1FBQUUsR0FBRyxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM1RCxPQUFPLEdBQUcsQ0FBQyxRQUFRLEVBQUUsQ0FBQztBQUN4QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29uZmlnRXJyb3IgfSBmcm9tICcuLi9lcnJvcnMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEF1dGhvcml6ZVVybElucHV0IHtcbiAgYXV0aEJhc2VVcmw/OiBzdHJpbmc7XG4gIGNsaWVudElkOiBzdHJpbmc7XG4gIHJlZGlyZWN0VXJpOiBzdHJpbmc7XG4gIHNjb3BlPzogc3RyaW5nO1xuICB0ZW5hbnQ6IHN0cmluZztcbiAgc3RhdGU/OiBzdHJpbmc7XG4gIGNvZGVDaGFsbGVuZ2U6IHN0cmluZztcbiAgY29kZUNoYWxsZW5nZU1ldGhvZD86ICdTMjU2JztcbiAgbm9uY2U/OiBzdHJpbmc7XG59XG5cbmNvbnN0IERFRkFVTFRfQVVUSF9CQVNFX1VSTCA9ICdodHRwczovL2FwaS5wbGF0Zm9ybS51ZW5nYWdlLmlvL2F1dGgvYnVzaW5lc3MnO1xuXG4vKipcbiAqIEJ1aWxkIHRoZSBgL2F1dGhvcml6ZWAgVVJMIHRoZSBicm93c2VyIHNob3VsZCBiZSByZWRpcmVjdGVkIHRvLiBUaGVcbiAqIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3Igc3RvcmluZyBgY29kZVZlcmlmaWVyYCAoZnJvbSBgZ2VuZXJhdGVQS0NFYClcbiAqIHRvIHJvdW5kLXRyaXAgaW50byBgZXhjaGFuZ2VDb2RlYCBhZnRlciB0aGUgcmVkaXJlY3QgY29tZXMgYmFjayB3aXRoXG4gKiBgP2NvZGU9Li4uYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUF1dGhvcml6ZVVybChpbnB1dDogQXV0aG9yaXplVXJsSW5wdXQpOiBzdHJpbmcge1xuICBpZiAoIWlucHV0LmNsaWVudElkIHx8ICFpbnB1dC5yZWRpcmVjdFVyaSB8fCAhaW5wdXQudGVuYW50IHx8ICFpbnB1dC5jb2RlQ2hhbGxlbmdlKSB7XG4gICAgdGhyb3cgbmV3IENvbmZpZ0Vycm9yKFxuICAgICAgJ2NyZWF0ZUF1dGhvcml6ZVVybCByZXF1aXJlcyBjbGllbnRJZCwgcmVkaXJlY3RVcmksIHRlbmFudCBhbmQgY29kZUNoYWxsZW5nZScsXG4gICAgKTtcbiAgfVxuICBjb25zdCB1cmwgPSBuZXcgVVJMKGAke2lucHV0LmF1dGhCYXNlVXJsID8/IERFRkFVTFRfQVVUSF9CQVNFX1VSTH0vYXV0aG9yaXplYCk7XG4gIHVybC5zZWFyY2hQYXJhbXMuc2V0KCdyZXNwb25zZV90eXBlJywgJ2NvZGUnKTtcbiAgdXJsLnNlYXJjaFBhcmFtcy5zZXQoJ2NsaWVudF9pZCcsIGlucHV0LmNsaWVudElkKTtcbiAgdXJsLnNlYXJjaFBhcmFtcy5zZXQoJ3JlZGlyZWN0X3VyaScsIGlucHV0LnJlZGlyZWN0VXJpKTtcbiAgaWYgKGlucHV0LnNjb3BlKSB1cmwuc2VhcmNoUGFyYW1zLnNldCgnc2NvcGUnLCBpbnB1dC5zY29wZSk7XG4gIHVybC5zZWFyY2hQYXJhbXMuc2V0KCd0ZW5hbnQnLCBpbnB1dC50ZW5hbnQpO1xuICBpZiAoaW5wdXQuc3RhdGUpIHVybC5zZWFyY2hQYXJhbXMuc2V0KCdzdGF0ZScsIGlucHV0LnN0YXRlKTtcbiAgdXJsLnNlYXJjaFBhcmFtcy5zZXQoJ2NvZGVfY2hhbGxlbmdlJywgaW5wdXQuY29kZUNoYWxsZW5nZSk7XG4gIHVybC5zZWFyY2hQYXJhbXMuc2V0KCdjb2RlX2NoYWxsZW5nZV9tZXRob2QnLCBpbnB1dC5jb2RlQ2hhbGxlbmdlTWV0aG9kID8/ICdTMjU2Jyk7XG4gIGlmIChpbnB1dC5ub25jZSkgdXJsLnNlYXJjaFBhcmFtcy5zZXQoJ25vbmNlJywgaW5wdXQubm9uY2UpO1xuICByZXR1cm4gdXJsLnRvU3RyaW5nKCk7XG59XG4iXX0=
@@ -0,0 +1,22 @@
1
+ export interface ExchangeCodeInput {
2
+ authBaseUrl?: string;
3
+ code: string;
4
+ codeVerifier: string;
5
+ clientId: string;
6
+ redirectUri: string;
7
+ }
8
+ export interface TokenPair {
9
+ accessToken: string;
10
+ refreshToken?: string;
11
+ idToken?: string;
12
+ expiresIn: number;
13
+ scope?: string;
14
+ }
15
+ /**
16
+ * Exchange an authorization code for an access + refresh + id token
17
+ * triple. PKCE verifier is included as `code_verifier` so the auth
18
+ * server can confirm the holder of the code is the same caller that
19
+ * initiated the flow.
20
+ */
21
+ export declare function exchangeCode(input: ExchangeCodeInput): Promise<TokenPair>;
22
+ export declare function parseTokenResponse(res: Response): Promise<TokenPair>;
@@ -0,0 +1,55 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.exchangeCode = exchangeCode;
4
+ exports.parseTokenResponse = parseTokenResponse;
5
+ const errors_1 = require("../errors");
6
+ const DEFAULT_AUTH_BASE_URL = 'https://api.platform.uengage.io/auth/business';
7
+ /**
8
+ * Exchange an authorization code for an access + refresh + id token
9
+ * triple. PKCE verifier is included as `code_verifier` so the auth
10
+ * server can confirm the holder of the code is the same caller that
11
+ * initiated the flow.
12
+ */
13
+ async function exchangeCode(input) {
14
+ const body = new URLSearchParams({
15
+ grant_type: 'authorization_code',
16
+ code: input.code,
17
+ code_verifier: input.codeVerifier,
18
+ client_id: input.clientId,
19
+ redirect_uri: input.redirectUri,
20
+ });
21
+ const res = await fetch(`${input.authBaseUrl ?? DEFAULT_AUTH_BASE_URL}/oauth/token`, {
22
+ method: 'POST',
23
+ headers: { 'content-type': 'application/x-www-form-urlencoded' },
24
+ body: body.toString(),
25
+ });
26
+ return parseTokenResponse(res);
27
+ }
28
+ async function parseTokenResponse(res) {
29
+ let body;
30
+ try {
31
+ body = (await res.json());
32
+ }
33
+ catch (err) {
34
+ throw new errors_1.PlatformError(`auth server returned non-JSON: HTTP ${res.status}`, {
35
+ status: res.status,
36
+ cause: err,
37
+ });
38
+ }
39
+ if (!res.ok) {
40
+ const error = typeof body.error === 'string' ? body.error : 'auth_request_failed';
41
+ const description = typeof body.error_description === 'string' ? body.error_description : undefined;
42
+ if (res.status === 401) {
43
+ throw new errors_1.AuthenticationError(description ?? error, { cause: body });
44
+ }
45
+ throw new errors_1.PlatformError(description ?? error, { status: res.status, cause: body });
46
+ }
47
+ return {
48
+ accessToken: String(body.access_token ?? ''),
49
+ refreshToken: typeof body.refresh_token === 'string' ? body.refresh_token : undefined,
50
+ idToken: typeof body.id_token === 'string' ? body.id_token : undefined,
51
+ expiresIn: Number(body.expires_in ?? 0),
52
+ scope: typeof body.scope === 'string' ? body.scope : undefined,
53
+ };
54
+ }
55
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhjaGFuZ2UtY29kZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hdXRoL2V4Y2hhbmdlLWNvZGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUEwQkEsb0NBY0M7QUFFRCxnREEwQkM7QUFwRUQsc0NBQStEO0FBa0IvRCxNQUFNLHFCQUFxQixHQUFHLCtDQUErQyxDQUFDO0FBRTlFOzs7OztHQUtHO0FBQ0ksS0FBSyxVQUFVLFlBQVksQ0FBQyxLQUF3QjtJQUN6RCxNQUFNLElBQUksR0FBRyxJQUFJLGVBQWUsQ0FBQztRQUMvQixVQUFVLEVBQUUsb0JBQW9CO1FBQ2hDLElBQUksRUFBRSxLQUFLLENBQUMsSUFBSTtRQUNoQixhQUFhLEVBQUUsS0FBSyxDQUFDLFlBQVk7UUFDakMsU0FBUyxFQUFFLEtBQUssQ0FBQyxRQUFRO1FBQ3pCLFlBQVksRUFBRSxLQUFLLENBQUMsV0FBVztLQUNoQyxDQUFDLENBQUM7SUFDSCxNQUFNLEdBQUcsR0FBRyxNQUFNLEtBQUssQ0FBQyxHQUFHLEtBQUssQ0FBQyxXQUFXLElBQUkscUJBQXFCLGNBQWMsRUFBRTtRQUNuRixNQUFNLEVBQUUsTUFBTTtRQUNkLE9BQU8sRUFBRSxFQUFFLGNBQWMsRUFBRSxtQ0FBbUMsRUFBRTtRQUNoRSxJQUFJLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRTtLQUN0QixDQUFDLENBQUM7SUFDSCxPQUFPLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2pDLENBQUM7QUFFTSxLQUFLLFVBQVUsa0JBQWtCLENBQUMsR0FBYTtJQUNwRCxJQUFJLElBQTZCLENBQUM7SUFDbEMsSUFBSSxDQUFDO1FBQ0gsSUFBSSxHQUFHLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxFQUFFLENBQTRCLENBQUM7SUFDdkQsQ0FBQztJQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7UUFDYixNQUFNLElBQUksc0JBQWEsQ0FBQyx1Q0FBdUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxFQUFFO1lBQzNFLE1BQU0sRUFBRSxHQUFHLENBQUMsTUFBTTtZQUNsQixLQUFLLEVBQUUsR0FBRztTQUNYLENBQUMsQ0FBQztJQUNMLENBQUM7SUFDRCxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBQ1osTUFBTSxLQUFLLEdBQUcsT0FBTyxJQUFJLENBQUMsS0FBSyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMscUJBQXFCLENBQUM7UUFDbEYsTUFBTSxXQUFXLEdBQ2YsT0FBTyxJQUFJLENBQUMsaUJBQWlCLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztRQUNsRixJQUFJLEdBQUcsQ0FBQyxNQUFNLEtBQUssR0FBRyxFQUFFLENBQUM7WUFDdkIsTUFBTSxJQUFJLDRCQUFtQixDQUFDLFdBQVcsSUFBSSxLQUFLLEVBQUUsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUN2RSxDQUFDO1FBQ0QsTUFBTSxJQUFJLHNCQUFhLENBQUMsV0FBVyxJQUFJLEtBQUssRUFBRSxFQUFFLE1BQU0sRUFBRSxHQUFHLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQ3JGLENBQUM7SUFDRCxPQUFPO1FBQ0wsV0FBVyxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsWUFBWSxJQUFJLEVBQUUsQ0FBQztRQUM1QyxZQUFZLEVBQUUsT0FBTyxJQUFJLENBQUMsYUFBYSxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsU0FBUztRQUNyRixPQUFPLEVBQUUsT0FBTyxJQUFJLENBQUMsUUFBUSxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsU0FBUztRQUN0RSxTQUFTLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxVQUFVLElBQUksQ0FBQyxDQUFDO1FBQ3ZDLEtBQUssRUFBRSxPQUFPLElBQUksQ0FBQyxLQUFLLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxTQUFTO0tBQy9ELENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQXV0aGVudGljYXRpb25FcnJvciwgUGxhdGZvcm1FcnJvciB9IGZyb20gJy4uL2Vycm9ycyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRXhjaGFuZ2VDb2RlSW5wdXQge1xuICBhdXRoQmFzZVVybD86IHN0cmluZztcbiAgY29kZTogc3RyaW5nO1xuICBjb2RlVmVyaWZpZXI6IHN0cmluZztcbiAgY2xpZW50SWQ6IHN0cmluZztcbiAgcmVkaXJlY3RVcmk6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUb2tlblBhaXIge1xuICBhY2Nlc3NUb2tlbjogc3RyaW5nO1xuICByZWZyZXNoVG9rZW4/OiBzdHJpbmc7XG4gIGlkVG9rZW4/OiBzdHJpbmc7XG4gIGV4cGlyZXNJbjogbnVtYmVyO1xuICBzY29wZT86IHN0cmluZztcbn1cblxuY29uc3QgREVGQVVMVF9BVVRIX0JBU0VfVVJMID0gJ2h0dHBzOi8vYXBpLnBsYXRmb3JtLnVlbmdhZ2UuaW8vYXV0aC9idXNpbmVzcyc7XG5cbi8qKlxuICogRXhjaGFuZ2UgYW4gYXV0aG9yaXphdGlvbiBjb2RlIGZvciBhbiBhY2Nlc3MgKyByZWZyZXNoICsgaWQgdG9rZW5cbiAqIHRyaXBsZS4gUEtDRSB2ZXJpZmllciBpcyBpbmNsdWRlZCBhcyBgY29kZV92ZXJpZmllcmAgc28gdGhlIGF1dGhcbiAqIHNlcnZlciBjYW4gY29uZmlybSB0aGUgaG9sZGVyIG9mIHRoZSBjb2RlIGlzIHRoZSBzYW1lIGNhbGxlciB0aGF0XG4gKiBpbml0aWF0ZWQgdGhlIGZsb3cuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBleGNoYW5nZUNvZGUoaW5wdXQ6IEV4Y2hhbmdlQ29kZUlucHV0KTogUHJvbWlzZTxUb2tlblBhaXI+IHtcbiAgY29uc3QgYm9keSA9IG5ldyBVUkxTZWFyY2hQYXJhbXMoe1xuICAgIGdyYW50X3R5cGU6ICdhdXRob3JpemF0aW9uX2NvZGUnLFxuICAgIGNvZGU6IGlucHV0LmNvZGUsXG4gICAgY29kZV92ZXJpZmllcjogaW5wdXQuY29kZVZlcmlmaWVyLFxuICAgIGNsaWVudF9pZDogaW5wdXQuY2xpZW50SWQsXG4gICAgcmVkaXJlY3RfdXJpOiBpbnB1dC5yZWRpcmVjdFVyaSxcbiAgfSk7XG4gIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKGAke2lucHV0LmF1dGhCYXNlVXJsID8/IERFRkFVTFRfQVVUSF9CQVNFX1VSTH0vb2F1dGgvdG9rZW5gLCB7XG4gICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgaGVhZGVyczogeyAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCcgfSxcbiAgICBib2R5OiBib2R5LnRvU3RyaW5nKCksXG4gIH0pO1xuICByZXR1cm4gcGFyc2VUb2tlblJlc3BvbnNlKHJlcyk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBwYXJzZVRva2VuUmVzcG9uc2UocmVzOiBSZXNwb25zZSk6IFByb21pc2U8VG9rZW5QYWlyPiB7XG4gIGxldCBib2R5OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgdHJ5IHtcbiAgICBib2R5ID0gKGF3YWl0IHJlcy5qc29uKCkpIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICB0aHJvdyBuZXcgUGxhdGZvcm1FcnJvcihgYXV0aCBzZXJ2ZXIgcmV0dXJuZWQgbm9uLUpTT046IEhUVFAgJHtyZXMuc3RhdHVzfWAsIHtcbiAgICAgIHN0YXR1czogcmVzLnN0YXR1cyxcbiAgICAgIGNhdXNlOiBlcnIsXG4gICAgfSk7XG4gIH1cbiAgaWYgKCFyZXMub2spIHtcbiAgICBjb25zdCBlcnJvciA9IHR5cGVvZiBib2R5LmVycm9yID09PSAnc3RyaW5nJyA/IGJvZHkuZXJyb3IgOiAnYXV0aF9yZXF1ZXN0X2ZhaWxlZCc7XG4gICAgY29uc3QgZGVzY3JpcHRpb24gPVxuICAgICAgdHlwZW9mIGJvZHkuZXJyb3JfZGVzY3JpcHRpb24gPT09ICdzdHJpbmcnID8gYm9keS5lcnJvcl9kZXNjcmlwdGlvbiA6IHVuZGVmaW5lZDtcbiAgICBpZiAocmVzLnN0YXR1cyA9PT0gNDAxKSB7XG4gICAgICB0aHJvdyBuZXcgQXV0aGVudGljYXRpb25FcnJvcihkZXNjcmlwdGlvbiA/PyBlcnJvciwgeyBjYXVzZTogYm9keSB9KTtcbiAgICB9XG4gICAgdGhyb3cgbmV3IFBsYXRmb3JtRXJyb3IoZGVzY3JpcHRpb24gPz8gZXJyb3IsIHsgc3RhdHVzOiByZXMuc3RhdHVzLCBjYXVzZTogYm9keSB9KTtcbiAgfVxuICByZXR1cm4ge1xuICAgIGFjY2Vzc1Rva2VuOiBTdHJpbmcoYm9keS5hY2Nlc3NfdG9rZW4gPz8gJycpLFxuICAgIHJlZnJlc2hUb2tlbjogdHlwZW9mIGJvZHkucmVmcmVzaF90b2tlbiA9PT0gJ3N0cmluZycgPyBib2R5LnJlZnJlc2hfdG9rZW4gOiB1bmRlZmluZWQsXG4gICAgaWRUb2tlbjogdHlwZW9mIGJvZHkuaWRfdG9rZW4gPT09ICdzdHJpbmcnID8gYm9keS5pZF90b2tlbiA6IHVuZGVmaW5lZCxcbiAgICBleHBpcmVzSW46IE51bWJlcihib2R5LmV4cGlyZXNfaW4gPz8gMCksXG4gICAgc2NvcGU6IHR5cGVvZiBib2R5LnNjb3BlID09PSAnc3RyaW5nJyA/IGJvZHkuc2NvcGUgOiB1bmRlZmluZWQsXG4gIH07XG59XG4iXX0=
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Auth namespace: helpers for OAuth2 flows against the platform's
3
+ * `/auth/business/*` surface. Consumers don't bake a `client_id` into
4
+ * the SDK itself — every helper takes parameters explicitly so multiple
5
+ * OAuth clients (dashboard, mobile, BFFs) can share one SDK install.
6
+ */
7
+ export { generatePKCE, type PkcePair } from './pkce';
8
+ export { createAuthorizeUrl, type AuthorizeUrlInput } from './authorize-url';
9
+ export { exchangeCode, parseTokenResponse, type ExchangeCodeInput, type TokenPair, } from './exchange-code';
10
+ export { refresh, type RefreshInput } from './refresh';
11
+ export { verifyAccessToken } from './verify';
12
+ export { getIssuer, getExpiry } from './issuer';
13
+ import { generatePKCE } from './pkce';
14
+ import { createAuthorizeUrl } from './authorize-url';
15
+ import { exchangeCode } from './exchange-code';
16
+ import { refresh } from './refresh';
17
+ import { verifyAccessToken } from './verify';
18
+ import { getIssuer, getExpiry } from './issuer';
19
+ /**
20
+ * Default singleton namespace for callers using the package singleton.
21
+ * import { auth } from '@uengage.io/platform-sdk';
22
+ * const pkce = auth.generatePKCE();
23
+ */
24
+ export declare const auth: {
25
+ generatePKCE: typeof generatePKCE;
26
+ createAuthorizeUrl: typeof createAuthorizeUrl;
27
+ exchangeCode: typeof exchangeCode;
28
+ refresh: typeof refresh;
29
+ verifyAccessToken: typeof verifyAccessToken;
30
+ getIssuer: typeof getIssuer;
31
+ getExpiry: typeof getExpiry;
32
+ };
@@ -0,0 +1,44 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.auth = exports.getExpiry = exports.getIssuer = exports.verifyAccessToken = exports.refresh = exports.parseTokenResponse = exports.exchangeCode = exports.createAuthorizeUrl = exports.generatePKCE = void 0;
4
+ /**
5
+ * Auth namespace: helpers for OAuth2 flows against the platform's
6
+ * `/auth/business/*` surface. Consumers don't bake a `client_id` into
7
+ * the SDK itself — every helper takes parameters explicitly so multiple
8
+ * OAuth clients (dashboard, mobile, BFFs) can share one SDK install.
9
+ */
10
+ var pkce_1 = require("./pkce");
11
+ Object.defineProperty(exports, "generatePKCE", { enumerable: true, get: function () { return pkce_1.generatePKCE; } });
12
+ var authorize_url_1 = require("./authorize-url");
13
+ Object.defineProperty(exports, "createAuthorizeUrl", { enumerable: true, get: function () { return authorize_url_1.createAuthorizeUrl; } });
14
+ var exchange_code_1 = require("./exchange-code");
15
+ Object.defineProperty(exports, "exchangeCode", { enumerable: true, get: function () { return exchange_code_1.exchangeCode; } });
16
+ Object.defineProperty(exports, "parseTokenResponse", { enumerable: true, get: function () { return exchange_code_1.parseTokenResponse; } });
17
+ var refresh_1 = require("./refresh");
18
+ Object.defineProperty(exports, "refresh", { enumerable: true, get: function () { return refresh_1.refresh; } });
19
+ var verify_1 = require("./verify");
20
+ Object.defineProperty(exports, "verifyAccessToken", { enumerable: true, get: function () { return verify_1.verifyAccessToken; } });
21
+ var issuer_1 = require("./issuer");
22
+ Object.defineProperty(exports, "getIssuer", { enumerable: true, get: function () { return issuer_1.getIssuer; } });
23
+ Object.defineProperty(exports, "getExpiry", { enumerable: true, get: function () { return issuer_1.getExpiry; } });
24
+ const pkce_2 = require("./pkce");
25
+ const authorize_url_2 = require("./authorize-url");
26
+ const exchange_code_2 = require("./exchange-code");
27
+ const refresh_2 = require("./refresh");
28
+ const verify_2 = require("./verify");
29
+ const issuer_2 = require("./issuer");
30
+ /**
31
+ * Default singleton namespace for callers using the package singleton.
32
+ * import { auth } from '@uengage.io/platform-sdk';
33
+ * const pkce = auth.generatePKCE();
34
+ */
35
+ exports.auth = {
36
+ generatePKCE: pkce_2.generatePKCE,
37
+ createAuthorizeUrl: authorize_url_2.createAuthorizeUrl,
38
+ exchangeCode: exchange_code_2.exchangeCode,
39
+ refresh: refresh_2.refresh,
40
+ verifyAccessToken: verify_2.verifyAccessToken,
41
+ getIssuer: issuer_2.getIssuer,
42
+ getExpiry: issuer_2.getExpiry,
43
+ };
44
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYXV0aC9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQTs7Ozs7R0FLRztBQUNILCtCQUFxRDtBQUE1QyxvR0FBQSxZQUFZLE9BQUE7QUFDckIsaURBQTZFO0FBQXBFLG1IQUFBLGtCQUFrQixPQUFBO0FBQzNCLGlEQUt5QjtBQUp2Qiw2R0FBQSxZQUFZLE9BQUE7QUFDWixtSEFBQSxrQkFBa0IsT0FBQTtBQUlwQixxQ0FBdUQ7QUFBOUMsa0dBQUEsT0FBTyxPQUFBO0FBQ2hCLG1DQUE2QztBQUFwQywyR0FBQSxpQkFBaUIsT0FBQTtBQUMxQixtQ0FBZ0Q7QUFBdkMsbUdBQUEsU0FBUyxPQUFBO0FBQUUsbUdBQUEsU0FBUyxPQUFBO0FBRTdCLGlDQUFzQztBQUN0QyxtREFBcUQ7QUFDckQsbURBQStDO0FBQy9DLHVDQUFvQztBQUNwQyxxQ0FBNkM7QUFDN0MscUNBQWdEO0FBRWhEOzs7O0dBSUc7QUFDVSxRQUFBLElBQUksR0FBRztJQUNsQixZQUFZLEVBQVosbUJBQVk7SUFDWixrQkFBa0IsRUFBbEIsa0NBQWtCO0lBQ2xCLFlBQVksRUFBWiw0QkFBWTtJQUNaLE9BQU8sRUFBUCxpQkFBTztJQUNQLGlCQUFpQixFQUFqQiwwQkFBaUI7SUFDakIsU0FBUyxFQUFULGtCQUFTO0lBQ1QsU0FBUyxFQUFULGtCQUFTO0NBQ1YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQXV0aCBuYW1lc3BhY2U6IGhlbHBlcnMgZm9yIE9BdXRoMiBmbG93cyBhZ2FpbnN0IHRoZSBwbGF0Zm9ybSdzXG4gKiBgL2F1dGgvYnVzaW5lc3MvKmAgc3VyZmFjZS4gQ29uc3VtZXJzIGRvbid0IGJha2UgYSBgY2xpZW50X2lkYCBpbnRvXG4gKiB0aGUgU0RLIGl0c2VsZiDigJQgZXZlcnkgaGVscGVyIHRha2VzIHBhcmFtZXRlcnMgZXhwbGljaXRseSBzbyBtdWx0aXBsZVxuICogT0F1dGggY2xpZW50cyAoZGFzaGJvYXJkLCBtb2JpbGUsIEJGRnMpIGNhbiBzaGFyZSBvbmUgU0RLIGluc3RhbGwuXG4gKi9cbmV4cG9ydCB7IGdlbmVyYXRlUEtDRSwgdHlwZSBQa2NlUGFpciB9IGZyb20gJy4vcGtjZSc7XG5leHBvcnQgeyBjcmVhdGVBdXRob3JpemVVcmwsIHR5cGUgQXV0aG9yaXplVXJsSW5wdXQgfSBmcm9tICcuL2F1dGhvcml6ZS11cmwnO1xuZXhwb3J0IHtcbiAgZXhjaGFuZ2VDb2RlLFxuICBwYXJzZVRva2VuUmVzcG9uc2UsXG4gIHR5cGUgRXhjaGFuZ2VDb2RlSW5wdXQsXG4gIHR5cGUgVG9rZW5QYWlyLFxufSBmcm9tICcuL2V4Y2hhbmdlLWNvZGUnO1xuZXhwb3J0IHsgcmVmcmVzaCwgdHlwZSBSZWZyZXNoSW5wdXQgfSBmcm9tICcuL3JlZnJlc2gnO1xuZXhwb3J0IHsgdmVyaWZ5QWNjZXNzVG9rZW4gfSBmcm9tICcuL3ZlcmlmeSc7XG5leHBvcnQgeyBnZXRJc3N1ZXIsIGdldEV4cGlyeSB9IGZyb20gJy4vaXNzdWVyJztcblxuaW1wb3J0IHsgZ2VuZXJhdGVQS0NFIH0gZnJvbSAnLi9wa2NlJztcbmltcG9ydCB7IGNyZWF0ZUF1dGhvcml6ZVVybCB9IGZyb20gJy4vYXV0aG9yaXplLXVybCc7XG5pbXBvcnQgeyBleGNoYW5nZUNvZGUgfSBmcm9tICcuL2V4Y2hhbmdlLWNvZGUnO1xuaW1wb3J0IHsgcmVmcmVzaCB9IGZyb20gJy4vcmVmcmVzaCc7XG5pbXBvcnQgeyB2ZXJpZnlBY2Nlc3NUb2tlbiB9IGZyb20gJy4vdmVyaWZ5JztcbmltcG9ydCB7IGdldElzc3VlciwgZ2V0RXhwaXJ5IH0gZnJvbSAnLi9pc3N1ZXInO1xuXG4vKipcbiAqIERlZmF1bHQgc2luZ2xldG9uIG5hbWVzcGFjZSBmb3IgY2FsbGVycyB1c2luZyB0aGUgcGFja2FnZSBzaW5nbGV0b24uXG4gKiAgIGltcG9ydCB7IGF1dGggfSBmcm9tICdAdWVuZ2FnZS5pby9wbGF0Zm9ybS1zZGsnO1xuICogICBjb25zdCBwa2NlID0gYXV0aC5nZW5lcmF0ZVBLQ0UoKTtcbiAqL1xuZXhwb3J0IGNvbnN0IGF1dGggPSB7XG4gIGdlbmVyYXRlUEtDRSxcbiAgY3JlYXRlQXV0aG9yaXplVXJsLFxuICBleGNoYW5nZUNvZGUsXG4gIHJlZnJlc2gsXG4gIHZlcmlmeUFjY2Vzc1Rva2VuLFxuICBnZXRJc3N1ZXIsXG4gIGdldEV4cGlyeSxcbn07XG4iXX0=
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Decode (without verifying) a JWT and return its `iss` claim. Used by
3
+ * the SDK to route subsequent auth-related calls (refresh, future
4
+ * logout) at `${iss}/...`, so tokens from different issuers are
5
+ * routed correctly when customer-auth ships alongside business-auth.
6
+ */
7
+ export declare function getIssuer(token: string): string | null;
8
+ /** Decode (without verifying) a JWT and return its `exp` claim (unix seconds). */
9
+ export declare function getExpiry(token: string): number | null;
@@ -0,0 +1,42 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getIssuer = getIssuer;
4
+ exports.getExpiry = getExpiry;
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.
10
+ */
11
+ function getIssuer(token) {
12
+ const parts = token.split('.');
13
+ if (parts.length !== 3)
14
+ return null;
15
+ 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;
21
+ }
22
+ catch {
23
+ return null;
24
+ }
25
+ }
26
+ /** Decode (without verifying) a JWT and return its `exp` claim (unix seconds). */
27
+ function getExpiry(token) {
28
+ const parts = token.split('.');
29
+ if (parts.length !== 3)
30
+ 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
+ }
41
+ }
42
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaXNzdWVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2F1dGgvaXNzdWVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBTUEsOEJBWUM7QUFHRCw4QkFZQztBQWpDRDs7Ozs7R0FLRztBQUNILFNBQWdCLFNBQVMsQ0FBQyxLQUFhO0lBQ3JDLE1BQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDL0IsSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUM7UUFBRSxPQUFPLElBQUksQ0FBQztJQUNwQyxJQUFJLENBQUM7UUFDSCxNQUFNLE9BQU8sR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQy9ELE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ3RGLE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUM1RCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBNEIsQ0FBQztRQUMzRCxPQUFPLE9BQU8sTUFBTSxDQUFDLEdBQUcsS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztJQUM1RCxDQUFDO0lBQUMsTUFBTSxDQUFDO1FBQ1AsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0FBQ0gsQ0FBQztBQUVELGtGQUFrRjtBQUNsRixTQUFnQixTQUFTLENBQUMsS0FBYTtJQUNyQyxNQUFNLEtBQUssR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQy9CLElBQUksS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDO1FBQUUsT0FBTyxJQUFJLENBQUM7SUFDcEMsSUFBSSxDQUFDO1FBQ0gsTUFBTSxPQUFPLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQztRQUMvRCxNQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUN0RixNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDNUQsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQTRCLENBQUM7UUFDM0QsT0FBTyxPQUFPLE1BQU0sQ0FBQyxHQUFHLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDNUQsQ0FBQztJQUFDLE1BQU0sQ0FBQztRQUNQLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIERlY29kZSAod2l0aG91dCB2ZXJpZnlpbmcpIGEgSldUIGFuZCByZXR1cm4gaXRzIGBpc3NgIGNsYWltLiBVc2VkIGJ5XG4gKiB0aGUgU0RLIHRvIHJvdXRlIHN1YnNlcXVlbnQgYXV0aC1yZWxhdGVkIGNhbGxzIChyZWZyZXNoLCBmdXR1cmVcbiAqIGxvZ291dCkgYXQgYCR7aXNzfS8uLi5gLCBzbyB0b2tlbnMgZnJvbSBkaWZmZXJlbnQgaXNzdWVycyBhcmVcbiAqIHJvdXRlZCBjb3JyZWN0bHkgd2hlbiBjdXN0b21lci1hdXRoIHNoaXBzIGFsb25nc2lkZSBidXNpbmVzcy1hdXRoLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0SXNzdWVyKHRva2VuOiBzdHJpbmcpOiBzdHJpbmcgfCBudWxsIHtcbiAgY29uc3QgcGFydHMgPSB0b2tlbi5zcGxpdCgnLicpO1xuICBpZiAocGFydHMubGVuZ3RoICE9PSAzKSByZXR1cm4gbnVsbDtcbiAgdHJ5IHtcbiAgICBjb25zdCBwYXlsb2FkID0gcGFydHNbMV0ucmVwbGFjZSgvLS9nLCAnKycpLnJlcGxhY2UoL18vZywgJy8nKTtcbiAgICBjb25zdCBwYWRkZWQgPSBwYXlsb2FkLnBhZEVuZChwYXlsb2FkLmxlbmd0aCArICgoNCAtIChwYXlsb2FkLmxlbmd0aCAlIDQpKSAlIDQpLCAnPScpO1xuICAgIGNvbnN0IGpzb24gPSBCdWZmZXIuZnJvbShwYWRkZWQsICdiYXNlNjQnKS50b1N0cmluZygndXRmOCcpO1xuICAgIGNvbnN0IGNsYWltcyA9IEpTT04ucGFyc2UoanNvbikgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgcmV0dXJuIHR5cGVvZiBjbGFpbXMuaXNzID09PSAnc3RyaW5nJyA/IGNsYWltcy5pc3MgOiBudWxsO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG4vKiogRGVjb2RlICh3aXRob3V0IHZlcmlmeWluZykgYSBKV1QgYW5kIHJldHVybiBpdHMgYGV4cGAgY2xhaW0gKHVuaXggc2Vjb25kcykuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RXhwaXJ5KHRva2VuOiBzdHJpbmcpOiBudW1iZXIgfCBudWxsIHtcbiAgY29uc3QgcGFydHMgPSB0b2tlbi5zcGxpdCgnLicpO1xuICBpZiAocGFydHMubGVuZ3RoICE9PSAzKSByZXR1cm4gbnVsbDtcbiAgdHJ5IHtcbiAgICBjb25zdCBwYXlsb2FkID0gcGFydHNbMV0ucmVwbGFjZSgvLS9nLCAnKycpLnJlcGxhY2UoL18vZywgJy8nKTtcbiAgICBjb25zdCBwYWRkZWQgPSBwYXlsb2FkLnBhZEVuZChwYXlsb2FkLmxlbmd0aCArICgoNCAtIChwYXlsb2FkLmxlbmd0aCAlIDQpKSAlIDQpLCAnPScpO1xuICAgIGNvbnN0IGpzb24gPSBCdWZmZXIuZnJvbShwYWRkZWQsICdiYXNlNjQnKS50b1N0cmluZygndXRmOCcpO1xuICAgIGNvbnN0IGNsYWltcyA9IEpTT04ucGFyc2UoanNvbikgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgcmV0dXJuIHR5cGVvZiBjbGFpbXMuZXhwID09PSAnbnVtYmVyJyA/IGNsYWltcy5leHAgOiBudWxsO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuIl19
@@ -0,0 +1,13 @@
1
+ /**
2
+ * PKCE (RFC 7636) S256 helper. Browser callers should pull `randomBytes`
3
+ * via the WebCrypto path instead — this package targets Node + bundlers
4
+ * that polyfill `node:crypto`. When the SDK ships a browser-only build
5
+ * we'll add a parallel implementation using `crypto.getRandomValues`.
6
+ */
7
+ export interface PkcePair {
8
+ codeVerifier: string;
9
+ codeChallenge: string;
10
+ codeChallengeMethod: 'S256';
11
+ }
12
+ export declare function generatePKCE(): PkcePair;
13
+ export declare function base64url(buf: Buffer): string;
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.generatePKCE = generatePKCE;
4
+ exports.base64url = base64url;
5
+ const node_crypto_1 = require("node:crypto");
6
+ function generatePKCE() {
7
+ const verifier = base64url((0, node_crypto_1.randomBytes)(32));
8
+ const challenge = base64url((0, node_crypto_1.createHash)('sha256').update(verifier).digest());
9
+ return { codeVerifier: verifier, codeChallenge: challenge, codeChallengeMethod: 'S256' };
10
+ }
11
+ function base64url(buf) {
12
+ return buf.toString('base64').replace(/\+/g, '-').replace(/\//g, '_').replace(/=+$/g, '');
13
+ }
14
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGtjZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hdXRoL3BrY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFjQSxvQ0FJQztBQUVELDhCQUVDO0FBdEJELDZDQUFzRDtBQWN0RCxTQUFnQixZQUFZO0lBQzFCLE1BQU0sUUFBUSxHQUFHLFNBQVMsQ0FBQyxJQUFBLHlCQUFXLEVBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUM1QyxNQUFNLFNBQVMsR0FBRyxTQUFTLENBQUMsSUFBQSx3QkFBVSxFQUFDLFFBQVEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO0lBQzVFLE9BQU8sRUFBRSxZQUFZLEVBQUUsUUFBUSxFQUFFLGFBQWEsRUFBRSxTQUFTLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxFQUFFLENBQUM7QUFDM0YsQ0FBQztBQUVELFNBQWdCLFNBQVMsQ0FBQyxHQUFXO0lBQ25DLE9BQU8sR0FBRyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsQ0FBQztBQUM1RixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgY3JlYXRlSGFzaCwgcmFuZG9tQnl0ZXMgfSBmcm9tICdub2RlOmNyeXB0byc7XG5cbi8qKlxuICogUEtDRSAoUkZDIDc2MzYpIFMyNTYgaGVscGVyLiBCcm93c2VyIGNhbGxlcnMgc2hvdWxkIHB1bGwgYHJhbmRvbUJ5dGVzYFxuICogdmlhIHRoZSBXZWJDcnlwdG8gcGF0aCBpbnN0ZWFkIOKAlCB0aGlzIHBhY2thZ2UgdGFyZ2V0cyBOb2RlICsgYnVuZGxlcnNcbiAqIHRoYXQgcG9seWZpbGwgYG5vZGU6Y3J5cHRvYC4gV2hlbiB0aGUgU0RLIHNoaXBzIGEgYnJvd3Nlci1vbmx5IGJ1aWxkXG4gKiB3ZSdsbCBhZGQgYSBwYXJhbGxlbCBpbXBsZW1lbnRhdGlvbiB1c2luZyBgY3J5cHRvLmdldFJhbmRvbVZhbHVlc2AuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGtjZVBhaXIge1xuICBjb2RlVmVyaWZpZXI6IHN0cmluZztcbiAgY29kZUNoYWxsZW5nZTogc3RyaW5nO1xuICBjb2RlQ2hhbGxlbmdlTWV0aG9kOiAnUzI1Nic7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZW5lcmF0ZVBLQ0UoKTogUGtjZVBhaXIge1xuICBjb25zdCB2ZXJpZmllciA9IGJhc2U2NHVybChyYW5kb21CeXRlcygzMikpO1xuICBjb25zdCBjaGFsbGVuZ2UgPSBiYXNlNjR1cmwoY3JlYXRlSGFzaCgnc2hhMjU2JykudXBkYXRlKHZlcmlmaWVyKS5kaWdlc3QoKSk7XG4gIHJldHVybiB7IGNvZGVWZXJpZmllcjogdmVyaWZpZXIsIGNvZGVDaGFsbGVuZ2U6IGNoYWxsZW5nZSwgY29kZUNoYWxsZW5nZU1ldGhvZDogJ1MyNTYnIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBiYXNlNjR1cmwoYnVmOiBCdWZmZXIpOiBzdHJpbmcge1xuICByZXR1cm4gYnVmLnRvU3RyaW5nKCdiYXNlNjQnKS5yZXBsYWNlKC9cXCsvZywgJy0nKS5yZXBsYWNlKC9cXC8vZywgJ18nKS5yZXBsYWNlKC89KyQvZywgJycpO1xufVxuIl19
@@ -0,0 +1,16 @@
1
+ import { type TokenPair } from './exchange-code';
2
+ export interface RefreshInput {
3
+ refreshToken: string;
4
+ /** Current access token; used to read `iss` for routing. */
5
+ accessToken: string;
6
+ clientId: string;
7
+ /** Override issuer-based routing for tests / non-standard flows. */
8
+ authBaseUrl?: string;
9
+ }
10
+ /**
11
+ * Trade an old refresh token for a fresh pair. Reads `iss` from the
12
+ * supplied access token so calls are routed back to the issuing auth
13
+ * service even when the SDK consumer has multiple issuers configured
14
+ * (business auth + future customer auth).
15
+ */
16
+ export declare function refresh(input: RefreshInput): Promise<TokenPair>;
@@ -0,0 +1,30 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.refresh = refresh;
4
+ const errors_1 = require("../errors");
5
+ const exchange_code_1 = require("./exchange-code");
6
+ const issuer_1 = require("./issuer");
7
+ /**
8
+ * Trade an old refresh token for a fresh pair. Reads `iss` from the
9
+ * supplied access token so calls are routed back to the issuing auth
10
+ * service even when the SDK consumer has multiple issuers configured
11
+ * (business auth + future customer auth).
12
+ */
13
+ async function refresh(input) {
14
+ const issuer = input.authBaseUrl ?? (0, issuer_1.getIssuer)(input.accessToken);
15
+ if (!issuer) {
16
+ throw new errors_1.ConfigError('cannot refresh: access token has no `iss` claim and no authBaseUrl was provided');
17
+ }
18
+ const body = new URLSearchParams({
19
+ grant_type: 'refresh_token',
20
+ refresh_token: input.refreshToken,
21
+ client_id: input.clientId,
22
+ });
23
+ const res = await fetch(`${issuer}/oauth/token`, {
24
+ method: 'POST',
25
+ headers: { 'content-type': 'application/x-www-form-urlencoded' },
26
+ body: body.toString(),
27
+ });
28
+ return (0, exchange_code_1.parseTokenResponse)(res);
29
+ }
30
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVmcmVzaC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hdXRoL3JlZnJlc2gudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFtQkEsMEJBa0JDO0FBckNELHNDQUF3QztBQUN4QyxtREFBcUU7QUFDckUscUNBQXFDO0FBV3JDOzs7OztHQUtHO0FBQ0ksS0FBSyxVQUFVLE9BQU8sQ0FBQyxLQUFtQjtJQUMvQyxNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsV0FBVyxJQUFJLElBQUEsa0JBQVMsRUFBQyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDakUsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ1osTUFBTSxJQUFJLG9CQUFXLENBQ25CLGlGQUFpRixDQUNsRixDQUFDO0lBQ0osQ0FBQztJQUNELE1BQU0sSUFBSSxHQUFHLElBQUksZUFBZSxDQUFDO1FBQy9CLFVBQVUsRUFBRSxlQUFlO1FBQzNCLGFBQWEsRUFBRSxLQUFLLENBQUMsWUFBWTtRQUNqQyxTQUFTLEVBQUUsS0FBSyxDQUFDLFFBQVE7S0FDMUIsQ0FBQyxDQUFDO0lBQ0gsTUFBTSxHQUFHLEdBQUcsTUFBTSxLQUFLLENBQUMsR0FBRyxNQUFNLGNBQWMsRUFBRTtRQUMvQyxNQUFNLEVBQUUsTUFBTTtRQUNkLE9BQU8sRUFBRSxFQUFFLGNBQWMsRUFBRSxtQ0FBbUMsRUFBRTtRQUNoRSxJQUFJLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRTtLQUN0QixDQUFDLENBQUM7SUFDSCxPQUFPLElBQUEsa0NBQWtCLEVBQUMsR0FBRyxDQUFDLENBQUM7QUFDakMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbmZpZ0Vycm9yIH0gZnJvbSAnLi4vZXJyb3JzJztcbmltcG9ydCB7IHBhcnNlVG9rZW5SZXNwb25zZSwgdHlwZSBUb2tlblBhaXIgfSBmcm9tICcuL2V4Y2hhbmdlLWNvZGUnO1xuaW1wb3J0IHsgZ2V0SXNzdWVyIH0gZnJvbSAnLi9pc3N1ZXInO1xuXG5leHBvcnQgaW50ZXJmYWNlIFJlZnJlc2hJbnB1dCB7XG4gIHJlZnJlc2hUb2tlbjogc3RyaW5nO1xuICAvKiogQ3VycmVudCBhY2Nlc3MgdG9rZW47IHVzZWQgdG8gcmVhZCBgaXNzYCBmb3Igcm91dGluZy4gKi9cbiAgYWNjZXNzVG9rZW46IHN0cmluZztcbiAgY2xpZW50SWQ6IHN0cmluZztcbiAgLyoqIE92ZXJyaWRlIGlzc3Vlci1iYXNlZCByb3V0aW5nIGZvciB0ZXN0cyAvIG5vbi1zdGFuZGFyZCBmbG93cy4gKi9cbiAgYXV0aEJhc2VVcmw/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogVHJhZGUgYW4gb2xkIHJlZnJlc2ggdG9rZW4gZm9yIGEgZnJlc2ggcGFpci4gUmVhZHMgYGlzc2AgZnJvbSB0aGVcbiAqIHN1cHBsaWVkIGFjY2VzcyB0b2tlbiBzbyBjYWxscyBhcmUgcm91dGVkIGJhY2sgdG8gdGhlIGlzc3VpbmcgYXV0aFxuICogc2VydmljZSBldmVuIHdoZW4gdGhlIFNESyBjb25zdW1lciBoYXMgbXVsdGlwbGUgaXNzdWVycyBjb25maWd1cmVkXG4gKiAoYnVzaW5lc3MgYXV0aCArIGZ1dHVyZSBjdXN0b21lciBhdXRoKS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlZnJlc2goaW5wdXQ6IFJlZnJlc2hJbnB1dCk6IFByb21pc2U8VG9rZW5QYWlyPiB7XG4gIGNvbnN0IGlzc3VlciA9IGlucHV0LmF1dGhCYXNlVXJsID8/IGdldElzc3VlcihpbnB1dC5hY2Nlc3NUb2tlbik7XG4gIGlmICghaXNzdWVyKSB7XG4gICAgdGhyb3cgbmV3IENvbmZpZ0Vycm9yKFxuICAgICAgJ2Nhbm5vdCByZWZyZXNoOiBhY2Nlc3MgdG9rZW4gaGFzIG5vIGBpc3NgIGNsYWltIGFuZCBubyBhdXRoQmFzZVVybCB3YXMgcHJvdmlkZWQnLFxuICAgICk7XG4gIH1cbiAgY29uc3QgYm9keSA9IG5ldyBVUkxTZWFyY2hQYXJhbXMoe1xuICAgIGdyYW50X3R5cGU6ICdyZWZyZXNoX3Rva2VuJyxcbiAgICByZWZyZXNoX3Rva2VuOiBpbnB1dC5yZWZyZXNoVG9rZW4sXG4gICAgY2xpZW50X2lkOiBpbnB1dC5jbGllbnRJZCxcbiAgfSk7XG4gIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKGAke2lzc3Vlcn0vb2F1dGgvdG9rZW5gLCB7XG4gICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgaGVhZGVyczogeyAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCcgfSxcbiAgICBib2R5OiBib2R5LnRvU3RyaW5nKCksXG4gIH0pO1xuICByZXR1cm4gcGFyc2VUb2tlblJlc3BvbnNlKHJlcyk7XG59XG4iXX0=
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Verify an access token: fetches JWKS based on the token's `iss`,
3
+ * verifies the RSA signature, and returns the claims. Throws on any
4
+ * failure so callers can `try/catch` once instead of branching on a
5
+ * boolean.
6
+ *
7
+ * The verification itself happens via `jose`'s `jwtVerify`, but to
8
+ * keep this module lightweight (and to avoid pulling jose into the
9
+ * Browser bundle when consumers only want the URL helpers) we
10
+ * dynamic-import it. Tree-shakers will drop the import for code paths
11
+ * that never call `verifyAccessToken`.
12
+ */
13
+ export declare function verifyAccessToken(token: string, options?: {
14
+ audience?: string;
15
+ }): Promise<Record<string, unknown>>;
16
+ /** Test-only: clear the JWKS cache. */
17
+ export declare function _resetJwksCache(): void;