@uengage.io/platform-sdk 0.6.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.
- package/dist/audit/client.d.ts +8 -0
- package/dist/audit/client.js +11 -18
- package/dist/audit/index.d.ts +0 -1
- package/dist/audit/index.js +2 -4
- package/dist/client.d.ts +25 -22
- package/dist/client.js +28 -45
- package/dist/config.d.ts +10 -15
- package/dist/config.js +11 -16
- package/dist/http.d.ts +7 -3
- package/dist/http.js +11 -26
- package/dist/index.d.ts +10 -7
- package/dist/index.js +11 -8
- package/dist/version.d.ts +1 -1
- package/dist/version.js +2 -2
- package/package.json +1 -1
- package/dist/audit/sign.d.ts +0 -24
- package/dist/audit/sign.js +0 -30
package/dist/audit/client.d.ts
CHANGED
|
@@ -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. */
|
package/dist/audit/client.js
CHANGED
|
@@ -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
|
|
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
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
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:
|
|
62
|
+
actor: { ...input.actor, via: actorVia },
|
|
70
63
|
};
|
|
71
64
|
const result = schema_1.auditEventSchema.safeParse(candidate);
|
|
72
65
|
if (!result.success) {
|
|
@@ -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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LEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUMvQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdWxpZCB9IGZyb20gJ3VsaWQnO1xuaW1wb3J0IHR5cGUgeyBMb2dnZXIgfSBmcm9tICdAdWVuZ2FnZS5pby9qcy1sb2dnZXInO1xuaW1wb3J0IHtcbiAgQ29uZmlnU3RhdGUsXG4gIHR5cGUgUGxhdGZvcm1BdXRoLFxuICB0eXBlIFBsYXRmb3JtQXV0aElucHV0LFxuICB0eXBlIFBsYXRmb3JtQ29uZmlnSW5wdXQsXG59IGZyb20gJy4uL2NvbmZpZyc7XG5pbXBvcnQgeyBidWlsZEhlYWRlcnMgfSBmcm9tICcuLi9odHRwJztcbmltcG9ydCB7IGF1ZGl0RXZlbnRTY2hlbWEsIHR5cGUgQXVkaXRFdmVudCB9IGZyb20gJy4vc2NoZW1hJztcblxuLyoqXG4gKiBDYWxsZXItZmFjaW5nIGV2ZW50IHNoYXBlLiBUaGUgU0RLIGZpbGxzOlxuICogICAtIGBldmVudF9pZGAgICAoVUxJRCwgZ2VuZXJhdGVkIHBlciBjYWxsKVxuICogICAtIGBvY2N1cnJlZF9hdGAgKFVUQyBJU08gODYwMSBhdCB0aGUgdGltZSBvZiBgcmVjb3JkKClgKVxuICogICAtIGBhY3Rvci52aWFgICAoYWx3YXlzIHNldCB0byB0aGUgY29uZmlndXJlZCBzZXJ2aWNlSWQsIHNvIGNhbGxlcnNcbiAqICAgICAgICAgICAgICAgICAgIGNhbid0IGRyaWZ0IGZyb20gdGhlIHNlcnZpY2UgaWRlbnRpdHkgdXNlZCBmb3IgYXV0aClcbiAqL1xuZXhwb3J0IHR5cGUgQXVkaXRFdmVudElucHV0ID0gT21pdDxBdWRpdEV2ZW50LCAnZXZlbnRfaWQnIHwgJ29jY3VycmVkX2F0JyB8ICdhY3Rvcic+ICYge1xuICBhY3RvcjogT21pdDxBdWRpdEV2ZW50WydhY3RvciddLCAndmlhJz47XG59O1xuXG5leHBvcnQgaW50ZXJmYWNlIEF1ZGl0Q2xpZW50SW5wdXQgZXh0ZW5kcyBQbGF0Zm9ybUNvbmZpZ0lucHV0IHtcbiAgLyoqIERlZmF1bHQgNTAwMC4gKi9cbiAgZmx1c2hJbnRlcnZhbE1zPzogbnVtYmVyO1xuICAvKiogRGVmYXVsdCA1MC4gKi9cbiAgbWF4QmF0Y2hTaXplPzogbnVtYmVyO1xuICAvKiogRGVmYXVsdCAxMDAwLiBOZXcgZXZlbnRzIHBhc3QgdGhpcyBhcmUgZHJvcHBlZCB3aXRoIGEgd2FybmluZy4gKi9cbiAgbWF4UXVldWVTaXplPzogbnVtYmVyO1xuICAvKiogRGVmYXVsdCB0cnVlLiBTZXQgZmFsc2UgdG8gZGlzYWJsZSB0aGUgYXV0by1mbHVzaCB0aW1lciAodGVzdCBvbmx5KS4gKi9cbiAgZW5hYmxlVGltZXI/OiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEF1ZGl0Q2xpZW50IHtcbiAgY29uZmlnKGlucHV0OiBQbGF0Zm9ybUNvbmZpZ0lucHV0KTogQXVkaXRDbGllbnQ7XG4gIGF1dGgoaW5wdXQ6IFBsYXRmb3JtQXV0aElucHV0IHwgUGxhdGZvcm1BdXRoKTogQXVkaXRDbGllbnQ7XG4gIHJlY29yZChldmVudDogQXVkaXRFdmVudElucHV0KTogdm9pZDtcbiAgZmx1c2goKTogUHJvbWlzZTx2b2lkPjtcbn1cblxuY29uc3QgUEFUSCA9ICcvdjEvYXVkaXQvZXZlbnRzJztcbmNvbnN0IFJFVFJZX0RFTEFZU19NUyA9IFs1MDAsIDIwMDAsIDgwMDBdO1xuXG5jb25zdCBOT09QX0xPR0dFUiA9IHtcbiAgZXJyb3I6ICgpID0+IHt9LFxuICB3YXJuOiAoKSA9PiB7fSxcbiAgaW5mbzogKCkgPT4ge30sXG4gIGRlYnVnOiAoKSA9PiB7fSxcbiAgY2hpbGQoKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG59IGFzIHVua25vd24gYXMgTG9nZ2VyO1xuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlQXVkaXRDbGllbnQoaW5wdXQ6IEF1ZGl0Q2xpZW50SW5wdXQgPSB7fSk6IEF1ZGl0Q2xpZW50IHtcbiAgY29uc3Qgc3RhdGUgPSBuZXcgQ29uZmlnU3RhdGUoKTtcbiAgY29uc3QgZmx1c2hJbnRlcnZhbE1zID0gaW5wdXQuZmx1c2hJbnRlcnZhbE1zID8/IDUwMDA7XG4gIGNvbnN0IG1heEJhdGNoU2l6ZSA9IGlucHV0Lm1heEJhdGNoU2l6ZSA/PyA1MDtcbiAgY29uc3QgbWF4UXVldWVTaXplID0gaW5wdXQubWF4UXVldWVTaXplID8/IDEwMDA7XG4gIGNvbnN0IGVuYWJsZVRpbWVyID0gaW5wdXQuZW5hYmxlVGltZXIgPz8gdHJ1ZTtcblxuICBjb25zdCB7XG4gICAgZmx1c2hJbnRlcnZhbE1zOiBfZixcbiAgICBtYXhCYXRjaFNpemU6IF9iLFxuICAgIG1heFF1ZXVlU2l6ZTogX3EsXG4gICAgZW5hYmxlVGltZXI6IF90LFxuICAgIC4uLnJlc3RcbiAgfSA9IGlucHV0O1xuICB2b2lkIF9mO1xuICB2b2lkIF9iO1xuICB2b2lkIF9xO1xuICB2b2lkIF90O1xuICBzdGF0ZS5hcHBseShyZXN0KTtcblxuICBjb25zdCBxdWV1ZTogQXVkaXRFdmVudFtdID0gW107XG4gIGNvbnN0IGluZmxpZ2h0OiBQcm9taXNlPHZvaWQ+W10gPSBbXTtcblxuICBmdW5jdGlvbiBnZXRMb2dnZXIoKTogTG9nZ2VyIHtcbiAgICByZXR1cm4gc3RhdGUucmVzb2x2ZSgpLmxvZ2dlciA/PyBOT09QX0xPR0dFUjtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldFNlcnZpY2VJZCgpOiBzdHJpbmcge1xuICAgIGNvbnN0IGNvbmZpZyA9IHN0YXRlLnJlc29sdmUoKTtcbiAgICBpZiAoIWNvbmZpZy5hdXRoIHx8IGNvbmZpZy5hdXRoLnR5cGUgIT09ICdobWFjJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnYXVkaXQgY2xpZW50IHJlcXVpcmVzIEhNQUMgYXV0aCAoc2V0IFBMQVRGT1JNX1NJR05JTkdfU0VDUkVUICsgUExBVEZPUk1fU0VSVklDRV9JRCwgb3IgY2FsbCAuYXV0aCh7c2VjcmV0LCBzZXJ2aWNlSWR9KSknLFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIGNvbmZpZy5hdXRoLnNlcnZpY2VJZDtcbiAgfVxuXG4gIGNvbnN0IGNsaWVudDogQXVkaXRDbGllbnQgPSB7XG4gICAgY29uZmlnKG9wdHMpIHtcbiAgICAgIHN0YXRlLmFwcGx5KG9wdHMpO1xuICAgICAgcmV0dXJuIGNsaWVudDtcbiAgICB9LFxuICAgIGF1dGgob3B0cykge1xuICAgICAgc3RhdGUuc2V0QXV0aChvcHRzKTtcbiAgICAgIHJldHVybiBjbGllbnQ7XG4gICAgfSxcbiAgICByZWNvcmQoaW5wdXQpIHtcbiAgICAgIGNvbnN0IGxvZ2dlciA9IGdldExvZ2dlcigpO1xuICAgICAgbGV0IHNlcnZpY2VJZDogc3RyaW5nO1xuICAgICAgdHJ5IHtcbiAgICAgICAgc2VydmljZUlkID0gZ2V0U2VydmljZUlkKCk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgbG9nZ2VyLmVycm9yKCdhdWRpdF9zZGsubm9fYXV0aCcsIHtcbiAgICAgICAgICBlcnJvcjogeyBjb2RlOiAnQVVESVRfTk9fQVVUSCcsIGNhdGVnb3J5OiAnZW5naW5lZXJpbmcnIH0sXG4gICAgICAgICAgY29udGV4dDogeyBtZXNzYWdlOiAoZXJyIGFzIEVycm9yKS5tZXNzYWdlIH0sXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGNhbmRpZGF0ZTogQXVkaXRFdmVudCA9IHtcbiAgICAgICAgLi4uaW5wdXQsXG4gICAgICAgIGV2ZW50X2lkOiB1bGlkKCksXG4gICAgICAgIG9jY3VycmVkX2F0OiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCkucmVwbGFjZSgvXFwuXFxkezN9WiQvLCAnWicpLFxuICAgICAgICBhY3RvcjogeyAuLi5pbnB1dC5hY3RvciwgdmlhOiBzZXJ2aWNlSWQgfSxcbiAgICAgIH07XG4gICAgICBjb25zdCByZXN1bHQgPSBhdWRpdEV2ZW50U2NoZW1hLnNhZmVQYXJzZShjYW5kaWRhdGUpO1xuICAgICAgaWYgKCFyZXN1bHQuc3VjY2Vzcykge1xuICAgICAgICBsb2dnZXIuZXJyb3IoJ2F1ZGl0X3Nkay5pbnZhbGlkX2V2ZW50Jywge1xuICAgICAgICAgIGVycm9yOiB7IGNvZGU6ICdBVURJVF9JTlZBTElEX0VWRU5UJywgY2F0ZWdvcnk6ICdlbmdpbmVlcmluZycgfSxcbiAgICAgICAgICBjb250ZXh0OiB7IGlzc3VlczogcmVzdWx0LmVycm9yLmlzc3VlcywgZXZlbnQ6IGNhbmRpZGF0ZSB9LFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKHF1ZXVlLmxlbmd0aCA+PSBtYXhRdWV1ZVNpemUpIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oJ2F1ZGl0X3Nkay5xdWV1ZV9mdWxsJywge1xuICAgICAgICAgIGNvbnRleHQ6IHsgZHJvcHBlZF9ldmVudF9pZDogY2FuZGlkYXRlLmV2ZW50X2lkLCBtYXhfcXVldWVfc2l6ZTogbWF4UXVldWVTaXplIH0sXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBxdWV1ZS5wdXNoKHJlc3VsdC5kYXRhKTtcbiAgICAgIGlmIChxdWV1ZS5sZW5ndGggPj0gbWF4QmF0Y2hTaXplKSB7XG4gICAgICAgIHZvaWQgc2NoZWR1bGVTZW5kKCk7XG4gICAgICB9XG4gICAgfSxcbiAgICBhc3luYyBmbHVzaCgpIHtcbiAgICAgIGF3YWl0IHNjaGVkdWxlU2VuZCgpO1xuICAgICAgd2hpbGUgKGluZmxpZ2h0Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKFsuLi5pbmZsaWdodF0pO1xuICAgICAgfVxuICAgIH0sXG4gIH07XG5cbiAgYXN5bmMgZnVuY3Rpb24gc2NoZWR1bGVTZW5kKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHdoaWxlIChxdWV1ZS5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBiYXRjaCA9IHF1ZXVlLnNwbGljZSgwLCBtYXhCYXRjaFNpemUpO1xuICAgICAgY29uc3Qgc2VuZCA9IHNlbmRXaXRoUmV0cmllcyhiYXRjaCk7XG4gICAgICBpbmZsaWdodC5wdXNoKHNlbmQpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgc2VuZDtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGNvbnN0IGlkeCA9IGluZmxpZ2h0LmluZGV4T2Yoc2VuZCk7XG4gICAgICAgIGlmIChpZHggIT09IC0xKSBpbmZsaWdodC5zcGxpY2UoaWR4LCAxKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiBzZW5kV2l0aFJldHJpZXMoZXZlbnRzOiBBdWRpdEV2ZW50W10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBsb2dnZXIgPSBnZXRMb2dnZXIoKTtcbiAgICBjb25zdCBib2R5ID0gSlNPTi5zdHJpbmdpZnkoeyBldmVudHMgfSk7XG4gICAgZm9yIChsZXQgYXR0ZW1wdCA9IDA7IGF0dGVtcHQgPD0gUkVUUllfREVMQVlTX01TLmxlbmd0aDsgYXR0ZW1wdCsrKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBvayA9IGF3YWl0IHNlbmRPbmNlKGJvZHkpO1xuICAgICAgICBpZiAob2spIHJldHVybjtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBjb25zdCBlID0gZXJyIGFzIEVycm9yO1xuICAgICAgICBsb2dnZXIud2FybignYXVkaXRfc2RrLnNlbmRfZXJyb3InLCB7XG4gICAgICAgICAgY29udGV4dDogeyBhdHRlbXB0LCBtZXNzYWdlOiBlLm1lc3NhZ2UsIGJhdGNoX3NpemU6IGV2ZW50cy5sZW5ndGggfSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBpZiAoYXR0ZW1wdCA8IFJFVFJZX0RFTEFZU19NUy5sZW5ndGgpIHtcbiAgICAgICAgYXdhaXQgc2xlZXAoUkVUUllfREVMQVlTX01TW2F0dGVtcHRdKTtcbiAgICAgIH1cbiAgICB9XG4gICAgbG9nZ2VyLmVycm9yKCdhdWRpdF9zZGsuc2VuZF9mYWlsZWQnLCB7XG4gICAgICBlcnJvcjogeyBjb2RlOiAnQVVESVRfU0VORF9GQUlMRUQnLCBjYXRlZ29yeTogJ2VuZ2luZWVyaW5nJyB9LFxuICAgICAgY29udGV4dDogeyBiYXRjaF9zaXplOiBldmVudHMubGVuZ3RoLCBldmVudHMgfSxcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIHNlbmRPbmNlKGJvZHk6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IGNvbmZpZyA9IHN0YXRlLnJlc29sdmUoKTtcbiAgICBjb25zdCBsb2dnZXIgPSBnZXRMb2dnZXIoKTtcbiAgICBjb25zdCBoZWFkZXJzID0gYXdhaXQgYnVpbGRIZWFkZXJzKGNvbmZpZywgeyBtZXRob2Q6ICdQT1NUJywgcGF0aDogUEFUSCwgYm9keSB9KTtcbiAgICBjb25zdCByZXMgPSBhd2FpdCBjb25maWcuZmV0Y2hGbihgJHtjb25maWcuYmFzZVVybH0ke1BBVEh9YCwge1xuICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICBoZWFkZXJzLFxuICAgICAgYm9keSxcbiAgICB9KTtcbiAgICBpZiAocmVzLnN0YXR1cyA+PSA1MDApIHJldHVybiBmYWxzZTtcbiAgICBpZiAoIXJlcy5vayAmJiByZXMuc3RhdHVzICE9PSAyMDIpIHtcbiAgICAgIGxvZ2dlci5lcnJvcignYXVkaXRfc2RrLnJlamVjdGVkJywge1xuICAgICAgICBlcnJvcjogeyBjb2RlOiAnQVVESVRfUkVKRUNURUQnLCBjYXRlZ29yeTogJ2VuZ2luZWVyaW5nJyB9LFxuICAgICAgICBjb250ZXh0OiB7IHN0YXR1czogcmVzLnN0YXR1cyB9LFxuICAgICAgfSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBsZXQgdGltZXI6IFJldHVyblR5cGU8dHlwZW9mIHNldEludGVydmFsPiB8IHVuZGVmaW5lZDtcbiAgaWYgKGVuYWJsZVRpbWVyKSB7XG4gICAgdGltZXIgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgICB2b2lkIHNjaGVkdWxlU2VuZCgpO1xuICAgIH0sIGZsdXNoSW50ZXJ2YWxNcyk7XG4gICAgaWYgKHR5cGVvZiB0aW1lci51bnJlZiA9PT0gJ2Z1bmN0aW9uJykgdGltZXIudW5yZWYoKTtcbiAgfVxuXG4gIHJldHVybiBjbGllbnQ7XG59XG5cbmZ1bmN0aW9uIHNsZWVwKG1zOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyKSA9PiBzZXRUaW1lb3V0KHIsIG1zKSk7XG59XG4iXX0=
|
|
162
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2F1ZGl0L2NsaWVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQTZEQSw4Q0F1SkM7QUFwTkQsK0JBQTRCO0FBRTVCLHNDQUttQjtBQUNuQixrQ0FBdUM7QUFDdkMscUNBQTZEO0FBdUM3RCxNQUFNLElBQUksR0FBRyxrQkFBa0IsQ0FBQztBQUNoQyxNQUFNLGVBQWUsR0FBRyxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFFMUMsTUFBTSxXQUFXLEdBQUc7SUFDbEIsS0FBSyxFQUFFLEdBQUcsRUFBRSxHQUFFLENBQUM7SUFDZixJQUFJLEVBQUUsR0FBRyxFQUFFLEdBQUUsQ0FBQztJQUNkLElBQUksRUFBRSxHQUFHLEVBQUUsR0FBRSxDQUFDO0lBQ2QsS0FBSyxFQUFFLEdBQUcsRUFBRSxHQUFFLENBQUM7SUFDZixLQUFLO1FBQ0gsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0NBQ21CLENBQUM7QUFFdkIsU0FBZ0IsaUJBQWlCLENBQUMsUUFBMEIsRUFBRTtJQUM1RCxNQUFNLEtBQUssR0FBRyxJQUFJLG9CQUFXLEVBQUUsQ0FBQztJQUNoQyxNQUFNLGVBQWUsR0FBRyxLQUFLLENBQUMsZUFBZSxJQUFJLElBQUksQ0FBQztJQUN0RCxNQUFNLFlBQVksR0FBRyxLQUFLLENBQUMsWUFBWSxJQUFJLEVBQUUsQ0FBQztJQUM5QyxNQUFNLFlBQVksR0FBRyxLQUFLLENBQUMsWUFBWSxJQUFJLElBQUksQ0FBQztJQUNoRCxNQUFNLFdBQVcsR0FBRyxLQUFLLENBQUMsV0FBVyxJQUFJLElBQUksQ0FBQztJQUM5QyxNQUFNLFFBQVEsR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFDO0lBRWhDLE1BQU0sRUFDSixlQUFlLEVBQUUsRUFBRSxFQUNuQixZQUFZLEVBQUUsRUFBRSxFQUNoQixZQUFZLEVBQUUsRUFBRSxFQUNoQixXQUFXLEVBQUUsRUFBRSxFQUNmLFFBQVEsRUFBRSxFQUFFLEVBQ1osR0FBRyxJQUFJLEVBQ1IsR0FBRyxLQUFLLENBQUM7SUFDVixLQUFLLEVBQUUsQ0FBQztJQUNSLEtBQUssRUFBRSxDQUFDO0lBQ1IsS0FBSyxFQUFFLENBQUM7SUFDUixLQUFLLEVBQUUsQ0FBQztJQUNSLEtBQUssRUFBRSxDQUFDO0lBQ1IsS0FBSyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUVsQixNQUFNLEtBQUssR0FBaUIsRUFBRSxDQUFDO0lBQy9CLE1BQU0sUUFBUSxHQUFvQixFQUFFLENBQUM7SUFFckMsU0FBUyxTQUFTO1FBQ2hCLE9BQU8sS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDLE1BQU0sSUFBSSxXQUFXLENBQUM7SUFDL0MsQ0FBQztJQUVELE1BQU0sTUFBTSxHQUFnQjtRQUMxQixNQUFNLENBQUMsSUFBSTtZQUNULEtBQUssQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDbEIsT0FBTyxNQUFNLENBQUM7UUFDaEIsQ0FBQztRQUNELElBQUksQ0FBQyxJQUFJO1lBQ1AsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNwQixPQUFPLE1BQU0sQ0FBQztRQUNoQixDQUFDO1FBQ0QsTUFBTSxDQUFDLEtBQUs7WUFDVixNQUFNLE1BQU0sR0FBRyxTQUFTLEVBQUUsQ0FBQztZQUMzQixJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7Z0JBQ2QsTUFBTSxDQUFDLEtBQUssQ0FBQyw2QkFBNkIsRUFBRTtvQkFDMUMsS0FBSyxFQUFFLEVBQUUsSUFBSSxFQUFFLHlCQUF5QixFQUFFLFFBQVEsRUFBRSxhQUFhLEVBQUU7b0JBQ25FLE9BQU8sRUFBRTt3QkFDUCxPQUFPLEVBQ0wsaUtBQWlLO3FCQUNwSztpQkFDRixDQUFDLENBQUM7Z0JBQ0gsT0FBTztZQUNULENBQUM7WUFFRCxNQUFNLFNBQVMsR0FBZTtnQkFDNUIsR0FBRyxLQUFLO2dCQUNSLFFBQVEsRUFBRSxJQUFBLFdBQUksR0FBRTtnQkFDaEIsV0FBVyxFQUFFLElBQUksSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRSxHQUFHLENBQUM7Z0JBQy9ELEtBQUssRUFBRSxFQUFFLEdBQUcsS0FBSyxDQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsUUFBUSxFQUFFO2FBQ3pDLENBQUM7WUFDRixNQUFNLE1BQU0sR0FBRyx5QkFBZ0IsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDckQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQztnQkFDcEIsTUFBTSxDQUFDLEtBQUssQ0FBQyx5QkFBeUIsRUFBRTtvQkFDdEMsS0FBSyxFQUFFLEVBQUUsSUFBSSxFQUFFLHFCQUFxQixFQUFFLFFBQVEsRUFBRSxhQUFhLEVBQUU7b0JBQy9ELE9BQU8sRUFBRSxFQUFFLE1BQU0sRUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFO2lCQUMzRCxDQUFDLENBQUM7Z0JBQ0gsT0FBTztZQUNULENBQUM7WUFDRCxJQUFJLEtBQUssQ0FBQyxNQUFNLElBQUksWUFBWSxFQUFFLENBQUM7Z0JBQ2pDLE1BQU0sQ0FBQyxJQUFJLENBQUMsc0JBQXNCLEVBQUU7b0JBQ2xDLE9BQU8sRUFBRSxFQUFFLGdCQUFnQixFQUFFLFNBQVMsQ0FBQyxRQUFRLEVBQUUsY0FBYyxFQUFFLFlBQVksRUFBRTtpQkFDaEYsQ0FBQyxDQUFDO2dCQUNILE9BQU87WUFDVCxDQUFDO1lBQ0QsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDeEIsSUFBSSxLQUFLLENBQUMsTUFBTSxJQUFJLFlBQVksRUFBRSxDQUFDO2dCQUNqQyxLQUFLLFlBQVksRUFBRSxDQUFDO1lBQ3RCLENBQUM7UUFDSCxDQUFDO1FBQ0QsS0FBSyxDQUFDLEtBQUs7WUFDVCxNQUFNLFlBQVksRUFBRSxDQUFDO1lBQ3JCLE9BQU8sUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDM0IsTUFBTSxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUMsR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDO1lBQzFDLENBQUM7UUFDSCxDQUFDO0tBQ0YsQ0FBQztJQUVGLEtBQUssVUFBVSxZQUFZO1FBQ3pCLE9BQU8sS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUN4QixNQUFNLEtBQUssR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxZQUFZLENBQUMsQ0FBQztZQUM1QyxNQUFNLElBQUksR0FBRyxlQUFlLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDcEMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNwQixJQUFJLENBQUM7Z0JBQ0gsTUFBTSxJQUFJLENBQUM7WUFDYixDQUFDO29CQUFTLENBQUM7Z0JBQ1QsTUFBTSxHQUFHLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDbkMsSUFBSSxHQUFHLEtBQUssQ0FBQyxDQUFDO29CQUFFLFFBQVEsQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQzFDLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUVELEtBQUssVUFBVSxlQUFlLENBQUMsTUFBb0I7UUFDakQsTUFBTSxNQUFNLEdBQUcsU0FBUyxFQUFFLENBQUM7UUFDM0IsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUM7UUFDeEMsS0FBSyxJQUFJLE9BQU8sR0FBRyxDQUFDLEVBQUUsT0FBTyxJQUFJLGVBQWUsQ0FBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLEVBQUUsQ0FBQztZQUNuRSxJQUFJLENBQUM7Z0JBQ0gsTUFBTSxFQUFFLEdBQUcsTUFBTSxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ2hDLElBQUksRUFBRTtvQkFBRSxPQUFPO1lBQ2pCLENBQUM7WUFBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO2dCQUNiLE1BQU0sQ0FBQyxHQUFHLEdBQVksQ0FBQztnQkFDdkIsTUFBTSxDQUFDLElBQUksQ0FBQyxzQkFBc0IsRUFBRTtvQkFDbEMsT0FBTyxFQUFFLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUMsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLENBQUMsTUFBTSxFQUFFO2lCQUNwRSxDQUFDLENBQUM7WUFDTCxDQUFDO1lBQ0QsSUFBSSxPQUFPLEdBQUcsZUFBZSxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUNyQyxNQUFNLEtBQUssQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztZQUN4QyxDQUFDO1FBQ0gsQ0FBQztRQUNELE1BQU0sQ0FBQyxLQUFLLENBQUMsdUJBQXVCLEVBQUU7WUFDcEMsS0FBSyxFQUFFLEVBQUUsSUFBSSxFQUFFLG1CQUFtQixFQUFFLFFBQVEsRUFBRSxhQUFhLEVBQUU7WUFDN0QsT0FBTyxFQUFFLEVBQUUsVUFBVSxFQUFFLE1BQU0sQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFO1NBQy9DLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxLQUFLLFVBQVUsUUFBUSxDQUFDLElBQVk7UUFDbEMsTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQy9CLE1BQU0sTUFBTSxHQUFHLFNBQVMsRUFBRSxDQUFDO1FBQzNCLE1BQU0sT0FBTyxHQUFHLE1BQU0sSUFBQSxtQkFBWSxFQUFDLE1BQU0sRUFBRSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQ2pGLE1BQU0sR0FBRyxHQUFHLE1BQU0sTUFBTSxDQUFDLE9BQU8sQ0FBQyxHQUFHLE1BQU0sQ0FBQyxPQUFPLEdBQUcsSUFBSSxFQUFFLEVBQUU7WUFDM0QsTUFBTSxFQUFFLE1BQU07WUFDZCxPQUFPO1lBQ1AsSUFBSTtTQUNMLENBQUMsQ0FBQztRQUNILElBQUksR0FBRyxDQUFDLE1BQU0sSUFBSSxHQUFHO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFDcEMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLElBQUksR0FBRyxDQUFDLE1BQU0sS0FBSyxHQUFHLEVBQUUsQ0FBQztZQUNsQyxNQUFNLENBQUMsS0FBSyxDQUFDLG9CQUFvQixFQUFFO2dCQUNqQyxLQUFLLEVBQUUsRUFBRSxJQUFJLEVBQUUsZ0JBQWdCLEVBQUUsUUFBUSxFQUFFLGFBQWEsRUFBRTtnQkFDMUQsT0FBTyxFQUFFLEVBQUUsTUFBTSxFQUFFLEdBQUcsQ0FBQyxNQUFNLEVBQUU7YUFDaEMsQ0FBQyxDQUFDO1lBQ0gsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsSUFBSSxLQUFpRCxDQUFDO0lBQ3RELElBQUksV0FBVyxFQUFFLENBQUM7UUFDaEIsS0FBSyxHQUFHLFdBQVcsQ0FBQyxHQUFHLEVBQUU7WUFDdkIsS0FBSyxZQUFZLEVBQUUsQ0FBQztRQUN0QixDQUFDLEVBQUUsZUFBZSxDQUFDLENBQUM7UUFDcEIsSUFBSSxPQUFPLEtBQUssQ0FBQyxLQUFLLEtBQUssVUFBVTtZQUFFLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUN2RCxDQUFDO0lBRUQsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQztBQUVELFNBQVMsS0FBSyxDQUFDLEVBQVU7SUFDdkIsT0FBTyxJQUFJLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsVUFBVSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQy9DLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyB1bGlkIH0gZnJvbSAndWxpZCc7XG5pbXBvcnQgdHlwZSB7IExvZ2dlciB9IGZyb20gJ0B1ZW5nYWdlLmlvL2pzLWxvZ2dlcic7XG5pbXBvcnQge1xuICBDb25maWdTdGF0ZSxcbiAgdHlwZSBQbGF0Zm9ybUF1dGgsXG4gIHR5cGUgUGxhdGZvcm1BdXRoSW5wdXQsXG4gIHR5cGUgUGxhdGZvcm1Db25maWdJbnB1dCxcbn0gZnJvbSAnLi4vY29uZmlnJztcbmltcG9ydCB7IGJ1aWxkSGVhZGVycyB9IGZyb20gJy4uL2h0dHAnO1xuaW1wb3J0IHsgYXVkaXRFdmVudFNjaGVtYSwgdHlwZSBBdWRpdEV2ZW50IH0gZnJvbSAnLi9zY2hlbWEnO1xuXG4vKipcbiAqIENhbGxlci1mYWNpbmcgZXZlbnQgc2hhcGUuIFRoZSBTREsgZmlsbHM6XG4gKiAgIC0gYGV2ZW50X2lkYCAgIChVTElELCBnZW5lcmF0ZWQgcGVyIGNhbGwpXG4gKiAgIC0gYG9jY3VycmVkX2F0YCAoVVRDIElTTyA4NjAxIGF0IHRoZSB0aW1lIG9mIGByZWNvcmQoKWApXG4gKiAgIC0gYGFjdG9yLnZpYWAgIChhbHdheXMgc2V0IHRvIHRoZSBjb25maWd1cmVkIHNlcnZpY2VJZCwgc28gY2FsbGVyc1xuICogICAgICAgICAgICAgICAgICAgY2FuJ3QgZHJpZnQgZnJvbSB0aGUgc2VydmljZSBpZGVudGl0eSB1c2VkIGZvciBhdXRoKVxuICovXG5leHBvcnQgdHlwZSBBdWRpdEV2ZW50SW5wdXQgPSBPbWl0PEF1ZGl0RXZlbnQsICdldmVudF9pZCcgfCAnb2NjdXJyZWRfYXQnIHwgJ2FjdG9yJz4gJiB7XG4gIGFjdG9yOiBPbWl0PEF1ZGl0RXZlbnRbJ2FjdG9yJ10sICd2aWEnPjtcbn07XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXVkaXRDbGllbnRJbnB1dCBleHRlbmRzIFBsYXRmb3JtQ29uZmlnSW5wdXQge1xuICAvKipcbiAgICogU2VydmljZSBpZGVudGlmaWVyIHRoZSBwcm9kdWNlciBpcyBhY3RpbmcgYXMuIFN0YW1wZWQgaW50b1xuICAgKiBgYWN0b3IudmlhYCBvbiBldmVyeSBldmVudC4gUmVxdWlyZWQgYmVjYXVzZSB0aGUgYXVkaXQgc2NoZW1hJ3NcbiAgICogYGFjdG9yLnZpYWAgZmllbGQgaXMgbm9uLW9wdGlvbmFsOyBPQXV0aCBCZWFyZXIgdG9rZW5zIGNhcnJ5IHRoZVxuICAgKiBpZGVudGl0eSBpbiBgc3ViYCBidXQgdGhlIFNESyBkb2Vzbid0IGRlY29kZSB0aGVtIG9uIHRoZSBob3RcbiAgICogcGF0aC4gUGluIHRoaXMgb25jZSBhdCBjb25zdHJ1Y3Rpb247IGRvIG5vdCBjaGFuZ2UgcGVyLWNhbGwuXG4gICAqL1xuICBhY3RvclZpYT86IHN0cmluZztcbiAgLyoqIERlZmF1bHQgNTAwMC4gKi9cbiAgZmx1c2hJbnRlcnZhbE1zPzogbnVtYmVyO1xuICAvKiogRGVmYXVsdCA1MC4gKi9cbiAgbWF4QmF0Y2hTaXplPzogbnVtYmVyO1xuICAvKiogRGVmYXVsdCAxMDAwLiBOZXcgZXZlbnRzIHBhc3QgdGhpcyBhcmUgZHJvcHBlZCB3aXRoIGEgd2FybmluZy4gKi9cbiAgbWF4UXVldWVTaXplPzogbnVtYmVyO1xuICAvKiogRGVmYXVsdCB0cnVlLiBTZXQgZmFsc2UgdG8gZGlzYWJsZSB0aGUgYXV0by1mbHVzaCB0aW1lciAodGVzdCBvbmx5KS4gKi9cbiAgZW5hYmxlVGltZXI/OiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEF1ZGl0Q2xpZW50IHtcbiAgY29uZmlnKGlucHV0OiBQbGF0Zm9ybUNvbmZpZ0lucHV0KTogQXVkaXRDbGllbnQ7XG4gIGF1dGgoaW5wdXQ6IFBsYXRmb3JtQXV0aElucHV0IHwgUGxhdGZvcm1BdXRoKTogQXVkaXRDbGllbnQ7XG4gIHJlY29yZChldmVudDogQXVkaXRFdmVudElucHV0KTogdm9pZDtcbiAgZmx1c2goKTogUHJvbWlzZTx2b2lkPjtcbn1cblxuY29uc3QgUEFUSCA9ICcvdjEvYXVkaXQvZXZlbnRzJztcbmNvbnN0IFJFVFJZX0RFTEFZU19NUyA9IFs1MDAsIDIwMDAsIDgwMDBdO1xuXG5jb25zdCBOT09QX0xPR0dFUiA9IHtcbiAgZXJyb3I6ICgpID0+IHt9LFxuICB3YXJuOiAoKSA9PiB7fSxcbiAgaW5mbzogKCkgPT4ge30sXG4gIGRlYnVnOiAoKSA9PiB7fSxcbiAgY2hpbGQoKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG59IGFzIHVua25vd24gYXMgTG9nZ2VyO1xuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlQXVkaXRDbGllbnQoaW5wdXQ6IEF1ZGl0Q2xpZW50SW5wdXQgPSB7fSk6IEF1ZGl0Q2xpZW50IHtcbiAgY29uc3Qgc3RhdGUgPSBuZXcgQ29uZmlnU3RhdGUoKTtcbiAgY29uc3QgZmx1c2hJbnRlcnZhbE1zID0gaW5wdXQuZmx1c2hJbnRlcnZhbE1zID8/IDUwMDA7XG4gIGNvbnN0IG1heEJhdGNoU2l6ZSA9IGlucHV0Lm1heEJhdGNoU2l6ZSA/PyA1MDtcbiAgY29uc3QgbWF4UXVldWVTaXplID0gaW5wdXQubWF4UXVldWVTaXplID8/IDEwMDA7XG4gIGNvbnN0IGVuYWJsZVRpbWVyID0gaW5wdXQuZW5hYmxlVGltZXIgPz8gdHJ1ZTtcbiAgY29uc3QgYWN0b3JWaWEgPSBpbnB1dC5hY3RvclZpYTtcblxuICBjb25zdCB7XG4gICAgZmx1c2hJbnRlcnZhbE1zOiBfZixcbiAgICBtYXhCYXRjaFNpemU6IF9iLFxuICAgIG1heFF1ZXVlU2l6ZTogX3EsXG4gICAgZW5hYmxlVGltZXI6IF90LFxuICAgIGFjdG9yVmlhOiBfdixcbiAgICAuLi5yZXN0XG4gIH0gPSBpbnB1dDtcbiAgdm9pZCBfZjtcbiAgdm9pZCBfYjtcbiAgdm9pZCBfcTtcbiAgdm9pZCBfdDtcbiAgdm9pZCBfdjtcbiAgc3RhdGUuYXBwbHkocmVzdCk7XG5cbiAgY29uc3QgcXVldWU6IEF1ZGl0RXZlbnRbXSA9IFtdO1xuICBjb25zdCBpbmZsaWdodDogUHJvbWlzZTx2b2lkPltdID0gW107XG5cbiAgZnVuY3Rpb24gZ2V0TG9nZ2VyKCk6IExvZ2dlciB7XG4gICAgcmV0dXJuIHN0YXRlLnJlc29sdmUoKS5sb2dnZXIgPz8gTk9PUF9MT0dHRVI7XG4gIH1cblxuICBjb25zdCBjbGllbnQ6IEF1ZGl0Q2xpZW50ID0ge1xuICAgIGNvbmZpZyhvcHRzKSB7XG4gICAgICBzdGF0ZS5hcHBseShvcHRzKTtcbiAgICAgIHJldHVybiBjbGllbnQ7XG4gICAgfSxcbiAgICBhdXRoKG9wdHMpIHtcbiAgICAgIHN0YXRlLnNldEF1dGgob3B0cyk7XG4gICAgICByZXR1cm4gY2xpZW50O1xuICAgIH0sXG4gICAgcmVjb3JkKGlucHV0KSB7XG4gICAgICBjb25zdCBsb2dnZXIgPSBnZXRMb2dnZXIoKTtcbiAgICAgIGlmICghYWN0b3JWaWEpIHtcbiAgICAgICAgbG9nZ2VyLmVycm9yKCdhdWRpdF9zZGsubWlzc2luZ19hY3Rvcl92aWEnLCB7XG4gICAgICAgICAgZXJyb3I6IHsgY29kZTogJ0FVRElUX01JU1NJTkdfQUNUT1JfVklBJywgY2F0ZWdvcnk6ICdlbmdpbmVlcmluZycgfSxcbiAgICAgICAgICBjb250ZXh0OiB7XG4gICAgICAgICAgICBtZXNzYWdlOlxuICAgICAgICAgICAgICAnYXVkaXQgY2xpZW50IHJlcXVpcmVzIGBhY3RvclZpYWAgY29uZmlnICh0aGUgc2VydmljZSBpZGVudGlmaWVyIHRoaXMgcHJvZHVjZXIgYWN0cyBhcykuIFBhc3Mge2FjdG9yVmlhOiBcIjx5b3VyLXNlcnZpY2U+XCJ9IHRvIGNyZWF0ZUF1ZGl0Q2xpZW50IG9yIGNyZWF0ZUNsaWVudC4nLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGNhbmRpZGF0ZTogQXVkaXRFdmVudCA9IHtcbiAgICAgICAgLi4uaW5wdXQsXG4gICAgICAgIGV2ZW50X2lkOiB1bGlkKCksXG4gICAgICAgIG9jY3VycmVkX2F0OiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCkucmVwbGFjZSgvXFwuXFxkezN9WiQvLCAnWicpLFxuICAgICAgICBhY3RvcjogeyAuLi5pbnB1dC5hY3RvciwgdmlhOiBhY3RvclZpYSB9LFxuICAgICAgfTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF1ZGl0RXZlbnRTY2hlbWEuc2FmZVBhcnNlKGNhbmRpZGF0ZSk7XG4gICAgICBpZiAoIXJlc3VsdC5zdWNjZXNzKSB7XG4gICAgICAgIGxvZ2dlci5lcnJvcignYXVkaXRfc2RrLmludmFsaWRfZXZlbnQnLCB7XG4gICAgICAgICAgZXJyb3I6IHsgY29kZTogJ0FVRElUX0lOVkFMSURfRVZFTlQnLCBjYXRlZ29yeTogJ2VuZ2luZWVyaW5nJyB9LFxuICAgICAgICAgIGNvbnRleHQ6IHsgaXNzdWVzOiByZXN1bHQuZXJyb3IuaXNzdWVzLCBldmVudDogY2FuZGlkYXRlIH0sXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAocXVldWUubGVuZ3RoID49IG1heFF1ZXVlU2l6ZSkge1xuICAgICAgICBsb2dnZXIud2FybignYXVkaXRfc2RrLnF1ZXVlX2Z1bGwnLCB7XG4gICAgICAgICAgY29udGV4dDogeyBkcm9wcGVkX2V2ZW50X2lkOiBjYW5kaWRhdGUuZXZlbnRfaWQsIG1heF9xdWV1ZV9zaXplOiBtYXhRdWV1ZVNpemUgfSxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHF1ZXVlLnB1c2gocmVzdWx0LmRhdGEpO1xuICAgICAgaWYgKHF1ZXVlLmxlbmd0aCA+PSBtYXhCYXRjaFNpemUpIHtcbiAgICAgICAgdm9pZCBzY2hlZHVsZVNlbmQoKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIGFzeW5jIGZsdXNoKCkge1xuICAgICAgYXdhaXQgc2NoZWR1bGVTZW5kKCk7XG4gICAgICB3aGlsZSAoaW5mbGlnaHQubGVuZ3RoID4gMCkge1xuICAgICAgICBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQoWy4uLmluZmxpZ2h0XSk7XG4gICAgICB9XG4gICAgfSxcbiAgfTtcblxuICBhc3luYyBmdW5jdGlvbiBzY2hlZHVsZVNlbmQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgd2hpbGUgKHF1ZXVlLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGJhdGNoID0gcXVldWUuc3BsaWNlKDAsIG1heEJhdGNoU2l6ZSk7XG4gICAgICBjb25zdCBzZW5kID0gc2VuZFdpdGhSZXRyaWVzKGJhdGNoKTtcbiAgICAgIGluZmxpZ2h0LnB1c2goc2VuZCk7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBzZW5kO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgY29uc3QgaWR4ID0gaW5mbGlnaHQuaW5kZXhPZihzZW5kKTtcbiAgICAgICAgaWYgKGlkeCAhPT0gLTEpIGluZmxpZ2h0LnNwbGljZShpZHgsIDEpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIHNlbmRXaXRoUmV0cmllcyhldmVudHM6IEF1ZGl0RXZlbnRbXSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGxvZ2dlciA9IGdldExvZ2dlcigpO1xuICAgIGNvbnN0IGJvZHkgPSBKU09OLnN0cmluZ2lmeSh7IGV2ZW50cyB9KTtcbiAgICBmb3IgKGxldCBhdHRlbXB0ID0gMDsgYXR0ZW1wdCA8PSBSRVRSWV9ERUxBWVNfTVMubGVuZ3RoOyBhdHRlbXB0KyspIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IG9rID0gYXdhaXQgc2VuZE9uY2UoYm9keSk7XG4gICAgICAgIGlmIChvaykgcmV0dXJuO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGNvbnN0IGUgPSBlcnIgYXMgRXJyb3I7XG4gICAgICAgIGxvZ2dlci53YXJuKCdhdWRpdF9zZGsuc2VuZF9lcnJvcicsIHtcbiAgICAgICAgICBjb250ZXh0OiB7IGF0dGVtcHQsIG1lc3NhZ2U6IGUubWVzc2FnZSwgYmF0Y2hfc2l6ZTogZXZlbnRzLmxlbmd0aCB9LFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGlmIChhdHRlbXB0IDwgUkVUUllfREVMQVlTX01TLmxlbmd0aCkge1xuICAgICAgICBhd2FpdCBzbGVlcChSRVRSWV9ERUxBWVNfTVNbYXR0ZW1wdF0pO1xuICAgICAgfVxuICAgIH1cbiAgICBsb2dnZXIuZXJyb3IoJ2F1ZGl0X3Nkay5zZW5kX2ZhaWxlZCcsIHtcbiAgICAgIGVycm9yOiB7IGNvZGU6ICdBVURJVF9TRU5EX0ZBSUxFRCcsIGNhdGVnb3J5OiAnZW5naW5lZXJpbmcnIH0sXG4gICAgICBjb250ZXh0OiB7IGJhdGNoX3NpemU6IGV2ZW50cy5sZW5ndGgsIGV2ZW50cyB9LFxuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gc2VuZE9uY2UoYm9keTogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3QgY29uZmlnID0gc3RhdGUucmVzb2x2ZSgpO1xuICAgIGNvbnN0IGxvZ2dlciA9IGdldExvZ2dlcigpO1xuICAgIGNvbnN0IGhlYWRlcnMgPSBhd2FpdCBidWlsZEhlYWRlcnMoY29uZmlnLCB7IG1ldGhvZDogJ1BPU1QnLCBwYXRoOiBQQVRILCBib2R5IH0pO1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGNvbmZpZy5mZXRjaEZuKGAke2NvbmZpZy5iYXNlVXJsfSR7UEFUSH1gLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgIGhlYWRlcnMsXG4gICAgICBib2R5LFxuICAgIH0pO1xuICAgIGlmIChyZXMuc3RhdHVzID49IDUwMCkgcmV0dXJuIGZhbHNlO1xuICAgIGlmICghcmVzLm9rICYmIHJlcy5zdGF0dXMgIT09IDIwMikge1xuICAgICAgbG9nZ2VyLmVycm9yKCdhdWRpdF9zZGsucmVqZWN0ZWQnLCB7XG4gICAgICAgIGVycm9yOiB7IGNvZGU6ICdBVURJVF9SRUpFQ1RFRCcsIGNhdGVnb3J5OiAnZW5naW5lZXJpbmcnIH0sXG4gICAgICAgIGNvbnRleHQ6IHsgc3RhdHVzOiByZXMuc3RhdHVzIH0sXG4gICAgICB9KTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGxldCB0aW1lcjogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0SW50ZXJ2YWw+IHwgdW5kZWZpbmVkO1xuICBpZiAoZW5hYmxlVGltZXIpIHtcbiAgICB0aW1lciA9IHNldEludGVydmFsKCgpID0+IHtcbiAgICAgIHZvaWQgc2NoZWR1bGVTZW5kKCk7XG4gICAgfSwgZmx1c2hJbnRlcnZhbE1zKTtcbiAgICBpZiAodHlwZW9mIHRpbWVyLnVucmVmID09PSAnZnVuY3Rpb24nKSB0aW1lci51bnJlZigpO1xuICB9XG5cbiAgcmV0dXJuIGNsaWVudDtcbn1cblxuZnVuY3Rpb24gc2xlZXAobXM6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHIpID0+IHNldFRpbWVvdXQociwgbXMpKTtcbn1cbiJdfQ==
|
package/dist/audit/index.d.ts
CHANGED
package/dist/audit/index.js
CHANGED
|
@@ -1,11 +1,9 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.createAuditClient = exports.
|
|
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,
|
|
9
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYXVkaXQvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsbUNBQWdHO0FBQXZGLDBHQUFBLGdCQUFnQixPQUFBO0FBQUUsMEdBQUEsZ0JBQWdCLE9BQUE7QUFDM0MsbUNBS2tCO0FBSmhCLDJHQUFBLGlCQUFpQixPQUFBIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IHsgYXVkaXRFdmVudFNjaGVtYSwgYXVkaXRCYXRjaFNjaGVtYSwgdHlwZSBBdWRpdEV2ZW50LCB0eXBlIEF1ZGl0QmF0Y2ggfSBmcm9tICcuL3NjaGVtYSc7XG5leHBvcnQge1xuICBjcmVhdGVBdWRpdENsaWVudCxcbiAgdHlwZSBBdWRpdENsaWVudCxcbiAgdHlwZSBBdWRpdENsaWVudElucHV0LFxuICB0eXBlIEF1ZGl0RXZlbnRJbnB1dCxcbn0gZnJvbSAnLi9jbGllbnQnO1xuIl19
|
package/dist/client.d.ts
CHANGED
|
@@ -6,25 +6,30 @@ import { auth } from './auth';
|
|
|
6
6
|
* the `platform` singleton.
|
|
7
7
|
*
|
|
8
8
|
* Pick exactly one of:
|
|
9
|
-
* - `accessToken` (string or callback) for the Bearer flow
|
|
10
|
-
* - `
|
|
11
|
-
* - `serviceId` + `serviceSecret` for HMAC service-to-service
|
|
9
|
+
* - `accessToken` (string or callback) for the static Bearer flow
|
|
10
|
+
* - `serviceId` + `serviceSecret` for OAuth2 client_credentials
|
|
12
11
|
*
|
|
13
|
-
*
|
|
14
|
-
* other is the HMAC fallback for legacy endpoints (audit ingest).
|
|
15
|
-
* In that case `platform.business` uses Bearer; `platform.audit` uses
|
|
16
|
-
* HMAC. Without either, calls throw `ConfigError` on the first request.
|
|
12
|
+
* Without either, calls throw `ConfigError` on the first request.
|
|
17
13
|
*/
|
|
18
14
|
export interface ClientConfig {
|
|
19
15
|
baseUrl?: string;
|
|
20
|
-
/**
|
|
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
21
|
authBaseUrl?: string;
|
|
22
22
|
accessToken?: string | (() => string | Promise<string>);
|
|
23
|
-
oauthClientId?: string;
|
|
24
|
-
oauthClientSecret?: string;
|
|
25
|
-
oauthScope?: string;
|
|
26
23
|
serviceId?: string;
|
|
27
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;
|
|
28
33
|
expiryBufferMs?: number;
|
|
29
34
|
fetchFn?: typeof fetch;
|
|
30
35
|
}
|
|
@@ -34,10 +39,9 @@ export interface PlatformClient {
|
|
|
34
39
|
auth: typeof auth;
|
|
35
40
|
/**
|
|
36
41
|
* Return a derived client bound to the supplied access token.
|
|
37
|
-
* Inherits `baseUrl
|
|
38
|
-
*
|
|
39
|
-
*
|
|
40
|
-
* end user instead of as the service.
|
|
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.
|
|
41
45
|
*/
|
|
42
46
|
withToken(token: string | (() => string | Promise<string>)): PlatformClient;
|
|
43
47
|
}
|
|
@@ -53,13 +57,12 @@ export declare function createClient(input?: ClientConfig): PlatformClient;
|
|
|
53
57
|
* import work). Use `createClient(...)` when you need an isolated
|
|
54
58
|
* instance with explicit config.
|
|
55
59
|
*
|
|
56
|
-
*
|
|
57
|
-
*
|
|
58
|
-
*
|
|
59
|
-
*
|
|
60
|
-
*
|
|
61
|
-
*
|
|
62
|
-
* PLATFORM_SIGNING_SECRET HMAC raw secret (legacy / audit)
|
|
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
|
|
63
66
|
*/
|
|
64
67
|
export declare const platform: PlatformClient;
|
|
65
68
|
/** Test-only: drop the singleton cache between cases. */
|
package/dist/client.js
CHANGED
|
@@ -6,7 +6,6 @@ exports._resetPlatformSingleton = _resetPlatformSingleton;
|
|
|
6
6
|
exports.withToken = withToken;
|
|
7
7
|
const client_1 = require("./audit/client");
|
|
8
8
|
const client_2 = require("./business/client");
|
|
9
|
-
const auth_1 = require("./auth");
|
|
10
9
|
const token_source_1 = require("./token-source");
|
|
11
10
|
const DEFAULT_BASE_URL = 'https://api.platform.uengage.io';
|
|
12
11
|
/**
|
|
@@ -21,21 +20,15 @@ function createClient(input = {}) {
|
|
|
21
20
|
function buildClient(input) {
|
|
22
21
|
const baseUrl = input.baseUrl ?? DEFAULT_BASE_URL;
|
|
23
22
|
const tokenSourceState = resolveTokenSource(input, baseUrl);
|
|
24
|
-
const
|
|
25
|
-
|
|
26
|
-
baseUrl,
|
|
27
|
-
fetchFn: input.fetchFn,
|
|
28
|
-
auth: businessAuth,
|
|
29
|
-
});
|
|
30
|
-
// Audit is HMAC-only on the server side, so always use the HMAC
|
|
31
|
-
// creds when present, regardless of any token-source overlay.
|
|
32
|
-
const auditAuth = input.serviceId && input.serviceSecret
|
|
33
|
-
? { type: 'hmac', serviceId: input.serviceId, secret: input.serviceSecret }
|
|
23
|
+
const auth = tokenSourceState
|
|
24
|
+
? { type: 'token-source', state: tokenSourceState }
|
|
34
25
|
: undefined;
|
|
26
|
+
const businessClient = (0, client_2.createBusinessClient)({ baseUrl, fetchFn: input.fetchFn, auth });
|
|
35
27
|
const auditClient = (0, client_1.createAuditClient)({
|
|
36
28
|
baseUrl,
|
|
37
29
|
fetchFn: input.fetchFn,
|
|
38
|
-
auth
|
|
30
|
+
auth,
|
|
31
|
+
actorVia: input.actorVia ?? input.serviceId,
|
|
39
32
|
});
|
|
40
33
|
const client = {
|
|
41
34
|
business: businessClient,
|
|
@@ -47,22 +40,15 @@ function buildClient(input) {
|
|
|
47
40
|
accessToken: token,
|
|
48
41
|
// The new client should not also try to mint via
|
|
49
42
|
// client_credentials on top of the supplied user token.
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
43
|
+
serviceId: undefined,
|
|
44
|
+
serviceSecret: undefined,
|
|
45
|
+
scope: undefined,
|
|
53
46
|
});
|
|
54
47
|
},
|
|
55
48
|
};
|
|
56
49
|
return client;
|
|
57
50
|
}
|
|
58
|
-
|
|
59
|
-
if (tokenSourceState)
|
|
60
|
-
return { type: 'token-source', state: tokenSourceState };
|
|
61
|
-
if (input.serviceId && input.serviceSecret) {
|
|
62
|
-
return { type: 'hmac', serviceId: input.serviceId, secret: input.serviceSecret };
|
|
63
|
-
}
|
|
64
|
-
return undefined;
|
|
65
|
-
}
|
|
51
|
+
const auth_1 = require("./auth");
|
|
66
52
|
function resolveTokenSource(input, baseUrl) {
|
|
67
53
|
const authBaseUrl = input.authBaseUrl ?? `${baseUrl}/auth/business`;
|
|
68
54
|
if (input.accessToken !== undefined) {
|
|
@@ -71,13 +57,13 @@ function resolveTokenSource(input, baseUrl) {
|
|
|
71
57
|
}
|
|
72
58
|
return (0, token_source_1.makeTokenSourceState)({ kind: 'callback', getToken: input.accessToken }, { expiryBufferMs: input.expiryBufferMs, fetchFn: input.fetchFn });
|
|
73
59
|
}
|
|
74
|
-
if (input.
|
|
60
|
+
if (input.serviceId && input.serviceSecret) {
|
|
75
61
|
return (0, token_source_1.makeTokenSourceState)({
|
|
76
62
|
kind: 'service-credentials',
|
|
77
|
-
clientId: input.
|
|
78
|
-
clientSecret: input.
|
|
63
|
+
clientId: input.serviceId,
|
|
64
|
+
clientSecret: input.serviceSecret,
|
|
79
65
|
authBaseUrl,
|
|
80
|
-
scope: input.
|
|
66
|
+
scope: input.scope,
|
|
81
67
|
}, { expiryBufferMs: input.expiryBufferMs, fetchFn: input.fetchFn });
|
|
82
68
|
}
|
|
83
69
|
return undefined;
|
|
@@ -87,8 +73,8 @@ function warnIfBrowserSecret(config) {
|
|
|
87
73
|
const inBrowser = typeof g.window !== 'undefined' && typeof g.window.document !== 'undefined';
|
|
88
74
|
if (!inBrowser)
|
|
89
75
|
return;
|
|
90
|
-
if (config.serviceSecret
|
|
91
|
-
console.warn('[uengage-platform-sdk]
|
|
76
|
+
if (config.serviceSecret) {
|
|
77
|
+
console.warn('[uengage-platform-sdk] serviceSecret should not be used in browser environments. ' +
|
|
92
78
|
'Service credentials in browser bundles are publicly visible. ' +
|
|
93
79
|
'Use `accessToken` with a token obtained via OAuth (or `withToken(...)` on a server-built client) instead.');
|
|
94
80
|
}
|
|
@@ -108,14 +94,12 @@ function envClientConfig() {
|
|
|
108
94
|
return {};
|
|
109
95
|
const e = process.env ?? {};
|
|
110
96
|
return {
|
|
111
|
-
baseUrl: e.
|
|
112
|
-
authBaseUrl: e.
|
|
113
|
-
accessToken: e.
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
serviceId: e.PLATFORM_SERVICE_ID,
|
|
118
|
-
serviceSecret: e.PLATFORM_SIGNING_SECRET,
|
|
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,
|
|
119
103
|
};
|
|
120
104
|
}
|
|
121
105
|
/**
|
|
@@ -124,13 +108,12 @@ function envClientConfig() {
|
|
|
124
108
|
* import work). Use `createClient(...)` when you need an isolated
|
|
125
109
|
* instance with explicit config.
|
|
126
110
|
*
|
|
127
|
-
*
|
|
128
|
-
*
|
|
129
|
-
*
|
|
130
|
-
*
|
|
131
|
-
*
|
|
132
|
-
*
|
|
133
|
-
* PLATFORM_SIGNING_SECRET HMAC raw secret (legacy / audit)
|
|
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
|
|
134
117
|
*/
|
|
135
118
|
exports.platform = new Proxy({}, {
|
|
136
119
|
get(_, prop) {
|
|
@@ -149,4 +132,4 @@ function _resetPlatformSingleton() {
|
|
|
149
132
|
function withToken(token) {
|
|
150
133
|
return singleton().withToken(token);
|
|
151
134
|
}
|
|
152
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2NsaWVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUF1REEsb0NBR0M7QUFpSkQsMERBRUM7QUFNRCw4QkFFQztBQXJORCwyQ0FBcUU7QUFDckUsOENBQThFO0FBQzlFLGlDQUE4QjtBQUM5QixpREFBNkU7QUE2QzdFLE1BQU0sZ0JBQWdCLEdBQUcsaUNBQWlDLENBQUM7QUFFM0Q7Ozs7R0FJRztBQUNILFNBQWdCLFlBQVksQ0FBQyxRQUFzQixFQUFFO0lBQ25ELG1CQUFtQixDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzNCLE9BQU8sV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQzVCLENBQUM7QUFFRCxTQUFTLFdBQVcsQ0FBQyxLQUFtQjtJQUN0QyxNQUFNLE9BQU8sR0FBRyxLQUFLLENBQUMsT0FBTyxJQUFJLGdCQUFnQixDQUFDO0lBQ2xELE1BQU0sZ0JBQWdCLEdBQUcsa0JBQWtCLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBRTVELE1BQU0sWUFBWSxHQUFHLGdCQUFnQixDQUFDLEtBQUssRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDO0lBQy9ELE1BQU0sY0FBYyxHQUFHLElBQUEsNkJBQW9CLEVBQUM7UUFDMUMsT0FBTztRQUNQLE9BQU8sRUFBRSxLQUFLLENBQUMsT0FBTztRQUN0QixJQUFJLEVBQUUsWUFBWTtLQUNuQixDQUFDLENBQUM7SUFFSCxnRUFBZ0U7SUFDaEUsOERBQThEO0lBQzlELE1BQU0sU0FBUyxHQUNiLEtBQUssQ0FBQyxTQUFTLElBQUksS0FBSyxDQUFDLGFBQWE7UUFDcEMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsS0FBSyxDQUFDLFNBQVMsRUFBRSxNQUFNLEVBQUUsS0FBSyxDQUFDLGFBQWEsRUFBRTtRQUMzRSxDQUFDLENBQUMsU0FBUyxDQUFDO0lBQ2hCLE1BQU0sV0FBVyxHQUFHLElB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QUFDO1FBQ2pFLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2pCLENBQUM7Q0FDRixDQUFDLENBQUM7QUFFSCx5REFBeUQ7QUFDekQsU0FBZ0IsdUJBQXVCO0lBQ3JDLGVBQWUsR0FBRyxTQUFTLENBQUM7QUFDOUIsQ0FBQztBQUVEOzs7R0FHRztBQUNILFNBQWdCLFNBQVMsQ0FBQyxLQUFnRDtJQUN4RSxPQUFPLFNBQVMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUN0QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgY3JlYXRlQXVkaXRDbGllbnQsIHR5cGUgQXVkaXRDbGllbnQgfSBmcm9tICcuL2F1ZGl0L2NsaWVudCc7XG5pbXBvcnQgeyBjcmVhdGVCdXNpbmVzc0NsaWVudCwgdHlwZSBCdXNpbmVzc0NsaWVudCB9IGZyb20gJy4vYnVzaW5lc3MvY2xpZW50JztcbmltcG9ydCB7IGF1dGggfSBmcm9tICcuL2F1dGgnO1xuaW1wb3J0IHsgbWFrZVRva2VuU291cmNlU3RhdGUsIHR5cGUgVG9rZW5Tb3VyY2VTdGF0ZSB9IGZyb20gJy4vdG9rZW4tc291cmNlJztcbmltcG9ydCB0eXBlIHsgUGxhdGZvcm1BdXRoIH0gZnJvbSAnLi9jb25maWcnO1xuXG4vKipcbiAqIENhbGxlci1mYWNpbmcgY29uZmlnIGZvciB0aGUgdW5pZmllZCBgY3JlYXRlQ2xpZW50KC4uLilgIGZhY3RvcnkgYW5kXG4gKiB0aGUgYHBsYXRmb3JtYCBzaW5nbGV0b24uXG4gKlxuICogUGljayBleGFjdGx5IG9uZSBvZjpcbiAqICAgLSBgYWNjZXNzVG9rZW5gIChzdHJpbmcgb3IgY2FsbGJhY2spIGZvciB0aGUgQmVhcmVyIGZsb3dcbiAqICAgLSBgb2F1dGhDbGllbnRJZGAgKyBgb2F1dGhDbGllbnRTZWNyZXRgIGZvciBPQXV0aDIgY2xpZW50X2NyZWRlbnRpYWxzXG4gKiAgIC0gYHNlcnZpY2VJZGAgKyBgc2VydmljZVNlY3JldGAgZm9yIEhNQUMgc2VydmljZS10by1zZXJ2aWNlXG4gKlxuICogTWl4aW5nIGlzIGFsbG93ZWQgb25seSB3aGVuIG9uZSBpcyB0aGUgdXNlci1mYWNpbmcgQmVhcmVyIGFuZCB0aGVcbiAqIG90aGVyIGlzIHRoZSBITUFDIGZhbGxiYWNrIGZvciBsZWdhY3kgZW5kcG9pbnRzIChhdWRpdCBpbmdlc3QpLlxuICogSW4gdGhhdCBjYXNlIGBwbGF0Zm9ybS5idXNpbmVzc2AgdXNlcyBCZWFyZXI7IGBwbGF0Zm9ybS5hdWRpdGAgdXNlc1xuICogSE1BQy4gV2l0aG91dCBlaXRoZXIsIGNhbGxzIHRocm93IGBDb25maWdFcnJvcmAgb24gdGhlIGZpcnN0IHJlcXVlc3QuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2xpZW50Q29uZmlnIHtcbiAgYmFzZVVybD86IHN0cmluZztcbiAgLyoqIEF1dGggc3VyZmFjZSBiYXNlOyBkZWZhdWx0cyB0byBgJHtiYXNlVXJsfS9hdXRoL2J1c2luZXNzYC4gVXNlZCBvbmx5IHRvIGJvb3RzdHJhcCB0aGUgZmlyc3QgY2xpZW50X2NyZWRlbnRpYWxzIG1pbnQg4oCUIG9uY2UgYSB0b2tlbiBleGlzdHMsIGZ1dHVyZSBhdXRoIGNhbGxzIGZvbGxvdyB0aGUgdG9rZW4ncyBgaXNzYC4gKi9cbiAgYXV0aEJhc2VVcmw/OiBzdHJpbmc7XG4gIGFjY2Vzc1Rva2VuPzogc3RyaW5nIHwgKCgpID0+IHN0cmluZyB8IFByb21pc2U8c3RyaW5nPik7XG4gIG9hdXRoQ2xpZW50SWQ/OiBzdHJpbmc7XG4gIG9hdXRoQ2xpZW50U2VjcmV0Pzogc3RyaW5nO1xuICBvYXV0aFNjb3BlPzogc3RyaW5nO1xuICBzZXJ2aWNlSWQ/OiBzdHJpbmc7XG4gIHNlcnZpY2VTZWNyZXQ/OiBzdHJpbmc7XG4gIGV4cGlyeUJ1ZmZlck1zPzogbnVtYmVyO1xuICBmZXRjaEZuPzogdHlwZW9mIGZldGNoO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFBsYXRmb3JtQ2xpZW50IHtcbiAgYnVzaW5lc3M6IEJ1c2luZXNzQ2xpZW50O1xuICBhdWRpdDogQXVkaXRDbGllbnQ7XG4gIGF1dGg6IHR5cGVvZiBhdXRoO1xuICAvKipcbiAgICogUmV0dXJuIGEgZGVyaXZlZCBjbGllbnQgYm91bmQgdG8gdGhlIHN1cHBsaWVkIGFjY2VzcyB0b2tlbi5cbiAgICogSW5oZXJpdHMgYGJhc2VVcmxgLCBgZmV0Y2hGbmAsIGFuZCBhbnkgSE1BQyBmYWxsYmFjayBmcm9tIHRoaXNcbiAgICogY2xpZW50OyByZXBsYWNlcyB0aGUgT0F1dGgvc3RhdGljLXRva2VuIHNvdXJjZSB3aXRoIHRoZSBuZXcgb25lLlxuICAgKiBVc2UgY2FzZTogQkZGIGhhbmRsZXJzIHRoYXQgd2FudCB0byBjYWxsIHRoZSBwbGF0Zm9ybSBBUEkgYXMgdGhlXG4gICAqIGVuZCB1c2VyIGluc3RlYWQgb2YgYXMgdGhlIHNlcnZpY2UuXG4gICAqL1xuICB3aXRoVG9rZW4odG9rZW46IHN0cmluZyB8ICgoKSA9PiBzdHJpbmcgfCBQcm9taXNlPHN0cmluZz4pKTogUGxhdGZvcm1DbGllbnQ7XG59XG5cbmNvbnN0IERFRkFVTFRfQkFTRV9VUkwgPSAnaHR0cHM6Ly9hcGkucGxhdGZvcm0udWVuZ2FnZS5pbyc7XG5cbi8qKlxuICogQnVpbGQgYSBmcmVzaCwgaXNvbGF0ZWQgY2xpZW50IGZyb20gZXhwbGljaXQgY29uZmlnLiBFYWNoIGNhbGxcbiAqIGdldHMgaXRzIG93biBUb2tlblNvdXJjZSBzdGF0ZSDigJQgY29uY3VycmVudCBgY3JlYXRlQ2xpZW50KC4uLilgIHVzZVxuICogZG9lcyBub3Qgc3RhbXBlZGUgdGhlIGNhY2hlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlQ2xpZW50KGlucHV0OiBDbGllbnRDb25maWcgPSB7fSk6IFBsYXRmb3JtQ2xpZW50IHtcbiAgd2FybklmQnJvd3NlclNlY3JldChpbnB1dCk7XG4gIHJldHVybiBidWlsZENsaWVudChpbnB1dCk7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkQ2xpZW50KGlucHV0OiBDbGllbnRDb25maWcpOiBQbGF0Zm9ybUNsaWVudCB7XG4gIGNvbnN0IGJhc2VVcmwgPSBpbnB1dC5iYXNlVXJsID8/IERFRkFVTFRfQkFTRV9VUkw7XG4gIGNvbnN0IHRva2VuU291cmNlU3RhdGUgPSByZXNvbHZlVG9rZW5Tb3VyY2UoaW5wdXQsIGJhc2VVcmwpO1xuXG4gIGNvbnN0IGJ1c2luZXNzQXV0aCA9IHBpY2tCdXNpbmVzc0F1dGgoaW5wdXQsIHRva2VuU291cmNlU3RhdGUpO1xuICBjb25zdCBidXNpbmVzc0NsaWVudCA9IGNyZWF0ZUJ1c2luZXNzQ2xpZW50KHtcbiAgICBiYXNlVXJsLFxuICAgIGZldGNoRm46IGlucHV0LmZldGNoRm4sXG4gICAgYXV0aDogYnVzaW5lc3NBdXRoLFxuICB9KTtcblxuICAvLyBBdWRpdCBpcyBITUFDLW9ubHkgb24gdGhlIHNlcnZlciBzaWRlLCBzbyBhbHdheXMgdXNlIHRoZSBITUFDXG4gIC8vIGNyZWRzIHdoZW4gcHJlc2VudCwgcmVnYXJkbGVzcyBvZiBhbnkgdG9rZW4tc291cmNlIG92ZXJsYXkuXG4gIGNvbnN0IGF1ZGl0QXV0aDogUGxhdGZvcm1BdXRoIHwgdW5kZWZpbmVkID1cbiAgICBpbnB1dC5zZXJ2aWNlSWQgJiYgaW5wdXQuc2VydmljZVNlY3JldFxuICAgICAgPyB7IHR5cGU6ICdobWFjJywgc2VydmljZUlkOiBpbnB1dC5zZXJ2aWNlSWQsIHNlY3JldDogaW5wdXQuc2VydmljZVNlY3JldCB9XG4gICAgICA6IHVuZGVmaW5lZDtcbiAgY29uc3QgYXVkaXRDbGllbnQgPSBjcmVhdGVBdWRpdENsaWVudCh7XG4gICAgYmFzZVVybCxcbiAgICBmZXRjaEZuOiBpbnB1dC5mZXRjaEZuLFxuICAgIGF1dGg6IGF1ZGl0QXV0aCxcbiAgfSk7XG5cbiAgY29uc3QgY2xpZW50OiBQbGF0Zm9ybUNsaWVudCA9IHtcbiAgICBidXNpbmVzczogYnVzaW5lc3NDbGllbnQsXG4gICAgYXVkaXQ6IGF1ZGl0Q2xpZW50LFxuICAgIGF1dGgsXG4gICAgd2l0aFRva2VuKHRva2VuKSB7XG4gICAgICByZXR1cm4gYnVpbGRDbGllbnQoe1xuICAgICAgICAuLi5pbnB1dCxcbiAgICAgICAgYWNjZXNzVG9rZW46IHRva2VuLFxuICAgICAgICAvLyBUaGUgbmV3IGNsaWVudCBzaG91bGQgbm90IGFsc28gdHJ5IHRvIG1pbnQgdmlhXG4gICAgICAgIC8vIGNsaWVudF9jcmVkZW50aWFscyBvbiB0b3Agb2YgdGhlIHN1cHBsaWVkIHVzZXIgdG9rZW4uXG4gICAgICAgIG9hdXRoQ2xpZW50SWQ6IHVuZGVmaW5lZCxcbiAgICAgICAgb2F1dGhDbGllbnRTZWNyZXQ6IHVuZGVmaW5lZCxcbiAgICAgICAgb2F1dGhTY29wZTogdW5kZWZpbmVkLFxuICAgICAgfSk7XG4gICAgfSxcbiAgfTtcbiAgcmV0dXJuIGNsaWVudDtcbn1cblxuZnVuY3Rpb24gcGlja0J1c2luZXNzQXV0aChcbiAgaW5wdXQ6IENsaWVudENvbmZpZyxcbiAgdG9rZW5Tb3VyY2VTdGF0ZTogVG9rZW5Tb3VyY2VTdGF0ZSB8IHVuZGVmaW5lZCxcbik6IFBsYXRmb3JtQXV0aCB8IHVuZGVmaW5lZCB7XG4gIGlmICh0b2tlblNvdXJjZVN0YXRlKSByZXR1cm4geyB0eXBlOiAndG9rZW4tc291cmNlJywgc3RhdGU6IHRva2VuU291cmNlU3RhdGUgfTtcbiAgaWYgKGlucHV0LnNlcnZpY2VJZCAmJiBpbnB1dC5zZXJ2aWNlU2VjcmV0KSB7XG4gICAgcmV0dXJuIHsgdHlwZTogJ2htYWMnLCBzZXJ2aWNlSWQ6IGlucHV0LnNlcnZpY2VJZCwgc2VjcmV0OiBpbnB1dC5zZXJ2aWNlU2VjcmV0IH07XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gcmVzb2x2ZVRva2VuU291cmNlKGlucHV0OiBDbGllbnRDb25maWcsIGJhc2VVcmw6IHN0cmluZyk6IFRva2VuU291cmNlU3RhdGUgfCB1bmRlZmluZWQge1xuICBjb25zdCBhdXRoQmFzZVVybCA9IGlucHV0LmF1dGhCYXNlVXJsID8/IGAke2Jhc2VVcmx9L2F1dGgvYnVzaW5lc3NgO1xuICBpZiAoaW5wdXQuYWNjZXNzVG9rZW4gIT09IHVuZGVmaW5lZCkge1xuICAgIGlmICh0eXBlb2YgaW5wdXQuYWNjZXNzVG9rZW4gPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gbWFrZVRva2VuU291cmNlU3RhdGUoXG4gICAgICAgIHsga2luZDogJ3N0YXRpYy1zdHJpbmcnLCB0b2tlbjogaW5wdXQuYWNjZXNzVG9rZW4gfSxcbiAgICAgICAgeyBleHBpcnlCdWZmZXJNczogaW5wdXQuZXhwaXJ5QnVmZmVyTXMsIGZldGNoRm46IGlucHV0LmZldGNoRm4gfSxcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBtYWtlVG9rZW5Tb3VyY2VTdGF0ZShcbiAgICAgIHsga2luZDogJ2NhbGxiYWNrJywgZ2V0VG9rZW46IGlucHV0LmFjY2Vzc1Rva2VuIH0sXG4gICAgICB7IGV4cGlyeUJ1ZmZlck1zOiBpbnB1dC5leHBpcnlCdWZmZXJNcywgZmV0Y2hGbjogaW5wdXQuZmV0Y2hGbiB9LFxuICAgICk7XG4gIH1cbiAgaWYgKGlucHV0Lm9hdXRoQ2xpZW50SWQgJiYgaW5wdXQub2F1dGhDbGllbnRTZWNyZXQpIHtcbiAgICByZXR1cm4gbWFrZVRva2VuU291cmNlU3RhdGUoXG4gICAgICB7XG4gICAgICAgIGtpbmQ6ICdzZXJ2aWNlLWNyZWRlbnRpYWxzJyxcbiAgICAgICAgY2xpZW50SWQ6IGlucHV0Lm9hdXRoQ2xpZW50SWQsXG4gICAgICAgIGNsaWVudFNlY3JldDogaW5wdXQub2F1dGhDbGllbnRTZWNyZXQsXG4gICAgICAgIGF1dGhCYXNlVXJsLFxuICAgICAgICBzY29wZTogaW5wdXQub2F1dGhTY29wZSxcbiAgICAgIH0sXG4gICAgICB7IGV4cGlyeUJ1ZmZlck1zOiBpbnB1dC5leHBpcnlCdWZmZXJNcywgZmV0Y2hGbjogaW5wdXQuZmV0Y2hGbiB9LFxuICAgICk7XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gd2FybklmQnJvd3NlclNlY3JldChjb25maWc6IENsaWVudENvbmZpZyk6IHZvaWQge1xuICBjb25zdCBnID0gZ2xvYmFsVGhpcyBhcyB7IHdpbmRvdz86IHsgZG9jdW1lbnQ/OiB1bmtub3duIH0gfTtcbiAgY29uc3QgaW5Ccm93c2VyID0gdHlwZW9mIGcud2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgZy53aW5kb3cuZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnO1xuICBpZiAoIWluQnJvd3NlcikgcmV0dXJuO1xuICBpZiAoY29uZmlnLnNlcnZpY2VTZWNyZXQgfHwgY29uZmlnLm9hdXRoQ2xpZW50U2VjcmV0KSB7XG4gICAgY29uc29sZS53YXJuKFxuICAgICAgJ1t1ZW5nYWdlLXBsYXRmb3JtLXNka10gc2VydmljZS1zaWRlIHNlY3JldHMgc2hvdWxkIG5vdCBiZSB1c2VkIGluIGJyb3dzZXIgZW52aXJvbm1lbnRzLiAnICtcbiAgICAgICAgJ1NlcnZpY2UgY3JlZGVudGlhbHMgaW4gYnJvd3NlciBidW5kbGVzIGFyZSBwdWJsaWNseSB2aXNpYmxlLiAnICtcbiAgICAgICAgJ1VzZSBgYWNjZXNzVG9rZW5gIHdpdGggYSB0b2tlbiBvYnRhaW5lZCB2aWEgT0F1dGggKG9yIGB3aXRoVG9rZW4oLi4uKWAgb24gYSBzZXJ2ZXItYnVpbHQgY2xpZW50KSBpbnN0ZWFkLicsXG4gICAgKTtcbiAgfVxufVxuXG4vLyDilIDilIDilIAgRGVmYXVsdCBzaW5nbGV0b24g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4vL1xuLy8gUmVzb2x2ZWQgbGF6aWx5IG9uIGZpcnN0IHByb3BlcnR5IGFjY2VzcyAoUHJveHkpIHNvIGNvbnN1bWVycyB0aGF0XG4vLyBtdXRhdGUgYHByb2Nlc3MuZW52YCBhZnRlciBpbXBvcnQgc3RpbGwgcGljayB1cCB0aGUgcmlnaHQgdmFsdWVzLlxuXG5sZXQgY2FjaGVkU2luZ2xldG9uOiBQbGF0Zm9ybUNsaWVudCB8IHVuZGVmaW5lZDtcbmZ1bmN0aW9uIHNpbmdsZXRvbigpOiBQbGF0Zm9ybUNsaWVudCB7XG4gIGlmICghY2FjaGVkU2luZ2xldG9uKSBjYWNoZWRTaW5nbGV0b24gPSBidWlsZENsaWVudChlbnZDbGllbnRDb25maWcoKSk7XG4gIHJldHVybiBjYWNoZWRTaW5nbGV0b247XG59XG5cbmZ1bmN0aW9uIGVudkNsaWVudENvbmZpZygpOiBDbGllbnRDb25maWcge1xuICBpZiAodHlwZW9mIHByb2Nlc3MgPT09ICd1bmRlZmluZWQnKSByZXR1cm4ge307XG4gIGNvbnN0IGUgPSAocHJvY2VzcyBhcyB7IGVudj86IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4gfSkuZW52ID8/IHt9O1xuICByZXR1cm4ge1xuICAgIGJhc2VVcmw6IGUuUExBVEZPUk1fQkFTRV9VUkwsXG4gICAgYXV0aEJhc2VVcmw6IGUuUExBVEZPUk1fQVVUSF9CQVNFX1VSTCxcbiAgICBhY2Nlc3NUb2tlbjogZS5QTEFURk9STV9BVVRIX1RPS0VOLFxuICAgIG9hdXRoQ2xpZW50SWQ6IGUuUExBVEZPUk1fT0FVVEhfQ0xJRU5UX0lELFxuICAgIG9hdXRoQ2xpZW50U2VjcmV0OiBlLlBMQVRGT1JNX09BVVRIX0NMSUVOVF9TRUNSRVQsXG4gICAgb2F1dGhTY29wZTogZS5QTEFURk9STV9PQVVUSF9TQ09QRSxcbiAgICBzZXJ2aWNlSWQ6IGUuUExBVEZPUk1fU0VSVklDRV9JRCxcbiAgICBzZXJ2aWNlU2VjcmV0OiBlLlBMQVRGT1JNX1NJR05JTkdfU0VDUkVULFxuICB9O1xufVxuXG4vKipcbiAqIERlZmF1bHQgY2xpZW50LiBSZWFkcyBjb25maWcgZnJvbSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgb24gZmlyc3RcbiAqIHByb3BlcnR5IGFjY2VzcyAoc28gdGVzdCBzZXR1cHMgdGhhdCBtdXRhdGUgYHByb2Nlc3MuZW52YCBhZnRlclxuICogaW1wb3J0IHdvcmspLiBVc2UgYGNyZWF0ZUNsaWVudCguLi4pYCB3aGVuIHlvdSBuZWVkIGFuIGlzb2xhdGVkXG4gKiBpbnN0YW5jZSB3aXRoIGV4cGxpY2l0IGNvbmZpZy5cbiAqXG4gKiAgIFBMQVRGT1JNX0JBU0VfVVJMICAgICAgICAgICAgICBkZWZhdWx0cyB0byBodHRwczovL2FwaS5wbGF0Zm9ybS51ZW5nYWdlLmlvXG4gKiAgIFBMQVRGT1JNX0FVVEhfVE9LRU4gICAgICAgICAgICBCZWFyZXIgdG9rZW4gKG92ZXJyaWRlcyBPQXV0aCArIEhNQUMpXG4gKiAgIFBMQVRGT1JNX09BVVRIX0NMSUVOVF9JRCAgICAgICBPQXV0aDIgY2xpZW50X2NyZWRlbnRpYWxzXG4gKiAgIFBMQVRGT1JNX09BVVRIX0NMSUVOVF9TRUNSRVQgICBPQXV0aDIgY2xpZW50X2NyZWRlbnRpYWxzXG4gKiAgIFBMQVRGT1JNX09BVVRIX1NDT1BFICAgICAgICAgICBvcHRpb25hbCBzcGFjZS1zZXBhcmF0ZWQgc2NvcGUgbGlzdFxuICogICBQTEFURk9STV9TRVJWSUNFX0lEICAgICAgICAgICAgSE1BQyBzZXJ2aWNlLWlkIChsZWdhY3kgLyBhdWRpdClcbiAqICAgUExBVEZPUk1fU0lHTklOR19TRUNSRVQgICAgICAgIEhNQUMgcmF3IHNlY3JldCAgKGxlZ2FjeSAvIGF1ZGl0KVxuICovXG5leHBvcnQgY29uc3QgcGxhdGZvcm06IFBsYXRmb3JtQ2xpZW50ID0gbmV3IFByb3h5KHt9IGFzIFBsYXRmb3JtQ2xpZW50LCB7XG4gIGdldChfLCBwcm9wKSB7XG4gICAgY29uc3QgcyA9IHNpbmdsZXRvbigpIGFzIHVua25vd24gYXMgUmVjb3JkPFByb3BlcnR5S2V5LCB1bmtub3duPjtcbiAgICByZXR1cm4gc1twcm9wXTtcbiAgfSxcbn0pO1xuXG4vKiogVGVzdC1vbmx5OiBkcm9wIHRoZSBzaW5nbGV0b24gY2FjaGUgYmV0d2VlbiBjYXNlcy4gKi9cbmV4cG9ydCBmdW5jdGlvbiBfcmVzZXRQbGF0Zm9ybVNpbmdsZXRvbigpOiB2b2lkIHtcbiAgY2FjaGVkU2luZ2xldG9uID0gdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIENvbnZlbmllbmNlOiBzaG9ydGhhbmQgZm9yIGBwbGF0Zm9ybS53aXRoVG9rZW4odG9rZW4pYC5cbiAqIEJGRiBoYW5kbGVycyBjb21tb25seSBjYWxsIHRoaXMgb25jZSBwZXIgcmVxdWVzdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdpdGhUb2tlbih0b2tlbjogc3RyaW5nIHwgKCgpID0+IHN0cmluZyB8IFByb21pc2U8c3RyaW5nPikpOiBQbGF0Zm9ybUNsaWVudCB7XG4gIHJldHVybiBzaW5nbGV0b24oKS53aXRoVG9rZW4odG9rZW4pO1xufVxuIl19
|
|
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
|
@@ -5,10 +5,6 @@ export declare const DEFAULT_BASE_URL = "https://api.platform.uengage.io";
|
|
|
5
5
|
* Resolved auth state. Discriminated by `type` so consumers can narrow.
|
|
6
6
|
*/
|
|
7
7
|
export type PlatformAuth = {
|
|
8
|
-
type: 'hmac';
|
|
9
|
-
secret: string;
|
|
10
|
-
serviceId: string;
|
|
11
|
-
} | {
|
|
12
8
|
type: 'bearer';
|
|
13
9
|
token: string;
|
|
14
10
|
} | {
|
|
@@ -21,11 +17,6 @@ export interface PlatformConfig {
|
|
|
21
17
|
fetchFn: typeof fetch;
|
|
22
18
|
logger?: Logger;
|
|
23
19
|
}
|
|
24
|
-
/**
|
|
25
|
-
* Caller-facing input shape. `auth` accepts either a discriminated
|
|
26
|
-
* PlatformAuth or the looser PlatformAuthInput - the looser form is
|
|
27
|
-
* also what `.auth()` accepts.
|
|
28
|
-
*/
|
|
29
20
|
export interface PlatformConfigInput {
|
|
30
21
|
baseUrl?: string;
|
|
31
22
|
auth?: PlatformAuthInput | PlatformAuth;
|
|
@@ -33,13 +24,12 @@ export interface PlatformConfigInput {
|
|
|
33
24
|
logger?: Logger;
|
|
34
25
|
}
|
|
35
26
|
/**
|
|
36
|
-
* `.auth()` shape. Pass
|
|
37
|
-
* (
|
|
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()`.
|
|
38
30
|
*/
|
|
39
31
|
export interface PlatformAuthInput {
|
|
40
32
|
token?: string;
|
|
41
|
-
secret?: string;
|
|
42
|
-
serviceId?: string;
|
|
43
33
|
}
|
|
44
34
|
/**
|
|
45
35
|
* Resolve env-defaulted config. Re-read on every call so that callers can
|
|
@@ -48,8 +38,13 @@ export interface PlatformAuthInput {
|
|
|
48
38
|
*/
|
|
49
39
|
export declare function envDefaults(): PlatformConfig;
|
|
50
40
|
/**
|
|
51
|
-
* Coerce `.auth()` input or `config({auth})` input into a typed
|
|
52
|
-
* Throws
|
|
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.
|
|
53
48
|
*/
|
|
54
49
|
export declare function normalizeAuth(input: PlatformAuthInput | PlatformAuth): PlatformAuth;
|
|
55
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.
|
|
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
|
|
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
|
|
31
|
-
* Throws
|
|
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
|
-
|
|
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,
|
|
79
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2NvbmZpZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUF3Q0Esa0NBTUM7QUFpQkQsc0NBUUM7QUFwRVksUUFBQSxnQkFBZ0IsR0FBRyxpQ0FBaUMsQ0FBQztBQWdDbEU7Ozs7R0FJRztBQUNILFNBQWdCLFdBQVc7SUFDekIsT0FBTztRQUNMLE9BQU8sRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLGdCQUFnQixJQUFJLHdCQUFnQjtRQUN6RCxJQUFJLEVBQUUsT0FBTyxFQUFFO1FBQ2YsT0FBTyxFQUFFLFVBQVUsQ0FBQyxLQUFxQjtLQUMxQyxDQUFDO0FBQ0osQ0FBQztBQUVELFNBQVMsT0FBTztJQUNkLE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsa0JBQWtCLENBQUM7SUFDN0MsSUFBSSxLQUFLO1FBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLENBQUM7SUFDNUMsT0FBTyxTQUFTLENBQUM7QUFDbkIsQ0FBQztBQUVEOzs7Ozs7OztHQVFHO0FBQ0gsU0FBZ0IsYUFBYSxDQUFDLEtBQXVDO0lBQ25FLElBQUksTUFBTSxJQUFJLEtBQUs7UUFBRSxPQUFPLEtBQUssQ0FBQztJQUNsQyxJQUFJLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNoQixPQUFPLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQ2hELENBQUM7SUFDRCxNQUFNLElBQUksS0FBSyxDQUNiLHNJQUFzSSxDQUN2SSxDQUFDO0FBQ0osQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsTUFBYSxXQUFXO0lBQ2QsU0FBUyxHQUF3QixFQUFFLENBQUM7SUFDcEMsWUFBWSxDQUEyQjtJQUN2QyxlQUFlLEdBQUcsS0FBSyxDQUFDO0lBRWhDLEtBQUssQ0FBQyxLQUEwQjtRQUM5QixJQUFJLEtBQUssQ0FBQyxPQUFPLEtBQUssU0FBUztZQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUM7UUFDeEUsSUFBSSxLQUFLLENBQUMsT0FBTyxLQUFLLFNBQVM7WUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDO1FBQ3hFLElBQUksS0FBSyxDQUFDLE1BQU0sS0FBSyxTQUFTO1lBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQztRQUNyRSxJQUFJLEtBQUssQ0FBQyxJQUFJLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDN0IsSUFBSSxDQUFDLFlBQVksR0FBRyxhQUFhLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzlDLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDO1FBQzlCLENBQUM7SUFDSCxDQUFDO0lBRUQsT0FBTyxDQUFDLEtBQXVDO1FBQzdDLElBQUksQ0FBQyxZQUFZLEdBQUcsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3pDLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDO0lBQzlCLENBQUM7SUFFRCxPQUFPO1FBQ0wsTUFBTSxHQUFHLEdBQUcsV0FBVyxFQUFFLENBQUM7UUFDMUIsT0FBTztZQUNMLE9BQU8sRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sSUFBSSxHQUFHLENBQUMsT0FBTztZQUM5QyxJQUFJLEVBQUUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUk7WUFDekQsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLElBQUksR0FBRyxDQUFDLE9BQU8sQ0FBaUI7WUFDaEUsTUFBTSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBNEI7U0FDcEQsQ0FBQztJQUNKLENBQUM7Q0FDRjtBQTdCRCxrQ0E2QkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IExvZ2dlciB9IGZyb20gJ0B1ZW5nYWdlLmlvL2pzLWxvZ2dlcic7XG5pbXBvcnQgdHlwZSB7IFRva2VuU291cmNlU3RhdGUgfSBmcm9tICcuL3Rva2VuLXNvdXJjZSc7XG5cbmV4cG9ydCBjb25zdCBERUZBVUxUX0JBU0VfVVJMID0gJ2h0dHBzOi8vYXBpLnBsYXRmb3JtLnVlbmdhZ2UuaW8nO1xuXG4vKipcbiAqIFJlc29sdmVkIGF1dGggc3RhdGUuIERpc2NyaW1pbmF0ZWQgYnkgYHR5cGVgIHNvIGNvbnN1bWVycyBjYW4gbmFycm93LlxuICovXG5leHBvcnQgdHlwZSBQbGF0Zm9ybUF1dGggPVxuICB8IHsgdHlwZTogJ2JlYXJlcic7IHRva2VuOiBzdHJpbmcgfVxuICB8IHsgdHlwZTogJ3Rva2VuLXNvdXJjZSc7IHN0YXRlOiBUb2tlblNvdXJjZVN0YXRlIH07XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGxhdGZvcm1Db25maWcge1xuICBiYXNlVXJsOiBzdHJpbmc7XG4gIGF1dGg/OiBQbGF0Zm9ybUF1dGg7XG4gIGZldGNoRm46IHR5cGVvZiBmZXRjaDtcbiAgbG9nZ2VyPzogTG9nZ2VyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFBsYXRmb3JtQ29uZmlnSW5wdXQge1xuICBiYXNlVXJsPzogc3RyaW5nO1xuICBhdXRoPzogUGxhdGZvcm1BdXRoSW5wdXQgfCBQbGF0Zm9ybUF1dGg7XG4gIGZldGNoRm4/OiB0eXBlb2YgZmV0Y2g7XG4gIGxvZ2dlcj86IExvZ2dlcjtcbn1cblxuLyoqXG4gKiBgLmF1dGgoKWAgc2hhcGUuIFBhc3MgYHt0b2tlbn1gIGZvciBhIHN0YXRpYyBCZWFyZXIgYWNjZXNzIHRva2VuLlxuICogT0F1dGgyIGNsaWVudF9jcmVkZW50aWFscyBsaXZlIGF0IGBjcmVhdGVDbGllbnQoKWAgY29uZmlnLXRpbWVcbiAqIChgc2VydmljZUlkYCArIGBzZXJ2aWNlU2VjcmV0YCBmaWVsZHMpLCBub3QgdmlhIGAuYXV0aCgpYC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQbGF0Zm9ybUF1dGhJbnB1dCB7XG4gIHRva2VuPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIFJlc29sdmUgZW52LWRlZmF1bHRlZCBjb25maWcuIFJlLXJlYWQgb24gZXZlcnkgY2FsbCBzbyB0aGF0IGNhbGxlcnMgY2FuXG4gKiBzZXQgZW52IHZhcnMgYWZ0ZXIgdGhlIFNESyBoYXMgYmVlbiBpbXBvcnRlZCBhbmQgc3RpbGwgcGljayB0aGVtIHVwIG9uXG4gKiB0aGUgbmV4dCByZXF1ZXN0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZW52RGVmYXVsdHMoKTogUGxhdGZvcm1Db25maWcge1xuICByZXR1cm4ge1xuICAgIGJhc2VVcmw6IHByb2Nlc3MuZW52LlVFTkdBR0VfQkFTRV9VUkwgPz8gREVGQVVMVF9CQVNFX1VSTCxcbiAgICBhdXRoOiBlbnZBdXRoKCksXG4gICAgZmV0Y2hGbjogZ2xvYmFsVGhpcy5mZXRjaCBhcyB0eXBlb2YgZmV0Y2gsXG4gIH07XG59XG5cbmZ1bmN0aW9uIGVudkF1dGgoKTogUGxhdGZvcm1BdXRoIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgdG9rZW4gPSBwcm9jZXNzLmVudi5VRU5HQUdFX0FVVEhfVE9LRU47XG4gIGlmICh0b2tlbikgcmV0dXJuIHsgdHlwZTogJ2JlYXJlcicsIHRva2VuIH07XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogQ29lcmNlIGAuYXV0aCgpYCBpbnB1dCBvciBgY29uZmlnKHthdXRofSlgIGlucHV0IGludG8gYSB0eXBlZFxuICogUGxhdGZvcm1BdXRoLiBUaHJvd3Mgd2hlbiB0aGUgaW5wdXQgaGFzIG5vIHVzYWJsZSBjcmVkZW50aWFscy5cbiAqXG4gKiBUb2RheSB0aGlzIG9ubHkgYWNjZXB0cyBge3Rva2VufWAgb3IgYSBwcmUtc2hhcGVkIGBQbGF0Zm9ybUF1dGhgLlxuICogRm9yIE9BdXRoMiBjbGllbnRfY3JlZGVudGlhbHMgdXNlIGBjcmVhdGVDbGllbnQoe3NlcnZpY2VJZCwgc2VydmljZVNlY3JldH0pYFxuICogaW5zdGVhZCDigJQgdGhhdCBidWlsZHMgYSBUb2tlblNvdXJjZSB3aGljaCBtaW50cyArIGNhY2hlcyBCZWFyZXJcbiAqIHRva2Vucy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZUF1dGgoaW5wdXQ6IFBsYXRmb3JtQXV0aElucHV0IHwgUGxhdGZvcm1BdXRoKTogUGxhdGZvcm1BdXRoIHtcbiAgaWYgKCd0eXBlJyBpbiBpbnB1dCkgcmV0dXJuIGlucHV0O1xuICBpZiAoaW5wdXQudG9rZW4pIHtcbiAgICByZXR1cm4geyB0eXBlOiAnYmVhcmVyJywgdG9rZW46IGlucHV0LnRva2VuIH07XG4gIH1cbiAgdGhyb3cgbmV3IEVycm9yKFxuICAgICdhdXRoKCk6IHBhc3Mge3Rva2VufSBmb3IgYSBzdGF0aWMgQmVhcmVyIGFjY2VzcyB0b2tlbiwgb3IgdXNlIGNyZWF0ZUNsaWVudCh7c2VydmljZUlkLCBzZXJ2aWNlU2VjcmV0fSkgZm9yIE9BdXRoMiBjbGllbnRfY3JlZGVudGlhbHMnLFxuICApO1xufVxuXG4vKipcbiAqIE11dGFibGUgY29uZmlnIHNoYXJlZCBieSBjbGllbnRzLiBgYXBwbHkoKWAgYW5kIGBzZXRBdXRoKClgIGFyZSBob3cgdGhlXG4gKiBjaGFpbmFibGUgYC5jb25maWcoKWAgLyBgLmF1dGgoKWAgbWV0aG9kcyB3cml0ZSBiYWNrLiBgcmVzb2x2ZSgpYCBwcm9kdWNlc1xuICogdGhlIGVmZmVjdGl2ZSBjb25maWcgZm9yIG9uZSByZXF1ZXN0LCBmYWxsaW5nIGJhY2sgdG8gY3VycmVudCBlbnYgc3RhdGVcbiAqIGZvciBmaWVsZHMgdGhlIGNhbGxlciBoYXNuJ3QgcGlubmVkLlxuICovXG5leHBvcnQgY2xhc3MgQ29uZmlnU3RhdGUge1xuICBwcml2YXRlIG92ZXJyaWRlczogUGxhdGZvcm1Db25maWdJbnB1dCA9IHt9O1xuICBwcml2YXRlIGV4cGxpY2l0QXV0aDogUGxhdGZvcm1BdXRoIHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIGhhc0V4cGxpY2l0QXV0aCA9IGZhbHNlO1xuXG4gIGFwcGx5KGlucHV0OiBQbGF0Zm9ybUNvbmZpZ0lucHV0KTogdm9pZCB7XG4gICAgaWYgKGlucHV0LmJhc2VVcmwgIT09IHVuZGVmaW5lZCkgdGhpcy5vdmVycmlkZXMuYmFzZVVybCA9IGlucHV0LmJhc2VVcmw7XG4gICAgaWYgKGlucHV0LmZldGNoRm4gIT09IHVuZGVmaW5lZCkgdGhpcy5vdmVycmlkZXMuZmV0Y2hGbiA9IGlucHV0LmZldGNoRm47XG4gICAgaWYgKGlucHV0LmxvZ2dlciAhPT0gdW5kZWZpbmVkKSB0aGlzLm92ZXJyaWRlcy5sb2dnZXIgPSBpbnB1dC5sb2dnZXI7XG4gICAgaWYgKGlucHV0LmF1dGggIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5leHBsaWNpdEF1dGggPSBub3JtYWxpemVBdXRoKGlucHV0LmF1dGgpO1xuICAgICAgdGhpcy5oYXNFeHBsaWNpdEF1dGggPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIHNldEF1dGgoaW5wdXQ6IFBsYXRmb3JtQXV0aElucHV0IHwgUGxhdGZvcm1BdXRoKTogdm9pZCB7XG4gICAgdGhpcy5leHBsaWNpdEF1dGggPSBub3JtYWxpemVBdXRoKGlucHV0KTtcbiAgICB0aGlzLmhhc0V4cGxpY2l0QXV0aCA9IHRydWU7XG4gIH1cblxuICByZXNvbHZlKCk6IFBsYXRmb3JtQ29uZmlnIHtcbiAgICBjb25zdCBlbnYgPSBlbnZEZWZhdWx0cygpO1xuICAgIHJldHVybiB7XG4gICAgICBiYXNlVXJsOiB0aGlzLm92ZXJyaWRlcy5iYXNlVXJsID8/IGVudi5iYXNlVXJsLFxuICAgICAgYXV0aDogdGhpcy5oYXNFeHBsaWNpdEF1dGggPyB0aGlzLmV4cGxpY2l0QXV0aCA6IGVudi5hdXRoLFxuICAgICAgZmV0Y2hGbjogKHRoaXMub3ZlcnJpZGVzLmZldGNoRm4gPz8gZW52LmZldGNoRm4pIGFzIHR5cGVvZiBmZXRjaCxcbiAgICAgIGxvZ2dlcjogdGhpcy5vdmVycmlkZXMubG9nZ2VyIGFzIExvZ2dlciB8IHVuZGVmaW5lZCxcbiAgICB9O1xuICB9XG59XG4iXX0=
|
package/dist/http.d.ts
CHANGED
|
@@ -7,14 +7,18 @@ export interface SignedHeaderParams {
|
|
|
7
7
|
body?: string;
|
|
8
8
|
}
|
|
9
9
|
/**
|
|
10
|
-
* Build the headers
|
|
11
|
-
* the effective auth on `config`. Async because the `token-source`
|
|
12
|
-
* auth path may need to mint or refresh before returning.
|
|
10
|
+
* Build the headers for a request to the platform API.
|
|
13
11
|
*
|
|
14
12
|
* Adds three platform-wide headers automatically:
|
|
15
13
|
* - `User-Agent` so the gateway can attribute traffic to SDK version
|
|
16
14
|
* - `Idempotency-Key` (UUID v4) on mutating methods, so callers don't
|
|
17
15
|
* have to generate one per call
|
|
18
16
|
* - `content-type: application/json` when a body is supplied
|
|
17
|
+
*
|
|
18
|
+
* Auth comes from `config.auth`:
|
|
19
|
+
* - `bearer`: the token is sent verbatim (caller is responsible for
|
|
20
|
+
* freshness; SDK throws TokenExpiredError on local-detected expiry)
|
|
21
|
+
* - `token-source`: SDK mints + caches via OAuth2 client_credentials
|
|
22
|
+
* and refreshes on expiry / 401
|
|
19
23
|
*/
|
|
20
24
|
export declare function buildHeaders(config: PlatformConfig, params: SignedHeaderParams): Promise<Record<string, string>>;
|
package/dist/http.js
CHANGED
|
@@ -2,20 +2,23 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.buildHeaders = buildHeaders;
|
|
4
4
|
const node_crypto_1 = require("node:crypto");
|
|
5
|
-
const sign_1 = require("./audit/sign");
|
|
6
5
|
const token_source_1 = require("./token-source");
|
|
7
6
|
const version_1 = require("./version");
|
|
8
7
|
const MUTATING_METHODS = new Set(['POST', 'PUT', 'PATCH', 'DELETE']);
|
|
9
8
|
/**
|
|
10
|
-
* Build the headers
|
|
11
|
-
* the effective auth on `config`. Async because the `token-source`
|
|
12
|
-
* auth path may need to mint or refresh before returning.
|
|
9
|
+
* Build the headers for a request to the platform API.
|
|
13
10
|
*
|
|
14
11
|
* Adds three platform-wide headers automatically:
|
|
15
12
|
* - `User-Agent` so the gateway can attribute traffic to SDK version
|
|
16
13
|
* - `Idempotency-Key` (UUID v4) on mutating methods, so callers don't
|
|
17
14
|
* have to generate one per call
|
|
18
15
|
* - `content-type: application/json` when a body is supplied
|
|
16
|
+
*
|
|
17
|
+
* Auth comes from `config.auth`:
|
|
18
|
+
* - `bearer`: the token is sent verbatim (caller is responsible for
|
|
19
|
+
* freshness; SDK throws TokenExpiredError on local-detected expiry)
|
|
20
|
+
* - `token-source`: SDK mints + caches via OAuth2 client_credentials
|
|
21
|
+
* and refreshes on expiry / 401
|
|
19
22
|
*/
|
|
20
23
|
async function buildHeaders(config, params) {
|
|
21
24
|
const headers = {
|
|
@@ -32,27 +35,9 @@ async function buildHeaders(config, params) {
|
|
|
32
35
|
headers['authorization'] = `Bearer ${config.auth.token}`;
|
|
33
36
|
return headers;
|
|
34
37
|
}
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
return headers;
|
|
39
|
-
}
|
|
40
|
-
// HMAC
|
|
41
|
-
const timestamp = new Date().toISOString().replace(/\.\d{3}Z$/, 'Z');
|
|
42
|
-
const nonce = (0, node_crypto_1.randomUUID)();
|
|
43
|
-
const signature = (0, sign_1.signRequest)({
|
|
44
|
-
method: params.method,
|
|
45
|
-
path: params.path,
|
|
46
|
-
serviceId: config.auth.serviceId,
|
|
47
|
-
timestamp,
|
|
48
|
-
nonce,
|
|
49
|
-
body: params.body ?? '',
|
|
50
|
-
secret: config.auth.secret,
|
|
51
|
-
});
|
|
52
|
-
headers['x-service-id'] = config.auth.serviceId;
|
|
53
|
-
headers['x-timestamp'] = timestamp;
|
|
54
|
-
headers['x-nonce'] = nonce;
|
|
55
|
-
headers['x-signature'] = signature;
|
|
38
|
+
// token-source: mint + cache + refresh-dedup happens in getAccessToken
|
|
39
|
+
const token = await (0, token_source_1.getAccessToken)(config.auth.state);
|
|
40
|
+
headers['authorization'] = `Bearer ${token}`;
|
|
56
41
|
return headers;
|
|
57
42
|
}
|
|
58
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
43
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHR0cC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9odHRwLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBOEJBLG9DQXVCQztBQXJERCw2Q0FBeUM7QUFFekMsaURBQWdEO0FBQ2hELHVDQUF3QztBQVV4QyxNQUFNLGdCQUFnQixHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQztBQUVyRTs7Ozs7Ozs7Ozs7Ozs7R0FjRztBQUNJLEtBQUssVUFBVSxZQUFZLENBQ2hDLE1BQXNCLEVBQ3RCLE1BQTBCO0lBRTFCLE1BQU0sT0FBTyxHQUEyQjtRQUN0QyxZQUFZLEVBQUUsd0JBQXdCLHFCQUFXLEVBQUU7S0FDcEQsQ0FBQztJQUNGLElBQUksTUFBTSxDQUFDLElBQUksS0FBSyxTQUFTO1FBQUUsT0FBTyxDQUFDLGNBQWMsQ0FBQyxHQUFHLGtCQUFrQixDQUFDO0lBQzVFLElBQUksZ0JBQWdCLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsV0FBVyxFQUFFLENBQUMsRUFBRSxDQUFDO1FBQ3RELE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLElBQUEsd0JBQVUsR0FBRSxDQUFDO0lBQzVDLENBQUM7SUFFRCxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUk7UUFBRSxPQUFPLE9BQU8sQ0FBQztJQUVqQyxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxLQUFLLFFBQVEsRUFBRSxDQUFDO1FBQ2xDLE9BQU8sQ0FBQyxlQUFlLENBQUMsR0FBRyxVQUFVLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDekQsT0FBTyxPQUFPLENBQUM7SUFDakIsQ0FBQztJQUVELHVFQUF1RTtJQUN2RSxNQUFNLEtBQUssR0FBRyxNQUFNLElBQUEsNkJBQWMsRUFBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3RELE9BQU8sQ0FBQyxlQUFlLENBQUMsR0FBRyxVQUFVLEtBQUssRUFBRSxDQUFDO0lBQzdDLE9BQU8sT0FBTyxDQUFDO0FBQ2pCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyByYW5kb21VVUlEIH0gZnJvbSAnbm9kZTpjcnlwdG8nO1xuaW1wb3J0IHR5cGUgeyBQbGF0Zm9ybUNvbmZpZyB9IGZyb20gJy4vY29uZmlnJztcbmltcG9ydCB7IGdldEFjY2Vzc1Rva2VuIH0gZnJvbSAnLi90b2tlbi1zb3VyY2UnO1xuaW1wb3J0IHsgU0RLX1ZFUlNJT04gfSBmcm9tICcuL3ZlcnNpb24nO1xuXG5leHBvcnQgaW50ZXJmYWNlIFNpZ25lZEhlYWRlclBhcmFtcyB7XG4gIG1ldGhvZDogc3RyaW5nO1xuICAvKiogVVJMIHBhdGhuYW1lIG9ubHksIHdpdGhvdXQgcXVlcnkgc3RyaW5nLiBNdXN0IG1hdGNoIGBjLnJlcS5wYXRoYCBzZXJ2ZXItc2lkZS4gKi9cbiAgcGF0aDogc3RyaW5nO1xuICAvKiogUmF3IEpTT04gYm9keSBzdHJpbmcsIG9yIGVtcHR5IGZvciBub25lLiAqL1xuICBib2R5Pzogc3RyaW5nO1xufVxuXG5jb25zdCBNVVRBVElOR19NRVRIT0RTID0gbmV3IFNldChbJ1BPU1QnLCAnUFVUJywgJ1BBVENIJywgJ0RFTEVURSddKTtcblxuLyoqXG4gKiBCdWlsZCB0aGUgaGVhZGVycyBmb3IgYSByZXF1ZXN0IHRvIHRoZSBwbGF0Zm9ybSBBUEkuXG4gKlxuICogQWRkcyB0aHJlZSBwbGF0Zm9ybS13aWRlIGhlYWRlcnMgYXV0b21hdGljYWxseTpcbiAqICAgLSBgVXNlci1BZ2VudGAgc28gdGhlIGdhdGV3YXkgY2FuIGF0dHJpYnV0ZSB0cmFmZmljIHRvIFNESyB2ZXJzaW9uXG4gKiAgIC0gYElkZW1wb3RlbmN5LUtleWAgKFVVSUQgdjQpIG9uIG11dGF0aW5nIG1ldGhvZHMsIHNvIGNhbGxlcnMgZG9uJ3RcbiAqICAgICBoYXZlIHRvIGdlbmVyYXRlIG9uZSBwZXIgY2FsbFxuICogICAtIGBjb250ZW50LXR5cGU6IGFwcGxpY2F0aW9uL2pzb25gIHdoZW4gYSBib2R5IGlzIHN1cHBsaWVkXG4gKlxuICogQXV0aCBjb21lcyBmcm9tIGBjb25maWcuYXV0aGA6XG4gKiAgIC0gYGJlYXJlcmA6IHRoZSB0b2tlbiBpcyBzZW50IHZlcmJhdGltIChjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yXG4gKiAgICAgZnJlc2huZXNzOyBTREsgdGhyb3dzIFRva2VuRXhwaXJlZEVycm9yIG9uIGxvY2FsLWRldGVjdGVkIGV4cGlyeSlcbiAqICAgLSBgdG9rZW4tc291cmNlYDogU0RLIG1pbnRzICsgY2FjaGVzIHZpYSBPQXV0aDIgY2xpZW50X2NyZWRlbnRpYWxzXG4gKiAgICAgYW5kIHJlZnJlc2hlcyBvbiBleHBpcnkgLyA0MDFcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGJ1aWxkSGVhZGVycyhcbiAgY29uZmlnOiBQbGF0Zm9ybUNvbmZpZyxcbiAgcGFyYW1zOiBTaWduZWRIZWFkZXJQYXJhbXMsXG4pOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIHN0cmluZz4+IHtcbiAgY29uc3QgaGVhZGVyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAndXNlci1hZ2VudCc6IGB1ZW5nYWdlLXBsYXRmb3JtLXNkay8ke1NES19WRVJTSU9OfWAsXG4gIH07XG4gIGlmIChwYXJhbXMuYm9keSAhPT0gdW5kZWZpbmVkKSBoZWFkZXJzWydjb250ZW50LXR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcbiAgaWYgKE1VVEFUSU5HX01FVEhPRFMuaGFzKHBhcmFtcy5tZXRob2QudG9VcHBlckNhc2UoKSkpIHtcbiAgICBoZWFkZXJzWydpZGVtcG90ZW5jeS1rZXknXSA9IHJhbmRvbVVVSUQoKTtcbiAgfVxuXG4gIGlmICghY29uZmlnLmF1dGgpIHJldHVybiBoZWFkZXJzO1xuXG4gIGlmIChjb25maWcuYXV0aC50eXBlID09PSAnYmVhcmVyJykge1xuICAgIGhlYWRlcnNbJ2F1dGhvcml6YXRpb24nXSA9IGBCZWFyZXIgJHtjb25maWcuYXV0aC50b2tlbn1gO1xuICAgIHJldHVybiBoZWFkZXJzO1xuICB9XG5cbiAgLy8gdG9rZW4tc291cmNlOiBtaW50ICsgY2FjaGUgKyByZWZyZXNoLWRlZHVwIGhhcHBlbnMgaW4gZ2V0QWNjZXNzVG9rZW5cbiAgY29uc3QgdG9rZW4gPSBhd2FpdCBnZXRBY2Nlc3NUb2tlbihjb25maWcuYXV0aC5zdGF0ZSk7XG4gIGhlYWRlcnNbJ2F1dGhvcml6YXRpb24nXSA9IGBCZWFyZXIgJHt0b2tlbn1gO1xuICByZXR1cm4gaGVhZGVycztcbn1cbiJdfQ==
|
package/dist/index.d.ts
CHANGED
|
@@ -8,14 +8,17 @@ export { createClient, platform, withToken, type ClientConfig, type PlatformClie
|
|
|
8
8
|
/**
|
|
9
9
|
* Default singleton clients. Both read defaults from the environment on
|
|
10
10
|
* every call:
|
|
11
|
-
* -
|
|
12
|
-
* -
|
|
13
|
-
* -
|
|
14
|
-
* -
|
|
11
|
+
* - UENGAGE_BASE_URL defaults to https://api.platform.uengage.io
|
|
12
|
+
* - UENGAGE_AUTH_TOKEN static Bearer token
|
|
13
|
+
* - UENGAGE_SERVICE_ID OAuth2 client_credentials clientId
|
|
14
|
+
* - UENGAGE_SERVICE_SECRET OAuth2 client_credentials clientSecret
|
|
15
|
+
* - UENGAGE_SERVICE_SCOPE optional space-separated scope list
|
|
15
16
|
*
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
*
|
|
17
|
+
* The chainable `.config({...})` / `.auth({...})` API on the audit and
|
|
18
|
+
* business clients is preserved for back-compat. `.auth({token})`
|
|
19
|
+
* accepts a static Bearer token; for OAuth2 client_credentials use the
|
|
20
|
+
* unified `createClient(...)` factory instead — that builds a
|
|
21
|
+
* TokenSource which handles caching + refresh dedup + 401 retry.
|
|
19
22
|
*/
|
|
20
23
|
export declare const audit: import("./audit").AuditClient;
|
|
21
24
|
export declare const business: import("./business").BusinessClient;
|
package/dist/index.js
CHANGED
|
@@ -31,15 +31,18 @@ const business_1 = require("./business");
|
|
|
31
31
|
/**
|
|
32
32
|
* Default singleton clients. Both read defaults from the environment on
|
|
33
33
|
* every call:
|
|
34
|
-
* -
|
|
35
|
-
* -
|
|
36
|
-
* -
|
|
37
|
-
* -
|
|
34
|
+
* - UENGAGE_BASE_URL defaults to https://api.platform.uengage.io
|
|
35
|
+
* - UENGAGE_AUTH_TOKEN static Bearer token
|
|
36
|
+
* - UENGAGE_SERVICE_ID OAuth2 client_credentials clientId
|
|
37
|
+
* - UENGAGE_SERVICE_SECRET OAuth2 client_credentials clientSecret
|
|
38
|
+
* - UENGAGE_SERVICE_SCOPE optional space-separated scope list
|
|
38
39
|
*
|
|
39
|
-
*
|
|
40
|
-
*
|
|
41
|
-
*
|
|
40
|
+
* The chainable `.config({...})` / `.auth({...})` API on the audit and
|
|
41
|
+
* business clients is preserved for back-compat. `.auth({token})`
|
|
42
|
+
* accepts a static Bearer token; for OAuth2 client_credentials use the
|
|
43
|
+
* unified `createClient(...)` factory instead — that builds a
|
|
44
|
+
* TokenSource which handles caching + refresh dedup + 401 retry.
|
|
42
45
|
*/
|
|
43
46
|
exports.audit = (0, audit_1.createAuditClient)();
|
|
44
47
|
exports.business = (0, business_1.createBusinessClient)();
|
|
45
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
48
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSwwQ0FBd0I7QUFDeEIsNkNBQTJCO0FBQzNCLDJDQUF5QjtBQUN6QiwrQkFBOEI7QUFBckIsNEZBQUEsSUFBSSxPQUFBO0FBUWIsbUNBTWtCO0FBRGhCLDBHQUFBLGdCQUFnQixPQUFBO0FBRWxCLG1DQU1rQjtBQUxoQixzR0FBQSxZQUFZLE9BQUE7QUFDWixrR0FBQSxRQUFRLE9BQUE7QUFDUixtR0FBQSxTQUFTLE9BQUE7QUFLWCxtQ0FBNEM7QUFDNUMseUNBQWtEO0FBRWxEOzs7Ozs7Ozs7Ozs7OztHQWNHO0FBQ1UsUUFBQSxLQUFLLEdBQUcsSUFBQSx5QkFBaUIsR0FBRSxDQUFDO0FBQzVCLFFBQUEsUUFBUSxHQUFHLElBQUEsK0JBQW9CLEdBQUUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gJy4vYXVkaXQnO1xuZXhwb3J0ICogZnJvbSAnLi9idXNpbmVzcyc7XG5leHBvcnQgKiBmcm9tICcuL2Vycm9ycyc7XG5leHBvcnQgeyBhdXRoIH0gZnJvbSAnLi9hdXRoJztcbmV4cG9ydCB0eXBlIHtcbiAgUGtjZVBhaXIsXG4gIEF1dGhvcml6ZVVybElucHV0LFxuICBFeGNoYW5nZUNvZGVJbnB1dCxcbiAgUmVmcmVzaElucHV0LFxuICBUb2tlblBhaXIsXG59IGZyb20gJy4vYXV0aCc7XG5leHBvcnQge1xuICB0eXBlIFBsYXRmb3JtQXV0aCxcbiAgdHlwZSBQbGF0Zm9ybUF1dGhJbnB1dCxcbiAgdHlwZSBQbGF0Zm9ybUNvbmZpZyxcbiAgdHlwZSBQbGF0Zm9ybUNvbmZpZ0lucHV0LFxuICBERUZBVUxUX0JBU0VfVVJMLFxufSBmcm9tICcuL2NvbmZpZyc7XG5leHBvcnQge1xuICBjcmVhdGVDbGllbnQsXG4gIHBsYXRmb3JtLFxuICB3aXRoVG9rZW4sXG4gIHR5cGUgQ2xpZW50Q29uZmlnLFxuICB0eXBlIFBsYXRmb3JtQ2xpZW50LFxufSBmcm9tICcuL2NsaWVudCc7XG5cbmltcG9ydCB7IGNyZWF0ZUF1ZGl0Q2xpZW50IH0gZnJvbSAnLi9hdWRpdCc7XG5pbXBvcnQgeyBjcmVhdGVCdXNpbmVzc0NsaWVudCB9IGZyb20gJy4vYnVzaW5lc3MnO1xuXG4vKipcbiAqIERlZmF1bHQgc2luZ2xldG9uIGNsaWVudHMuIEJvdGggcmVhZCBkZWZhdWx0cyBmcm9tIHRoZSBlbnZpcm9ubWVudCBvblxuICogZXZlcnkgY2FsbDpcbiAqICAgLSBVRU5HQUdFX0JBU0VfVVJMICAgICAgICAgIGRlZmF1bHRzIHRvIGh0dHBzOi8vYXBpLnBsYXRmb3JtLnVlbmdhZ2UuaW9cbiAqICAgLSBVRU5HQUdFX0FVVEhfVE9LRU4gICAgICAgIHN0YXRpYyBCZWFyZXIgdG9rZW5cbiAqICAgLSBVRU5HQUdFX1NFUlZJQ0VfSUQgICAgICAgIE9BdXRoMiBjbGllbnRfY3JlZGVudGlhbHMgY2xpZW50SWRcbiAqICAgLSBVRU5HQUdFX1NFUlZJQ0VfU0VDUkVUICAgIE9BdXRoMiBjbGllbnRfY3JlZGVudGlhbHMgY2xpZW50U2VjcmV0XG4gKiAgIC0gVUVOR0FHRV9TRVJWSUNFX1NDT1BFICAgICBvcHRpb25hbCBzcGFjZS1zZXBhcmF0ZWQgc2NvcGUgbGlzdFxuICpcbiAqIFRoZSBjaGFpbmFibGUgYC5jb25maWcoey4uLn0pYCAvIGAuYXV0aCh7Li4ufSlgIEFQSSBvbiB0aGUgYXVkaXQgYW5kXG4gKiBidXNpbmVzcyBjbGllbnRzIGlzIHByZXNlcnZlZCBmb3IgYmFjay1jb21wYXQuIGAuYXV0aCh7dG9rZW59KWBcbiAqIGFjY2VwdHMgYSBzdGF0aWMgQmVhcmVyIHRva2VuOyBmb3IgT0F1dGgyIGNsaWVudF9jcmVkZW50aWFscyB1c2UgdGhlXG4gKiB1bmlmaWVkIGBjcmVhdGVDbGllbnQoLi4uKWAgZmFjdG9yeSBpbnN0ZWFkIOKAlCB0aGF0IGJ1aWxkcyBhXG4gKiBUb2tlblNvdXJjZSB3aGljaCBoYW5kbGVzIGNhY2hpbmcgKyByZWZyZXNoIGRlZHVwICsgNDAxIHJldHJ5LlxuICovXG5leHBvcnQgY29uc3QgYXVkaXQgPSBjcmVhdGVBdWRpdENsaWVudCgpO1xuZXhwb3J0IGNvbnN0IGJ1c2luZXNzID0gY3JlYXRlQnVzaW5lc3NDbGllbnQoKTtcbiJdfQ==
|
package/dist/version.d.ts
CHANGED
package/dist/version.js
CHANGED
|
@@ -8,5 +8,5 @@ exports.SDK_VERSION = void 0;
|
|
|
8
8
|
* (TS lib settings dependent) or a build-time replacement, and the
|
|
9
9
|
* cost of one bump-in-two-places per release is small.
|
|
10
10
|
*/
|
|
11
|
-
exports.SDK_VERSION = '0.
|
|
12
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
11
|
+
exports.SDK_VERSION = '0.7.0';
|
|
12
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVyc2lvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy92ZXJzaW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBOzs7Ozs7R0FNRztBQUNVLFFBQUEsV0FBVyxHQUFHLE9BQU8sQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogTWFudWFsbHktbWFpbnRhaW5lZCB2ZXJzaW9uIHN0cmluZyBzdXJmYWNlZCB2aWEgdGhlIGBVc2VyLUFnZW50YFxuICogaGVhZGVyLiBLZXB0IGluIHN5bmMgd2l0aCBgcGFja2FnZS5qc29uYCBieSBoYW5kIGJlY2F1c2UgcHVsbGluZyB0aGVcbiAqIHZhbHVlIGZyb20gcGFja2FnZS5qc29uIGF0IHJ1bnRpbWUgd291bGQgcmVxdWlyZSBlaXRoZXIgYSBKU09OIGltcG9ydFxuICogKFRTIGxpYiBzZXR0aW5ncyBkZXBlbmRlbnQpIG9yIGEgYnVpbGQtdGltZSByZXBsYWNlbWVudCwgYW5kIHRoZVxuICogY29zdCBvZiBvbmUgYnVtcC1pbi10d28tcGxhY2VzIHBlciByZWxlYXNlIGlzIHNtYWxsLlxuICovXG5leHBvcnQgY29uc3QgU0RLX1ZFUlNJT04gPSAnMC43LjAnO1xuIl19
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@uengage.io/platform-sdk",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.7.0",
|
|
4
4
|
"description": "Client SDK for the uEngage platform API (audit, business, ...). Namespaced singletons with HMAC or Bearer auth.",
|
|
5
5
|
"main": "./dist/index.js",
|
|
6
6
|
"types": "./dist/index.d.ts",
|
package/dist/audit/sign.d.ts
DELETED
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
export interface SignRequestParams {
|
|
2
|
-
method: string;
|
|
3
|
-
path: string;
|
|
4
|
-
serviceId: string;
|
|
5
|
-
timestamp: string;
|
|
6
|
-
nonce: string;
|
|
7
|
-
/** Raw JSON body string, or empty string for no body. */
|
|
8
|
-
body: string;
|
|
9
|
-
secret: string;
|
|
10
|
-
}
|
|
11
|
-
/**
|
|
12
|
-
* HMAC-SHA256 signature over a canonical request representation. Producer
|
|
13
|
-
* (this SDK) and verifier (`serviceAuthMiddleware` in `@uengage/common`) must
|
|
14
|
-
* compute the same canonical string, so any change here MUST be mirrored
|
|
15
|
-
* there. The canonical form is newline-separated, with no trailing newline:
|
|
16
|
-
*
|
|
17
|
-
* <METHOD>
|
|
18
|
-
* <PATH>
|
|
19
|
-
* <X-Service-Id>
|
|
20
|
-
* <X-Timestamp>
|
|
21
|
-
* <X-Nonce>
|
|
22
|
-
* <sha256-hex of body, or empty string for no body>
|
|
23
|
-
*/
|
|
24
|
-
export declare function signRequest(params: SignRequestParams): string;
|
package/dist/audit/sign.js
DELETED
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.signRequest = signRequest;
|
|
4
|
-
const node_crypto_1 = require("node:crypto");
|
|
5
|
-
/**
|
|
6
|
-
* HMAC-SHA256 signature over a canonical request representation. Producer
|
|
7
|
-
* (this SDK) and verifier (`serviceAuthMiddleware` in `@uengage/common`) must
|
|
8
|
-
* compute the same canonical string, so any change here MUST be mirrored
|
|
9
|
-
* there. The canonical form is newline-separated, with no trailing newline:
|
|
10
|
-
*
|
|
11
|
-
* <METHOD>
|
|
12
|
-
* <PATH>
|
|
13
|
-
* <X-Service-Id>
|
|
14
|
-
* <X-Timestamp>
|
|
15
|
-
* <X-Nonce>
|
|
16
|
-
* <sha256-hex of body, or empty string for no body>
|
|
17
|
-
*/
|
|
18
|
-
function signRequest(params) {
|
|
19
|
-
const bodyHash = params.body ? (0, node_crypto_1.createHash)('sha256').update(params.body).digest('hex') : '';
|
|
20
|
-
const canonical = [
|
|
21
|
-
params.method.toUpperCase(),
|
|
22
|
-
params.path,
|
|
23
|
-
params.serviceId,
|
|
24
|
-
params.timestamp,
|
|
25
|
-
params.nonce,
|
|
26
|
-
bodyHash,
|
|
27
|
-
].join('\n');
|
|
28
|
-
return (0, node_crypto_1.createHmac)('sha256', params.secret).update(canonical).digest('hex');
|
|
29
|
-
}
|
|
30
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2lnbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hdWRpdC9zaWduLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBMEJBLGtDQVdDO0FBckNELDZDQUFxRDtBQWFyRDs7Ozs7Ozs7Ozs7O0dBWUc7QUFDSCxTQUFnQixXQUFXLENBQUMsTUFBeUI7SUFDbkQsTUFBTSxRQUFRLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBQSx3QkFBVSxFQUFDLFFBQVEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDM0YsTUFBTSxTQUFTLEdBQUc7UUFDaEIsTUFBTSxDQUFDLE1BQU0sQ0FBQyxXQUFXLEVBQUU7UUFDM0IsTUFBTSxDQUFDLElBQUk7UUFDWCxNQUFNLENBQUMsU0FBUztRQUNoQixNQUFNLENBQUMsU0FBUztRQUNoQixNQUFNLENBQUMsS0FBSztRQUNaLFFBQVE7S0FDVCxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNiLE9BQU8sSUFBQSx3QkFBVSxFQUFDLFFBQVEsRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUM3RSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgY3JlYXRlSG1hYywgY3JlYXRlSGFzaCB9IGZyb20gJ25vZGU6Y3J5cHRvJztcblxuZXhwb3J0IGludGVyZmFjZSBTaWduUmVxdWVzdFBhcmFtcyB7XG4gIG1ldGhvZDogc3RyaW5nO1xuICBwYXRoOiBzdHJpbmc7XG4gIHNlcnZpY2VJZDogc3RyaW5nO1xuICB0aW1lc3RhbXA6IHN0cmluZztcbiAgbm9uY2U6IHN0cmluZztcbiAgLyoqIFJhdyBKU09OIGJvZHkgc3RyaW5nLCBvciBlbXB0eSBzdHJpbmcgZm9yIG5vIGJvZHkuICovXG4gIGJvZHk6IHN0cmluZztcbiAgc2VjcmV0OiBzdHJpbmc7XG59XG5cbi8qKlxuICogSE1BQy1TSEEyNTYgc2lnbmF0dXJlIG92ZXIgYSBjYW5vbmljYWwgcmVxdWVzdCByZXByZXNlbnRhdGlvbi4gUHJvZHVjZXJcbiAqICh0aGlzIFNESykgYW5kIHZlcmlmaWVyIChgc2VydmljZUF1dGhNaWRkbGV3YXJlYCBpbiBgQHVlbmdhZ2UvY29tbW9uYCkgbXVzdFxuICogY29tcHV0ZSB0aGUgc2FtZSBjYW5vbmljYWwgc3RyaW5nLCBzbyBhbnkgY2hhbmdlIGhlcmUgTVVTVCBiZSBtaXJyb3JlZFxuICogdGhlcmUuIFRoZSBjYW5vbmljYWwgZm9ybSBpcyBuZXdsaW5lLXNlcGFyYXRlZCwgd2l0aCBubyB0cmFpbGluZyBuZXdsaW5lOlxuICpcbiAqICAgPE1FVEhPRD5cbiAqICAgPFBBVEg+XG4gKiAgIDxYLVNlcnZpY2UtSWQ+XG4gKiAgIDxYLVRpbWVzdGFtcD5cbiAqICAgPFgtTm9uY2U+XG4gKiAgIDxzaGEyNTYtaGV4IG9mIGJvZHksIG9yIGVtcHR5IHN0cmluZyBmb3Igbm8gYm9keT5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNpZ25SZXF1ZXN0KHBhcmFtczogU2lnblJlcXVlc3RQYXJhbXMpOiBzdHJpbmcge1xuICBjb25zdCBib2R5SGFzaCA9IHBhcmFtcy5ib2R5ID8gY3JlYXRlSGFzaCgnc2hhMjU2JykudXBkYXRlKHBhcmFtcy5ib2R5KS5kaWdlc3QoJ2hleCcpIDogJyc7XG4gIGNvbnN0IGNhbm9uaWNhbCA9IFtcbiAgICBwYXJhbXMubWV0aG9kLnRvVXBwZXJDYXNlKCksXG4gICAgcGFyYW1zLnBhdGgsXG4gICAgcGFyYW1zLnNlcnZpY2VJZCxcbiAgICBwYXJhbXMudGltZXN0YW1wLFxuICAgIHBhcmFtcy5ub25jZSxcbiAgICBib2R5SGFzaCxcbiAgXS5qb2luKCdcXG4nKTtcbiAgcmV0dXJuIGNyZWF0ZUhtYWMoJ3NoYTI1NicsIHBhcmFtcy5zZWNyZXQpLnVwZGF0ZShjYW5vbmljYWwpLmRpZ2VzdCgnaGV4Jyk7XG59XG4iXX0=
|