@keycardai/oauth 0.18.0 → 0.20.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.
Files changed (64) hide show
  1. package/README.md +5 -0
  2. package/dist/cjs/clientCredentials.d.ts +3 -2
  3. package/dist/cjs/clientCredentials.d.ts.map +1 -1
  4. package/dist/cjs/clientCredentials.js +4 -4
  5. package/dist/cjs/clientCredentials.js.map +1 -1
  6. package/dist/cjs/credentials.d.ts +5 -4
  7. package/dist/cjs/credentials.d.ts.map +1 -1
  8. package/dist/cjs/pkce.d.ts.map +1 -1
  9. package/dist/cjs/pkce.js +2 -2
  10. package/dist/cjs/pkce.js.map +1 -1
  11. package/dist/cjs/registration.js +4 -4
  12. package/dist/cjs/registration.js.map +1 -1
  13. package/dist/cjs/server/clientSecret.d.ts +1 -1
  14. package/dist/cjs/server/clientSecret.d.ts.map +1 -1
  15. package/dist/cjs/server/clientSecret.js +28 -19
  16. package/dist/cjs/server/clientSecret.js.map +1 -1
  17. package/dist/cjs/server/eksWorkloadIdentity.d.ts +7 -6
  18. package/dist/cjs/server/eksWorkloadIdentity.d.ts.map +1 -1
  19. package/dist/cjs/server/eksWorkloadIdentity.js +11 -95
  20. package/dist/cjs/server/eksWorkloadIdentity.js.map +1 -1
  21. package/dist/cjs/server/index.d.ts +2 -0
  22. package/dist/cjs/server/index.d.ts.map +1 -1
  23. package/dist/cjs/server/index.js +13 -1
  24. package/dist/cjs/server/index.js.map +1 -1
  25. package/dist/cjs/server/workloadIdentity.d.ts +166 -0
  26. package/dist/cjs/server/workloadIdentity.d.ts.map +1 -0
  27. package/dist/cjs/server/workloadIdentity.js +355 -0
  28. package/dist/cjs/server/workloadIdentity.js.map +1 -0
  29. package/dist/cjs/tokenExchange.d.ts +11 -3
  30. package/dist/cjs/tokenExchange.d.ts.map +1 -1
  31. package/dist/cjs/tokenExchange.js +8 -6
  32. package/dist/cjs/tokenExchange.js.map +1 -1
  33. package/dist/esm/clientCredentials.d.ts +3 -2
  34. package/dist/esm/clientCredentials.d.ts.map +1 -1
  35. package/dist/esm/clientCredentials.js +4 -4
  36. package/dist/esm/clientCredentials.js.map +1 -1
  37. package/dist/esm/credentials.d.ts +5 -4
  38. package/dist/esm/credentials.d.ts.map +1 -1
  39. package/dist/esm/pkce.d.ts.map +1 -1
  40. package/dist/esm/pkce.js +2 -2
  41. package/dist/esm/pkce.js.map +1 -1
  42. package/dist/esm/registration.js +4 -4
  43. package/dist/esm/registration.js.map +1 -1
  44. package/dist/esm/server/clientSecret.d.ts +1 -1
  45. package/dist/esm/server/clientSecret.d.ts.map +1 -1
  46. package/dist/esm/server/clientSecret.js +28 -19
  47. package/dist/esm/server/clientSecret.js.map +1 -1
  48. package/dist/esm/server/eksWorkloadIdentity.d.ts +7 -6
  49. package/dist/esm/server/eksWorkloadIdentity.d.ts.map +1 -1
  50. package/dist/esm/server/eksWorkloadIdentity.js +11 -62
  51. package/dist/esm/server/eksWorkloadIdentity.js.map +1 -1
  52. package/dist/esm/server/index.d.ts +2 -0
  53. package/dist/esm/server/index.d.ts.map +1 -1
  54. package/dist/esm/server/index.js +1 -0
  55. package/dist/esm/server/index.js.map +1 -1
  56. package/dist/esm/server/workloadIdentity.d.ts +166 -0
  57. package/dist/esm/server/workloadIdentity.d.ts.map +1 -0
  58. package/dist/esm/server/workloadIdentity.js +312 -0
  59. package/dist/esm/server/workloadIdentity.js.map +1 -0
  60. package/dist/esm/tokenExchange.d.ts +11 -3
  61. package/dist/esm/tokenExchange.d.ts.map +1 -1
  62. package/dist/esm/tokenExchange.js +8 -6
  63. package/dist/esm/tokenExchange.js.map +1 -1
  64. package/package.json +2 -2
@@ -0,0 +1,166 @@
1
+ import type { ApplicationCredential } from "../credentials.js";
2
+ import type { TokenExchangeRequest } from "../tokenExchange.js";
3
+ /**
4
+ * Source identifiers carried on WorkloadIdentityConfigurationError and
5
+ * WorkloadIdentityRuntimeError, for branching on which token source failed.
6
+ */
7
+ export declare const WORKLOAD_IDENTITY_SOURCE_FILE = "file";
8
+ export declare const WORKLOAD_IDENTITY_SOURCE_GCP_METADATA = "gcp-metadata";
9
+ export declare const WORKLOAD_IDENTITY_SOURCE_FLY = "fly";
10
+ export declare const WORKLOAD_IDENTITY_SOURCE_CUSTOM = "custom";
11
+ /**
12
+ * A workload identity credential or token source was misconfigured at
13
+ * construction: a missing or empty token file, no discovery environment
14
+ * variable set, a missing required audience, or an invalid source.
15
+ *
16
+ * `source` identifies the token source ("file", "gcp-metadata", "fly");
17
+ * undefined when the fault is in the credential itself. The underlying cause,
18
+ * when any, is on `cause`.
19
+ */
20
+ export declare class WorkloadIdentityConfigurationError extends Error {
21
+ readonly source?: string;
22
+ readonly cause?: unknown;
23
+ constructor(message: string, options?: {
24
+ source?: string;
25
+ cause?: unknown;
26
+ });
27
+ }
28
+ /**
29
+ * The subject token could not be obtained at request time: the token file was
30
+ * rotated away or emptied after construction, or the platform endpoint was
31
+ * unreachable. Distinct from WorkloadIdentityConfigurationError, which is a
32
+ * construction-time fault.
33
+ *
34
+ * `source` identifies the token source ("file", "gcp-metadata", "fly", or
35
+ * "custom" for a source whose error is not one of this module's typed
36
+ * errors). The underlying cause, when any, is on `cause`.
37
+ */
38
+ export declare class WorkloadIdentityRuntimeError extends Error {
39
+ readonly source?: string;
40
+ readonly cause?: unknown;
41
+ constructor(message: string, options?: {
42
+ source?: string;
43
+ cause?: unknown;
44
+ });
45
+ }
46
+ /**
47
+ * Supplies a platform-signed OIDC token for use as a client assertion during
48
+ * token exchange. The only per-platform piece of a workload identity
49
+ * credential: {@link FileTokenSource} covers platforms that project the token
50
+ * to a file (EKS, AKS, Kubernetes projected service-account tokens),
51
+ * {@link GCPMetadataTokenSource} covers platforms that serve it from the GCP
52
+ * metadata endpoint (GKE, GCE, Cloud Run), {@link FlyTokenSource} covers Fly
53
+ * Machines, and any bare function returning the token is accepted as a source.
54
+ *
55
+ * `identityToken` is called on every token exchange. Implementations must
56
+ * return the current token; platforms rotate these tokens, so returning a
57
+ * stale cached value risks an expired assertion.
58
+ */
59
+ export interface IdentityTokenSource {
60
+ identityToken(): Promise<string>;
61
+ }
62
+ /** A bare function accepted anywhere a IdentityTokenSource is. */
63
+ export type IdentityTokenFetcher = () => Promise<string> | string;
64
+ export declare const DEFAULT_FILE_TOKEN_ENV_VARS: string[];
65
+ export interface FileTokenSourceOptions {
66
+ /** Explicit token file path, skipping env-var discovery. */
67
+ tokenFilePath?: string;
68
+ /** An environment variable to consult first during discovery. */
69
+ envVarName?: string;
70
+ }
71
+ /** @internal Shared by FileTokenSource and the deprecated EKSWorkloadIdentity. */
72
+ export declare function resolveTokenFilePath(discoveryEnvVars: string[], options?: FileTokenSourceOptions): string;
73
+ /**
74
+ * Reads a platform-projected OIDC token from a mounted file, fresh on every
75
+ * call (platforms rotate projected tokens). Covers EKS pod identity, AKS
76
+ * workload identity, any Kubernetes projected service-account token, and CI
77
+ * providers that write the token to a file.
78
+ *
79
+ * When no explicit path is given, the path is discovered from the first set
80
+ * environment variable: the variable named by `envVarName` when given, then
81
+ * KEYCARD_EKS_WORKLOAD_IDENTITY_TOKEN_FILE, AWS_CONTAINER_AUTHORIZATION_TOKEN_FILE,
82
+ * AWS_WEB_IDENTITY_TOKEN_FILE, and AZURE_FEDERATED_TOKEN_FILE.
83
+ *
84
+ * **Requires Node.js.** Validates at construction that the resolved file
85
+ * exists and is non-empty.
86
+ */
87
+ export declare class FileTokenSource implements IdentityTokenSource {
88
+ #private;
89
+ constructor(options?: FileTokenSourceOptions);
90
+ /** Re-reads the token file and returns its trimmed contents. */
91
+ identityToken(): Promise<string>;
92
+ }
93
+ export interface GCPMetadataTokenSourceOptions {
94
+ /** The token audience, typically the Keycard zone URL. Required. */
95
+ audience: string;
96
+ /** Metadata server base URL override (for testing). */
97
+ metadataUrl?: string;
98
+ /** Per-call deadline in milliseconds. */
99
+ timeoutMs?: number;
100
+ }
101
+ /**
102
+ * Fetches an OIDC identity token for the default service account from the
103
+ * GCP metadata server. Covers GKE, GCE, and Cloud Run.
104
+ */
105
+ export declare class GCPMetadataTokenSource implements IdentityTokenSource {
106
+ #private;
107
+ constructor(options: GCPMetadataTokenSourceOptions);
108
+ /** Requests a GCP-signed OIDC JWT from the metadata server. */
109
+ identityToken(): Promise<string>;
110
+ }
111
+ export interface FlyTokenSourceOptions {
112
+ /** The token audience claim, typically the Keycard zone URL. */
113
+ audience?: string;
114
+ /** Machines API socket path override (default /.fly/api). */
115
+ socketPath?: string;
116
+ }
117
+ /**
118
+ * Fetches an OIDC token from the Fly.io Machines API over the local Unix
119
+ * socket. Covers workloads running on Fly Machines.
120
+ *
121
+ * **Requires Node.js** (Unix domain sockets). The socket is not probed at
122
+ * construction; an unreachable Machines API surfaces as a
123
+ * WorkloadIdentityRuntimeError at the first fetch.
124
+ */
125
+ export declare class FlyTokenSource implements IdentityTokenSource {
126
+ #private;
127
+ constructor(options?: FlyTokenSourceOptions);
128
+ /** Requests a Fly-signed OIDC JWT from the Machines API. */
129
+ identityToken(): Promise<string>;
130
+ }
131
+ export interface WorkloadIdentityOptions {
132
+ /**
133
+ * ID of the Keycard application credential this workload authenticates as,
134
+ * sent as the `client_id` form parameter alongside the client assertion.
135
+ * Token-federation application credentials are resolved by this ID, so
136
+ * they require it; legacy token credentials are resolved by the
137
+ * assertion's subject and do not use it.
138
+ */
139
+ clientId?: string;
140
+ }
141
+ /**
142
+ * Workload identity credential using a platform-signed OIDC token obtained
143
+ * from a {@link IdentityTokenSource}. On every token exchange it fetches the
144
+ * current token from the source and attaches it as a jwt-bearer client
145
+ * assertion. It holds no shared secret and never caches the token across
146
+ * requests.
147
+ *
148
+ * @example
149
+ * // EKS / AKS / Kubernetes projected token (path discovered from env)
150
+ * const credential = new WorkloadIdentity(new FileTokenSource());
151
+ *
152
+ * // GKE / GCE / Cloud Run
153
+ * const credential = new WorkloadIdentity(
154
+ * new GCPMetadataTokenSource({ audience: "https://zone.keycard.cloud" }),
155
+ * );
156
+ *
157
+ * // Custom fetch
158
+ * const credential = new WorkloadIdentity(() => fetchMyToken());
159
+ */
160
+ export declare class WorkloadIdentity implements ApplicationCredential {
161
+ #private;
162
+ constructor(source: IdentityTokenSource | IdentityTokenFetcher, options?: WorkloadIdentityOptions);
163
+ getAuth(): null;
164
+ prepareTokenExchangeRequest(subjectToken: string, resource: string): Promise<TokenExchangeRequest>;
165
+ }
166
+ //# sourceMappingURL=workloadIdentity.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workloadIdentity.d.ts","sourceRoot":"","sources":["../../../src/server/workloadIdentity.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAC/D,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAEhE;;;GAGG;AACH,eAAO,MAAM,6BAA6B,SAAS,CAAC;AACpD,eAAO,MAAM,qCAAqC,iBAAiB,CAAC;AACpE,eAAO,MAAM,4BAA4B,QAAQ,CAAC;AAClD,eAAO,MAAM,+BAA+B,WAAW,CAAC;AAExD;;;;;;;;GAQG;AACH,qBAAa,kCAAmC,SAAQ,KAAK;IAC3D,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;gBAEb,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE;CAM5E;AAED;;;;;;;;;GASG;AACH,qBAAa,4BAA6B,SAAQ,KAAK;IACrD,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;gBAEb,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE;CAM5E;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,WAAW,mBAAmB;IAClC,aAAa,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;CAClC;AAED,kEAAkE;AAClE,MAAM,MAAM,oBAAoB,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC;AAElE,eAAO,MAAM,2BAA2B,UAKvC,CAAC;AAEF,MAAM,WAAW,sBAAsB;IACrC,4DAA4D;IAC5D,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,iEAAiE;IACjE,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,kFAAkF;AAClF,wBAAgB,oBAAoB,CAClC,gBAAgB,EAAE,MAAM,EAAE,EAC1B,OAAO,CAAC,EAAE,sBAAsB,GAC/B,MAAM,CAeR;AA0BD;;;;;;;;;;;;;GAaG;AACH,qBAAa,eAAgB,YAAW,mBAAmB;;gBAG7C,OAAO,CAAC,EAAE,sBAAsB;IAK5C,gEAAgE;IAC1D,aAAa,IAAI,OAAO,CAAC,MAAM,CAAC;CAGvC;AAED,MAAM,WAAW,6BAA6B;IAC5C,oEAAoE;IACpE,QAAQ,EAAE,MAAM,CAAC;IACjB,uDAAuD;IACvD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,yCAAyC;IACzC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAMD;;;GAGG;AACH,qBAAa,sBAAuB,YAAW,mBAAmB;;gBAKpD,OAAO,EAAE,6BAA6B;IAWlD,+DAA+D;IACzD,aAAa,IAAI,OAAO,CAAC,MAAM,CAAC;CAkCvC;AAED,MAAM,WAAW,qBAAqB;IACpC,gEAAgE;IAChE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,6DAA6D;IAC7D,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAMD;;;;;;;GAOG;AACH,qBAAa,cAAe,YAAW,mBAAmB;;gBAI5C,OAAO,CAAC,EAAE,qBAAqB;IAK3C,4DAA4D;IACtD,aAAa,IAAI,OAAO,CAAC,MAAM,CAAC;CAkEvC;AAED,MAAM,WAAW,uBAAuB;IACtC;;;;;;OAMG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,qBAAa,gBAAiB,YAAW,qBAAqB;;gBAK1D,MAAM,EAAE,mBAAmB,GAAG,oBAAoB,EAClD,OAAO,CAAC,EAAE,uBAAuB;IAiBnC,OAAO,IAAI,IAAI;IAIT,2BAA2B,CAC/B,YAAY,EAAE,MAAM,EACpB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,oBAAoB,CAAC;CAuCjC"}
@@ -0,0 +1,312 @@
1
+ var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
2
+ if (kind === "m") throw new TypeError("Private method is not writable");
3
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
4
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
5
+ return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
6
+ };
7
+ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
8
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
9
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
10
+ return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
11
+ };
12
+ var _FileTokenSource_tokenFilePath, _GCPMetadataTokenSource_audience, _GCPMetadataTokenSource_metadataUrl, _GCPMetadataTokenSource_timeoutMs, _FlyTokenSource_audience, _FlyTokenSource_socketPath, _WorkloadIdentity_instances, _WorkloadIdentity_source, _WorkloadIdentity_clientId, _WorkloadIdentity_fetchIdentityToken;
13
+ import * as fs from "node:fs";
14
+ /**
15
+ * Source identifiers carried on WorkloadIdentityConfigurationError and
16
+ * WorkloadIdentityRuntimeError, for branching on which token source failed.
17
+ */
18
+ export const WORKLOAD_IDENTITY_SOURCE_FILE = "file";
19
+ export const WORKLOAD_IDENTITY_SOURCE_GCP_METADATA = "gcp-metadata";
20
+ export const WORKLOAD_IDENTITY_SOURCE_FLY = "fly";
21
+ export const WORKLOAD_IDENTITY_SOURCE_CUSTOM = "custom";
22
+ /**
23
+ * A workload identity credential or token source was misconfigured at
24
+ * construction: a missing or empty token file, no discovery environment
25
+ * variable set, a missing required audience, or an invalid source.
26
+ *
27
+ * `source` identifies the token source ("file", "gcp-metadata", "fly");
28
+ * undefined when the fault is in the credential itself. The underlying cause,
29
+ * when any, is on `cause`.
30
+ */
31
+ export class WorkloadIdentityConfigurationError extends Error {
32
+ constructor(message, options) {
33
+ super(message);
34
+ this.name = "WorkloadIdentityConfigurationError";
35
+ this.source = options?.source;
36
+ this.cause = options?.cause;
37
+ }
38
+ }
39
+ /**
40
+ * The subject token could not be obtained at request time: the token file was
41
+ * rotated away or emptied after construction, or the platform endpoint was
42
+ * unreachable. Distinct from WorkloadIdentityConfigurationError, which is a
43
+ * construction-time fault.
44
+ *
45
+ * `source` identifies the token source ("file", "gcp-metadata", "fly", or
46
+ * "custom" for a source whose error is not one of this module's typed
47
+ * errors). The underlying cause, when any, is on `cause`.
48
+ */
49
+ export class WorkloadIdentityRuntimeError extends Error {
50
+ constructor(message, options) {
51
+ super(message);
52
+ this.name = "WorkloadIdentityRuntimeError";
53
+ this.source = options?.source;
54
+ this.cause = options?.cause;
55
+ }
56
+ }
57
+ export const DEFAULT_FILE_TOKEN_ENV_VARS = [
58
+ "KEYCARD_EKS_WORKLOAD_IDENTITY_TOKEN_FILE",
59
+ "AWS_CONTAINER_AUTHORIZATION_TOKEN_FILE",
60
+ "AWS_WEB_IDENTITY_TOKEN_FILE",
61
+ "AZURE_FEDERATED_TOKEN_FILE",
62
+ ];
63
+ /** @internal Shared by FileTokenSource and the deprecated EKSWorkloadIdentity. */
64
+ export function resolveTokenFilePath(discoveryEnvVars, options) {
65
+ if (options?.tokenFilePath) {
66
+ return options.tokenFilePath;
67
+ }
68
+ const envNames = options?.envVarName
69
+ ? [options.envVarName, ...discoveryEnvVars]
70
+ : discoveryEnvVars;
71
+ const found = envNames.find((name) => process.env[name]);
72
+ if (!found || !process.env[found]) {
73
+ throw new WorkloadIdentityConfigurationError(`Could not find token file path in environment variables; checked: ${envNames.join(", ")}`, { source: WORKLOAD_IDENTITY_SOURCE_FILE });
74
+ }
75
+ return process.env[found];
76
+ }
77
+ function readTokenFile(tokenFilePath, errorClass) {
78
+ let contents;
79
+ try {
80
+ contents = fs.readFileSync(tokenFilePath, "utf-8");
81
+ }
82
+ catch (error) {
83
+ throw new errorClass(`Error reading token file: ${tokenFilePath}`, {
84
+ source: WORKLOAD_IDENTITY_SOURCE_FILE,
85
+ cause: error,
86
+ });
87
+ }
88
+ const token = contents.trim();
89
+ if (!token) {
90
+ throw new errorClass(`Token file is empty: ${tokenFilePath}`, {
91
+ source: WORKLOAD_IDENTITY_SOURCE_FILE,
92
+ });
93
+ }
94
+ return token;
95
+ }
96
+ /**
97
+ * Reads a platform-projected OIDC token from a mounted file, fresh on every
98
+ * call (platforms rotate projected tokens). Covers EKS pod identity, AKS
99
+ * workload identity, any Kubernetes projected service-account token, and CI
100
+ * providers that write the token to a file.
101
+ *
102
+ * When no explicit path is given, the path is discovered from the first set
103
+ * environment variable: the variable named by `envVarName` when given, then
104
+ * KEYCARD_EKS_WORKLOAD_IDENTITY_TOKEN_FILE, AWS_CONTAINER_AUTHORIZATION_TOKEN_FILE,
105
+ * AWS_WEB_IDENTITY_TOKEN_FILE, and AZURE_FEDERATED_TOKEN_FILE.
106
+ *
107
+ * **Requires Node.js.** Validates at construction that the resolved file
108
+ * exists and is non-empty.
109
+ */
110
+ export class FileTokenSource {
111
+ constructor(options) {
112
+ _FileTokenSource_tokenFilePath.set(this, void 0);
113
+ __classPrivateFieldSet(this, _FileTokenSource_tokenFilePath, resolveTokenFilePath(DEFAULT_FILE_TOKEN_ENV_VARS, options), "f");
114
+ readTokenFile(__classPrivateFieldGet(this, _FileTokenSource_tokenFilePath, "f"), WorkloadIdentityConfigurationError);
115
+ }
116
+ /** Re-reads the token file and returns its trimmed contents. */
117
+ async identityToken() {
118
+ return readTokenFile(__classPrivateFieldGet(this, _FileTokenSource_tokenFilePath, "f"), WorkloadIdentityRuntimeError);
119
+ }
120
+ }
121
+ _FileTokenSource_tokenFilePath = new WeakMap();
122
+ const DEFAULT_GCP_METADATA_URL = "http://metadata.google.internal";
123
+ const DEFAULT_GCP_TIMEOUT_MS = 5000;
124
+ const GCP_IDENTITY_PATH = "/computeMetadata/v1/instance/service-accounts/default/identity";
125
+ /**
126
+ * Fetches an OIDC identity token for the default service account from the
127
+ * GCP metadata server. Covers GKE, GCE, and Cloud Run.
128
+ */
129
+ export class GCPMetadataTokenSource {
130
+ constructor(options) {
131
+ _GCPMetadataTokenSource_audience.set(this, void 0);
132
+ _GCPMetadataTokenSource_metadataUrl.set(this, void 0);
133
+ _GCPMetadataTokenSource_timeoutMs.set(this, void 0);
134
+ if (!options.audience || !options.audience.trim()) {
135
+ throw new WorkloadIdentityConfigurationError("audience must not be empty", {
136
+ source: WORKLOAD_IDENTITY_SOURCE_GCP_METADATA,
137
+ });
138
+ }
139
+ __classPrivateFieldSet(this, _GCPMetadataTokenSource_audience, options.audience, "f");
140
+ __classPrivateFieldSet(this, _GCPMetadataTokenSource_metadataUrl, (options.metadataUrl ?? DEFAULT_GCP_METADATA_URL).replace(/\/$/, ""), "f");
141
+ __classPrivateFieldSet(this, _GCPMetadataTokenSource_timeoutMs, options.timeoutMs ?? DEFAULT_GCP_TIMEOUT_MS, "f");
142
+ }
143
+ /** Requests a GCP-signed OIDC JWT from the metadata server. */
144
+ async identityToken() {
145
+ const url = `${__classPrivateFieldGet(this, _GCPMetadataTokenSource_metadataUrl, "f")}${GCP_IDENTITY_PATH}` +
146
+ `?audience=${encodeURIComponent(__classPrivateFieldGet(this, _GCPMetadataTokenSource_audience, "f"))}&format=full`;
147
+ let response;
148
+ let body;
149
+ try {
150
+ response = await fetch(url, {
151
+ headers: { "Metadata-Flavor": "Google" },
152
+ signal: AbortSignal.timeout(__classPrivateFieldGet(this, _GCPMetadataTokenSource_timeoutMs, "f")),
153
+ });
154
+ body = await response.text();
155
+ }
156
+ catch (error) {
157
+ throw new WorkloadIdentityRuntimeError(`Error calling metadata server at ${__classPrivateFieldGet(this, _GCPMetadataTokenSource_metadataUrl, "f")} (is this running on GCP?)`, { source: WORKLOAD_IDENTITY_SOURCE_GCP_METADATA, cause: error });
158
+ }
159
+ if (!response.ok) {
160
+ throw new WorkloadIdentityRuntimeError(`Metadata server returned status ${response.status}`, { source: WORKLOAD_IDENTITY_SOURCE_GCP_METADATA });
161
+ }
162
+ const token = body.trim();
163
+ if (!token) {
164
+ throw new WorkloadIdentityRuntimeError("Metadata server returned an empty token", {
165
+ source: WORKLOAD_IDENTITY_SOURCE_GCP_METADATA,
166
+ });
167
+ }
168
+ return token;
169
+ }
170
+ }
171
+ _GCPMetadataTokenSource_audience = new WeakMap(), _GCPMetadataTokenSource_metadataUrl = new WeakMap(), _GCPMetadataTokenSource_timeoutMs = new WeakMap();
172
+ const DEFAULT_FLY_SOCKET_PATH = "/.fly/api";
173
+ const FLY_TOKEN_PATH = "/v1/tokens/oidc";
174
+ const FLY_TIMEOUT_MS = 5000;
175
+ /**
176
+ * Fetches an OIDC token from the Fly.io Machines API over the local Unix
177
+ * socket. Covers workloads running on Fly Machines.
178
+ *
179
+ * **Requires Node.js** (Unix domain sockets). The socket is not probed at
180
+ * construction; an unreachable Machines API surfaces as a
181
+ * WorkloadIdentityRuntimeError at the first fetch.
182
+ */
183
+ export class FlyTokenSource {
184
+ constructor(options) {
185
+ _FlyTokenSource_audience.set(this, void 0);
186
+ _FlyTokenSource_socketPath.set(this, void 0);
187
+ __classPrivateFieldSet(this, _FlyTokenSource_audience, options?.audience, "f");
188
+ __classPrivateFieldSet(this, _FlyTokenSource_socketPath, options?.socketPath ?? DEFAULT_FLY_SOCKET_PATH, "f");
189
+ }
190
+ /** Requests a Fly-signed OIDC JWT from the Machines API. */
191
+ async identityToken() {
192
+ const http = await import("node:http");
193
+ const payload = JSON.stringify(__classPrivateFieldGet(this, _FlyTokenSource_audience, "f") ? { aud: __classPrivateFieldGet(this, _FlyTokenSource_audience, "f") } : {});
194
+ return new Promise((resolve, reject) => {
195
+ const request = http.request({
196
+ socketPath: __classPrivateFieldGet(this, _FlyTokenSource_socketPath, "f"),
197
+ path: FLY_TOKEN_PATH,
198
+ method: "POST",
199
+ headers: {
200
+ "Content-Type": "application/json",
201
+ "Content-Length": Buffer.byteLength(payload),
202
+ },
203
+ timeout: FLY_TIMEOUT_MS,
204
+ }, (response) => {
205
+ const chunks = [];
206
+ response.on("data", (chunk) => chunks.push(chunk));
207
+ response.on("end", () => {
208
+ if (response.statusCode !== 200) {
209
+ reject(new WorkloadIdentityRuntimeError(`Machines API returned status ${response.statusCode}`, { source: WORKLOAD_IDENTITY_SOURCE_FLY }));
210
+ return;
211
+ }
212
+ const token = Buffer.concat(chunks).toString("utf-8").trim();
213
+ if (!token) {
214
+ reject(new WorkloadIdentityRuntimeError("Machines API returned an empty token", {
215
+ source: WORKLOAD_IDENTITY_SOURCE_FLY,
216
+ }));
217
+ return;
218
+ }
219
+ resolve(token);
220
+ });
221
+ });
222
+ request.on("error", (error) => {
223
+ if (error instanceof WorkloadIdentityRuntimeError) {
224
+ reject(error);
225
+ return;
226
+ }
227
+ reject(new WorkloadIdentityRuntimeError(`Error calling Machines API socket ${__classPrivateFieldGet(this, _FlyTokenSource_socketPath, "f")} (is this running on a Fly Machine?)`, { source: WORKLOAD_IDENTITY_SOURCE_FLY, cause: error }));
228
+ });
229
+ request.on("timeout", () => {
230
+ request.destroy(new WorkloadIdentityRuntimeError(`Machines API request timed out after ${FLY_TIMEOUT_MS}ms`, { source: WORKLOAD_IDENTITY_SOURCE_FLY }));
231
+ });
232
+ request.write(payload);
233
+ request.end();
234
+ });
235
+ }
236
+ }
237
+ _FlyTokenSource_audience = new WeakMap(), _FlyTokenSource_socketPath = new WeakMap();
238
+ /**
239
+ * Workload identity credential using a platform-signed OIDC token obtained
240
+ * from a {@link IdentityTokenSource}. On every token exchange it fetches the
241
+ * current token from the source and attaches it as a jwt-bearer client
242
+ * assertion. It holds no shared secret and never caches the token across
243
+ * requests.
244
+ *
245
+ * @example
246
+ * // EKS / AKS / Kubernetes projected token (path discovered from env)
247
+ * const credential = new WorkloadIdentity(new FileTokenSource());
248
+ *
249
+ * // GKE / GCE / Cloud Run
250
+ * const credential = new WorkloadIdentity(
251
+ * new GCPMetadataTokenSource({ audience: "https://zone.keycard.cloud" }),
252
+ * );
253
+ *
254
+ * // Custom fetch
255
+ * const credential = new WorkloadIdentity(() => fetchMyToken());
256
+ */
257
+ export class WorkloadIdentity {
258
+ constructor(source, options) {
259
+ _WorkloadIdentity_instances.add(this);
260
+ _WorkloadIdentity_source.set(this, void 0);
261
+ _WorkloadIdentity_clientId.set(this, void 0);
262
+ if (source == null) {
263
+ throw new WorkloadIdentityConfigurationError("identity token source must not be null");
264
+ }
265
+ if (typeof source !== "function" &&
266
+ typeof source.identityToken !== "function") {
267
+ throw new WorkloadIdentityConfigurationError("identity token source must provide identityToken() or be a function");
268
+ }
269
+ __classPrivateFieldSet(this, _WorkloadIdentity_source, source, "f");
270
+ __classPrivateFieldSet(this, _WorkloadIdentity_clientId, options?.clientId, "f");
271
+ }
272
+ getAuth() {
273
+ return null;
274
+ }
275
+ async prepareTokenExchangeRequest(subjectToken, resource) {
276
+ const assertion = await __classPrivateFieldGet(this, _WorkloadIdentity_instances, "m", _WorkloadIdentity_fetchIdentityToken).call(this);
277
+ return {
278
+ subjectToken,
279
+ resource,
280
+ subjectTokenType: "urn:ietf:params:oauth:token-type:access_token",
281
+ clientAssertionType: "urn:ietf:params:oauth:client-assertion-type:jwt-bearer",
282
+ clientAssertion: assertion,
283
+ clientId: __classPrivateFieldGet(this, _WorkloadIdentity_clientId, "f"),
284
+ };
285
+ }
286
+ }
287
+ _WorkloadIdentity_source = new WeakMap(), _WorkloadIdentity_clientId = new WeakMap(), _WorkloadIdentity_instances = new WeakSet(), _WorkloadIdentity_fetchIdentityToken = async function _WorkloadIdentity_fetchIdentityToken() {
288
+ let token;
289
+ try {
290
+ token =
291
+ typeof __classPrivateFieldGet(this, _WorkloadIdentity_source, "f") === "function"
292
+ ? await __classPrivateFieldGet(this, _WorkloadIdentity_source, "f").call(this)
293
+ : await __classPrivateFieldGet(this, _WorkloadIdentity_source, "f").identityToken();
294
+ }
295
+ catch (error) {
296
+ if (error instanceof WorkloadIdentityConfigurationError ||
297
+ error instanceof WorkloadIdentityRuntimeError) {
298
+ throw error;
299
+ }
300
+ throw new WorkloadIdentityRuntimeError("Error fetching identity token", {
301
+ source: WORKLOAD_IDENTITY_SOURCE_CUSTOM,
302
+ cause: error,
303
+ });
304
+ }
305
+ if (typeof token !== "string" || !token.trim()) {
306
+ throw new WorkloadIdentityRuntimeError("Identity token source returned an empty token", {
307
+ source: WORKLOAD_IDENTITY_SOURCE_CUSTOM,
308
+ });
309
+ }
310
+ return token;
311
+ };
312
+ //# sourceMappingURL=workloadIdentity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workloadIdentity.js","sourceRoot":"","sources":["../../../src/server/workloadIdentity.ts"],"names":[],"mappings":"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"}
@@ -20,6 +20,12 @@ export interface TokenExchangeRequest {
20
20
  actorTokenType?: string;
21
21
  clientAssertion?: string;
22
22
  clientAssertionType?: string;
23
+ /**
24
+ * Names the application credential the client authenticates as, sent as
25
+ * the client_id form parameter. Used with assertion-based credentials that
26
+ * are resolved by ID rather than by the assertion's subject.
27
+ */
28
+ clientId?: string;
23
29
  }
24
30
  export interface TokenResponse {
25
31
  accessToken: string;
@@ -37,18 +43,20 @@ export interface TokenExchangeClientOptions {
37
43
  /**
38
44
  * Application credential provider. When set, takes precedence over
39
45
  * static `clientId`/`clientSecret` and resolves the per-request
40
- * Authorization header from the credential's `getAuth(zoneId)`.
46
+ * Authorization header from the credential's `getAuth(issuer)`.
41
47
  */
42
48
  credential?: ApplicationCredential;
43
49
  }
44
50
  export interface ExchangeOptions {
45
- zoneId?: string;
51
+ /** Zone issuer URL used to select per-zone credentials. */
52
+ issuer?: string;
46
53
  }
47
54
  export interface ImpersonateRequest {
48
55
  userIdentifier: string;
49
56
  resource: string;
50
57
  scope?: string;
51
- zoneId?: string;
58
+ /** Zone issuer URL used to select per-zone credentials. */
59
+ issuer?: string;
52
60
  }
53
61
  export declare function deserializeTokenResponse(json: Record<string, unknown>): TokenResponse;
54
62
  export declare class TokenExchangeClient {
@@ -1 +1 @@
1
- {"version":3,"file":"tokenExchange.d.ts","sourceRoot":"","sources":["../../src/tokenExchange.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AAO9D,eAAO,MAAM,SAAS;;IAEpB;;;OAGG;;CAEK,CAAC;AACX,MAAM,MAAM,SAAS,GAAG,CAAC,OAAO,SAAS,CAAC,CAAC,MAAM,OAAO,SAAS,CAAC,CAAC;AAEnE,MAAM,WAAW,oBAAoB;IACnC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED,MAAM,WAAW,aAAa;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,+EAA+E;IAC/E,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,0BAA0B;IACzC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;;;OAIG;IACH,UAAU,CAAC,EAAE,qBAAqB,CAAC;CACpC;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,kBAAkB;IACjC,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAyBD,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,aAAa,CAqBrF;AAMD,qBAAa,mBAAmB;;gBAQlB,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,0BAA0B;IAO1D,aAAa,CACjB,OAAO,EAAE,oBAAoB,EAC7B,OAAO,CAAC,EAAE,eAAe,GACxB,OAAO,CAAC,aAAa,CAAC;IA8CnB,WAAW,CAAC,GAAG,EAAE,kBAAkB,GAAG,OAAO,CAAC,aAAa,CAAC;IA+BlE;;;;OAIG;IACG,gBAAgB,IAAI,OAAO,CAAC,MAAM,CAAC;CAuB1C"}
1
+ {"version":3,"file":"tokenExchange.d.ts","sourceRoot":"","sources":["../../src/tokenExchange.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AAO9D,eAAO,MAAM,SAAS;;IAEpB;;;OAGG;;CAEK,CAAC;AACX,MAAM,MAAM,SAAS,GAAG,CAAC,OAAO,SAAS,CAAC,CAAC,MAAM,OAAO,SAAS,CAAC,CAAC;AAEnE,MAAM,WAAW,oBAAoB;IACnC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B;;;;OAIG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,aAAa;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,+EAA+E;IAC/E,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,0BAA0B;IACzC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;;;OAIG;IACH,UAAU,CAAC,EAAE,qBAAqB,CAAC;CACpC;AAED,MAAM,WAAW,eAAe;IAC9B,2DAA2D;IAC3D,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,kBAAkB;IACjC,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,2DAA2D;IAC3D,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AA0BD,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,aAAa,CAqBrF;AAMD,qBAAa,mBAAmB;;gBAQlB,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,0BAA0B;IAO1D,aAAa,CACjB,OAAO,EAAE,oBAAoB,EAC7B,OAAO,CAAC,EAAE,eAAe,GACxB,OAAO,CAAC,aAAa,CAAC;IA+CnB,WAAW,CAAC,GAAG,EAAE,kBAAkB,GAAG,OAAO,CAAC,aAAa,CAAC;IA+BlE;;;;OAIG;IACG,gBAAgB,IAAI,OAAO,CAAC,MAAM,CAAC;CAuB1C"}
@@ -48,12 +48,14 @@ function serializeRequest(request) {
48
48
  params.set("client_assertion", request.clientAssertion);
49
49
  if (request.clientAssertionType)
50
50
  params.set("client_assertion_type", request.clientAssertionType);
51
+ if (request.clientId)
52
+ params.set("client_id", request.clientId);
51
53
  return params;
52
54
  }
53
55
  export function deserializeTokenResponse(json) {
54
56
  const accessToken = json.access_token;
55
57
  if (typeof accessToken !== "string" || !accessToken) {
56
- throw new Error("Token exchange response missing access_token");
58
+ throw new OAuthError("invalid_response", "Token response missing access_token");
57
59
  }
58
60
  const response = {
59
61
  accessToken,
@@ -96,7 +98,7 @@ export class TokenExchangeClient {
96
98
  const headers = {
97
99
  "Content-Type": "application/x-www-form-urlencoded",
98
100
  };
99
- const basicAuth = __classPrivateFieldGet(this, _TokenExchangeClient_instances, "m", _TokenExchangeClient_resolveBasicAuth).call(this, options?.zoneId);
101
+ const basicAuth = __classPrivateFieldGet(this, _TokenExchangeClient_instances, "m", _TokenExchangeClient_resolveBasicAuth).call(this, options?.issuer);
100
102
  if (basicAuth) {
101
103
  const credentials = btoa(`${basicAuth.clientId}:${basicAuth.clientSecret}`);
102
104
  headers["Authorization"] = `Basic ${credentials}`;
@@ -125,7 +127,7 @@ export class TokenExchangeClient {
125
127
  throw e;
126
128
  // non-JSON or no "error" key — fall through
127
129
  }
128
- throw new Error(`Token exchange failed (HTTP ${response.status})`);
130
+ throw new OAuthError("invalid_response", `Token exchange failed (HTTP ${response.status})`);
129
131
  }
130
132
  const json = await response.json();
131
133
  return deserializeTokenResponse(json);
@@ -143,7 +145,7 @@ export class TokenExchangeClient {
143
145
  subjectTokenType: TokenType.SUBSTITUTE_USER,
144
146
  resource: req.resource,
145
147
  scope: req.scope,
146
- }, { zoneId: req.zoneId });
148
+ }, { issuer: req.issuer });
147
149
  }
148
150
  /**
149
151
  * Resolve the authorization server's token endpoint (discovered from metadata
@@ -154,9 +156,9 @@ export class TokenExchangeClient {
154
156
  return __classPrivateFieldGet(this, _TokenExchangeClient_instances, "m", _TokenExchangeClient_getTokenEndpoint).call(this);
155
157
  }
156
158
  }
157
- _TokenExchangeClient_issuer = new WeakMap(), _TokenExchangeClient_clientId = new WeakMap(), _TokenExchangeClient_clientSecret = new WeakMap(), _TokenExchangeClient_credential = new WeakMap(), _TokenExchangeClient_tokenEndpoint = new WeakMap(), _TokenExchangeClient_discoveryPromise = new WeakMap(), _TokenExchangeClient_instances = new WeakSet(), _TokenExchangeClient_resolveBasicAuth = function _TokenExchangeClient_resolveBasicAuth(zoneId) {
159
+ _TokenExchangeClient_issuer = new WeakMap(), _TokenExchangeClient_clientId = new WeakMap(), _TokenExchangeClient_clientSecret = new WeakMap(), _TokenExchangeClient_credential = new WeakMap(), _TokenExchangeClient_tokenEndpoint = new WeakMap(), _TokenExchangeClient_discoveryPromise = new WeakMap(), _TokenExchangeClient_instances = new WeakSet(), _TokenExchangeClient_resolveBasicAuth = function _TokenExchangeClient_resolveBasicAuth(issuer) {
158
160
  if (__classPrivateFieldGet(this, _TokenExchangeClient_credential, "f")) {
159
- return __classPrivateFieldGet(this, _TokenExchangeClient_credential, "f").getAuth(zoneId);
161
+ return __classPrivateFieldGet(this, _TokenExchangeClient_credential, "f").getAuth(issuer);
160
162
  }
161
163
  if (__classPrivateFieldGet(this, _TokenExchangeClient_clientId, "f") && __classPrivateFieldGet(this, _TokenExchangeClient_clientSecret, "f")) {
162
164
  return { clientId: __classPrivateFieldGet(this, _TokenExchangeClient_clientId, "f"), clientSecret: __classPrivateFieldGet(this, _TokenExchangeClient_clientSecret, "f") };
@@ -1 +1 @@
1
- {"version":3,"file":"tokenExchange.js","sourceRoot":"","sources":["../../src/tokenExchange.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"tokenExchange.js","sourceRoot":"","sources":["../../src/tokenExchange.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@keycardai/oauth",
3
- "version": "0.18.0",
3
+ "version": "0.20.0",
4
4
  "description": "[Preview] OAuth 2.0 primitives for Keycard: JWKS keyring, JWT signing/verification, server-tier token verifier, AccessContext, ClientSecret credentials, and impersonation via RFC 8693 token exchange",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -119,7 +119,7 @@
119
119
  "@jest/globals": "^30.0.4",
120
120
  "@types/node": "^25.6.0",
121
121
  "jest": "^30.0.4",
122
- "ts-jest": "^29.4.0",
122
+ "ts-jest": "^29.4.7",
123
123
  "typescript": "^5.8.3"
124
124
  },
125
125
  "scripts": {