@xemahq/temporal-runtime 0.5.2 → 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/README.md +154 -11
- package/dist/bin/controller-token-publisher.d.ts +3 -0
- package/dist/bin/controller-token-publisher.d.ts.map +1 -0
- package/dist/bin/controller-token-publisher.js +18 -0
- package/dist/bin/controller-token-publisher.js.map +1 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +12 -0
- package/dist/index.js.map +1 -1
- package/dist/lib/access-token.d.ts +11 -0
- package/dist/lib/access-token.d.ts.map +1 -0
- package/dist/lib/access-token.js +30 -0
- package/dist/lib/access-token.js.map +1 -0
- package/dist/lib/base-temporal-client.service.d.ts +3 -2
- package/dist/lib/base-temporal-client.service.d.ts.map +1 -1
- package/dist/lib/base-temporal-client.service.js +5 -5
- package/dist/lib/base-temporal-client.service.js.map +1 -1
- package/dist/lib/biome-worker.d.ts +83 -0
- package/dist/lib/biome-worker.d.ts.map +1 -0
- package/dist/lib/biome-worker.js +253 -0
- package/dist/lib/biome-worker.js.map +1 -0
- package/dist/lib/bounded-retry.d.ts +22 -0
- package/dist/lib/bounded-retry.d.ts.map +1 -0
- package/dist/lib/bounded-retry.js +67 -0
- package/dist/lib/bounded-retry.js.map +1 -0
- package/dist/lib/client-credentials-token-source.d.ts +23 -0
- package/dist/lib/client-credentials-token-source.d.ts.map +1 -0
- package/dist/lib/client-credentials-token-source.js +108 -0
- package/dist/lib/client-credentials-token-source.js.map +1 -0
- package/dist/lib/connection.d.ts +48 -9
- package/dist/lib/connection.d.ts.map +1 -1
- package/dist/lib/connection.js +153 -41
- package/dist/lib/connection.js.map +1 -1
- package/dist/lib/controller-token-publisher.d.ts +51 -0
- package/dist/lib/controller-token-publisher.d.ts.map +1 -0
- package/dist/lib/controller-token-publisher.js +116 -0
- package/dist/lib/controller-token-publisher.js.map +1 -0
- package/dist/lib/fairness-constants.d.ts +3 -0
- package/dist/lib/fairness-constants.d.ts.map +1 -0
- package/dist/lib/fairness-constants.js +6 -0
- package/dist/lib/fairness-constants.js.map +1 -0
- package/dist/lib/fairness.d.ts +13 -0
- package/dist/lib/fairness.d.ts.map +1 -0
- package/dist/lib/fairness.js +56 -0
- package/dist/lib/fairness.js.map +1 -0
- package/dist/lib/namespace.d.ts +4 -0
- package/dist/lib/namespace.d.ts.map +1 -0
- package/dist/lib/namespace.js +18 -0
- package/dist/lib/namespace.js.map +1 -0
- package/dist/lib/org-erasure.d.ts +13 -0
- package/dist/lib/org-erasure.d.ts.map +1 -0
- package/dist/lib/org-erasure.js +68 -0
- package/dist/lib/org-erasure.js.map +1 -0
- package/dist/lib/proactive-token-refresher.d.ts +47 -0
- package/dist/lib/proactive-token-refresher.d.ts.map +1 -0
- package/dist/lib/proactive-token-refresher.js +147 -0
- package/dist/lib/proactive-token-refresher.js.map +1 -0
- package/dist/lib/search-attribute-constants.d.ts +3 -0
- package/dist/lib/search-attribute-constants.d.ts.map +1 -0
- package/dist/lib/search-attribute-constants.js +6 -0
- package/dist/lib/search-attribute-constants.js.map +1 -0
- package/dist/lib/search-attributes.d.ts +4 -18
- package/dist/lib/search-attributes.d.ts.map +1 -1
- package/dist/lib/search-attributes.js +33 -40
- package/dist/lib/search-attributes.js.map +1 -1
- package/dist/lib/standalone-activity.d.ts +23 -0
- package/dist/lib/standalone-activity.d.ts.map +1 -0
- package/dist/lib/standalone-activity.js +48 -0
- package/dist/lib/standalone-activity.js.map +1 -0
- package/dist/lib/versioned-worker.d.ts +26 -0
- package/dist/lib/versioned-worker.d.ts.map +1 -0
- package/dist/lib/versioned-worker.js +60 -0
- package/dist/lib/versioned-worker.js.map +1 -0
- package/dist/lib/worker-deployment-version.d.ts +8 -0
- package/dist/lib/worker-deployment-version.d.ts.map +1 -0
- package/dist/lib/worker-deployment-version.js +45 -0
- package/dist/lib/worker-deployment-version.js.map +1 -0
- package/dist/lib/worker.d.ts +7 -7
- package/dist/lib/worker.d.ts.map +1 -1
- package/dist/lib/worker.js +33 -37
- package/dist/lib/worker.js.map +1 -1
- package/dist/lib/workflow-interceptors/fairness-guard.d.ts +4 -0
- package/dist/lib/workflow-interceptors/fairness-guard.d.ts.map +1 -0
- package/dist/lib/workflow-interceptors/fairness-guard.js +65 -0
- package/dist/lib/workflow-interceptors/fairness-guard.js.map +1 -0
- package/dist/lib/workflow-interceptors/fairness-propagation.d.ts +3 -0
- package/dist/lib/workflow-interceptors/fairness-propagation.d.ts.map +1 -0
- package/dist/lib/workflow-interceptors/fairness-propagation.js +6 -0
- package/dist/lib/workflow-interceptors/fairness-propagation.js.map +1 -0
- package/dist/lib/workflow-interceptors/org-fairness-required.d.ts +3 -0
- package/dist/lib/workflow-interceptors/org-fairness-required.d.ts.map +1 -0
- package/dist/lib/workflow-interceptors/org-fairness-required.js +6 -0
- package/dist/lib/workflow-interceptors/org-fairness-required.js.map +1 -0
- package/dist/lib/workflow-interceptors/org-search-attribute.d.ts +3 -0
- package/dist/lib/workflow-interceptors/org-search-attribute.d.ts.map +1 -0
- package/dist/lib/workflow-interceptors/org-search-attribute.js +49 -0
- package/dist/lib/workflow-interceptors/org-search-attribute.js.map +1 -0
- package/dist/lib/workflow-purity.d.ts +27 -0
- package/dist/lib/workflow-purity.d.ts.map +1 -0
- package/dist/lib/workflow-purity.js +115 -0
- package/dist/lib/workflow-purity.js.map +1 -0
- package/package.json +21 -10
package/dist/lib/connection.js
CHANGED
|
@@ -1,62 +1,174 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.TEMPORAL_CONNECTION_ENV = void 0;
|
|
4
|
+
exports.temporalClientCredentialsFromEnv = temporalClientCredentialsFromEnv;
|
|
5
|
+
exports.temporalConnectionOptionsFromEnv = temporalConnectionOptionsFromEnv;
|
|
6
|
+
exports.validateTemporalConnectionOptions = validateTemporalConnectionOptions;
|
|
3
7
|
exports.connectTemporalWorker = connectTemporalWorker;
|
|
4
8
|
exports.connectTemporalClient = connectTemporalClient;
|
|
5
|
-
|
|
6
|
-
const node_fs_1 = require("node:fs");
|
|
9
|
+
const promises_1 = require("node:fs/promises");
|
|
7
10
|
const client_1 = require("@temporalio/client");
|
|
8
11
|
const worker_1 = require("@temporalio/worker");
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
12
|
+
const bounded_retry_1 = require("./bounded-retry");
|
|
13
|
+
const client_credentials_token_source_1 = require("./client-credentials-token-source");
|
|
14
|
+
const proactive_token_refresher_1 = require("./proactive-token-refresher");
|
|
15
|
+
exports.TEMPORAL_CONNECTION_ENV = {
|
|
16
|
+
address: 'TEMPORAL_ADDRESS',
|
|
17
|
+
tlsCaPath: 'TEMPORAL_TLS_CA_PATH',
|
|
18
|
+
tlsServerName: 'TEMPORAL_TLS_SERVER_NAME',
|
|
19
|
+
tlsClientCertPath: 'TEMPORAL_TLS_CLIENT_CERT_PATH',
|
|
20
|
+
tlsClientKeyPath: 'TEMPORAL_TLS_CLIENT_KEY_PATH',
|
|
21
|
+
tokenEndpoint: 'TEMPORAL_AUTH_TOKEN_ENDPOINT',
|
|
22
|
+
clientId: 'TEMPORAL_AUTH_CLIENT_ID',
|
|
23
|
+
clientSecretFile: 'TEMPORAL_AUTH_CLIENT_SECRET_FILE',
|
|
24
|
+
audience: 'TEMPORAL_AUTH_AUDIENCE',
|
|
25
|
+
};
|
|
26
|
+
const RETIRED_CONNECTION_ENV = ['TEMPORAL_TLS_ENABLED'];
|
|
27
|
+
function required(env, name) {
|
|
28
|
+
const value = env(name)?.trim();
|
|
29
|
+
if (!value) {
|
|
30
|
+
throw new Error(`${name} is required for a Temporal connection: every worker and client ` +
|
|
31
|
+
'connects to the frontend over TLS with an infra-realm bearer token, and ' +
|
|
32
|
+
'there is no plaintext or unauthenticated mode.');
|
|
33
|
+
}
|
|
34
|
+
return value;
|
|
35
|
+
}
|
|
36
|
+
function optional(env, name) {
|
|
37
|
+
const value = env(name)?.trim();
|
|
38
|
+
return value ? value : undefined;
|
|
39
|
+
}
|
|
40
|
+
function temporalClientCredentialsFromEnv(env) {
|
|
41
|
+
const options = {
|
|
42
|
+
tokenEndpoint: required(env, exports.TEMPORAL_CONNECTION_ENV.tokenEndpoint),
|
|
43
|
+
clientId: required(env, exports.TEMPORAL_CONNECTION_ENV.clientId),
|
|
44
|
+
clientSecretFile: required(env, exports.TEMPORAL_CONNECTION_ENV.clientSecretFile),
|
|
45
|
+
audience: required(env, exports.TEMPORAL_CONNECTION_ENV.audience),
|
|
46
|
+
};
|
|
47
|
+
(0, client_credentials_token_source_1.validateClientCredentialsOptions)(options);
|
|
48
|
+
return options;
|
|
49
|
+
}
|
|
50
|
+
function temporalConnectionOptionsFromEnv(env) {
|
|
51
|
+
for (const retired of RETIRED_CONNECTION_ENV) {
|
|
52
|
+
if (env(retired) !== undefined) {
|
|
53
|
+
throw new Error(`${retired} is set, but the opt-in TLS mode it controlled is removed: TLS and ` +
|
|
54
|
+
`an infra-realm bearer are unconditional. Remove ${retired} from the deployment.`);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
const clientCertPath = optional(env, exports.TEMPORAL_CONNECTION_ENV.tlsClientCertPath);
|
|
58
|
+
const clientKeyPath = optional(env, exports.TEMPORAL_CONNECTION_ENV.tlsClientKeyPath);
|
|
59
|
+
const serverName = optional(env, exports.TEMPORAL_CONNECTION_ENV.tlsServerName);
|
|
60
|
+
const options = {
|
|
61
|
+
address: required(env, exports.TEMPORAL_CONNECTION_ENV.address),
|
|
62
|
+
tls: {
|
|
63
|
+
serverCaPath: required(env, exports.TEMPORAL_CONNECTION_ENV.tlsCaPath),
|
|
64
|
+
...(serverName !== undefined ? { serverName } : {}),
|
|
65
|
+
...(clientCertPath !== undefined ? { clientCertPath } : {}),
|
|
66
|
+
...(clientKeyPath !== undefined ? { clientKeyPath } : {}),
|
|
14
67
|
},
|
|
15
|
-
|
|
16
|
-
? { serverNameOverride: tls.serverName }
|
|
17
|
-
: {}),
|
|
68
|
+
credentials: temporalClientCredentialsFromEnv(env),
|
|
18
69
|
};
|
|
70
|
+
validateTemporalConnectionOptions(options);
|
|
71
|
+
return options;
|
|
19
72
|
}
|
|
20
|
-
|
|
21
|
-
if (
|
|
22
|
-
|
|
73
|
+
function validateTemporalConnectionOptions(options) {
|
|
74
|
+
if (options.address.trim().length === 0) {
|
|
75
|
+
throw new Error('Temporal connection: address is required.');
|
|
23
76
|
}
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
77
|
+
if (options.tls.serverCaPath.trim().length === 0) {
|
|
78
|
+
throw new Error('Temporal connection: tls.serverCaPath is required.');
|
|
79
|
+
}
|
|
80
|
+
const hasCert = options.tls.clientCertPath !== undefined;
|
|
81
|
+
const hasKey = options.tls.clientKeyPath !== undefined;
|
|
82
|
+
if (hasCert !== hasKey) {
|
|
83
|
+
throw new Error('Temporal connection: tls.clientCertPath and tls.clientKeyPath are a pair — set both or neither.');
|
|
84
|
+
}
|
|
85
|
+
(0, client_credentials_token_source_1.validateClientCredentialsOptions)(options.credentials);
|
|
28
86
|
}
|
|
29
|
-
async function
|
|
30
|
-
|
|
31
|
-
|
|
87
|
+
async function resolveTls(tls, read) {
|
|
88
|
+
const serverRootCACertificate = await read(tls.serverCaPath);
|
|
89
|
+
if (serverRootCACertificate.length === 0) {
|
|
90
|
+
throw new Error(`Temporal server CA file ${tls.serverCaPath} is empty.`);
|
|
91
|
+
}
|
|
92
|
+
const config = { serverRootCACertificate };
|
|
93
|
+
if (tls.serverName !== undefined)
|
|
94
|
+
config.serverNameOverride = tls.serverName;
|
|
95
|
+
if (tls.clientCertPath !== undefined && tls.clientKeyPath !== undefined) {
|
|
96
|
+
config.clientCertPair = {
|
|
97
|
+
crt: await read(tls.clientCertPath),
|
|
98
|
+
key: await read(tls.clientKeyPath),
|
|
99
|
+
};
|
|
32
100
|
}
|
|
33
|
-
return
|
|
34
|
-
|
|
35
|
-
|
|
101
|
+
return config;
|
|
102
|
+
}
|
|
103
|
+
async function startTokens(options, deps) {
|
|
104
|
+
const source = deps.tokenSource ?? (0, client_credentials_token_source_1.createClientCredentialsTokenSource)(options.credentials, deps);
|
|
105
|
+
return proactive_token_refresher_1.ProactiveTokenRefresher.start({
|
|
106
|
+
source,
|
|
107
|
+
description: `client ${options.credentials.clientId}`,
|
|
108
|
+
startupRetry: options.connectRetry ?? bounded_retry_1.DEFAULT_BOUNDED_RETRY_POLICY,
|
|
109
|
+
...(deps.logger !== undefined ? { logger: deps.logger } : {}),
|
|
110
|
+
...(deps.clock !== undefined ? { clock: deps.clock } : {}),
|
|
111
|
+
...(deps.onCredentialFailure !== undefined ? { onFatal: deps.onCredentialFailure } : {}),
|
|
36
112
|
});
|
|
37
113
|
}
|
|
38
|
-
function
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
114
|
+
async function prepare(options, deps) {
|
|
115
|
+
validateTemporalConnectionOptions(options);
|
|
116
|
+
const tls = await resolveTls(options.tls, deps.readFile ?? ((path) => (0, promises_1.readFile)(path)));
|
|
117
|
+
const tokens = await startTokens(options, deps);
|
|
118
|
+
return {
|
|
119
|
+
tls,
|
|
120
|
+
tokens,
|
|
121
|
+
retry: options.connectRetry ?? bounded_retry_1.DEFAULT_BOUNDED_RETRY_POLICY,
|
|
122
|
+
clock: deps.clock ?? bounded_retry_1.SYSTEM_CLOCK,
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
function onceClose(close) {
|
|
126
|
+
let closing = null;
|
|
127
|
+
return () => (closing ??= close());
|
|
128
|
+
}
|
|
129
|
+
async function connectTemporalWorker(options, deps = {}) {
|
|
130
|
+
const { tls, tokens, retry, clock } = await prepare(options, deps);
|
|
131
|
+
let connection;
|
|
132
|
+
try {
|
|
133
|
+
connection = await (0, bounded_retry_1.withBoundedRetry)(`Connecting a Temporal worker to ${options.address}`, () => worker_1.NativeConnection.connect({ address: options.address, tls, apiKey: tokens.token() }), retry, clock, (attempt, error, delay) => deps.logger?.warn(`Temporal worker connection to ${options.address}: attempt ${attempt} failed ` +
|
|
134
|
+
`(${error instanceof Error ? error.message : String(error)}); retrying in ${delay}ms.`));
|
|
42
135
|
}
|
|
43
|
-
|
|
44
|
-
|
|
136
|
+
catch (error) {
|
|
137
|
+
tokens.stop();
|
|
138
|
+
throw error;
|
|
45
139
|
}
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
140
|
+
await tokens.subscribe((token) => connection.setApiKey(token.value));
|
|
141
|
+
return {
|
|
142
|
+
connection,
|
|
143
|
+
tokens,
|
|
144
|
+
close: onceClose(async () => {
|
|
145
|
+
tokens.stop();
|
|
146
|
+
await connection.close();
|
|
147
|
+
}),
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
async function connectTemporalClient(options, deps = {}) {
|
|
151
|
+
const { tls, tokens, retry, clock } = await prepare(options, deps);
|
|
152
|
+
let connection;
|
|
153
|
+
try {
|
|
154
|
+
connection = await (0, bounded_retry_1.withBoundedRetry)(`Connecting a Temporal client to ${options.address}`, () => client_1.Connection.connect({
|
|
155
|
+
address: options.address,
|
|
156
|
+
tls,
|
|
157
|
+
apiKey: () => tokens.token(),
|
|
158
|
+
}), retry, clock, (attempt, error, delay) => deps.logger?.warn(`Temporal client connection to ${options.address}: attempt ${attempt} failed ` +
|
|
159
|
+
`(${error instanceof Error ? error.message : String(error)}); retrying in ${delay}ms.`));
|
|
160
|
+
}
|
|
161
|
+
catch (error) {
|
|
162
|
+
tokens.stop();
|
|
163
|
+
throw error;
|
|
51
164
|
}
|
|
52
|
-
const serverName = process.env.TEMPORAL_TLS_SERVER_NAME?.trim();
|
|
53
165
|
return {
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
},
|
|
166
|
+
connection,
|
|
167
|
+
tokens,
|
|
168
|
+
close: onceClose(async () => {
|
|
169
|
+
tokens.stop();
|
|
170
|
+
await connection.close();
|
|
171
|
+
}),
|
|
60
172
|
};
|
|
61
173
|
}
|
|
62
174
|
//# sourceMappingURL=connection.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"connection.js","sourceRoot":"","sources":["../../src/lib/connection.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"connection.js","sourceRoot":"","sources":["../../src/lib/connection.ts"],"names":[],"mappings":";;;AAgIA,4EASC;AASD,4EAwBC;AAGD,8EAeC;AA8DD,sDAiCC;AAOD,sDAmCC;AArUD,+CAA4C;AAE5C,+CAAgE;AAChE,+CAAsD;AAGtD,mDAMyB;AACzB,uFAK2C;AAE3C,2EAGqC;AAoExB,QAAA,uBAAuB,GAAG;IACrC,OAAO,EAAE,kBAAkB;IAC3B,SAAS,EAAE,sBAAsB;IACjC,aAAa,EAAE,0BAA0B;IACzC,iBAAiB,EAAE,+BAA+B;IAClD,gBAAgB,EAAE,8BAA8B;IAChD,aAAa,EAAE,8BAA8B;IAC7C,QAAQ,EAAE,yBAAyB;IACnC,gBAAgB,EAAE,kCAAkC;IACpD,QAAQ,EAAE,wBAAwB;CAC1B,CAAC;AAGX,MAAM,sBAAsB,GAAG,CAAC,sBAAsB,CAAU,CAAC;AAEjE,SAAS,QAAQ,CAAC,GAAsB,EAAE,IAAY;IACpD,MAAM,KAAK,GAAG,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC;IAChC,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,IAAI,KAAK,CACb,GAAG,IAAI,kEAAkE;YACvE,0EAA0E;YAC1E,gDAAgD,CACnD,CAAC;IACJ,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,QAAQ,CAAC,GAAsB,EAAE,IAAY;IACpD,MAAM,KAAK,GAAG,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC;IAChC,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;AACnC,CAAC;AAOD,SAAgB,gCAAgC,CAAC,GAAsB;IACrE,MAAM,OAAO,GAA6B;QACxC,aAAa,EAAE,QAAQ,CAAC,GAAG,EAAE,+BAAuB,CAAC,aAAa,CAAC;QACnE,QAAQ,EAAE,QAAQ,CAAC,GAAG,EAAE,+BAAuB,CAAC,QAAQ,CAAC;QACzD,gBAAgB,EAAE,QAAQ,CAAC,GAAG,EAAE,+BAAuB,CAAC,gBAAgB,CAAC;QACzE,QAAQ,EAAE,QAAQ,CAAC,GAAG,EAAE,+BAAuB,CAAC,QAAQ,CAAC;KAC1D,CAAC;IACF,IAAA,kEAAgC,EAAC,OAAO,CAAC,CAAC;IAC1C,OAAO,OAAO,CAAC;AACjB,CAAC;AASD,SAAgB,gCAAgC,CAAC,GAAsB;IACrE,KAAK,MAAM,OAAO,IAAI,sBAAsB,EAAE,CAAC;QAC7C,IAAI,GAAG,CAAC,OAAO,CAAC,KAAK,SAAS,EAAE,CAAC;YAC/B,MAAM,IAAI,KAAK,CACb,GAAG,OAAO,qEAAqE;gBAC7E,mDAAmD,OAAO,uBAAuB,CACpF,CAAC;QACJ,CAAC;IACH,CAAC;IACD,MAAM,cAAc,GAAG,QAAQ,CAAC,GAAG,EAAE,+BAAuB,CAAC,iBAAiB,CAAC,CAAC;IAChF,MAAM,aAAa,GAAG,QAAQ,CAAC,GAAG,EAAE,+BAAuB,CAAC,gBAAgB,CAAC,CAAC;IAC9E,MAAM,UAAU,GAAG,QAAQ,CAAC,GAAG,EAAE,+BAAuB,CAAC,aAAa,CAAC,CAAC;IACxE,MAAM,OAAO,GAA8B;QACzC,OAAO,EAAE,QAAQ,CAAC,GAAG,EAAE,+BAAuB,CAAC,OAAO,CAAC;QACvD,GAAG,EAAE;YACH,YAAY,EAAE,QAAQ,CAAC,GAAG,EAAE,+BAAuB,CAAC,SAAS,CAAC;YAC9D,GAAG,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACnD,GAAG,CAAC,cAAc,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC3D,GAAG,CAAC,aAAa,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC1D;QACD,WAAW,EAAE,gCAAgC,CAAC,GAAG,CAAC;KACnD,CAAC;IACF,iCAAiC,CAAC,OAAO,CAAC,CAAC;IAC3C,OAAO,OAAO,CAAC;AACjB,CAAC;AAGD,SAAgB,iCAAiC,CAAC,OAAkC;IAClF,IAAI,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxC,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC;IAC/D,CAAC;IACD,IAAI,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACjD,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAC;IACxE,CAAC;IACD,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,KAAK,SAAS,CAAC;IACzD,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,aAAa,KAAK,SAAS,CAAC;IACvD,IAAI,OAAO,KAAK,MAAM,EAAE,CAAC;QACvB,MAAM,IAAI,KAAK,CACb,iGAAiG,CAClG,CAAC;IACJ,CAAC;IACD,IAAA,kEAAgC,EAAC,OAAO,CAAC,WAAW,CAAC,CAAC;AACxD,CAAC;AAED,KAAK,UAAU,UAAU,CACvB,GAAuB,EACvB,IAAuC;IAGvC,MAAM,uBAAuB,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;IAC7D,IAAI,uBAAuB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzC,MAAM,IAAI,KAAK,CAAC,2BAA2B,GAAG,CAAC,YAAY,YAAY,CAAC,CAAC;IAC3E,CAAC;IACD,MAAM,MAAM,GAAc,EAAE,uBAAuB,EAAE,CAAC;IACtD,IAAI,GAAG,CAAC,UAAU,KAAK,SAAS;QAAE,MAAM,CAAC,kBAAkB,GAAG,GAAG,CAAC,UAAU,CAAC;IAC7E,IAAI,GAAG,CAAC,cAAc,KAAK,SAAS,IAAI,GAAG,CAAC,aAAa,KAAK,SAAS,EAAE,CAAC;QACxE,MAAM,CAAC,cAAc,GAAG;YACtB,GAAG,EAAE,MAAM,IAAI,CAAC,GAAG,CAAC,cAAc,CAAC;YACnC,GAAG,EAAE,MAAM,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC;SACnC,CAAC;IACJ,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,KAAK,UAAU,WAAW,CACxB,OAAkC,EAClC,IAA4B;IAE5B,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,IAAI,IAAA,oEAAkC,EAAC,OAAO,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;IACjG,OAAO,mDAAuB,CAAC,KAAK,CAAC;QACnC,MAAM;QACN,WAAW,EAAE,UAAU,OAAO,CAAC,WAAW,CAAC,QAAQ,EAAE;QACrD,YAAY,EAAE,OAAO,CAAC,YAAY,IAAI,4CAA4B;QAClE,GAAG,CAAC,IAAI,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7D,GAAG,CAAC,IAAI,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC1D,GAAG,CAAC,IAAI,CAAC,mBAAmB,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,mBAAmB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACzF,CAAC,CAAC;AACL,CAAC;AAED,KAAK,UAAU,OAAO,CACpB,OAAkC,EAClC,IAA4B;IAE5B,iCAAiC,CAAC,OAAO,CAAC,CAAC;IAC3C,MAAM,GAAG,GAAG,MAAM,UAAU,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,QAAQ,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAA,mBAAQ,EAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACvF,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IAChD,OAAO;QACL,GAAG;QACH,MAAM;QACN,KAAK,EAAE,OAAO,CAAC,YAAY,IAAI,4CAA4B;QAC3D,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,4BAAY;KAClC,CAAC;AACJ,CAAC;AAED,SAAS,SAAS,CAAC,KAA0B;IAC3C,IAAI,OAAO,GAAyB,IAAI,CAAC;IACzC,OAAO,GAAG,EAAE,CAAC,CAAC,OAAO,KAAK,KAAK,EAAE,CAAC,CAAC;AACrC,CAAC;AAOM,KAAK,UAAU,qBAAqB,CACzC,OAAkC,EAClC,OAA+B,EAAE;IAEjC,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,MAAM,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IACnE,IAAI,UAA4B,CAAC;IACjC,IAAI,CAAC;QACH,UAAU,GAAG,MAAM,IAAA,gCAAgB,EACjC,mCAAmC,OAAO,CAAC,OAAO,EAAE,EACpD,GAAG,EAAE,CAAC,yBAAgB,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,KAAK,EAAE,EAAE,CAAC,EACzF,KAAK,EACL,KAAK,EACL,CAAC,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,CACxB,IAAI,CAAC,MAAM,EAAE,IAAI,CACf,iCAAiC,OAAO,CAAC,OAAO,aAAa,OAAO,UAAU;YAC5E,IAAI,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,kBAAkB,KAAK,KAAK,CACzF,CACJ,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,CAAC,IAAI,EAAE,CAAC;QACd,MAAM,KAAK,CAAC;IACd,CAAC;IAGD,MAAM,MAAM,CAAC,SAAS,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;IACrE,OAAO;QACL,UAAU;QACV,MAAM;QACN,KAAK,EAAE,SAAS,CAAC,KAAK,IAAI,EAAE;YAC1B,MAAM,CAAC,IAAI,EAAE,CAAC;YACd,MAAM,UAAU,CAAC,KAAK,EAAE,CAAC;QAC3B,CAAC,CAAC;KACH,CAAC;AACJ,CAAC;AAOM,KAAK,UAAU,qBAAqB,CACzC,OAAkC,EAClC,OAA+B,EAAE;IAEjC,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,MAAM,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IACnE,IAAI,UAAsB,CAAC;IAC3B,IAAI,CAAC;QACH,UAAU,GAAG,MAAM,IAAA,gCAAgB,EACjC,mCAAmC,OAAO,CAAC,OAAO,EAAE,EACpD,GAAG,EAAE,CACH,mBAAU,CAAC,OAAO,CAAC;YACjB,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,GAAG;YACH,MAAM,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,KAAK,EAAE;SAC7B,CAAC,EACJ,KAAK,EACL,KAAK,EACL,CAAC,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,CACxB,IAAI,CAAC,MAAM,EAAE,IAAI,CACf,iCAAiC,OAAO,CAAC,OAAO,aAAa,OAAO,UAAU;YAC5E,IAAI,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,kBAAkB,KAAK,KAAK,CACzF,CACJ,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,CAAC,IAAI,EAAE,CAAC;QACd,MAAM,KAAK,CAAC;IACd,CAAC;IACD,OAAO;QACL,UAAU;QACV,MAAM;QACN,KAAK,EAAE,SAAS,CAAC,KAAK,IAAI,EAAE;YAC1B,MAAM,CAAC,IAAI,EAAE,CAAC;YACd,MAAM,UAAU,CAAC,KAAK,EAAE,CAAC;QAC3B,CAAC,CAAC;KACH,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import type { AccessTokenSource } from './access-token';
|
|
2
|
+
import type { RetryClock } from './bounded-retry';
|
|
3
|
+
import type { TemporalEnvReader } from './namespace';
|
|
4
|
+
import { ProactiveTokenRefresher, type AccessTokenListener, type TokenRefresherLogger } from './proactive-token-refresher';
|
|
5
|
+
export declare const CONTROLLER_TOKEN_PUBLISHER_ENV: {
|
|
6
|
+
readonly secretName: "XEMA_TEMPORAL_CONTROLLER_TOKEN_SECRET";
|
|
7
|
+
readonly secretKey: "XEMA_TEMPORAL_CONTROLLER_TOKEN_KEY";
|
|
8
|
+
readonly apiHost: "KUBERNETES_SERVICE_HOST";
|
|
9
|
+
readonly apiPort: "KUBERNETES_SERVICE_PORT";
|
|
10
|
+
};
|
|
11
|
+
export declare const IN_CLUSTER_SERVICE_ACCOUNT_DIR = "/var/run/secrets/kubernetes.io/serviceaccount";
|
|
12
|
+
export interface KubernetesSecretTarget {
|
|
13
|
+
readonly apiServer: string;
|
|
14
|
+
readonly namespace: string;
|
|
15
|
+
readonly secretName: string;
|
|
16
|
+
readonly secretKey: string;
|
|
17
|
+
readonly serviceAccountTokenFile: string;
|
|
18
|
+
readonly caFile: string;
|
|
19
|
+
}
|
|
20
|
+
export type SecretPatchRequest = (input: {
|
|
21
|
+
readonly url: string;
|
|
22
|
+
readonly ca: string;
|
|
23
|
+
readonly bearer: string;
|
|
24
|
+
readonly body: string;
|
|
25
|
+
}) => Promise<{
|
|
26
|
+
readonly status: number;
|
|
27
|
+
readonly body: string;
|
|
28
|
+
}>;
|
|
29
|
+
export interface KubernetesSecretSinkDeps {
|
|
30
|
+
readonly readFile?: (path: string) => Promise<string>;
|
|
31
|
+
readonly request?: SecretPatchRequest;
|
|
32
|
+
}
|
|
33
|
+
export declare class ControllerTokenSinkError extends Error {
|
|
34
|
+
constructor(message: string);
|
|
35
|
+
}
|
|
36
|
+
export declare function kubernetesSecretTokenSink(target: KubernetesSecretTarget, deps?: KubernetesSecretSinkDeps): AccessTokenListener;
|
|
37
|
+
export interface ControllerTokenPublisherOptions {
|
|
38
|
+
readonly source: AccessTokenSource;
|
|
39
|
+
readonly clientId: string;
|
|
40
|
+
readonly target: KubernetesSecretTarget;
|
|
41
|
+
}
|
|
42
|
+
export declare function controllerTokenPublisherOptionsFromEnv(env: TemporalEnvReader, deps?: {
|
|
43
|
+
readonly readFile?: (path: string) => Promise<string>;
|
|
44
|
+
readonly serviceAccountDir?: string;
|
|
45
|
+
}): Promise<ControllerTokenPublisherOptions>;
|
|
46
|
+
export declare function startControllerTokenPublisher(options: ControllerTokenPublisherOptions, deps?: KubernetesSecretSinkDeps & {
|
|
47
|
+
readonly logger?: TokenRefresherLogger;
|
|
48
|
+
readonly onFatal?: (error: Error) => void;
|
|
49
|
+
readonly clock?: RetryClock;
|
|
50
|
+
}): Promise<ProactiveTokenRefresher>;
|
|
51
|
+
//# sourceMappingURL=controller-token-publisher.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"controller-token-publisher.d.ts","sourceRoot":"","sources":["../../src/lib/controller-token-publisher.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAe,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACrE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAGlD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,EACL,uBAAuB,EACvB,KAAK,mBAAmB,EACxB,KAAK,oBAAoB,EAC1B,MAAM,6BAA6B,CAAC;AAwBrC,eAAO,MAAM,8BAA8B;;;;;CAKjC,CAAC;AAGX,eAAO,MAAM,8BAA8B,kDAAkD,CAAC;AAG9F,MAAM,WAAW,sBAAsB;IAErC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAE3B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAE3B,QAAQ,CAAC,uBAAuB,EAAE,MAAM,CAAC;IAEzC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAGD,MAAM,MAAM,kBAAkB,GAAG,CAAC,KAAK,EAAE;IACvC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB,KAAK,OAAO,CAAC;IAAE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC;AAElE,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IACtD,QAAQ,CAAC,OAAO,CAAC,EAAE,kBAAkB,CAAC;CACvC;AAOD,qBAAa,wBAAyB,SAAQ,KAAK;gBACrC,OAAO,EAAE,MAAM;CAI5B;AAoCD,wBAAgB,yBAAyB,CACvC,MAAM,EAAE,sBAAsB,EAC9B,IAAI,GAAE,wBAA6B,GAClC,mBAAmB,CAyBrB;AAED,MAAM,WAAW,+BAA+B;IAC9C,QAAQ,CAAC,MAAM,EAAE,iBAAiB,CAAC;IAEnC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,sBAAsB,CAAC;CACzC;AASD,wBAAsB,sCAAsC,CAC1D,GAAG,EAAE,iBAAiB,EACtB,IAAI,GAAE;IAAE,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IAAC,QAAQ,CAAC,iBAAiB,CAAC,EAAE,MAAM,CAAA;CAAO,GACxG,OAAO,CAAC,+BAA+B,CAAC,CAwB1C;AASD,wBAAsB,6BAA6B,CACjD,OAAO,EAAE,+BAA+B,EACxC,IAAI,GAAE,wBAAwB,GAAG;IAC/B,QAAQ,CAAC,MAAM,CAAC,EAAE,oBAAoB,CAAC;IACvC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IAC1C,QAAQ,CAAC,KAAK,CAAC,EAAE,UAAU,CAAC;CACxB,GACL,OAAO,CAAC,uBAAuB,CAAC,CAelC"}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ControllerTokenSinkError = exports.IN_CLUSTER_SERVICE_ACCOUNT_DIR = exports.CONTROLLER_TOKEN_PUBLISHER_ENV = void 0;
|
|
4
|
+
exports.kubernetesSecretTokenSink = kubernetesSecretTokenSink;
|
|
5
|
+
exports.controllerTokenPublisherOptionsFromEnv = controllerTokenPublisherOptionsFromEnv;
|
|
6
|
+
exports.startControllerTokenPublisher = startControllerTokenPublisher;
|
|
7
|
+
const promises_1 = require("node:fs/promises");
|
|
8
|
+
const node_https_1 = require("node:https");
|
|
9
|
+
const client_credentials_token_source_1 = require("./client-credentials-token-source");
|
|
10
|
+
const connection_1 = require("./connection");
|
|
11
|
+
const proactive_token_refresher_1 = require("./proactive-token-refresher");
|
|
12
|
+
exports.CONTROLLER_TOKEN_PUBLISHER_ENV = {
|
|
13
|
+
secretName: 'XEMA_TEMPORAL_CONTROLLER_TOKEN_SECRET',
|
|
14
|
+
secretKey: 'XEMA_TEMPORAL_CONTROLLER_TOKEN_KEY',
|
|
15
|
+
apiHost: 'KUBERNETES_SERVICE_HOST',
|
|
16
|
+
apiPort: 'KUBERNETES_SERVICE_PORT',
|
|
17
|
+
};
|
|
18
|
+
exports.IN_CLUSTER_SERVICE_ACCOUNT_DIR = '/var/run/secrets/kubernetes.io/serviceaccount';
|
|
19
|
+
const SECRET_NAME = /^[a-z0-9]([-a-z0-9.]{0,251}[a-z0-9])?$/;
|
|
20
|
+
const SECRET_KEY = /^[-._a-zA-Z0-9]{1,253}$/;
|
|
21
|
+
const REQUEST_TIMEOUT_MS = 10_000;
|
|
22
|
+
class ControllerTokenSinkError extends Error {
|
|
23
|
+
constructor(message) {
|
|
24
|
+
super(message);
|
|
25
|
+
this.name = 'ControllerTokenSinkError';
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
exports.ControllerTokenSinkError = ControllerTokenSinkError;
|
|
29
|
+
const defaultRequest = ({ url, ca, bearer, body }) => new Promise((resolve, reject) => {
|
|
30
|
+
const req = (0, node_https_1.request)(url, {
|
|
31
|
+
method: 'PATCH',
|
|
32
|
+
ca,
|
|
33
|
+
timeout: REQUEST_TIMEOUT_MS,
|
|
34
|
+
headers: {
|
|
35
|
+
authorization: `Bearer ${bearer}`,
|
|
36
|
+
'content-type': 'application/merge-patch+json',
|
|
37
|
+
accept: 'application/json',
|
|
38
|
+
'content-length': Buffer.byteLength(body),
|
|
39
|
+
},
|
|
40
|
+
}, (res) => {
|
|
41
|
+
const chunks = [];
|
|
42
|
+
res.on('data', (chunk) => chunks.push(chunk));
|
|
43
|
+
res.on('end', () => resolve({ status: res.statusCode ?? 0, body: Buffer.concat(chunks).toString('utf8') }));
|
|
44
|
+
res.on('error', reject);
|
|
45
|
+
});
|
|
46
|
+
req.on('timeout', () => req.destroy(new Error(`PATCH ${url} timed out after ${REQUEST_TIMEOUT_MS}ms`)));
|
|
47
|
+
req.on('error', reject);
|
|
48
|
+
req.end(body);
|
|
49
|
+
});
|
|
50
|
+
function kubernetesSecretTokenSink(target, deps = {}) {
|
|
51
|
+
if (!SECRET_NAME.test(target.secretName)) {
|
|
52
|
+
throw new ControllerTokenSinkError(`secret name ${JSON.stringify(target.secretName)} is not a Kubernetes object name.`);
|
|
53
|
+
}
|
|
54
|
+
if (!SECRET_KEY.test(target.secretKey)) {
|
|
55
|
+
throw new ControllerTokenSinkError(`secret key ${JSON.stringify(target.secretKey)} is not a valid Secret data key.`);
|
|
56
|
+
}
|
|
57
|
+
if (!SECRET_NAME.test(target.namespace)) {
|
|
58
|
+
throw new ControllerTokenSinkError(`namespace ${JSON.stringify(target.namespace)} is not a Kubernetes namespace name.`);
|
|
59
|
+
}
|
|
60
|
+
const read = deps.readFile ?? ((path) => (0, promises_1.readFile)(path, 'utf8'));
|
|
61
|
+
const send = deps.request ?? defaultRequest;
|
|
62
|
+
const url = `${target.apiServer}/api/v1/namespaces/${encodeURIComponent(target.namespace)}` +
|
|
63
|
+
`/secrets/${encodeURIComponent(target.secretName)}`;
|
|
64
|
+
return async (token) => {
|
|
65
|
+
const [bearer, ca] = await Promise.all([read(target.serviceAccountTokenFile), read(target.caFile)]);
|
|
66
|
+
const body = JSON.stringify({ data: { [target.secretKey]: Buffer.from(token.value, 'utf8').toString('base64') } });
|
|
67
|
+
const response = await send({ url, ca, bearer: bearer.trim(), body });
|
|
68
|
+
if (response.status < 200 || response.status >= 300) {
|
|
69
|
+
throw new ControllerTokenSinkError(`PATCH ${target.namespace}/${target.secretName} answered ${response.status}: ${response.body.slice(0, 300)}`);
|
|
70
|
+
}
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
async function controllerTokenPublisherOptionsFromEnv(env, deps = {}) {
|
|
74
|
+
const credentials = (0, connection_1.temporalClientCredentialsFromEnv)(env);
|
|
75
|
+
const required = (name) => {
|
|
76
|
+
const value = env(name)?.trim();
|
|
77
|
+
if (!value)
|
|
78
|
+
throw new ControllerTokenSinkError(`${name} is required by the Worker Controller token publisher.`);
|
|
79
|
+
return value;
|
|
80
|
+
};
|
|
81
|
+
const dir = deps.serviceAccountDir ?? exports.IN_CLUSTER_SERVICE_ACCOUNT_DIR;
|
|
82
|
+
const read = deps.readFile ?? ((path) => (0, promises_1.readFile)(path, 'utf8'));
|
|
83
|
+
const host = required(exports.CONTROLLER_TOKEN_PUBLISHER_ENV.apiHost);
|
|
84
|
+
const port = required(exports.CONTROLLER_TOKEN_PUBLISHER_ENV.apiPort);
|
|
85
|
+
const namespace = (await read(`${dir}/namespace`)).trim();
|
|
86
|
+
return {
|
|
87
|
+
source: (0, client_credentials_token_source_1.createClientCredentialsTokenSource)(credentials),
|
|
88
|
+
clientId: credentials.clientId,
|
|
89
|
+
target: {
|
|
90
|
+
apiServer: `https://${host.includes(':') ? `[${host}]` : host}:${port}`,
|
|
91
|
+
namespace,
|
|
92
|
+
secretName: required(exports.CONTROLLER_TOKEN_PUBLISHER_ENV.secretName),
|
|
93
|
+
secretKey: required(exports.CONTROLLER_TOKEN_PUBLISHER_ENV.secretKey),
|
|
94
|
+
serviceAccountTokenFile: `${dir}/token`,
|
|
95
|
+
caFile: `${dir}/ca.crt`,
|
|
96
|
+
},
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
async function startControllerTokenPublisher(options, deps = {}) {
|
|
100
|
+
const refresher = await proactive_token_refresher_1.ProactiveTokenRefresher.start({
|
|
101
|
+
source: options.source,
|
|
102
|
+
description: `${options.clientId} (Worker Controller credential → ${options.target.namespace}/${options.target.secretName})`,
|
|
103
|
+
...(deps.logger ? { logger: deps.logger } : {}),
|
|
104
|
+
...(deps.onFatal ? { onFatal: deps.onFatal } : {}),
|
|
105
|
+
...(deps.clock ? { clock: deps.clock } : {}),
|
|
106
|
+
});
|
|
107
|
+
try {
|
|
108
|
+
await refresher.subscribe(kubernetesSecretTokenSink(options.target, deps));
|
|
109
|
+
}
|
|
110
|
+
catch (error) {
|
|
111
|
+
refresher.stop();
|
|
112
|
+
throw error;
|
|
113
|
+
}
|
|
114
|
+
return refresher;
|
|
115
|
+
}
|
|
116
|
+
//# sourceMappingURL=controller-token-publisher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"controller-token-publisher.js","sourceRoot":"","sources":["../../src/lib/controller-token-publisher.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fairness-constants.d.ts","sourceRoot":"","sources":["../../src/lib/fairness-constants.ts"],"names":[],"mappings":"AASA,eAAO,MAAM,wBAAwB,6BAA6B,CAAC;AAOnE,eAAO,MAAM,2BAA2B,gCAAgC,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ORG_FAIRNESS_KEY_OVERRIDDEN = exports.ORG_FAIRNESS_KEY_MISSING = void 0;
|
|
4
|
+
exports.ORG_FAIRNESS_KEY_MISSING = 'ORG_FAIRNESS_KEY_MISSING';
|
|
5
|
+
exports.ORG_FAIRNESS_KEY_OVERRIDDEN = 'ORG_FAIRNESS_KEY_OVERRIDDEN';
|
|
6
|
+
//# sourceMappingURL=fairness-constants.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fairness-constants.js","sourceRoot":"","sources":["../../src/lib/fairness-constants.ts"],"names":[],"mappings":";;;AASa,QAAA,wBAAwB,GAAG,0BAA0B,CAAC;AAOtD,QAAA,2BAA2B,GAAG,6BAA6B,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { type Priority, type Workflow } from '@temporalio/common';
|
|
2
|
+
import type { Client, WorkflowHandleWithFirstExecutionRunId, WorkflowStartOptions } from '@temporalio/client';
|
|
3
|
+
import type { ActivityInterceptorsFactory } from '@temporalio/worker';
|
|
4
|
+
export { ORG_FAIRNESS_KEY_MISSING, ORG_FAIRNESS_KEY_OVERRIDDEN, } from './fairness-constants';
|
|
5
|
+
export declare const FAIRNESS_KEY_MAX_BYTES = 64;
|
|
6
|
+
export declare function orgFairnessKey(orgId: string): string;
|
|
7
|
+
export type OrgWorkflowStartOptions<T extends Workflow> = Omit<WorkflowStartOptions<T>, 'searchAttributes' | 'typedSearchAttributes'> & {
|
|
8
|
+
readonly orgId: string;
|
|
9
|
+
readonly priority?: Omit<Priority, 'fairnessKey'>;
|
|
10
|
+
};
|
|
11
|
+
export declare function startWorkflowForOrg<T extends Workflow>(client: Pick<Client, 'workflow'>, workflowTypeOrFunc: string | T, options: OrgWorkflowStartOptions<T>): Promise<WorkflowHandleWithFirstExecutionRunId<T>>;
|
|
12
|
+
export declare const orgFairnessActivityInterceptor: ActivityInterceptorsFactory;
|
|
13
|
+
//# sourceMappingURL=fairness.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fairness.d.ts","sourceRoot":"","sources":["../../src/lib/fairness.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,QAAQ,EACb,KAAK,QAAQ,EACd,MAAM,oBAAoB,CAAC;AAK5B,OAAO,KAAK,EACV,MAAM,EACN,qCAAqC,EACrC,oBAAoB,EACrB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,KAAK,EAEV,2BAA2B,EAC5B,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EACL,wBAAwB,EACxB,2BAA2B,GAC5B,MAAM,sBAAsB,CAAC;AAM9B,eAAO,MAAM,sBAAsB,KAAK,CAAC;AAQzC,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAmBpD;AAOD,MAAM,MAAM,uBAAuB,CAAC,CAAC,SAAS,QAAQ,IACpD,IAAI,CAAC,oBAAoB,CAAC,CAAC,CAAC,EAAE,kBAAkB,GAAG,uBAAuB,CAAC,GAAG;IAE5E,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,QAAQ,CAAC,EAAE,IAAI,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;CACnD,CAAC;AAcJ,wBAAsB,mBAAmB,CAAC,CAAC,SAAS,QAAQ,EAC1D,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,UAAU,CAAC,EAChC,kBAAkB,EAAE,MAAM,GAAG,CAAC,EAC9B,OAAO,EAAE,uBAAuB,CAAC,CAAC,CAAC,GAClC,OAAO,CAAC,qCAAqC,CAAC,CAAC,CAAC,CAAC,CAenD;AAOD,eAAO,MAAM,8BAA8B,EAAE,2BAkB5C,CAAC"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.orgFairnessActivityInterceptor = exports.FAIRNESS_KEY_MAX_BYTES = exports.ORG_FAIRNESS_KEY_OVERRIDDEN = exports.ORG_FAIRNESS_KEY_MISSING = void 0;
|
|
4
|
+
exports.orgFairnessKey = orgFairnessKey;
|
|
5
|
+
exports.startWorkflowForOrg = startWorkflowForOrg;
|
|
6
|
+
const common_1 = require("@temporalio/common");
|
|
7
|
+
const fairness_constants_1 = require("./fairness-constants");
|
|
8
|
+
const search_attribute_constants_1 = require("./search-attribute-constants");
|
|
9
|
+
var fairness_constants_2 = require("./fairness-constants");
|
|
10
|
+
Object.defineProperty(exports, "ORG_FAIRNESS_KEY_MISSING", { enumerable: true, get: function () { return fairness_constants_2.ORG_FAIRNESS_KEY_MISSING; } });
|
|
11
|
+
Object.defineProperty(exports, "ORG_FAIRNESS_KEY_OVERRIDDEN", { enumerable: true, get: function () { return fairness_constants_2.ORG_FAIRNESS_KEY_OVERRIDDEN; } });
|
|
12
|
+
exports.FAIRNESS_KEY_MAX_BYTES = 64;
|
|
13
|
+
function orgFairnessKey(orgId) {
|
|
14
|
+
if (typeof orgId !== 'string' ||
|
|
15
|
+
orgId.length === 0 ||
|
|
16
|
+
orgId.trim() !== orgId) {
|
|
17
|
+
throw new Error(`orgFairnessKey: org id must be a non-empty string without surrounding ` +
|
|
18
|
+
`whitespace; got ${JSON.stringify(orgId)}.`);
|
|
19
|
+
}
|
|
20
|
+
const bytes = Buffer.byteLength(orgId, 'utf8');
|
|
21
|
+
if (bytes > exports.FAIRNESS_KEY_MAX_BYTES) {
|
|
22
|
+
throw new Error(`orgFairnessKey: org id ${JSON.stringify(orgId)} is ${bytes} bytes; ` +
|
|
23
|
+
`Temporal caps a fairness key at ${exports.FAIRNESS_KEY_MAX_BYTES}.`);
|
|
24
|
+
}
|
|
25
|
+
return orgId;
|
|
26
|
+
}
|
|
27
|
+
async function startWorkflowForOrg(client, workflowTypeOrFunc, options) {
|
|
28
|
+
const { orgId, priority, ...rest } = options;
|
|
29
|
+
const supplied = priority;
|
|
30
|
+
if (supplied?.fairnessKey !== undefined) {
|
|
31
|
+
throw new Error('startWorkflowForOrg: priority.fairnessKey is derived from orgId and may ' +
|
|
32
|
+
'not be supplied.');
|
|
33
|
+
}
|
|
34
|
+
const fairnessKey = orgFairnessKey(orgId);
|
|
35
|
+
return client.workflow.start(workflowTypeOrFunc, {
|
|
36
|
+
...rest,
|
|
37
|
+
priority: { ...supplied, fairnessKey },
|
|
38
|
+
searchAttributes: { [search_attribute_constants_1.SEARCH_ATTR_ORG_ID]: [fairnessKey] },
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
const orgFairnessActivityInterceptor = (ctx) => {
|
|
42
|
+
const inbound = {
|
|
43
|
+
async execute(input, next) {
|
|
44
|
+
const key = ctx.info.priority?.fairnessKey;
|
|
45
|
+
if (key === undefined || key.length === 0) {
|
|
46
|
+
throw common_1.ApplicationFailure.nonRetryable(`Activity ${ctx.info.activityType} arrived on org-fair task queue ` +
|
|
47
|
+
`${ctx.info.taskQueue} with no fairness key. Start the workflow ` +
|
|
48
|
+
'with startWorkflowForOrg, or the standalone activity with an orgId.', fairness_constants_1.ORG_FAIRNESS_KEY_MISSING);
|
|
49
|
+
}
|
|
50
|
+
return next(input);
|
|
51
|
+
},
|
|
52
|
+
};
|
|
53
|
+
return { inbound };
|
|
54
|
+
};
|
|
55
|
+
exports.orgFairnessActivityInterceptor = orgFairnessActivityInterceptor;
|
|
56
|
+
//# sourceMappingURL=fairness.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fairness.js","sourceRoot":"","sources":["../../src/lib/fairness.ts"],"names":[],"mappings":";;;AAoCA,wCAmBC;AA0BD,kDAmBC;AApGD,+CAI4B;AAE5B,6DAAgE;AAChE,6EAAkE;AAYlE,2DAG8B;AAF5B,8HAAA,wBAAwB,OAAA;AACxB,iIAAA,2BAA2B,OAAA;AAOhB,QAAA,sBAAsB,GAAG,EAAE,CAAC;AAQzC,SAAgB,cAAc,CAAC,KAAa;IAC1C,IACE,OAAO,KAAK,KAAK,QAAQ;QACzB,KAAK,CAAC,MAAM,KAAK,CAAC;QAClB,KAAK,CAAC,IAAI,EAAE,KAAK,KAAK,EACtB,CAAC;QACD,MAAM,IAAI,KAAK,CACb,wEAAwE;YACtE,mBAAmB,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,CAC9C,CAAC;IACJ,CAAC;IACD,MAAM,KAAK,GAAG,MAAM,CAAC,UAAU,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IAC/C,IAAI,KAAK,GAAG,8BAAsB,EAAE,CAAC;QACnC,MAAM,IAAI,KAAK,CACb,0BAA0B,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,OAAO,KAAK,UAAU;YACnE,mCAAmC,8BAAsB,GAAG,CAC/D,CAAC;IACJ,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AA0BM,KAAK,UAAU,mBAAmB,CACvC,MAAgC,EAChC,kBAA8B,EAC9B,OAAmC;IAEnC,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,IAAI,EAAE,GAAG,OAAO,CAAC;IAC7C,MAAM,QAAQ,GAAG,QAAgC,CAAC;IAClD,IAAI,QAAQ,EAAE,WAAW,KAAK,SAAS,EAAE,CAAC;QACxC,MAAM,IAAI,KAAK,CACb,0EAA0E;YACxE,kBAAkB,CACrB,CAAC;IACJ,CAAC;IACD,MAAM,WAAW,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;IAC1C,OAAO,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,kBAAkB,EAAE;QAC/C,GAAI,IAA2C;QAC/C,QAAQ,EAAE,EAAE,GAAG,QAAQ,EAAE,WAAW,EAAE;QACtC,gBAAgB,EAAE,EAAE,CAAC,+CAAkB,CAAC,EAAE,CAAC,WAAW,CAAC,EAAE;KAC1D,CAAC,CAAC;AACL,CAAC;AAOM,MAAM,8BAA8B,GAAgC,CACzE,GAAG,EACH,EAAE;IACF,MAAM,OAAO,GAAoC;QAC/C,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI;YACvB,MAAM,GAAG,GAAG,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAE,WAAW,CAAC;YAC3C,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC1C,MAAM,2BAAkB,CAAC,YAAY,CACnC,YAAY,GAAG,CAAC,IAAI,CAAC,YAAY,kCAAkC;oBACjE,GAAG,GAAG,CAAC,IAAI,CAAC,SAAS,4CAA4C;oBACjE,qEAAqE,EACvE,6CAAwB,CACzB,CAAC;YACJ,CAAC;YACD,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC;QACrB,CAAC;KACF,CAAC;IACF,OAAO,EAAE,OAAO,EAAE,CAAC;AACrB,CAAC,CAAC;AAlBW,QAAA,8BAA8B,kCAkBzC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"namespace.d.ts","sourceRoot":"","sources":["../../src/lib/namespace.ts"],"names":[],"mappings":"AAUA,MAAM,MAAM,iBAAiB,GAAG,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,CAAC;AAGrE,eAAO,MAAM,sBAAsB,uBAAuB,CAAC;AAa3D,wBAAgB,+BAA+B,CAAC,GAAG,EAAE,iBAAiB,GAAG,MAAM,CAc9E"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.TEMPORAL_NAMESPACE_ENV = void 0;
|
|
4
|
+
exports.resolveWorkflowNamespaceFromEnv = resolveWorkflowNamespaceFromEnv;
|
|
5
|
+
const deployment_1 = require("@xemahq/contracts/deployment");
|
|
6
|
+
exports.TEMPORAL_NAMESPACE_ENV = 'TEMPORAL_NAMESPACE';
|
|
7
|
+
function resolveWorkflowNamespaceFromEnv(env) {
|
|
8
|
+
const raw = env(exports.TEMPORAL_NAMESPACE_ENV);
|
|
9
|
+
if (raw === undefined || raw.trim().length === 0) {
|
|
10
|
+
throw new Error(`${exports.TEMPORAL_NAMESPACE_ENV} is required: it is this deployment's workflow ` +
|
|
11
|
+
'namespace, derived by the deployment from its own identity and rendered ' +
|
|
12
|
+
'into every process that declares TEMPORAL_ADDRESS. There is no default — ' +
|
|
13
|
+
'a shared default is what let two deployments on one server run each ' +
|
|
14
|
+
"other's workflows.");
|
|
15
|
+
}
|
|
16
|
+
return (0, deployment_1.workflowNamespaceForDeployment)((0, deployment_1.parseDeploymentId)(raw));
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=namespace.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"namespace.js","sourceRoot":"","sources":["../../src/lib/namespace.ts"],"names":[],"mappings":";;;AA0BA,0EAcC;AAxCD,6DAGsC;AAUzB,QAAA,sBAAsB,GAAG,oBAAoB,CAAC;AAa3D,SAAgB,+BAA+B,CAAC,GAAsB;IACpE,MAAM,GAAG,GAAG,GAAG,CAAC,8BAAsB,CAAC,CAAC;IACxC,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACjD,MAAM,IAAI,KAAK,CACb,GAAG,8BAAsB,iDAAiD;YACxE,0EAA0E;YAC1E,2EAA2E;YAC3E,sEAAsE;YACtE,oBAAoB,CACvB,CAAC;IACJ,CAAC;IAGD,OAAO,IAAA,2CAA8B,EAAC,IAAA,8BAAiB,EAAC,GAAG,CAAC,CAAC,CAAC;AAChE,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { type Client } from '@temporalio/client';
|
|
2
|
+
export interface EraseOrgWorkflowExecutionsOptions {
|
|
3
|
+
readonly orgId: string;
|
|
4
|
+
readonly reason: string;
|
|
5
|
+
readonly deadlineMs?: number;
|
|
6
|
+
readonly passIntervalMs?: number;
|
|
7
|
+
}
|
|
8
|
+
export interface EraseOrgWorkflowExecutionsResult {
|
|
9
|
+
readonly erased: number;
|
|
10
|
+
}
|
|
11
|
+
export declare function orgWorkflowExecutionsQuery(orgId: string): string;
|
|
12
|
+
export declare function eraseOrgWorkflowExecutions(client: Client, options: EraseOrgWorkflowExecutionsOptions): Promise<EraseOrgWorkflowExecutionsResult>;
|
|
13
|
+
//# sourceMappingURL=org-erasure.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"org-erasure.d.ts","sourceRoot":"","sources":["../../src/lib/org-erasure.ts"],"names":[],"mappings":"AAAA,OAAO,EAAyB,KAAK,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAuBxE,MAAM,WAAW,iCAAiC;IAChD,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IAEvB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IAExB,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAE7B,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;CAClC;AAED,MAAM,WAAW,gCAAgC;IAE/C,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAQD,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAUhE;AAQD,wBAAsB,0BAA0B,CAC9C,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,iCAAiC,GACzC,OAAO,CAAC,gCAAgC,CAAC,CA0C3C"}
|