@ontemper/sdk 0.7.1-postgresql.2 → 0.7.1-postgresql.4
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 +45 -1
- package/dist/As2Resource.d.ts +431 -76
- package/dist/As2Resource.d.ts.map +1 -1
- package/dist/As2Resource.js +31 -30
- package/dist/As2Resource.js.map +1 -1
- package/dist/As2Transport.d.ts.map +1 -1
- package/dist/As2Transport.js +3 -1
- package/dist/As2Transport.js.map +1 -1
- package/dist/As2Wire.d.ts +39 -0
- package/dist/As2Wire.d.ts.map +1 -1
- package/dist/DatabaseTunnelAuthorization.d.ts +11 -0
- package/dist/DatabaseTunnelAuthorization.d.ts.map +1 -0
- package/dist/DatabaseTunnelAuthorization.js +35 -0
- package/dist/DatabaseTunnelAuthorization.js.map +1 -0
- package/dist/ExpiringMap.d.ts +21 -0
- package/dist/ExpiringMap.d.ts.map +1 -0
- package/dist/ExpiringMap.js +79 -0
- package/dist/ExpiringMap.js.map +1 -0
- package/dist/HttpApiResource.d.ts +2904 -177
- package/dist/HttpApiResource.d.ts.map +1 -1
- package/dist/HttpApiResource.js +81 -59
- package/dist/HttpApiResource.js.map +1 -1
- package/dist/Kafka.d.ts +89 -0
- package/dist/Kafka.d.ts.map +1 -0
- package/dist/Kafka.js +297 -0
- package/dist/Kafka.js.map +1 -0
- package/dist/Manifest.d.ts +1 -1
- package/dist/Manifest.js +1 -1
- package/dist/PostgreSql.d.ts.map +1 -1
- package/dist/PostgreSql.js +2 -11
- package/dist/PostgreSql.js.map +1 -1
- package/dist/PostgreSqlPool.d.ts +1 -39
- package/dist/PostgreSqlPool.d.ts.map +1 -1
- package/dist/PostgreSqlPool.js +2 -22
- package/dist/PostgreSqlPool.js.map +1 -1
- package/dist/Redaction.d.ts +5 -1
- package/dist/Redaction.d.ts.map +1 -1
- package/dist/Redaction.js +28 -6
- package/dist/Redaction.js.map +1 -1
- package/dist/ResourceRecords.d.ts +1086 -0
- package/dist/ResourceRecords.d.ts.map +1 -0
- package/dist/ResourceRecords.js +303 -0
- package/dist/ResourceRecords.js.map +1 -0
- package/dist/Resources.d.ts +13 -3
- package/dist/Resources.d.ts.map +1 -1
- package/dist/Resources.js +11 -3
- package/dist/Resources.js.map +1 -1
- package/dist/ResourcesCache.d.ts +33 -0
- package/dist/ResourcesCache.d.ts.map +1 -0
- package/dist/ResourcesCache.js +205 -0
- package/dist/ResourcesCache.js.map +1 -0
- package/dist/ResourcesEnv.d.ts +81 -0
- package/dist/ResourcesEnv.d.ts.map +1 -0
- package/dist/ResourcesEnv.js +110 -0
- package/dist/ResourcesEnv.js.map +1 -0
- package/dist/ResourcesErrors.d.ts +5 -1
- package/dist/ResourcesErrors.d.ts.map +1 -1
- package/dist/ResourcesErrors.js +5 -2
- package/dist/ResourcesErrors.js.map +1 -1
- package/dist/ResourcesToken.d.ts +9 -0
- package/dist/ResourcesToken.d.ts.map +1 -1
- package/dist/ResourcesToken.js +20 -7
- package/dist/ResourcesToken.js.map +1 -1
- package/dist/RuntimeResources.d.ts +18 -3
- package/dist/RuntimeResources.d.ts.map +1 -1
- package/dist/RuntimeResources.js +53 -29
- package/dist/RuntimeResources.js.map +1 -1
- package/dist/TransportResource.d.ts +1 -32
- package/dist/TransportResource.d.ts.map +1 -1
- package/dist/TransportResource.js +1 -19
- package/dist/TransportResource.js.map +1 -1
- package/dist/Workflow.js +2 -2
- package/dist/Workflow.js.map +1 -1
- package/package.json +14 -2
package/dist/Kafka.js
ADDED
|
@@ -0,0 +1,297 @@
|
|
|
1
|
+
import { constants, createPrivateKey, createSign, randomUUID } from 'node:crypto';
|
|
2
|
+
import { Option, Redacted, Schema } from 'effect';
|
|
3
|
+
export class OptionalKafkaDependencyError extends Error {
|
|
4
|
+
constructor(packageName) {
|
|
5
|
+
super(`Kafka authentication requires the optional package ${packageName}.`);
|
|
6
|
+
this.name = 'OptionalKafkaDependencyError';
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
export class UnsupportedKafkaAuthError extends Error {
|
|
10
|
+
constructor(field) {
|
|
11
|
+
super(`Kafka record uses an unsupported ${field}. Upgrade @ontemper/sdk to support it.`);
|
|
12
|
+
this.name = 'UnsupportedKafkaAuthError';
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
// STS credentials are reused until this long before they expire.
|
|
16
|
+
const ASSUMED_ROLE_REFRESH_MARGIN_MS = 60_000;
|
|
17
|
+
const OAUTH_TOKEN_REQUEST_TIMEOUT_MS = 15_000;
|
|
18
|
+
const base64Url = (value) => Buffer.from(value).toString('base64url');
|
|
19
|
+
const formEncode = (value) => encodeURIComponent(value).replace(/%20/g, '+');
|
|
20
|
+
function privateKeyAssertion(tokenRequest, now) {
|
|
21
|
+
const clientAuthentication = tokenRequest.clientAuthentication;
|
|
22
|
+
if (clientAuthentication.type !== 'private_key_jwt') {
|
|
23
|
+
throw new UnsupportedKafkaAuthError('auth.tokenRequest.clientAuthentication');
|
|
24
|
+
}
|
|
25
|
+
const header = {
|
|
26
|
+
alg: clientAuthentication.algorithm,
|
|
27
|
+
typ: 'JWT',
|
|
28
|
+
};
|
|
29
|
+
if (clientAuthentication.keyId !== undefined) {
|
|
30
|
+
header.kid = clientAuthentication.keyId;
|
|
31
|
+
}
|
|
32
|
+
const issuedAt = Math.floor(now / 1000);
|
|
33
|
+
const claims = {
|
|
34
|
+
iss: tokenRequest.clientId,
|
|
35
|
+
sub: tokenRequest.clientId,
|
|
36
|
+
aud: tokenRequest.tokenUrl,
|
|
37
|
+
exp: issuedAt + 60,
|
|
38
|
+
iat: issuedAt,
|
|
39
|
+
jti: randomUUID(),
|
|
40
|
+
};
|
|
41
|
+
const signed = `${base64Url(JSON.stringify(header))}.${base64Url(JSON.stringify(claims))}`;
|
|
42
|
+
const signature = createSign('SHA256');
|
|
43
|
+
signature.update(signed);
|
|
44
|
+
signature.end();
|
|
45
|
+
const value = clientAuthentication.algorithm === 'ES256'
|
|
46
|
+
? signature.sign({ key: Redacted.value(clientAuthentication.privateKey), dsaEncoding: 'ieee-p1363' })
|
|
47
|
+
: clientAuthentication.algorithm === 'PS256'
|
|
48
|
+
? signature.sign({
|
|
49
|
+
key: Redacted.value(clientAuthentication.privateKey),
|
|
50
|
+
padding: constants.RSA_PKCS1_PSS_PADDING,
|
|
51
|
+
saltLength: constants.RSA_PSS_SALTLEN_DIGEST,
|
|
52
|
+
})
|
|
53
|
+
: signature.sign(Redacted.value(clientAuthentication.privateKey));
|
|
54
|
+
return `${signed}.${base64Url(value)}`;
|
|
55
|
+
}
|
|
56
|
+
function oauthBearerProvider(tokenRequest, options) {
|
|
57
|
+
const fetchImpl = options.fetch ?? globalThis.fetch;
|
|
58
|
+
const now = options.now ?? Date.now;
|
|
59
|
+
let cached;
|
|
60
|
+
// Concurrent broker authentications share one in-flight token request.
|
|
61
|
+
let pendingFetch = null;
|
|
62
|
+
const fetchToken = async () => {
|
|
63
|
+
const clientAuthentication = tokenRequest.clientAuthentication;
|
|
64
|
+
if (!['none', 'basic', 'body', 'query', 'private_key_jwt'].includes(clientAuthentication.type)) {
|
|
65
|
+
throw new UnsupportedKafkaAuthError('auth.tokenRequest.clientAuthentication');
|
|
66
|
+
}
|
|
67
|
+
const parameters = new URLSearchParams({ ...tokenRequest.extraParams, grant_type: 'client_credentials' });
|
|
68
|
+
if (tokenRequest.scope !== undefined)
|
|
69
|
+
parameters.set('scope', tokenRequest.scope);
|
|
70
|
+
if (tokenRequest.audience !== undefined)
|
|
71
|
+
parameters.set('audience', tokenRequest.audience);
|
|
72
|
+
const headers = {};
|
|
73
|
+
const tokenUrl = new URL(tokenRequest.tokenUrl);
|
|
74
|
+
switch (clientAuthentication.type) {
|
|
75
|
+
case 'none':
|
|
76
|
+
parameters.set('client_id', tokenRequest.clientId);
|
|
77
|
+
break;
|
|
78
|
+
case 'basic':
|
|
79
|
+
headers.Authorization = `Basic ${Buffer.from(`${formEncode(tokenRequest.clientId)}:${formEncode(Redacted.value(clientAuthentication.clientSecret))}`).toString('base64')}`;
|
|
80
|
+
break;
|
|
81
|
+
case 'body':
|
|
82
|
+
parameters.set('client_id', tokenRequest.clientId);
|
|
83
|
+
parameters.set('client_secret', Redacted.value(clientAuthentication.clientSecret));
|
|
84
|
+
break;
|
|
85
|
+
case 'query':
|
|
86
|
+
tokenUrl.searchParams.set('client_id', tokenRequest.clientId);
|
|
87
|
+
tokenUrl.searchParams.set('client_secret', Redacted.value(clientAuthentication.clientSecret));
|
|
88
|
+
break;
|
|
89
|
+
case 'private_key_jwt':
|
|
90
|
+
parameters.set('client_id', tokenRequest.clientId);
|
|
91
|
+
parameters.set('client_assertion_type', 'urn:ietf:params:oauth:client-assertion-type:jwt-bearer');
|
|
92
|
+
parameters.set('client_assertion', privateKeyAssertion(tokenRequest, now()));
|
|
93
|
+
break;
|
|
94
|
+
}
|
|
95
|
+
const isJson = tokenRequest.tokenRequestFormat === 'json';
|
|
96
|
+
headers['Content-Type'] = isJson ? 'application/json' : 'application/x-www-form-urlencoded';
|
|
97
|
+
const response = await fetchImpl(tokenUrl, {
|
|
98
|
+
method: 'POST',
|
|
99
|
+
headers,
|
|
100
|
+
body: isJson ? JSON.stringify(Object.fromEntries(parameters)) : parameters,
|
|
101
|
+
redirect: 'error',
|
|
102
|
+
signal: AbortSignal.timeout(OAUTH_TOKEN_REQUEST_TIMEOUT_MS),
|
|
103
|
+
});
|
|
104
|
+
if (!response.ok)
|
|
105
|
+
throw new Error(`OAuth token request failed with status ${response.status}.`);
|
|
106
|
+
const body = await response.json();
|
|
107
|
+
const parsed = decodeTokenResponse(body);
|
|
108
|
+
if (Option.isNone(parsed))
|
|
109
|
+
throw new Error('OAuth token response did not include an access token.');
|
|
110
|
+
const accessToken = parsed.value.access_token;
|
|
111
|
+
const expiresIn = Option.getOrUndefined(decodeExpiresIn(parsed.value.expires_in));
|
|
112
|
+
// Without a stated lifetime the token's expiry is unknown, so each authentication requests a fresh one.
|
|
113
|
+
cached =
|
|
114
|
+
expiresIn === undefined
|
|
115
|
+
? undefined
|
|
116
|
+
: { value: accessToken, expiresAt: now() + Math.max(0, expiresIn - 30) * 1000 };
|
|
117
|
+
return { value: accessToken };
|
|
118
|
+
};
|
|
119
|
+
return () => {
|
|
120
|
+
if (cached !== undefined && cached.expiresAt > now())
|
|
121
|
+
return Promise.resolve({ value: cached.value });
|
|
122
|
+
if (pendingFetch !== null)
|
|
123
|
+
return pendingFetch;
|
|
124
|
+
const request = (async () => {
|
|
125
|
+
try {
|
|
126
|
+
return await fetchToken();
|
|
127
|
+
}
|
|
128
|
+
finally {
|
|
129
|
+
pendingFetch = null;
|
|
130
|
+
}
|
|
131
|
+
})();
|
|
132
|
+
pendingFetch = request;
|
|
133
|
+
return request;
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
const decodeTokenResponse = Schema.decodeUnknownOption(Schema.Struct({
|
|
137
|
+
access_token: Schema.String.check(Schema.isMinLength(1)),
|
|
138
|
+
expires_in: Schema.optionalKey(Schema.Unknown),
|
|
139
|
+
}));
|
|
140
|
+
// A missing, non-numeric, or non-positive expires_in reads as absent, so the token is not cached.
|
|
141
|
+
const decodeExpiresIn = Schema.decodeUnknownOption(Schema.Finite.check(Schema.isGreaterThan(0)));
|
|
142
|
+
function mskOAuthBearerProvider(resource, options) {
|
|
143
|
+
const auth = resource.auth;
|
|
144
|
+
if (auth.type !== 'aws_msk_iam')
|
|
145
|
+
throw new UnsupportedKafkaAuthError('auth.type');
|
|
146
|
+
const loadMskSigner = options.loadMskSigner ??
|
|
147
|
+
(async () => {
|
|
148
|
+
// The optional peer is absent in workflows that do not use MSK IAM, so loading it must remain lazy.
|
|
149
|
+
try {
|
|
150
|
+
return await import('aws-msk-iam-sasl-signer-js');
|
|
151
|
+
}
|
|
152
|
+
catch (error) {
|
|
153
|
+
if (error instanceof Error && 'code' in error && error.code === 'ERR_MODULE_NOT_FOUND') {
|
|
154
|
+
throw new OptionalKafkaDependencyError('aws-msk-iam-sasl-signer-js');
|
|
155
|
+
}
|
|
156
|
+
throw error;
|
|
157
|
+
}
|
|
158
|
+
});
|
|
159
|
+
const loadCredentialProviders = options.loadCredentialProviders ??
|
|
160
|
+
(async () => {
|
|
161
|
+
// The optional peer is loaded only when a record asks the client to assume an AWS role.
|
|
162
|
+
try {
|
|
163
|
+
return await import('@aws-sdk/credential-providers');
|
|
164
|
+
}
|
|
165
|
+
catch (error) {
|
|
166
|
+
if (error instanceof Error && 'code' in error && error.code === 'ERR_MODULE_NOT_FOUND') {
|
|
167
|
+
throw new OptionalKafkaDependencyError('@aws-sdk/credential-providers');
|
|
168
|
+
}
|
|
169
|
+
throw error;
|
|
170
|
+
}
|
|
171
|
+
});
|
|
172
|
+
const now = options.now ?? Date.now;
|
|
173
|
+
// One STS provider per config, and its credentials reused until shortly before expiry, so each broker
|
|
174
|
+
// authentication does not send its own AssumeRole call.
|
|
175
|
+
let assumeRoleProvider;
|
|
176
|
+
let assumedCredentials;
|
|
177
|
+
const loadAssumeRoleProvider = async (params) => {
|
|
178
|
+
try {
|
|
179
|
+
return (await loadCredentialProviders()).fromTemporaryCredentials({
|
|
180
|
+
params,
|
|
181
|
+
clientConfig: { region: auth.region },
|
|
182
|
+
});
|
|
183
|
+
}
|
|
184
|
+
catch (error) {
|
|
185
|
+
// A failed load is retried on the next authentication instead of caching the rejection.
|
|
186
|
+
assumeRoleProvider = undefined;
|
|
187
|
+
throw error;
|
|
188
|
+
}
|
|
189
|
+
};
|
|
190
|
+
const assumedRoleCredentials = async (params) => {
|
|
191
|
+
if (assumedCredentials !== undefined && assumedCredentials.refreshAt > now())
|
|
192
|
+
return assumedCredentials.credentials;
|
|
193
|
+
assumeRoleProvider ??= loadAssumeRoleProvider(params);
|
|
194
|
+
const { expiration, ...credentials } = await (await assumeRoleProvider)();
|
|
195
|
+
assumedCredentials =
|
|
196
|
+
expiration === undefined
|
|
197
|
+
? undefined
|
|
198
|
+
: { credentials, refreshAt: expiration.getTime() - ASSUMED_ROLE_REFRESH_MARGIN_MS };
|
|
199
|
+
return credentials;
|
|
200
|
+
};
|
|
201
|
+
return async () => {
|
|
202
|
+
const signer = await loadMskSigner();
|
|
203
|
+
const awsAuth = auth.awsAuth;
|
|
204
|
+
if (!['access_key', 'assume_role', 'ambient'].includes(awsAuth.type)) {
|
|
205
|
+
throw new UnsupportedKafkaAuthError('auth.awsAuth');
|
|
206
|
+
}
|
|
207
|
+
const token = awsAuth.type === 'access_key'
|
|
208
|
+
? await signer.generateAuthTokenFromCredentialsProvider({
|
|
209
|
+
region: auth.region,
|
|
210
|
+
awsCredentialsProvider: async () => {
|
|
211
|
+
const creds = {
|
|
212
|
+
accessKeyId: awsAuth.accessKeyId,
|
|
213
|
+
secretAccessKey: Redacted.value(awsAuth.secretAccessKey),
|
|
214
|
+
};
|
|
215
|
+
if (awsAuth.sessionToken !== undefined)
|
|
216
|
+
creds.sessionToken = Redacted.value(awsAuth.sessionToken);
|
|
217
|
+
return creds;
|
|
218
|
+
},
|
|
219
|
+
})
|
|
220
|
+
: awsAuth.type === 'assume_role'
|
|
221
|
+
? await signer.generateAuthTokenFromCredentialsProvider({
|
|
222
|
+
region: auth.region,
|
|
223
|
+
awsCredentialsProvider: () => {
|
|
224
|
+
const params = { RoleArn: awsAuth.roleArn, RoleSessionName: 'temper-kafka' };
|
|
225
|
+
if (awsAuth.externalId !== undefined)
|
|
226
|
+
params.ExternalId = awsAuth.externalId;
|
|
227
|
+
return assumedRoleCredentials(params);
|
|
228
|
+
},
|
|
229
|
+
})
|
|
230
|
+
: await signer.generateAuthToken({ region: auth.region });
|
|
231
|
+
return { value: token.token };
|
|
232
|
+
};
|
|
233
|
+
}
|
|
234
|
+
// A bad endpoint or key would otherwise surface only at the first broker authentication, deep inside KafkaJS.
|
|
235
|
+
function assertTokenRequestUsable(tokenRequest) {
|
|
236
|
+
const tokenUrl = URL.canParse(tokenRequest.tokenUrl) ? new URL(tokenRequest.tokenUrl) : undefined;
|
|
237
|
+
if (tokenUrl?.protocol !== 'https:') {
|
|
238
|
+
throw new Error('Kafka OAuth auth.tokenRequest.tokenUrl must be an https URL.');
|
|
239
|
+
}
|
|
240
|
+
const clientAuthentication = tokenRequest.clientAuthentication;
|
|
241
|
+
if (clientAuthentication.type !== 'private_key_jwt')
|
|
242
|
+
return;
|
|
243
|
+
try {
|
|
244
|
+
createPrivateKey(Redacted.value(clientAuthentication.privateKey));
|
|
245
|
+
}
|
|
246
|
+
catch {
|
|
247
|
+
throw new Error('Kafka OAuth auth.tokenRequest.clientAuthentication.privateKey is not a valid PEM private key.');
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
/** Maps a resolved Kafka record to the options accepted by `new Kafka(...)`. */
|
|
251
|
+
export function kafkaConfig(resource, options = {}) {
|
|
252
|
+
if (resource.brokers.some((broker) => broker.startsWith('['))) {
|
|
253
|
+
throw new Error('KafkaJS does not support bracketed IPv6 bootstrap broker addresses; configure a hostname or IPv4 address.');
|
|
254
|
+
}
|
|
255
|
+
let ssl;
|
|
256
|
+
if (resource.tls !== undefined) {
|
|
257
|
+
const tlsOptions = {};
|
|
258
|
+
if (resource.tls.caCertificate !== undefined)
|
|
259
|
+
tlsOptions.ca = resource.tls.caCertificate;
|
|
260
|
+
if (resource.tls.clientCertificate !== undefined)
|
|
261
|
+
tlsOptions.cert = resource.tls.clientCertificate;
|
|
262
|
+
if (resource.tls.clientKey !== undefined)
|
|
263
|
+
tlsOptions.key = Redacted.value(resource.tls.clientKey);
|
|
264
|
+
if (resource.tls.clientKeyPassphrase !== undefined) {
|
|
265
|
+
tlsOptions.passphrase = Redacted.value(resource.tls.clientKeyPassphrase);
|
|
266
|
+
}
|
|
267
|
+
if (resource.tls.serverName !== undefined)
|
|
268
|
+
tlsOptions.servername = resource.tls.serverName;
|
|
269
|
+
ssl = Object.keys(tlsOptions).length === 0 ? true : tlsOptions;
|
|
270
|
+
}
|
|
271
|
+
const auth = resource.auth;
|
|
272
|
+
if (!['none', 'sasl_plain', 'sasl_scram', 'oauthbearer', 'aws_msk_iam'].includes(auth.type)) {
|
|
273
|
+
throw new UnsupportedKafkaAuthError('auth.type');
|
|
274
|
+
}
|
|
275
|
+
if (auth.type === 'oauthbearer')
|
|
276
|
+
assertTokenRequestUsable(auth.tokenRequest);
|
|
277
|
+
const sasl = auth.type === 'none'
|
|
278
|
+
? undefined
|
|
279
|
+
: auth.type === 'sasl_plain'
|
|
280
|
+
? { mechanism: 'plain', username: auth.username, password: Redacted.value(auth.password) }
|
|
281
|
+
: auth.type === 'sasl_scram'
|
|
282
|
+
? auth.mechanism === 'SCRAM-SHA-256'
|
|
283
|
+
? { mechanism: 'scram-sha-256', username: auth.username, password: Redacted.value(auth.password) }
|
|
284
|
+
: { mechanism: 'scram-sha-512', username: auth.username, password: Redacted.value(auth.password) }
|
|
285
|
+
: auth.type === 'oauthbearer'
|
|
286
|
+
? { mechanism: 'oauthbearer', oauthBearerProvider: oauthBearerProvider(auth.tokenRequest, options) }
|
|
287
|
+
: { mechanism: 'oauthbearer', oauthBearerProvider: mskOAuthBearerProvider(resource, options) };
|
|
288
|
+
const config = { brokers: [...resource.brokers] };
|
|
289
|
+
if (resource.clientId !== undefined)
|
|
290
|
+
config.clientId = resource.clientId;
|
|
291
|
+
if (ssl !== undefined)
|
|
292
|
+
config.ssl = ssl;
|
|
293
|
+
if (sasl !== undefined)
|
|
294
|
+
config.sasl = sasl;
|
|
295
|
+
return config;
|
|
296
|
+
}
|
|
297
|
+
//# sourceMappingURL=Kafka.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Kafka.js","sourceRoot":"","sources":["../src/Kafka.ts"],"names":[],"mappings":"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"}
|
package/dist/Manifest.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { HttpApi, type HttpApiGroup } from 'effect/http-api';
|
|
2
2
|
import { type WorkflowManifest } from './Contract/Manifest.js';
|
|
3
|
-
export declare const SDK_VERSION = "0.7.1-postgresql.
|
|
3
|
+
export declare const SDK_VERSION = "0.7.1-postgresql.4";
|
|
4
4
|
export declare const RUNTIME_API_VERSION = 1;
|
|
5
5
|
/** The route the SDK serves for platform probes; an API declaring `GET` on it collides with it on every request. */
|
|
6
6
|
export declare const HEALTHCHECK_PATH = "/healthcheck";
|
package/dist/Manifest.js
CHANGED
|
@@ -5,7 +5,7 @@ import { declarationOf } from './Resource.js';
|
|
|
5
5
|
import { Trigger } from './Trigger.js';
|
|
6
6
|
const decodeTrigger = Schema.decodeUnknownSync(TriggerMetadata, { onExcessProperty: 'error' });
|
|
7
7
|
const identityOf = (resource) => `${resource.kind}:${resource.kind === 'resourceType' ? resource.type : resource.key}`;
|
|
8
|
-
export const SDK_VERSION = '0.7.1-postgresql.
|
|
8
|
+
export const SDK_VERSION = '0.7.1-postgresql.4';
|
|
9
9
|
export const RUNTIME_API_VERSION = 1;
|
|
10
10
|
/** The route the SDK serves for platform probes; an API declaring `GET` on it collides with it on every request. */
|
|
11
11
|
export const HEALTHCHECK_PATH = '/healthcheck';
|
package/dist/PostgreSql.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PostgreSql.d.ts","sourceRoot":"","sources":["../src/PostgreSql.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAA2C,MAAM,EAAuB,KAAK,KAAK,EAAE,MAAM,QAAQ,CAAC;AAE1G,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"PostgreSql.d.ts","sourceRoot":"","sources":["../src/PostgreSql.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAA2C,MAAM,EAAuB,KAAK,KAAK,EAAE,MAAM,QAAQ,CAAC;AAE1G,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AAIzB,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AACjE,OAAO,EAA6B,KAAK,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAElF,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAEzD,0GAA0G;AAC1G,MAAM,MAAM,mBAAmB,GAAG,SAAS,GAAG,oBAAoB,CAAC;AAqCnE;;;;GAIG;AACH,eAAO,MAAM,kBAAkB,QAAS,MAAM,KAAG,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,mBAAmB,EAAE,KAAK,CAAC,KAAK,CAC7C,CAAC;AAS5D;;;;GAIG;AACH,wBAAsB,oBAAoB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,EAAE,CAAC,IAAI,CAAC,CAIxE"}
|
package/dist/PostgreSql.js
CHANGED
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
*/
|
|
5
5
|
import { Cause, Config, ConfigProvider, Duration, Effect, Exit, Layer, Option } from 'effect';
|
|
6
6
|
import { FetchHttpClient, HttpClient } from 'effect/http';
|
|
7
|
+
import { databaseTunnelUrl } from './DatabaseTunnelAuthorization.js';
|
|
7
8
|
import { loggerLayer, writeStdoutLine } from './Logger.js';
|
|
8
9
|
import { endPool, makeResourcePool, tunnelEnabled } from './PostgreSqlPool.js';
|
|
9
10
|
import { makeRuntimeResourceClient } from './RuntimeResources.js';
|
|
@@ -11,16 +12,6 @@ export { PostgresqlResource } from './PostgreSqlPool.js';
|
|
|
11
12
|
// A token in its refresh window waits for the provider's next publish. pg's connect timeout is 10 s, so the wait
|
|
12
13
|
// ends with the connection attempt instead of holding the process open.
|
|
13
14
|
const TUNNEL_AUTHORIZATION_TIMEOUT = Duration.seconds(10);
|
|
14
|
-
// The tunnel path keeps literal dots out of the router's file-extension handling, as @ontemper/resources did.
|
|
15
|
-
const tunnelAuthorization = (key) => Effect.gen(function* () {
|
|
16
|
-
const apiUrl = yield* Config.NonEmptyString('UNNBOUND_API_URL');
|
|
17
|
-
const endpoint = new URL(`/api/runtime/databases/${encodeURIComponent(key.replaceAll('.', '%2E'))}/tunnel`, apiUrl);
|
|
18
|
-
if (endpoint.protocol !== 'https:' && endpoint.protocol !== 'http:') {
|
|
19
|
-
return yield* Effect.fail(new Error('Temper API URL must use HTTP or HTTPS.'));
|
|
20
|
-
}
|
|
21
|
-
endpoint.protocol = endpoint.protocol === 'https:' ? 'wss:' : 'ws:';
|
|
22
|
-
return endpoint.href;
|
|
23
|
-
});
|
|
24
15
|
const open = (rawKey) => Effect.gen(function* () {
|
|
25
16
|
const key = rawKey.trim();
|
|
26
17
|
// A workflow's own HttpClient when there is one; resolver calls disable its tracing either way.
|
|
@@ -34,7 +25,7 @@ const open = (rawKey) => Effect.gen(function* () {
|
|
|
34
25
|
resolve: client.resolve,
|
|
35
26
|
inspect: client.inspect,
|
|
36
27
|
authorizeTunnel: tunnel
|
|
37
|
-
? (tunnelKey) => Effect.runPromiseWith(context)(Effect.all({ url:
|
|
28
|
+
? (tunnelKey) => Effect.runPromiseWith(context)(Effect.all({ url: databaseTunnelUrl(tunnelKey), token: client.tunnelToken }).pipe(Effect.timeoutOrElse({
|
|
38
29
|
duration: TUNNEL_AUTHORIZATION_TIMEOUT,
|
|
39
30
|
orElse: () => Effect.fail(new Error('No runtime token for the database tunnel within 10 s.')),
|
|
40
31
|
})))
|
package/dist/PostgreSql.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PostgreSql.js","sourceRoot":"","sources":["../src/PostgreSql.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAc,MAAM,QAAQ,CAAC;AAC1G,OAAO,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAE1D,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC3D,OAAO,EAAE,OAAO,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAE/E,OAAO,EAAE,yBAAyB,EAAkB,MAAM,uBAAuB,CAAC;AAElF,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAKzD,iHAAiH;AACjH,wEAAwE;AACxE,MAAM,4BAA4B,GAAG,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;AAE1D,
|
|
1
|
+
{"version":3,"file":"PostgreSql.js","sourceRoot":"","sources":["../src/PostgreSql.ts"],"names":[],"mappings":"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"}
|
package/dist/PostgreSqlPool.d.ts
CHANGED
|
@@ -2,45 +2,7 @@ import { type Duration, Effect, Option, Schema } from 'effect';
|
|
|
2
2
|
import type pg from 'pg';
|
|
3
3
|
import { InvalidResourceError } from './ResourcesErrors.js';
|
|
4
4
|
import type { InspectedResource, ReadError } from './RuntimeResources.js';
|
|
5
|
-
|
|
6
|
-
export declare const PostgresqlResource: Schema.Struct<{
|
|
7
|
-
readonly host: Schema.String;
|
|
8
|
-
readonly port: Schema.withDecodingDefaultKey<Schema.Int, never>;
|
|
9
|
-
readonly dbname: Schema.String;
|
|
10
|
-
readonly user: Schema.String;
|
|
11
|
-
readonly auth: Schema.Union<readonly [Schema.Struct<{
|
|
12
|
-
readonly type: Schema.Literal<"password">;
|
|
13
|
-
readonly password: Schema.RedactedFromValue<Schema.String>;
|
|
14
|
-
}>, Schema.Struct<{
|
|
15
|
-
readonly type: Schema.Literal<"rds_iam">;
|
|
16
|
-
readonly region: Schema.String;
|
|
17
|
-
readonly awsAuth: Schema.Union<readonly [Schema.Struct<{
|
|
18
|
-
readonly type: Schema.Literal<"access_key">;
|
|
19
|
-
readonly accessKeyId: Schema.String;
|
|
20
|
-
readonly secretAccessKey: Schema.RedactedFromValue<Schema.String>;
|
|
21
|
-
readonly sessionToken: Schema.optionalKey<Schema.RedactedFromValue<Schema.String>>;
|
|
22
|
-
}>, Schema.Struct<{
|
|
23
|
-
readonly type: Schema.Literal<"assume_role">;
|
|
24
|
-
readonly roleArn: Schema.String;
|
|
25
|
-
readonly externalId: Schema.optionalKey<Schema.String>;
|
|
26
|
-
}>, Schema.Struct<{
|
|
27
|
-
readonly type: Schema.Literal<"ambient">;
|
|
28
|
-
}>]>;
|
|
29
|
-
}>, Schema.Struct<{
|
|
30
|
-
readonly type: Schema.Literal<"none">;
|
|
31
|
-
}>]>;
|
|
32
|
-
readonly sslmode: Schema.withDecodingDefaultKey<Schema.Literals<readonly ["disable", "require", "verify-ca", "verify-full"]>, never>;
|
|
33
|
-
readonly tls: Schema.optionalKey<Schema.Struct<{
|
|
34
|
-
readonly caCertificate: Schema.optionalKey<Schema.String>;
|
|
35
|
-
readonly clientCertificate: Schema.optionalKey<Schema.String>;
|
|
36
|
-
readonly clientKey: Schema.optionalKey<Schema.RedactedFromValue<Schema.String>>;
|
|
37
|
-
readonly clientKeyPassphrase: Schema.optionalKey<Schema.RedactedFromValue<Schema.String>>;
|
|
38
|
-
readonly serverName: Schema.optionalKey<Schema.String>;
|
|
39
|
-
}>>;
|
|
40
|
-
readonly sshTunnel: Schema.optionalKey<Schema.$Record<Schema.String, Schema.Codec<Schema.Json, Schema.Json, never, never>>>;
|
|
41
|
-
readonly options: Schema.optionalKey<Schema.String>;
|
|
42
|
-
}>;
|
|
43
|
-
export type PostgresqlResource = typeof PostgresqlResource.Type;
|
|
5
|
+
export { PostgresqlResource } from './ResourceRecords.js';
|
|
44
6
|
/** Where a pool reads its Resource: the runtime API in a workflow, fixed answers in tests. */
|
|
45
7
|
export interface ResourceSource {
|
|
46
8
|
readonly resolve: (key: string) => Effect.Effect<Schema.Json, ReadError | InvalidResourceError>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PostgreSqlPool.d.ts","sourceRoot":"","sources":["../src/PostgreSqlPool.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAuB,MAAM,EAAE,MAAM,QAAQ,CAAC;AACpF,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AAIzB,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,KAAK,EAAE,iBAAiB,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"PostgreSqlPool.d.ts","sourceRoot":"","sources":["../src/PostgreSqlPool.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAuB,MAAM,EAAE,MAAM,QAAQ,CAAC;AACpF,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AAIzB,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,KAAK,EAAE,iBAAiB,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAE1E,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAE1D,8FAA8F;AAC9F,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,SAAS,GAAG,oBAAoB,CAAC,CAAC;IAChG,oEAAoE;IACpE,QAAQ,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,iBAAiB,EAAE,UAAU,CAAC,EAAE,SAAS,CAAC,CAAC;IACjG,8FAA8F;IAC9F,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC;QAAE,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC,GAAG,SAAS,CAAC;CACrH;AAgFD;;;GAGG;AACH,eAAO,MAAM,gBAAgB,QACtB,MAAM,UACH,cAAc,KACrB,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,SAAS,GAAG,oBAAoB,CAwCtD,CAAC;AAEL,eAAO,MAAM,aAAa,UAAW,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,YAAwC,CAAC;AAEnG,+GAA+G;AAC/G,eAAO,MAAM,gBAAgB,EAAE,QAAQ,CAAC,KAAoB,CAAC;AAE7D;;;GAGG;AACH,eAAO,MAAM,OAAO,SACZ;IAAE,QAAQ,CAAC,GAAG,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;CAAE,YAClC,QAAQ,CAAC,KAAK,KACtB,MAAM,CAAC,MAAM,CAAC,IAAI,CAUlB,CAAC"}
|
package/dist/PostgreSqlPool.js
CHANGED
|
@@ -1,29 +1,9 @@
|
|
|
1
1
|
import { Effect, Option, Predicate, Redacted, Schema } from 'effect';
|
|
2
|
-
import { AwsAuth, TlsSettings } from './HttpApiResource.js';
|
|
3
2
|
import { observePostgreSqlTimeouts } from './PostgreSqlTimeouts.js';
|
|
4
3
|
import { registerSecrets } from './Redaction.js';
|
|
4
|
+
import { PostgresqlResource } from './ResourceRecords.js';
|
|
5
5
|
import { InvalidResourceError } from './ResourcesErrors.js';
|
|
6
|
-
|
|
7
|
-
const Secret = Schema.RedactedFromValue(Schema.String);
|
|
8
|
-
/** A `postgresql` record as `@ontemper/resources` reads it; `sslmode` carries libpq semantics, and `tls` the CA and client certificate. */
|
|
9
|
-
export const PostgresqlResource = Schema.Struct({
|
|
10
|
-
host: NonEmptyString,
|
|
11
|
-
port: Schema.Int.check(Schema.isBetween({ minimum: 1, maximum: 65_535 })).pipe(Schema.withDecodingDefaultKey(Effect.succeed(5432))),
|
|
12
|
-
dbname: NonEmptyString,
|
|
13
|
-
user: NonEmptyString,
|
|
14
|
-
// Closed: the type decides how the client signs in.
|
|
15
|
-
auth: Schema.Union([
|
|
16
|
-
Schema.Struct({ type: Schema.Literal('password'), password: Secret }),
|
|
17
|
-
Schema.Struct({ type: Schema.Literal('rds_iam'), region: NonEmptyString, awsAuth: AwsAuth }),
|
|
18
|
-
Schema.Struct({ type: Schema.Literal('none') }),
|
|
19
|
-
]),
|
|
20
|
-
// Closed: libpq's weaker `allow` and `prefer` would map to no TLS at all.
|
|
21
|
-
sslmode: Schema.Literals(['disable', 'require', 'verify-ca', 'verify-full']).pipe(Schema.withDecodingDefaultKey(Effect.succeed('verify-full'))),
|
|
22
|
-
tls: Schema.optionalKey(TlsSettings),
|
|
23
|
-
// Only its presence matters: this pool refuses a bastion tunnel.
|
|
24
|
-
sshTunnel: Schema.optionalKey(Schema.Record(Schema.String, Schema.Json)),
|
|
25
|
-
options: Schema.optionalKey(Schema.String),
|
|
26
|
-
});
|
|
6
|
+
export { PostgresqlResource } from './ResourceRecords.js';
|
|
27
7
|
const validate = Schema.toStandardSchemaV1(PostgresqlResource)['~standard'].validate;
|
|
28
8
|
// Names only the failing paths: a schema message can quote the value, which may be a secret.
|
|
29
9
|
const decode = (key, value) => Effect.suspend(() => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PostgreSqlPool.js","sourceRoot":"","sources":["../src/PostgreSqlPool.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAEpF,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"PostgreSqlPool.js","sourceRoot":"","sources":["../src/PostgreSqlPool.ts"],"names":[],"mappings":"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"}
|
package/dist/Redaction.d.ts
CHANGED
|
@@ -16,7 +16,11 @@ export interface SecretMasks {
|
|
|
16
16
|
readonly register: (values: Iterable<string>) => void;
|
|
17
17
|
readonly mask: (text: string) => string;
|
|
18
18
|
}
|
|
19
|
-
|
|
19
|
+
/** Legacy `unnbound-logger-sdk` bound: past it, the least recently registered value stops being masked. */
|
|
20
|
+
export declare const MASK_LIMIT = 4096;
|
|
21
|
+
export declare const makeSecretMasks: (limit?: number) => SecretMasks;
|
|
22
|
+
/** A module's own registry that also masks every secret registered process-wide, in one longest-first pass. */
|
|
23
|
+
export declare const makeWorkflowSecretMasks: () => SecretMasks;
|
|
20
24
|
/** `workflow()` installs one registry per module, so a secret seen by one request stays masked in every later one. */
|
|
21
25
|
export declare const SecretMasks: Context.Reference<SecretMasks>;
|
|
22
26
|
/**
|
package/dist/Redaction.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Redaction.d.ts","sourceRoot":"","sources":["../src/Redaction.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,KAAK,MAAM,EAAa,MAAM,QAAQ,CAAC;AACzD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAE/C,+FAA+F;AAC/F,eAAO,MAAM,QAAQ,eAAe,CAAC;AAkFrC;;;;;GAKG;AACH,eAAO,MAAM,UAAU,SAAU;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CAAE,KAAG,IAoB7D,CAAC;AAEF,gEAAgE;AAChE,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC;IACtD,QAAQ,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;CACzC;AAaD,eAAO,MAAM,eAAe,QAAO,
|
|
1
|
+
{"version":3,"file":"Redaction.d.ts","sourceRoot":"","sources":["../src/Redaction.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,KAAK,MAAM,EAAa,MAAM,QAAQ,CAAC;AACzD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAE/C,+FAA+F;AAC/F,eAAO,MAAM,QAAQ,eAAe,CAAC;AAkFrC;;;;;GAKG;AACH,eAAO,MAAM,UAAU,SAAU;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CAAE,KAAG,IAoB7D,CAAC;AAEF,gEAAgE;AAChE,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC;IACtD,QAAQ,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;CACzC;AAaD,2GAA2G;AAC3G,eAAO,MAAM,UAAU,OAAQ,CAAC;AA6DhC,eAAO,MAAM,eAAe,WAAY,MAAM,KAAG,WAA0C,CAAC;AAK5F,+GAA+G;AAC/G,eAAO,MAAM,uBAAuB,QAAO,WAAgD,CAAC;AAE5F,sHAAsH;AACtH,eAAO,MAAM,WAAW,gCAEtB,CAAC;AAEH;;;GAGG;AACH,eAAO,MAAM,eAAe,WAAY,QAAQ,CAAC,MAAM,CAAC,KAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CACrB,CAAC"}
|
package/dist/Redaction.js
CHANGED
|
@@ -118,27 +118,44 @@ const encodingsOf = (value) => {
|
|
|
118
118
|
return [value, form];
|
|
119
119
|
}
|
|
120
120
|
};
|
|
121
|
-
|
|
122
|
-
|
|
121
|
+
/** Legacy `unnbound-logger-sdk` bound: past it, the least recently registered value stops being masked. */
|
|
122
|
+
export const MASK_LIMIT = 4_096;
|
|
123
|
+
/** Masks with one longest-first pattern over this registry's values and, when given, the `shared` registry's. */
|
|
124
|
+
const makeMasks = (shared, limit = MASK_LIMIT) => {
|
|
125
|
+
const own = { values: new Set(), version: 0 };
|
|
126
|
+
const { values } = own;
|
|
123
127
|
// Alternation tries the longest secret first at each position, as the legacy scanner did.
|
|
124
128
|
let pattern;
|
|
129
|
+
let sharedVersion = shared?.version ?? 0;
|
|
125
130
|
return {
|
|
131
|
+
own,
|
|
126
132
|
register: (candidates) => {
|
|
127
133
|
for (const candidate of candidates) {
|
|
128
134
|
if (candidate.length === 0)
|
|
129
135
|
continue;
|
|
130
136
|
for (const value of encodingsOf(candidate)) {
|
|
131
|
-
|
|
137
|
+
// A repeat registration moves the value to the newest end, so eviction drops the least recently registered.
|
|
138
|
+
if (values.delete(value)) {
|
|
139
|
+
values.add(value);
|
|
132
140
|
continue;
|
|
141
|
+
}
|
|
133
142
|
values.add(value);
|
|
143
|
+
const [oldest] = values;
|
|
144
|
+
if (values.size > limit && oldest !== undefined)
|
|
145
|
+
values.delete(oldest);
|
|
146
|
+
own.version++;
|
|
134
147
|
pattern = undefined;
|
|
135
148
|
}
|
|
136
149
|
}
|
|
137
150
|
},
|
|
138
151
|
mask: (text) => {
|
|
139
|
-
if (
|
|
152
|
+
if (shared !== undefined && shared.version !== sharedVersion) {
|
|
153
|
+
sharedVersion = shared.version;
|
|
154
|
+
pattern = undefined;
|
|
155
|
+
}
|
|
156
|
+
if (values.size + (shared?.values.size ?? 0) === 0)
|
|
140
157
|
return text;
|
|
141
|
-
pattern ??= new RegExp([...values]
|
|
158
|
+
pattern ??= new RegExp([...values, ...(shared?.values ?? [])]
|
|
142
159
|
.sort((left, right) => right.length - left.length)
|
|
143
160
|
.map((value) => value
|
|
144
161
|
.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')
|
|
@@ -149,9 +166,14 @@ export const makeSecretMasks = () => {
|
|
|
149
166
|
},
|
|
150
167
|
};
|
|
151
168
|
};
|
|
169
|
+
export const makeSecretMasks = (limit) => makeMasks(undefined, limit);
|
|
170
|
+
// Reads outside a workflow fiber (the promise `env`, `createPostgresqlPool`) register here, as legacy masked globally.
|
|
171
|
+
const processSecretMasks = makeMasks();
|
|
172
|
+
/** A module's own registry that also masks every secret registered process-wide, in one longest-first pass. */
|
|
173
|
+
export const makeWorkflowSecretMasks = () => makeMasks(processSecretMasks.own);
|
|
152
174
|
/** `workflow()` installs one registry per module, so a secret seen by one request stays masked in every later one. */
|
|
153
175
|
export const SecretMasks = Context.Reference('@temper/workflow/SecretMasks', {
|
|
154
|
-
defaultValue:
|
|
176
|
+
defaultValue: () => processSecretMasks,
|
|
155
177
|
});
|
|
156
178
|
/**
|
|
157
179
|
* Masks each non-empty value, and its `encodeURIComponent` and form-urlencoded forms, as `[Redacted]`
|