@uengage.io/platform-sdk 0.2.0 → 0.6.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.js +2 -2
- package/dist/auth/authorize-url.d.ts +18 -0
- package/dist/auth/authorize-url.js +31 -0
- package/dist/auth/exchange-code.d.ts +22 -0
- package/dist/auth/exchange-code.js +55 -0
- package/dist/auth/index.d.ts +32 -0
- package/dist/auth/index.js +44 -0
- package/dist/auth/issuer.d.ts +9 -0
- package/dist/auth/issuer.js +42 -0
- package/dist/auth/pkce.d.ts +13 -0
- package/dist/auth/pkce.js +14 -0
- package/dist/auth/refresh.d.ts +16 -0
- package/dist/auth/refresh.js +30 -0
- package/dist/auth/verify.d.ts +17 -0
- package/dist/auth/verify.js +93 -0
- package/dist/business/client.d.ts +2 -2
- package/dist/business/client.js +42 -9
- package/dist/business/index.d.ts +1 -1
- package/dist/business/index.js +1 -1
- package/dist/business/schema.d.ts +14 -3
- package/dist/business/schema.js +1 -1
- package/dist/client.d.ts +71 -0
- package/dist/client.js +152 -0
- package/dist/config.d.ts +4 -0
- package/dist/config.js +1 -1
- package/dist/errors.d.ts +61 -0
- package/dist/errors.js +86 -0
- package/dist/http.d.ts +10 -5
- package/dist/http.js +25 -7
- package/dist/index.d.ts +4 -0
- package/dist/index.js +9 -2
- package/dist/token-source.d.ts +60 -0
- package/dist/token-source.js +111 -0
- package/dist/version.d.ts +8 -0
- package/dist/version.js +12 -0
- package/package.json +3 -2
package/dist/errors.js
ADDED
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ConfigError = exports.TokenExpiredError = exports.RateLimitError = exports.ValidationError = exports.NotFoundError = exports.AuthorizationError = exports.AuthenticationError = exports.PlatformError = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Platform-SDK error hierarchy. Consumers should `instanceof`-check
|
|
6
|
+
* against `PlatformError` for the catch-all and the specific subclasses
|
|
7
|
+
* for the cases they care about. Status codes mirror the HTTP responses
|
|
8
|
+
* the platform API actually emits, so `error.status` is the simplest
|
|
9
|
+
* routing signal.
|
|
10
|
+
*/
|
|
11
|
+
class PlatformError extends Error {
|
|
12
|
+
status;
|
|
13
|
+
cause;
|
|
14
|
+
constructor(message, opts) {
|
|
15
|
+
super(message);
|
|
16
|
+
this.name = 'PlatformError';
|
|
17
|
+
this.status = opts?.status;
|
|
18
|
+
this.cause = opts?.cause;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
exports.PlatformError = PlatformError;
|
|
22
|
+
class AuthenticationError extends PlatformError {
|
|
23
|
+
constructor(message = 'authentication failed', opts) {
|
|
24
|
+
super(message, { status: 401, cause: opts?.cause });
|
|
25
|
+
this.name = 'AuthenticationError';
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
exports.AuthenticationError = AuthenticationError;
|
|
29
|
+
class AuthorizationError extends PlatformError {
|
|
30
|
+
/** When the API returns a `requiredScope`, surface it for the consumer. */
|
|
31
|
+
requiredScope;
|
|
32
|
+
constructor(message = 'authorization failed', opts) {
|
|
33
|
+
super(message, { status: 403, cause: opts?.cause });
|
|
34
|
+
this.name = 'AuthorizationError';
|
|
35
|
+
this.requiredScope = opts?.requiredScope;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
exports.AuthorizationError = AuthorizationError;
|
|
39
|
+
class NotFoundError extends PlatformError {
|
|
40
|
+
constructor(message = 'not found', opts) {
|
|
41
|
+
super(message, { status: 404, cause: opts?.cause });
|
|
42
|
+
this.name = 'NotFoundError';
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
exports.NotFoundError = NotFoundError;
|
|
46
|
+
class ValidationError extends PlatformError {
|
|
47
|
+
/** Per-field issues in the platform's standard `issues` array shape. */
|
|
48
|
+
issues;
|
|
49
|
+
constructor(message = 'validation failed', opts) {
|
|
50
|
+
super(message, { status: 422, cause: opts?.cause });
|
|
51
|
+
this.name = 'ValidationError';
|
|
52
|
+
this.issues = opts?.issues;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
exports.ValidationError = ValidationError;
|
|
56
|
+
class RateLimitError extends PlatformError {
|
|
57
|
+
/** Seconds the consumer should back off (from `Retry-After`). */
|
|
58
|
+
retryAfter;
|
|
59
|
+
constructor(message = 'rate limited', opts) {
|
|
60
|
+
super(message, { status: 429, cause: opts?.cause });
|
|
61
|
+
this.name = 'RateLimitError';
|
|
62
|
+
this.retryAfter = opts?.retryAfter;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
exports.RateLimitError = RateLimitError;
|
|
66
|
+
/**
|
|
67
|
+
* Thrown when the SDK detects an expired access token before the request
|
|
68
|
+
* is sent. Callers using a static externally-supplied token must update
|
|
69
|
+
* the config with a fresh one.
|
|
70
|
+
*/
|
|
71
|
+
class TokenExpiredError extends PlatformError {
|
|
72
|
+
constructor(message = 'access token has expired') {
|
|
73
|
+
super(message, { status: 401 });
|
|
74
|
+
this.name = 'TokenExpiredError';
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
exports.TokenExpiredError = TokenExpiredError;
|
|
78
|
+
/** Thrown for missing / inconsistent SDK configuration. */
|
|
79
|
+
class ConfigError extends PlatformError {
|
|
80
|
+
constructor(message) {
|
|
81
|
+
super(message);
|
|
82
|
+
this.name = 'ConfigError';
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
exports.ConfigError = ConfigError;
|
|
86
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXJyb3JzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2Vycm9ycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQTs7Ozs7O0dBTUc7QUFDSCxNQUFhLGFBQWMsU0FBUSxLQUFLO0lBQzdCLE1BQU0sQ0FBVTtJQUNoQixLQUFLLENBQVc7SUFDekIsWUFBWSxPQUFlLEVBQUUsSUFBMkM7UUFDdEUsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ2YsSUFBSSxDQUFDLElBQUksR0FBRyxlQUFlLENBQUM7UUFDNUIsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLEVBQUUsTUFBTSxDQUFDO1FBQzNCLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxFQUFFLEtBQUssQ0FBQztJQUMzQixDQUFDO0NBQ0Y7QUFURCxzQ0FTQztBQUVELE1BQWEsbUJBQW9CLFNBQVEsYUFBYTtJQUNwRCxZQUFZLE9BQU8sR0FBRyx1QkFBdUIsRUFBRSxJQUEwQjtRQUN2RSxLQUFLLENBQUMsT0FBTyxFQUFFLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7UUFDcEQsSUFBSSxDQUFDLElBQUksR0FBRyxxQkFBcUIsQ0FBQztJQUNwQyxDQUFDO0NBQ0Y7QUFMRCxrREFLQztBQUVELE1BQWEsa0JBQW1CLFNBQVEsYUFBYTtJQUNuRCwyRUFBMkU7SUFDbEUsYUFBYSxDQUFVO0lBQ2hDLFlBQ0UsT0FBTyxHQUFHLHNCQUFzQixFQUNoQyxJQUFrRDtRQUVsRCxLQUFLLENBQUMsT0FBTyxFQUFFLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7UUFDcEQsSUFBSSxDQUFDLElBQUksR0FBRyxvQkFBb0IsQ0FBQztRQUNqQyxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksRUFBRSxhQUFhLENBQUM7SUFDM0MsQ0FBQztDQUNGO0FBWEQsZ0RBV0M7QUFFRCxNQUFhLGFBQWMsU0FBUSxhQUFhO0lBQzlDLFlBQVksT0FBTyxHQUFHLFdBQVcsRUFBRSxJQUEwQjtRQUMzRCxLQUFLLENBQUMsT0FBTyxFQUFFLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7UUFDcEQsSUFBSSxDQUFDLElBQUksR0FBRyxlQUFlLENBQUM7SUFDOUIsQ0FBQztDQUNGO0FBTEQsc0NBS0M7QUFFRCxNQUFhLGVBQWdCLFNBQVEsYUFBYTtJQUNoRCx3RUFBd0U7SUFDL0QsTUFBTSxDQUFhO0lBQzVCLFlBQVksT0FBTyxHQUFHLG1CQUFtQixFQUFFLElBQThDO1FBQ3ZGLEtBQUssQ0FBQyxPQUFPLEVBQUUsRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztRQUNwRCxJQUFJLENBQUMsSUFBSSxHQUFHLGlCQUFpQixDQUFDO1FBQzlCLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxFQUFFLE1BQU0sQ0FBQztJQUM3QixDQUFDO0NBQ0Y7QUFSRCwwQ0FRQztBQUVELE1BQWEsY0FBZSxTQUFRLGFBQWE7SUFDL0MsaUVBQWlFO0lBQ3hELFVBQVUsQ0FBVTtJQUM3QixZQUFZLE9BQU8sR0FBRyxjQUFjLEVBQUUsSUFBK0M7UUFDbkYsS0FBSyxDQUFDLE9BQU8sRUFBRSxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO1FBQ3BELElBQUksQ0FBQyxJQUFJLEdBQUcsZ0JBQWdCLENBQUM7UUFDN0IsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLEVBQUUsVUFBVSxDQUFDO0lBQ3JDLENBQUM7Q0FDRjtBQVJELHdDQVFDO0FBRUQ7Ozs7R0FJRztBQUNILE1BQWEsaUJBQWtCLFNBQVEsYUFBYTtJQUNsRCxZQUFZLE9BQU8sR0FBRywwQkFBMEI7UUFDOUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO1FBQ2hDLElBQUksQ0FBQyxJQUFJLEdBQUcsbUJBQW1CLENBQUM7SUFDbEMsQ0FBQztDQUNGO0FBTEQsOENBS0M7QUFFRCwyREFBMkQ7QUFDM0QsTUFBYSxXQUFZLFNBQVEsYUFBYTtJQUM1QyxZQUFZLE9BQWU7UUFDekIsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ2YsSUFBSSxDQUFDLElBQUksR0FBRyxhQUFhLENBQUM7SUFDNUIsQ0FBQztDQUNGO0FBTEQsa0NBS0MiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFBsYXRmb3JtLVNESyBlcnJvciBoaWVyYXJjaHkuIENvbnN1bWVycyBzaG91bGQgYGluc3RhbmNlb2ZgLWNoZWNrXG4gKiBhZ2FpbnN0IGBQbGF0Zm9ybUVycm9yYCBmb3IgdGhlIGNhdGNoLWFsbCBhbmQgdGhlIHNwZWNpZmljIHN1YmNsYXNzZXNcbiAqIGZvciB0aGUgY2FzZXMgdGhleSBjYXJlIGFib3V0LiBTdGF0dXMgY29kZXMgbWlycm9yIHRoZSBIVFRQIHJlc3BvbnNlc1xuICogdGhlIHBsYXRmb3JtIEFQSSBhY3R1YWxseSBlbWl0cywgc28gYGVycm9yLnN0YXR1c2AgaXMgdGhlIHNpbXBsZXN0XG4gKiByb3V0aW5nIHNpZ25hbC5cbiAqL1xuZXhwb3J0IGNsYXNzIFBsYXRmb3JtRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIHJlYWRvbmx5IHN0YXR1cz86IG51bWJlcjtcbiAgcmVhZG9ubHkgY2F1c2U/OiB1bmtub3duO1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcsIG9wdHM/OiB7IHN0YXR1cz86IG51bWJlcjsgY2F1c2U/OiB1bmtub3duIH0pIHtcbiAgICBzdXBlcihtZXNzYWdlKTtcbiAgICB0aGlzLm5hbWUgPSAnUGxhdGZvcm1FcnJvcic7XG4gICAgdGhpcy5zdGF0dXMgPSBvcHRzPy5zdGF0dXM7XG4gICAgdGhpcy5jYXVzZSA9IG9wdHM/LmNhdXNlO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBBdXRoZW50aWNhdGlvbkVycm9yIGV4dGVuZHMgUGxhdGZvcm1FcnJvciB7XG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2UgPSAnYXV0aGVudGljYXRpb24gZmFpbGVkJywgb3B0cz86IHsgY2F1c2U/OiB1bmtub3duIH0pIHtcbiAgICBzdXBlcihtZXNzYWdlLCB7IHN0YXR1czogNDAxLCBjYXVzZTogb3B0cz8uY2F1c2UgfSk7XG4gICAgdGhpcy5uYW1lID0gJ0F1dGhlbnRpY2F0aW9uRXJyb3InO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBBdXRob3JpemF0aW9uRXJyb3IgZXh0ZW5kcyBQbGF0Zm9ybUVycm9yIHtcbiAgLyoqIFdoZW4gdGhlIEFQSSByZXR1cm5zIGEgYHJlcXVpcmVkU2NvcGVgLCBzdXJmYWNlIGl0IGZvciB0aGUgY29uc3VtZXIuICovXG4gIHJlYWRvbmx5IHJlcXVpcmVkU2NvcGU/OiBzdHJpbmc7XG4gIGNvbnN0cnVjdG9yKFxuICAgIG1lc3NhZ2UgPSAnYXV0aG9yaXphdGlvbiBmYWlsZWQnLFxuICAgIG9wdHM/OiB7IHJlcXVpcmVkU2NvcGU/OiBzdHJpbmc7IGNhdXNlPzogdW5rbm93biB9LFxuICApIHtcbiAgICBzdXBlcihtZXNzYWdlLCB7IHN0YXR1czogNDAzLCBjYXVzZTogb3B0cz8uY2F1c2UgfSk7XG4gICAgdGhpcy5uYW1lID0gJ0F1dGhvcml6YXRpb25FcnJvcic7XG4gICAgdGhpcy5yZXF1aXJlZFNjb3BlID0gb3B0cz8ucmVxdWlyZWRTY29wZTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgTm90Rm91bmRFcnJvciBleHRlbmRzIFBsYXRmb3JtRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlID0gJ25vdCBmb3VuZCcsIG9wdHM/OiB7IGNhdXNlPzogdW5rbm93biB9KSB7XG4gICAgc3VwZXIobWVzc2FnZSwgeyBzdGF0dXM6IDQwNCwgY2F1c2U6IG9wdHM/LmNhdXNlIH0pO1xuICAgIHRoaXMubmFtZSA9ICdOb3RGb3VuZEVycm9yJztcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgVmFsaWRhdGlvbkVycm9yIGV4dGVuZHMgUGxhdGZvcm1FcnJvciB7XG4gIC8qKiBQZXItZmllbGQgaXNzdWVzIGluIHRoZSBwbGF0Zm9ybSdzIHN0YW5kYXJkIGBpc3N1ZXNgIGFycmF5IHNoYXBlLiAqL1xuICByZWFkb25seSBpc3N1ZXM/OiB1bmtub3duW107XG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2UgPSAndmFsaWRhdGlvbiBmYWlsZWQnLCBvcHRzPzogeyBpc3N1ZXM/OiB1bmtub3duW107IGNhdXNlPzogdW5rbm93biB9KSB7XG4gICAgc3VwZXIobWVzc2FnZSwgeyBzdGF0dXM6IDQyMiwgY2F1c2U6IG9wdHM/LmNhdXNlIH0pO1xuICAgIHRoaXMubmFtZSA9ICdWYWxpZGF0aW9uRXJyb3InO1xuICAgIHRoaXMuaXNzdWVzID0gb3B0cz8uaXNzdWVzO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBSYXRlTGltaXRFcnJvciBleHRlbmRzIFBsYXRmb3JtRXJyb3Ige1xuICAvKiogU2Vjb25kcyB0aGUgY29uc3VtZXIgc2hvdWxkIGJhY2sgb2ZmIChmcm9tIGBSZXRyeS1BZnRlcmApLiAqL1xuICByZWFkb25seSByZXRyeUFmdGVyPzogbnVtYmVyO1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlID0gJ3JhdGUgbGltaXRlZCcsIG9wdHM/OiB7IHJldHJ5QWZ0ZXI/OiBudW1iZXI7IGNhdXNlPzogdW5rbm93biB9KSB7XG4gICAgc3VwZXIobWVzc2FnZSwgeyBzdGF0dXM6IDQyOSwgY2F1c2U6IG9wdHM/LmNhdXNlIH0pO1xuICAgIHRoaXMubmFtZSA9ICdSYXRlTGltaXRFcnJvcic7XG4gICAgdGhpcy5yZXRyeUFmdGVyID0gb3B0cz8ucmV0cnlBZnRlcjtcbiAgfVxufVxuXG4vKipcbiAqIFRocm93biB3aGVuIHRoZSBTREsgZGV0ZWN0cyBhbiBleHBpcmVkIGFjY2VzcyB0b2tlbiBiZWZvcmUgdGhlIHJlcXVlc3RcbiAqIGlzIHNlbnQuIENhbGxlcnMgdXNpbmcgYSBzdGF0aWMgZXh0ZXJuYWxseS1zdXBwbGllZCB0b2tlbiBtdXN0IHVwZGF0ZVxuICogdGhlIGNvbmZpZyB3aXRoIGEgZnJlc2ggb25lLlxuICovXG5leHBvcnQgY2xhc3MgVG9rZW5FeHBpcmVkRXJyb3IgZXh0ZW5kcyBQbGF0Zm9ybUVycm9yIHtcbiAgY29uc3RydWN0b3IobWVzc2FnZSA9ICdhY2Nlc3MgdG9rZW4gaGFzIGV4cGlyZWQnKSB7XG4gICAgc3VwZXIobWVzc2FnZSwgeyBzdGF0dXM6IDQwMSB9KTtcbiAgICB0aGlzLm5hbWUgPSAnVG9rZW5FeHBpcmVkRXJyb3InO1xuICB9XG59XG5cbi8qKiBUaHJvd24gZm9yIG1pc3NpbmcgLyBpbmNvbnNpc3RlbnQgU0RLIGNvbmZpZ3VyYXRpb24uICovXG5leHBvcnQgY2xhc3MgQ29uZmlnRXJyb3IgZXh0ZW5kcyBQbGF0Zm9ybUVycm9yIHtcbiAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nKSB7XG4gICAgc3VwZXIobWVzc2FnZSk7XG4gICAgdGhpcy5uYW1lID0gJ0NvbmZpZ0Vycm9yJztcbiAgfVxufVxuIl19
|
package/dist/http.d.ts
CHANGED
|
@@ -7,9 +7,14 @@ export interface SignedHeaderParams {
|
|
|
7
7
|
body?: string;
|
|
8
8
|
}
|
|
9
9
|
/**
|
|
10
|
-
* Build the headers required for a request to the platform API, given
|
|
11
|
-
* effective auth on `config`.
|
|
12
|
-
*
|
|
13
|
-
*
|
|
10
|
+
* Build the headers required for a request to the platform API, given
|
|
11
|
+
* the effective auth on `config`. Async because the `token-source`
|
|
12
|
+
* auth path may need to mint or refresh before returning.
|
|
13
|
+
*
|
|
14
|
+
* Adds three platform-wide headers automatically:
|
|
15
|
+
* - `User-Agent` so the gateway can attribute traffic to SDK version
|
|
16
|
+
* - `Idempotency-Key` (UUID v4) on mutating methods, so callers don't
|
|
17
|
+
* have to generate one per call
|
|
18
|
+
* - `content-type: application/json` when a body is supplied
|
|
14
19
|
*/
|
|
15
|
-
export declare function buildHeaders(config: PlatformConfig, params: SignedHeaderParams): Record<string, string
|
|
20
|
+
export declare function buildHeaders(config: PlatformConfig, params: SignedHeaderParams): Promise<Record<string, string>>;
|
package/dist/http.js
CHANGED
|
@@ -3,22 +3,40 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.buildHeaders = buildHeaders;
|
|
4
4
|
const node_crypto_1 = require("node:crypto");
|
|
5
5
|
const sign_1 = require("./audit/sign");
|
|
6
|
+
const token_source_1 = require("./token-source");
|
|
7
|
+
const version_1 = require("./version");
|
|
8
|
+
const MUTATING_METHODS = new Set(['POST', 'PUT', 'PATCH', 'DELETE']);
|
|
6
9
|
/**
|
|
7
|
-
* Build the headers required for a request to the platform API, given
|
|
8
|
-
* effective auth on `config`.
|
|
9
|
-
*
|
|
10
|
-
*
|
|
10
|
+
* Build the headers required for a request to the platform API, given
|
|
11
|
+
* the effective auth on `config`. Async because the `token-source`
|
|
12
|
+
* auth path may need to mint or refresh before returning.
|
|
13
|
+
*
|
|
14
|
+
* Adds three platform-wide headers automatically:
|
|
15
|
+
* - `User-Agent` so the gateway can attribute traffic to SDK version
|
|
16
|
+
* - `Idempotency-Key` (UUID v4) on mutating methods, so callers don't
|
|
17
|
+
* have to generate one per call
|
|
18
|
+
* - `content-type: application/json` when a body is supplied
|
|
11
19
|
*/
|
|
12
|
-
function buildHeaders(config, params) {
|
|
13
|
-
const headers = {
|
|
20
|
+
async function buildHeaders(config, params) {
|
|
21
|
+
const headers = {
|
|
22
|
+
'user-agent': `uengage-platform-sdk/${version_1.SDK_VERSION}`,
|
|
23
|
+
};
|
|
14
24
|
if (params.body !== undefined)
|
|
15
25
|
headers['content-type'] = 'application/json';
|
|
26
|
+
if (MUTATING_METHODS.has(params.method.toUpperCase())) {
|
|
27
|
+
headers['idempotency-key'] = (0, node_crypto_1.randomUUID)();
|
|
28
|
+
}
|
|
16
29
|
if (!config.auth)
|
|
17
30
|
return headers;
|
|
18
31
|
if (config.auth.type === 'bearer') {
|
|
19
32
|
headers['authorization'] = `Bearer ${config.auth.token}`;
|
|
20
33
|
return headers;
|
|
21
34
|
}
|
|
35
|
+
if (config.auth.type === 'token-source') {
|
|
36
|
+
const token = await (0, token_source_1.getAccessToken)(config.auth.state);
|
|
37
|
+
headers['authorization'] = `Bearer ${token}`;
|
|
38
|
+
return headers;
|
|
39
|
+
}
|
|
22
40
|
// HMAC
|
|
23
41
|
const timestamp = new Date().toISOString().replace(/\.\d{3}Z$/, 'Z');
|
|
24
42
|
const nonce = (0, node_crypto_1.randomUUID)();
|
|
@@ -37,4 +55,4 @@ function buildHeaders(config, params) {
|
|
|
37
55
|
headers['x-signature'] = signature;
|
|
38
56
|
return headers;
|
|
39
57
|
}
|
|
40
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
58
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHR0cC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9odHRwLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBMkJBLG9DQTBDQztBQXJFRCw2Q0FBeUM7QUFDekMsdUNBQTJDO0FBRTNDLGlEQUFnRDtBQUNoRCx1Q0FBd0M7QUFVeEMsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUM7QUFFckU7Ozs7Ozs7Ozs7R0FVRztBQUNJLEtBQUssVUFBVSxZQUFZLENBQ2hDLE1BQXNCLEVBQ3RCLE1BQTBCO0lBRTFCLE1BQU0sT0FBTyxHQUEyQjtRQUN0QyxZQUFZLEVBQUUsd0JBQXdCLHFCQUFXLEVBQUU7S0FDcEQsQ0FBQztJQUNGLElBQUksTUFBTSxDQUFDLElBQUksS0FBSyxTQUFTO1FBQUUsT0FBTyxDQUFDLGNBQWMsQ0FBQyxHQUFHLGtCQUFrQixDQUFDO0lBQzVFLElBQUksZ0JBQWdCLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsV0FBVyxFQUFFLENBQUMsRUFBRSxDQUFDO1FBQ3RELE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLElBQUEsd0JBQVUsR0FBRSxDQUFDO0lBQzVDLENBQUM7SUFFRCxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUk7UUFBRSxPQUFPLE9BQU8sQ0FBQztJQUVqQyxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxLQUFLLFFBQVEsRUFBRSxDQUFDO1FBQ2xDLE9BQU8sQ0FBQyxlQUFlLENBQUMsR0FBRyxVQUFVLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDekQsT0FBTyxPQUFPLENBQUM7SUFDakIsQ0FBQztJQUVELElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLEtBQUssY0FBYyxFQUFFLENBQUM7UUFDeEMsTUFBTSxLQUFLLEdBQUcsTUFBTSxJQUFBLDZCQUFjLEVBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN0RCxPQUFPLENBQUMsZUFBZSxDQUFDLEdBQUcsVUFBVSxLQUFLLEVBQUUsQ0FBQztRQUM3QyxPQUFPLE9BQU8sQ0FBQztJQUNqQixDQUFDO0lBRUQsT0FBTztJQUNQLE1BQU0sU0FBUyxHQUFHLElBQUksSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRSxHQUFHLENBQUMsQ0FBQztJQUNyRSxNQUFNLEtBQUssR0FBRyxJQUFBLHdCQUFVLEdBQUUsQ0FBQztJQUMzQixNQUFNLFNBQVMsR0FBRyxJQUFBLGtCQUFXLEVBQUM7UUFDNUIsTUFBTSxFQUFFLE1BQU0sQ0FBQyxNQUFNO1FBQ3JCLElBQUksRUFBRSxNQUFNLENBQUMsSUFBSTtRQUNqQixTQUFTLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTO1FBQ2hDLFNBQVM7UUFDVCxLQUFLO1FBQ0wsSUFBSSxFQUFFLE1BQU0sQ0FBQyxJQUFJLElBQUksRUFBRTtRQUN2QixNQUFNLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNO0tBQzNCLENBQUMsQ0FBQztJQUNILE9BQU8sQ0FBQyxjQUFjLENBQUMsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQztJQUNoRCxPQUFPLENBQUMsYUFBYSxDQUFDLEdBQUcsU0FBUyxDQUFDO0lBQ25DLE9BQU8sQ0FBQyxTQUFTLENBQUMsR0FBRyxLQUFLLENBQUM7SUFDM0IsT0FBTyxDQUFDLGFBQWEsQ0FBQyxHQUFHLFNBQVMsQ0FBQztJQUNuQyxPQUFPLE9BQU8sQ0FBQztBQUNqQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgcmFuZG9tVVVJRCB9IGZyb20gJ25vZGU6Y3J5cHRvJztcbmltcG9ydCB7IHNpZ25SZXF1ZXN0IH0gZnJvbSAnLi9hdWRpdC9zaWduJztcbmltcG9ydCB0eXBlIHsgUGxhdGZvcm1Db25maWcgfSBmcm9tICcuL2NvbmZpZyc7XG5pbXBvcnQgeyBnZXRBY2Nlc3NUb2tlbiB9IGZyb20gJy4vdG9rZW4tc291cmNlJztcbmltcG9ydCB7IFNES19WRVJTSU9OIH0gZnJvbSAnLi92ZXJzaW9uJztcblxuZXhwb3J0IGludGVyZmFjZSBTaWduZWRIZWFkZXJQYXJhbXMge1xuICBtZXRob2Q6IHN0cmluZztcbiAgLyoqIFVSTCBwYXRobmFtZSBvbmx5LCB3aXRob3V0IHF1ZXJ5IHN0cmluZy4gTXVzdCBtYXRjaCBgYy5yZXEucGF0aGAgc2VydmVyLXNpZGUuICovXG4gIHBhdGg6IHN0cmluZztcbiAgLyoqIFJhdyBKU09OIGJvZHkgc3RyaW5nLCBvciBlbXB0eSBmb3Igbm9uZS4gKi9cbiAgYm9keT86IHN0cmluZztcbn1cblxuY29uc3QgTVVUQVRJTkdfTUVUSE9EUyA9IG5ldyBTZXQoWydQT1NUJywgJ1BVVCcsICdQQVRDSCcsICdERUxFVEUnXSk7XG5cbi8qKlxuICogQnVpbGQgdGhlIGhlYWRlcnMgcmVxdWlyZWQgZm9yIGEgcmVxdWVzdCB0byB0aGUgcGxhdGZvcm0gQVBJLCBnaXZlblxuICogdGhlIGVmZmVjdGl2ZSBhdXRoIG9uIGBjb25maWdgLiBBc3luYyBiZWNhdXNlIHRoZSBgdG9rZW4tc291cmNlYFxuICogYXV0aCBwYXRoIG1heSBuZWVkIHRvIG1pbnQgb3IgcmVmcmVzaCBiZWZvcmUgcmV0dXJuaW5nLlxuICpcbiAqIEFkZHMgdGhyZWUgcGxhdGZvcm0td2lkZSBoZWFkZXJzIGF1dG9tYXRpY2FsbHk6XG4gKiAgIC0gYFVzZXItQWdlbnRgIHNvIHRoZSBnYXRld2F5IGNhbiBhdHRyaWJ1dGUgdHJhZmZpYyB0byBTREsgdmVyc2lvblxuICogICAtIGBJZGVtcG90ZW5jeS1LZXlgIChVVUlEIHY0KSBvbiBtdXRhdGluZyBtZXRob2RzLCBzbyBjYWxsZXJzIGRvbid0XG4gKiAgICAgaGF2ZSB0byBnZW5lcmF0ZSBvbmUgcGVyIGNhbGxcbiAqICAgLSBgY29udGVudC10eXBlOiBhcHBsaWNhdGlvbi9qc29uYCB3aGVuIGEgYm9keSBpcyBzdXBwbGllZFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYnVpbGRIZWFkZXJzKFxuICBjb25maWc6IFBsYXRmb3JtQ29uZmlnLFxuICBwYXJhbXM6IFNpZ25lZEhlYWRlclBhcmFtcyxcbik6IFByb21pc2U8UmVjb3JkPHN0cmluZywgc3RyaW5nPj4ge1xuICBjb25zdCBoZWFkZXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgICd1c2VyLWFnZW50JzogYHVlbmdhZ2UtcGxhdGZvcm0tc2RrLyR7U0RLX1ZFUlNJT059YCxcbiAgfTtcbiAgaWYgKHBhcmFtcy5ib2R5ICE9PSB1bmRlZmluZWQpIGhlYWRlcnNbJ2NvbnRlbnQtdHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuICBpZiAoTVVUQVRJTkdfTUVUSE9EUy5oYXMocGFyYW1zLm1ldGhvZC50b1VwcGVyQ2FzZSgpKSkge1xuICAgIGhlYWRlcnNbJ2lkZW1wb3RlbmN5LWtleSddID0gcmFuZG9tVVVJRCgpO1xuICB9XG5cbiAgaWYgKCFjb25maWcuYXV0aCkgcmV0dXJuIGhlYWRlcnM7XG5cbiAgaWYgKGNvbmZpZy5hdXRoLnR5cGUgPT09ICdiZWFyZXInKSB7XG4gICAgaGVhZGVyc1snYXV0aG9yaXphdGlvbiddID0gYEJlYXJlciAke2NvbmZpZy5hdXRoLnRva2VufWA7XG4gICAgcmV0dXJuIGhlYWRlcnM7XG4gIH1cblxuICBpZiAoY29uZmlnLmF1dGgudHlwZSA9PT0gJ3Rva2VuLXNvdXJjZScpIHtcbiAgICBjb25zdCB0b2tlbiA9IGF3YWl0IGdldEFjY2Vzc1Rva2VuKGNvbmZpZy5hdXRoLnN0YXRlKTtcbiAgICBoZWFkZXJzWydhdXRob3JpemF0aW9uJ10gPSBgQmVhcmVyICR7dG9rZW59YDtcbiAgICByZXR1cm4gaGVhZGVycztcbiAgfVxuXG4gIC8vIEhNQUNcbiAgY29uc3QgdGltZXN0YW1wID0gbmV3IERhdGUoKS50b0lTT1N0cmluZygpLnJlcGxhY2UoL1xcLlxcZHszfVokLywgJ1onKTtcbiAgY29uc3Qgbm9uY2UgPSByYW5kb21VVUlEKCk7XG4gIGNvbnN0IHNpZ25hdHVyZSA9IHNpZ25SZXF1ZXN0KHtcbiAgICBtZXRob2Q6IHBhcmFtcy5tZXRob2QsXG4gICAgcGF0aDogcGFyYW1zLnBhdGgsXG4gICAgc2VydmljZUlkOiBjb25maWcuYXV0aC5zZXJ2aWNlSWQsXG4gICAgdGltZXN0YW1wLFxuICAgIG5vbmNlLFxuICAgIGJvZHk6IHBhcmFtcy5ib2R5ID8/ICcnLFxuICAgIHNlY3JldDogY29uZmlnLmF1dGguc2VjcmV0LFxuICB9KTtcbiAgaGVhZGVyc1sneC1zZXJ2aWNlLWlkJ10gPSBjb25maWcuYXV0aC5zZXJ2aWNlSWQ7XG4gIGhlYWRlcnNbJ3gtdGltZXN0YW1wJ10gPSB0aW1lc3RhbXA7XG4gIGhlYWRlcnNbJ3gtbm9uY2UnXSA9IG5vbmNlO1xuICBoZWFkZXJzWyd4LXNpZ25hdHVyZSddID0gc2lnbmF0dXJlO1xuICByZXR1cm4gaGVhZGVycztcbn1cbiJdfQ==
|
package/dist/index.d.ts
CHANGED
|
@@ -1,6 +1,10 @@
|
|
|
1
1
|
export * from './audit';
|
|
2
2
|
export * from './business';
|
|
3
|
+
export * from './errors';
|
|
4
|
+
export { auth } from './auth';
|
|
5
|
+
export type { PkcePair, AuthorizeUrlInput, ExchangeCodeInput, RefreshInput, TokenPair, } from './auth';
|
|
3
6
|
export { type PlatformAuth, type PlatformAuthInput, type PlatformConfig, type PlatformConfigInput, DEFAULT_BASE_URL, } from './config';
|
|
7
|
+
export { createClient, platform, withToken, type ClientConfig, type PlatformClient, } from './client';
|
|
4
8
|
/**
|
|
5
9
|
* Default singleton clients. Both read defaults from the environment on
|
|
6
10
|
* every call:
|
package/dist/index.js
CHANGED
|
@@ -14,11 +14,18 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
|
14
14
|
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
15
|
};
|
|
16
16
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
-
exports.business = exports.audit = exports.DEFAULT_BASE_URL = void 0;
|
|
17
|
+
exports.business = exports.audit = exports.withToken = exports.platform = exports.createClient = exports.DEFAULT_BASE_URL = exports.auth = void 0;
|
|
18
18
|
__exportStar(require("./audit"), exports);
|
|
19
19
|
__exportStar(require("./business"), exports);
|
|
20
|
+
__exportStar(require("./errors"), exports);
|
|
21
|
+
var auth_1 = require("./auth");
|
|
22
|
+
Object.defineProperty(exports, "auth", { enumerable: true, get: function () { return auth_1.auth; } });
|
|
20
23
|
var config_1 = require("./config");
|
|
21
24
|
Object.defineProperty(exports, "DEFAULT_BASE_URL", { enumerable: true, get: function () { return config_1.DEFAULT_BASE_URL; } });
|
|
25
|
+
var client_1 = require("./client");
|
|
26
|
+
Object.defineProperty(exports, "createClient", { enumerable: true, get: function () { return client_1.createClient; } });
|
|
27
|
+
Object.defineProperty(exports, "platform", { enumerable: true, get: function () { return client_1.platform; } });
|
|
28
|
+
Object.defineProperty(exports, "withToken", { enumerable: true, get: function () { return client_1.withToken; } });
|
|
22
29
|
const audit_1 = require("./audit");
|
|
23
30
|
const business_1 = require("./business");
|
|
24
31
|
/**
|
|
@@ -35,4 +42,4 @@ const business_1 = require("./business");
|
|
|
35
42
|
*/
|
|
36
43
|
exports.audit = (0, audit_1.createAuditClient)();
|
|
37
44
|
exports.business = (0, business_1.createBusinessClient)();
|
|
38
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
45
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSwwQ0FBd0I7QUFDeEIsNkNBQTJCO0FBQzNCLDJDQUF5QjtBQUN6QiwrQkFBOEI7QUFBckIsNEZBQUEsSUFBSSxPQUFBO0FBUWIsbUNBTWtCO0FBRGhCLDBHQUFBLGdCQUFnQixPQUFBO0FBRWxCLG1DQU1rQjtBQUxoQixzR0FBQSxZQUFZLE9BQUE7QUFDWixrR0FBQSxRQUFRLE9BQUE7QUFDUixtR0FBQSxTQUFTLE9BQUE7QUFLWCxtQ0FBNEM7QUFDNUMseUNBQWtEO0FBRWxEOzs7Ozs7Ozs7OztHQVdHO0FBQ1UsUUFBQSxLQUFLLEdBQUcsSUFBQSx5QkFBaUIsR0FBRSxDQUFDO0FBQzVCLFFBQUEsUUFBUSxHQUFHLElBQUEsK0JBQW9CLEdBQUUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gJy4vYXVkaXQnO1xuZXhwb3J0ICogZnJvbSAnLi9idXNpbmVzcyc7XG5leHBvcnQgKiBmcm9tICcuL2Vycm9ycyc7XG5leHBvcnQgeyBhdXRoIH0gZnJvbSAnLi9hdXRoJztcbmV4cG9ydCB0eXBlIHtcbiAgUGtjZVBhaXIsXG4gIEF1dGhvcml6ZVVybElucHV0LFxuICBFeGNoYW5nZUNvZGVJbnB1dCxcbiAgUmVmcmVzaElucHV0LFxuICBUb2tlblBhaXIsXG59IGZyb20gJy4vYXV0aCc7XG5leHBvcnQge1xuICB0eXBlIFBsYXRmb3JtQXV0aCxcbiAgdHlwZSBQbGF0Zm9ybUF1dGhJbnB1dCxcbiAgdHlwZSBQbGF0Zm9ybUNvbmZpZyxcbiAgdHlwZSBQbGF0Zm9ybUNvbmZpZ0lucHV0LFxuICBERUZBVUxUX0JBU0VfVVJMLFxufSBmcm9tICcuL2NvbmZpZyc7XG5leHBvcnQge1xuICBjcmVhdGVDbGllbnQsXG4gIHBsYXRmb3JtLFxuICB3aXRoVG9rZW4sXG4gIHR5cGUgQ2xpZW50Q29uZmlnLFxuICB0eXBlIFBsYXRmb3JtQ2xpZW50LFxufSBmcm9tICcuL2NsaWVudCc7XG5cbmltcG9ydCB7IGNyZWF0ZUF1ZGl0Q2xpZW50IH0gZnJvbSAnLi9hdWRpdCc7XG5pbXBvcnQgeyBjcmVhdGVCdXNpbmVzc0NsaWVudCB9IGZyb20gJy4vYnVzaW5lc3MnO1xuXG4vKipcbiAqIERlZmF1bHQgc2luZ2xldG9uIGNsaWVudHMuIEJvdGggcmVhZCBkZWZhdWx0cyBmcm9tIHRoZSBlbnZpcm9ubWVudCBvblxuICogZXZlcnkgY2FsbDpcbiAqICAgLSBQTEFURk9STV9CQVNFX1VSTCAgICAgICAgICAoZGVmYXVsdHMgdG8gaHR0cHM6Ly9hcGkucGxhdGZvcm0udWVuZ2FnZS5pbylcbiAqICAgLSBQTEFURk9STV9TSUdOSU5HX1NFQ1JFVCAgICBITUFDIHNlY3JldCBoZXhcbiAqICAgLSBQTEFURk9STV9TRVJWSUNFX0lEICAgICAgICBITUFDIHNlcnZpY2UgaWRcbiAqICAgLSBQTEFURk9STV9BVVRIX1RPS0VOICAgICAgICBCZWFyZXIgdG9rZW4gKG92ZXJyaWRlcyBITUFDIGlmIHNldClcbiAqXG4gKiBPdmVycmlkZSBwZXItaW5zdGFuY2Ugd2l0aCBgLmNvbmZpZyh7Li4ufSlgIGFuZC9vciBgLmF1dGgoey4uLn0pYC4gRm9yXG4gKiBpc29sYXRlZCBjb25maWd1cmF0aW9uICh0ZXN0cywgbXVsdGktdGVuYW50IGNvZGUgcGF0aHMpLCBjb25zdHJ1Y3QgeW91clxuICogb3duIHZpYSBgY3JlYXRlQXVkaXRDbGllbnQoLi4uKWAgb3IgYGNyZWF0ZUJ1c2luZXNzQ2xpZW50KC4uLilgIGluc3RlYWQuXG4gKi9cbmV4cG9ydCBjb25zdCBhdWRpdCA9IGNyZWF0ZUF1ZGl0Q2xpZW50KCk7XG5leHBvcnQgY29uc3QgYnVzaW5lc3MgPSBjcmVhdGVCdXNpbmVzc0NsaWVudCgpO1xuIl19
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* How the SDK gets a fresh access token. Three shapes per the brief:
|
|
3
|
+
*
|
|
4
|
+
* - `static-string` — caller hands in a token string. Used until its
|
|
5
|
+
* `exp` has passed; on expiry we throw `TokenExpiredError` rather
|
|
6
|
+
* than try to refresh (the SDK has no way to refresh a static
|
|
7
|
+
* externally-supplied token).
|
|
8
|
+
*
|
|
9
|
+
* - `callback` — caller supplies a function the SDK calls on miss
|
|
10
|
+
* and on 401 invalidation. The consumer's logic is responsible for
|
|
11
|
+
* refresh; the SDK just caches the result between invocations.
|
|
12
|
+
*
|
|
13
|
+
* - `service-credentials` — `client_id` + `client_secret` for the
|
|
14
|
+
* OAuth2 `client_credentials` grant. SDK mints + caches; on
|
|
15
|
+
* expiry it re-mints with the same credentials.
|
|
16
|
+
*/
|
|
17
|
+
export type TokenSource = {
|
|
18
|
+
kind: 'static-string';
|
|
19
|
+
token: string;
|
|
20
|
+
} | {
|
|
21
|
+
kind: 'callback';
|
|
22
|
+
getToken: () => string | Promise<string>;
|
|
23
|
+
} | {
|
|
24
|
+
kind: 'service-credentials';
|
|
25
|
+
clientId: string;
|
|
26
|
+
clientSecret: string;
|
|
27
|
+
authBaseUrl: string;
|
|
28
|
+
scope?: string;
|
|
29
|
+
};
|
|
30
|
+
export interface TokenSourceState {
|
|
31
|
+
source: TokenSource;
|
|
32
|
+
cached?: {
|
|
33
|
+
token: string;
|
|
34
|
+
expiresAt: number;
|
|
35
|
+
};
|
|
36
|
+
/** Refresh dedup: concurrent requests share the same fetch. */
|
|
37
|
+
inflight?: Promise<{
|
|
38
|
+
token: string;
|
|
39
|
+
expiresAt: number;
|
|
40
|
+
}>;
|
|
41
|
+
/** Buffer (ms) before `exp` at which we treat a token as expired. */
|
|
42
|
+
expiryBufferMs: number;
|
|
43
|
+
/** Used only by the service-credentials path. */
|
|
44
|
+
fetchFn: typeof fetch;
|
|
45
|
+
}
|
|
46
|
+
export declare function makeTokenSourceState(source: TokenSource, options?: {
|
|
47
|
+
expiryBufferMs?: number;
|
|
48
|
+
fetchFn?: typeof fetch;
|
|
49
|
+
}): TokenSourceState;
|
|
50
|
+
/**
|
|
51
|
+
* Return a fresh access token, using the cache when warm. Concurrent
|
|
52
|
+
* callers during a refresh share the in-flight Promise so we don't
|
|
53
|
+
* stampede the auth server.
|
|
54
|
+
*/
|
|
55
|
+
export declare function getAccessToken(state: TokenSourceState): Promise<string>;
|
|
56
|
+
/**
|
|
57
|
+
* Drop the cached token. The next `getAccessToken` will mint or
|
|
58
|
+
* re-fetch. Called by the request layer on 401.
|
|
59
|
+
*/
|
|
60
|
+
export declare function invalidateToken(state: TokenSourceState): void;
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.makeTokenSourceState = makeTokenSourceState;
|
|
4
|
+
exports.getAccessToken = getAccessToken;
|
|
5
|
+
exports.invalidateToken = invalidateToken;
|
|
6
|
+
const errors_1 = require("./errors");
|
|
7
|
+
const issuer_1 = require("./auth/issuer");
|
|
8
|
+
const DEFAULT_EXPIRY_BUFFER_MS = 5000;
|
|
9
|
+
function makeTokenSourceState(source, options = {}) {
|
|
10
|
+
return {
|
|
11
|
+
source,
|
|
12
|
+
expiryBufferMs: options.expiryBufferMs ?? DEFAULT_EXPIRY_BUFFER_MS,
|
|
13
|
+
fetchFn: options.fetchFn ?? globalThis.fetch,
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Return a fresh access token, using the cache when warm. Concurrent
|
|
18
|
+
* callers during a refresh share the in-flight Promise so we don't
|
|
19
|
+
* stampede the auth server.
|
|
20
|
+
*/
|
|
21
|
+
async function getAccessToken(state) {
|
|
22
|
+
const now = Date.now();
|
|
23
|
+
if (state.cached && state.cached.expiresAt > now + state.expiryBufferMs) {
|
|
24
|
+
return state.cached.token;
|
|
25
|
+
}
|
|
26
|
+
if (state.inflight) {
|
|
27
|
+
const fresh = await state.inflight;
|
|
28
|
+
return fresh.token;
|
|
29
|
+
}
|
|
30
|
+
const inflight = mintToken(state).then((res) => {
|
|
31
|
+
state.cached = res;
|
|
32
|
+
state.inflight = undefined;
|
|
33
|
+
return res;
|
|
34
|
+
});
|
|
35
|
+
state.inflight = inflight;
|
|
36
|
+
try {
|
|
37
|
+
const fresh = await inflight;
|
|
38
|
+
return fresh.token;
|
|
39
|
+
}
|
|
40
|
+
catch (err) {
|
|
41
|
+
state.inflight = undefined;
|
|
42
|
+
throw err;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Drop the cached token. The next `getAccessToken` will mint or
|
|
47
|
+
* re-fetch. Called by the request layer on 401.
|
|
48
|
+
*/
|
|
49
|
+
function invalidateToken(state) {
|
|
50
|
+
state.cached = undefined;
|
|
51
|
+
}
|
|
52
|
+
async function mintToken(state) {
|
|
53
|
+
switch (state.source.kind) {
|
|
54
|
+
case 'static-string': {
|
|
55
|
+
const exp = (0, issuer_1.getExpiry)(state.source.token);
|
|
56
|
+
if (exp !== null && exp * 1000 < Date.now() + state.expiryBufferMs) {
|
|
57
|
+
throw new errors_1.TokenExpiredError('static access token has expired; consumer must update the config with a fresh token');
|
|
58
|
+
}
|
|
59
|
+
return {
|
|
60
|
+
token: state.source.token,
|
|
61
|
+
// No `exp`? Treat as opaque non-expiring; cache for 1h to avoid
|
|
62
|
+
// re-using the same string forever in case the issuer rotates.
|
|
63
|
+
expiresAt: exp !== null ? exp * 1000 : Date.now() + 60 * 60 * 1000,
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
case 'callback': {
|
|
67
|
+
const token = await state.source.getToken();
|
|
68
|
+
const exp = (0, issuer_1.getExpiry)(token);
|
|
69
|
+
return {
|
|
70
|
+
token,
|
|
71
|
+
expiresAt: exp !== null ? exp * 1000 : Date.now() + 5 * 60 * 1000,
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
case 'service-credentials': {
|
|
75
|
+
const body = new URLSearchParams({ grant_type: 'client_credentials' });
|
|
76
|
+
if (state.source.scope)
|
|
77
|
+
body.set('scope', state.source.scope);
|
|
78
|
+
const basic = base64(`${state.source.clientId}:${state.source.clientSecret}`);
|
|
79
|
+
const res = await state.fetchFn(`${state.source.authBaseUrl}/oauth/token`, {
|
|
80
|
+
method: 'POST',
|
|
81
|
+
headers: {
|
|
82
|
+
'content-type': 'application/x-www-form-urlencoded',
|
|
83
|
+
authorization: `Basic ${basic}`,
|
|
84
|
+
},
|
|
85
|
+
body: body.toString(),
|
|
86
|
+
});
|
|
87
|
+
if (!res.ok) {
|
|
88
|
+
const text = await res.text();
|
|
89
|
+
throw new errors_1.ConfigError(`client_credentials mint failed: HTTP ${res.status} ${text}`);
|
|
90
|
+
}
|
|
91
|
+
const json = (await res.json());
|
|
92
|
+
if (!json.access_token) {
|
|
93
|
+
throw new errors_1.ConfigError('auth server response missing access_token');
|
|
94
|
+
}
|
|
95
|
+
const ttl = (json.expires_in ?? 0) * 1000;
|
|
96
|
+
return {
|
|
97
|
+
token: json.access_token,
|
|
98
|
+
expiresAt: ttl > 0 ? Date.now() + ttl : Date.now() + 5 * 60 * 1000,
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
function base64(s) {
|
|
104
|
+
// Works in Node and browser (Buffer is polyfilled via @types/node and
|
|
105
|
+
// most bundlers; btoa is a fallback for envs without Buffer).
|
|
106
|
+
if (typeof Buffer !== 'undefined')
|
|
107
|
+
return Buffer.from(s, 'utf8').toString('base64');
|
|
108
|
+
// eslint-disable-next-line no-undef
|
|
109
|
+
return btoa(s);
|
|
110
|
+
}
|
|
111
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9rZW4tc291cmNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3Rva2VuLXNvdXJjZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQTJDQSxvREFTQztBQU9ELHdDQXNCQztBQU1ELDBDQUVDO0FBekZELHFDQUEwRDtBQUMxRCwwQ0FBMEM7QUF3QzFDLE1BQU0sd0JBQXdCLEdBQUcsSUFBSSxDQUFDO0FBRXRDLFNBQWdCLG9CQUFvQixDQUNsQyxNQUFtQixFQUNuQixVQUErRCxFQUFFO0lBRWpFLE9BQU87UUFDTCxNQUFNO1FBQ04sY0FBYyxFQUFFLE9BQU8sQ0FBQyxjQUFjLElBQUksd0JBQXdCO1FBQ2xFLE9BQU8sRUFBRSxPQUFPLENBQUMsT0FBTyxJQUFLLFVBQVUsQ0FBQyxLQUFzQjtLQUMvRCxDQUFDO0FBQ0osQ0FBQztBQUVEOzs7O0dBSUc7QUFDSSxLQUFLLFVBQVUsY0FBYyxDQUFDLEtBQXVCO0lBQzFELE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztJQUN2QixJQUFJLEtBQUssQ0FBQyxNQUFNLElBQUksS0FBSyxDQUFDLE1BQU0sQ0FBQyxTQUFTLEdBQUcsR0FBRyxHQUFHLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUN4RSxPQUFPLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDO0lBQzVCLENBQUM7SUFDRCxJQUFJLEtBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUNuQixNQUFNLEtBQUssR0FBRyxNQUFNLEtBQUssQ0FBQyxRQUFRLENBQUM7UUFDbkMsT0FBTyxLQUFLLENBQUMsS0FBSyxDQUFDO0lBQ3JCLENBQUM7SUFDRCxNQUFNLFFBQVEsR0FBRyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUU7UUFDN0MsS0FBSyxDQUFDLE1BQU0sR0FBRyxHQUFHLENBQUM7UUFDbkIsS0FBSyxDQUFDLFFBQVEsR0FBRyxTQUFTLENB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cnJvciB9IGZyb20gJy4vZXJyb3JzJztcbmltcG9ydCB7IGdldEV4cGlyeSB9IGZyb20gJy4vYXV0aC9pc3N1ZXInO1xuXG4vKipcbiAqIEhvdyB0aGUgU0RLIGdldHMgYSBmcmVzaCBhY2Nlc3MgdG9rZW4uIFRocmVlIHNoYXBlcyBwZXIgdGhlIGJyaWVmOlxuICpcbiAqICAgLSBgc3RhdGljLXN0cmluZ2Ag4oCUIGNhbGxlciBoYW5kcyBpbiBhIHRva2VuIHN0cmluZy4gVXNlZCB1bnRpbCBpdHNcbiAqICAgICBgZXhwYCBoYXMgcGFzc2VkOyBvbiBleHBpcnkgd2UgdGhyb3cgYFRva2VuRXhwaXJlZEVycm9yYCByYXRoZXJcbiAqICAgICB0aGFuIHRyeSB0byByZWZyZXNoICh0aGUgU0RLIGhhcyBubyB3YXkgdG8gcmVmcmVzaCBhIHN0YXRpY1xuICogICAgIGV4dGVybmFsbHktc3VwcGxpZWQgdG9rZW4pLlxuICpcbiAqICAgLSBgY2FsbGJhY2tgIOKAlCBjYWxsZXIgc3VwcGxpZXMgYSBmdW5jdGlvbiB0aGUgU0RLIGNhbGxzIG9uIG1pc3NcbiAqICAgICBhbmQgb24gNDAxIGludmFsaWRhdGlvbi4gVGhlIGNvbnN1bWVyJ3MgbG9naWMgaXMgcmVzcG9uc2libGUgZm9yXG4gKiAgICAgcmVmcmVzaDsgdGhlIFNESyBqdXN0IGNhY2hlcyB0aGUgcmVzdWx0IGJldHdlZW4gaW52b2NhdGlvbnMuXG4gKlxuICogICAtIGBzZXJ2aWNlLWNyZWRlbnRpYWxzYCDigJQgYGNsaWVudF9pZGAgKyBgY2xpZW50X3NlY3JldGAgZm9yIHRoZVxuICogICAgIE9BdXRoMiBgY2xpZW50X2NyZWRlbnRpYWxzYCBncmFudC4gU0RLIG1pbnRzICsgY2FjaGVzOyBvblxuICogICAgIGV4cGlyeSBpdCByZS1taW50cyB3aXRoIHRoZSBzYW1lIGNyZWRlbnRpYWxzLlxuICovXG5leHBvcnQgdHlwZSBUb2tlblNvdXJjZSA9XG4gIHwgeyBraW5kOiAnc3RhdGljLXN0cmluZyc7IHRva2VuOiBzdHJpbmcgfVxuICB8IHsga2luZDogJ2NhbGxiYWNrJzsgZ2V0VG9rZW46ICgpID0+IHN0cmluZyB8IFByb21pc2U8c3RyaW5nPiB9XG4gIHwge1xuICAgICAga2luZDogJ3NlcnZpY2UtY3JlZGVudGlhbHMnO1xuICAgICAgY2xpZW50SWQ6IHN0cmluZztcbiAgICAgIGNsaWVudFNlY3JldDogc3RyaW5nO1xuICAgICAgYXV0aEJhc2VVcmw6IHN0cmluZztcbiAgICAgIHNjb3BlPzogc3RyaW5nO1xuICAgIH07XG5cbmV4cG9ydCBpbnRlcmZhY2UgVG9rZW5Tb3VyY2VTdGF0ZSB7XG4gIHNvdXJjZTogVG9rZW5Tb3VyY2U7XG4gIGNhY2hlZD86IHsgdG9rZW46IHN0cmluZzsgZXhwaXJlc0F0OiBudW1iZXIgfTtcbiAgLyoqIFJlZnJlc2ggZGVkdXA6IGNvbmN1cnJlbnQgcmVxdWVzdHMgc2hhcmUgdGhlIHNhbWUgZmV0Y2guICovXG4gIGluZmxpZ2h0PzogUHJvbWlzZTx7IHRva2VuOiBzdHJpbmc7IGV4cGlyZXNBdDogbnVtYmVyIH0+O1xuICAvKiogQnVmZmVyIChtcykgYmVmb3JlIGBleHBgIGF0IHdoaWNoIHdlIHRyZWF0IGEgdG9rZW4gYXMgZXhwaXJlZC4gKi9cbiAgZXhwaXJ5QnVmZmVyTXM6IG51bWJlcjtcbiAgLyoqIFVzZWQgb25seSBieSB0aGUgc2VydmljZS1jcmVkZW50aWFscyBwYXRoLiAqL1xuICBmZXRjaEZuOiB0eXBlb2YgZmV0Y2g7XG59XG5cbmNvbnN0IERFRkFVTFRfRVhQSVJZX0JVRkZFUl9NUyA9IDUwMDA7XG5cbmV4cG9ydCBmdW5jdGlvbiBtYWtlVG9rZW5Tb3VyY2VTdGF0ZShcbiAgc291cmNlOiBUb2tlblNvdXJjZSxcbiAgb3B0aW9uczogeyBleHBpcnlCdWZmZXJNcz86IG51bWJlcjsgZmV0Y2hGbj86IHR5cGVvZiBmZXRjaCB9ID0ge30sXG4pOiBUb2tlblNvdXJjZVN0YXRlIHtcbiAgcmV0dXJuIHtcbiAgICBzb3VyY2UsXG4gICAgZXhwaXJ5QnVmZmVyTXM6IG9wdGlvbnMuZXhwaXJ5QnVmZmVyTXMgPz8gREVGQVVMVF9FWFBJUllfQlVGRkVSX01TLFxuICAgIGZldGNoRm46IG9wdGlvbnMuZmV0Y2hGbiA/PyAoZ2xvYmFsVGhpcy5mZXRjaCBhcyB0eXBlb2YgZmV0Y2gpLFxuICB9O1xufVxuXG4vKipcbiAqIFJldHVybiBhIGZyZXNoIGFjY2VzcyB0b2tlbiwgdXNpbmcgdGhlIGNhY2hlIHdoZW4gd2FybS4gQ29uY3VycmVudFxuICogY2FsbGVycyBkdXJpbmcgYSByZWZyZXNoIHNoYXJlIHRoZSBpbi1mbGlnaHQgUHJvbWlzZSBzbyB3ZSBkb24ndFxuICogc3RhbXBlZGUgdGhlIGF1dGggc2VydmVyLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0QWNjZXNzVG9rZW4oc3RhdGU6IFRva2VuU291cmNlU3RhdGUpOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICBpZiAoc3RhdGUuY2FjaGVkICYmIHN0YXRlLmNhY2hlZC5leHBpcmVzQXQgPiBub3cgKyBzdGF0ZS5leHBpcnlCdWZmZXJNcykge1xuICAgIHJldHVybiBzdGF0ZS5jYWNoZWQudG9rZW47XG4gIH1cbiAgaWYgKHN0YXRlLmluZmxpZ2h0KSB7XG4gICAgY29uc3QgZnJlc2ggPSBhd2FpdCBzdGF0ZS5pbmZsaWdodDtcbiAgICByZXR1cm4gZnJlc2gudG9rZW47XG4gIH1cbiAgY29uc3QgaW5mbGlnaHQgPSBtaW50VG9rZW4oc3RhdGUpLnRoZW4oKHJlcykgPT4ge1xuICAgIHN0YXRlLmNhY2hlZCA9IHJlcztcbiAgICBzdGF0ZS5pbmZsaWdodCA9IHVuZGVmaW5lZDtcbiAgICByZXR1cm4gcmVzO1xuICB9KTtcbiAgc3RhdGUuaW5mbGlnaHQgPSBpbmZsaWdodDtcbiAgdHJ5IHtcbiAgICBjb25zdCBmcmVzaCA9IGF3YWl0IGluZmxpZ2h0O1xuICAgIHJldHVybiBmcmVzaC50b2tlbjtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgc3RhdGUuaW5mbGlnaHQgPSB1bmRlZmluZWQ7XG4gICAgdGhyb3cgZXJyO1xuICB9XG59XG5cbi8qKlxuICogRHJvcCB0aGUgY2FjaGVkIHRva2VuLiBUaGUgbmV4dCBgZ2V0QWNjZXNzVG9rZW5gIHdpbGwgbWludCBvclxuICogcmUtZmV0Y2guIENhbGxlZCBieSB0aGUgcmVxdWVzdCBsYXllciBvbiA0MDEuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbnZhbGlkYXRlVG9rZW4oc3RhdGU6IFRva2VuU291cmNlU3RhdGUpOiB2b2lkIHtcbiAgc3RhdGUuY2FjaGVkID0gdW5kZWZpbmVkO1xufVxuXG5hc3luYyBmdW5jdGlvbiBtaW50VG9rZW4oc3RhdGU6IFRva2VuU291cmNlU3RhdGUpOiBQcm9taXNlPHsgdG9rZW46IHN0cmluZzsgZXhwaXJlc0F0OiBudW1iZXIgfT4ge1xuICBzd2l0Y2ggKHN0YXRlLnNvdXJjZS5raW5kKSB7XG4gICAgY2FzZSAnc3RhdGljLXN0cmluZyc6IHtcbiAgICAgIGNvbnN0IGV4cCA9IGdldEV4cGlyeShzdGF0ZS5zb3VyY2UudG9rZW4pO1xuICAgICAgaWYgKGV4cCAhPT0gbnVsbCAmJiBleHAgKiAxMDAwIDwgRGF0ZS5ub3coKSArIHN0YXRlLmV4cGlyeUJ1ZmZlck1zKSB7XG4gICAgICAgIHRocm93IG5ldyBUb2tlbkV4cGlyZWRFcnJvcihcbiAgICAgICAgICAnc3RhdGljIGFjY2VzcyB0b2tlbiBoYXMgZXhwaXJlZDsgY29uc3VtZXIgbXVzdCB1cGRhdGUgdGhlIGNvbmZpZyB3aXRoIGEgZnJlc2ggdG9rZW4nLFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdG9rZW46IHN0YXRlLnNvdXJjZS50b2tlbixcbiAgICAgICAgLy8gTm8gYGV4cGA/IFRyZWF0IGFzIG9wYXF1ZSBub24tZXhwaXJpbmc7IGNhY2hlIGZvciAxaCB0byBhdm9pZFxuICAgICAgICAvLyByZS11c2luZyB0aGUgc2FtZSBzdHJpbmcgZm9yZXZlciBpbiBjYXNlIHRoZSBpc3N1ZXIgcm90YXRlcy5cbiAgICAgICAgZXhwaXJlc0F0OiBleHAgIT09IG51bGwgPyBleHAgKiAxMDAwIDogRGF0ZS5ub3coKSArIDYwICogNjAgKiAxMDAwLFxuICAgICAgfTtcbiAgICB9XG4gICAgY2FzZSAnY2FsbGJhY2snOiB7XG4gICAgICBjb25zdCB0b2tlbiA9IGF3YWl0IHN0YXRlLnNvdXJjZS5nZXRUb2tlbigpO1xuICAgICAgY29uc3QgZXhwID0gZ2V0RXhwaXJ5KHRva2VuKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHRva2VuLFxuICAgICAgICBleHBpcmVzQXQ6IGV4cCAhPT0gbnVsbCA/IGV4cCAqIDEwMDAgOiBEYXRlLm5vdygpICsgNSAqIDYwICogMTAwMCxcbiAgICAgIH07XG4gICAgfVxuICAgIGNhc2UgJ3NlcnZpY2UtY3JlZGVudGlhbHMnOiB7XG4gICAgICBjb25zdCBib2R5ID0gbmV3IFVSTFNlYXJjaFBhcmFtcyh7IGdyYW50X3R5cGU6ICdjbGllbnRfY3JlZGVudGlhbHMnIH0pO1xuICAgICAgaWYgKHN0YXRlLnNvdXJjZS5zY29wZSkgYm9keS5zZXQoJ3Njb3BlJywgc3RhdGUuc291cmNlLnNjb3BlKTtcbiAgICAgIGNvbnN0IGJhc2ljID0gYmFzZTY0KGAke3N0YXRlLnNvdXJjZS5jbGllbnRJZH06JHtzdGF0ZS5zb3VyY2UuY2xpZW50U2VjcmV0fWApO1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgc3RhdGUuZmV0Y2hGbihgJHtzdGF0ZS5zb3VyY2UuYXV0aEJhc2VVcmx9L29hdXRoL3Rva2VuYCwge1xuICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJyxcbiAgICAgICAgICBhdXRob3JpemF0aW9uOiBgQmFzaWMgJHtiYXNpY31gLFxuICAgICAgICB9LFxuICAgICAgICBib2R5OiBib2R5LnRvU3RyaW5nKCksXG4gICAgICB9KTtcbiAgICAgIGlmICghcmVzLm9rKSB7XG4gICAgICAgIGNvbnN0IHRleHQgPSBhd2FpdCByZXMudGV4dCgpO1xuICAgICAgICB0aHJvdyBuZXcgQ29uZmlnRXJyb3IoYGNsaWVudF9jcmVkZW50aWFscyBtaW50IGZhaWxlZDogSFRUUCAke3Jlcy5zdGF0dXN9ICR7dGV4dH1gKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGpzb24gPSAoYXdhaXQgcmVzLmpzb24oKSkgYXMgeyBhY2Nlc3NfdG9rZW4/OiBzdHJpbmc7IGV4cGlyZXNfaW4/OiBudW1iZXIgfTtcbiAgICAgIGlmICghanNvbi5hY2Nlc3NfdG9rZW4pIHtcbiAgICAgICAgdGhyb3cgbmV3IENvbmZpZ0Vycm9yKCdhdXRoIHNlcnZlciByZXNwb25zZSBtaXNzaW5nIGFjY2Vzc190b2tlbicpO1xuICAgICAgfVxuICAgICAgY29uc3QgdHRsID0gKGpzb24uZXhwaXJlc19pbiA/PyAwKSAqIDEwMDA7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0b2tlbjoganNvbi5hY2Nlc3NfdG9rZW4sXG4gICAgICAgIGV4cGlyZXNBdDogdHRsID4gMCA/IERhdGUubm93KCkgKyB0dGwgOiBEYXRlLm5vdygpICsgNSAqIDYwICogMTAwMCxcbiAgICAgIH07XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGJhc2U2NChzOiBzdHJpbmcpOiBzdHJpbmcge1xuICAvLyBXb3JrcyBpbiBOb2RlIGFuZCBicm93c2VyIChCdWZmZXIgaXMgcG9seWZpbGxlZCB2aWEgQHR5cGVzL25vZGUgYW5kXG4gIC8vIG1vc3QgYnVuZGxlcnM7IGJ0b2EgaXMgYSBmYWxsYmFjayBmb3IgZW52cyB3aXRob3V0IEJ1ZmZlcikuXG4gIGlmICh0eXBlb2YgQnVmZmVyICE9PSAndW5kZWZpbmVkJykgcmV0dXJuIEJ1ZmZlci5mcm9tKHMsICd1dGY4JykudG9TdHJpbmcoJ2Jhc2U2NCcpO1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW5kZWZcbiAgcmV0dXJuIGJ0b2Eocyk7XG59XG4iXX0=
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Manually-maintained version string surfaced via the `User-Agent`
|
|
3
|
+
* header. Kept in sync with `package.json` by hand because pulling the
|
|
4
|
+
* value from package.json at runtime would require either a JSON import
|
|
5
|
+
* (TS lib settings dependent) or a build-time replacement, and the
|
|
6
|
+
* cost of one bump-in-two-places per release is small.
|
|
7
|
+
*/
|
|
8
|
+
export declare const SDK_VERSION = "0.6.0";
|
package/dist/version.js
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SDK_VERSION = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Manually-maintained version string surfaced via the `User-Agent`
|
|
6
|
+
* header. Kept in sync with `package.json` by hand because pulling the
|
|
7
|
+
* value from package.json at runtime would require either a JSON import
|
|
8
|
+
* (TS lib settings dependent) or a build-time replacement, and the
|
|
9
|
+
* cost of one bump-in-two-places per release is small.
|
|
10
|
+
*/
|
|
11
|
+
exports.SDK_VERSION = '0.6.0';
|
|
12
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVyc2lvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy92ZXJzaW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBOzs7Ozs7R0FNRztBQUNVLFFBQUEsV0FBVyxHQUFHLE9BQU8sQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogTWFudWFsbHktbWFpbnRhaW5lZCB2ZXJzaW9uIHN0cmluZyBzdXJmYWNlZCB2aWEgdGhlIGBVc2VyLUFnZW50YFxuICogaGVhZGVyLiBLZXB0IGluIHN5bmMgd2l0aCBgcGFja2FnZS5qc29uYCBieSBoYW5kIGJlY2F1c2UgcHVsbGluZyB0aGVcbiAqIHZhbHVlIGZyb20gcGFja2FnZS5qc29uIGF0IHJ1bnRpbWUgd291bGQgcmVxdWlyZSBlaXRoZXIgYSBKU09OIGltcG9ydFxuICogKFRTIGxpYiBzZXR0aW5ncyBkZXBlbmRlbnQpIG9yIGEgYnVpbGQtdGltZSByZXBsYWNlbWVudCwgYW5kIHRoZVxuICogY29zdCBvZiBvbmUgYnVtcC1pbi10d28tcGxhY2VzIHBlciByZWxlYXNlIGlzIHNtYWxsLlxuICovXG5leHBvcnQgY29uc3QgU0RLX1ZFUlNJT04gPSAnMC42LjAnO1xuIl19
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@uengage.io/platform-sdk",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.6.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",
|
|
@@ -21,9 +21,10 @@
|
|
|
21
21
|
"hmac"
|
|
22
22
|
],
|
|
23
23
|
"dependencies": {
|
|
24
|
+
"jose": "^5.9.6",
|
|
24
25
|
"ulid": "^2.3.0",
|
|
25
26
|
"zod": "^3.23.8",
|
|
26
|
-
"@uengage.io/js-logger": "0.
|
|
27
|
+
"@uengage.io/js-logger": "0.10.0"
|
|
27
28
|
},
|
|
28
29
|
"devDependencies": {
|
|
29
30
|
"@types/jest": "^29.5.14",
|