@ontemper/sdk 0.7.1-postgresql.2 → 0.7.1-postgresql.3

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 (74) hide show
  1. package/README.md +46 -2
  2. package/dist/As2Resource.d.ts +431 -76
  3. package/dist/As2Resource.d.ts.map +1 -1
  4. package/dist/As2Resource.js +31 -30
  5. package/dist/As2Resource.js.map +1 -1
  6. package/dist/As2Transport.d.ts.map +1 -1
  7. package/dist/As2Transport.js +3 -1
  8. package/dist/As2Transport.js.map +1 -1
  9. package/dist/As2Wire.d.ts +39 -0
  10. package/dist/As2Wire.d.ts.map +1 -1
  11. package/dist/DatabaseTunnelAuthorization.d.ts +11 -0
  12. package/dist/DatabaseTunnelAuthorization.d.ts.map +1 -0
  13. package/dist/DatabaseTunnelAuthorization.js +35 -0
  14. package/dist/DatabaseTunnelAuthorization.js.map +1 -0
  15. package/dist/ExpiringMap.d.ts +21 -0
  16. package/dist/ExpiringMap.d.ts.map +1 -0
  17. package/dist/ExpiringMap.js +79 -0
  18. package/dist/ExpiringMap.js.map +1 -0
  19. package/dist/HttpApiResource.d.ts +2904 -177
  20. package/dist/HttpApiResource.d.ts.map +1 -1
  21. package/dist/HttpApiResource.js +81 -59
  22. package/dist/HttpApiResource.js.map +1 -1
  23. package/dist/Kafka.d.ts +89 -0
  24. package/dist/Kafka.d.ts.map +1 -0
  25. package/dist/Kafka.js +297 -0
  26. package/dist/Kafka.js.map +1 -0
  27. package/dist/Manifest.d.ts +1 -1
  28. package/dist/Manifest.js +1 -1
  29. package/dist/PostgreSql.d.ts.map +1 -1
  30. package/dist/PostgreSql.js +2 -11
  31. package/dist/PostgreSql.js.map +1 -1
  32. package/dist/PostgreSqlPool.d.ts +1 -39
  33. package/dist/PostgreSqlPool.d.ts.map +1 -1
  34. package/dist/PostgreSqlPool.js +2 -22
  35. package/dist/PostgreSqlPool.js.map +1 -1
  36. package/dist/Redaction.d.ts +2 -0
  37. package/dist/Redaction.d.ts.map +1 -1
  38. package/dist/Redaction.js +16 -4
  39. package/dist/Redaction.js.map +1 -1
  40. package/dist/ResourceRecords.d.ts +1086 -0
  41. package/dist/ResourceRecords.d.ts.map +1 -0
  42. package/dist/ResourceRecords.js +303 -0
  43. package/dist/ResourceRecords.js.map +1 -0
  44. package/dist/Resources.d.ts +13 -3
  45. package/dist/Resources.d.ts.map +1 -1
  46. package/dist/Resources.js +11 -3
  47. package/dist/Resources.js.map +1 -1
  48. package/dist/ResourcesCache.d.ts +33 -0
  49. package/dist/ResourcesCache.d.ts.map +1 -0
  50. package/dist/ResourcesCache.js +205 -0
  51. package/dist/ResourcesCache.js.map +1 -0
  52. package/dist/ResourcesEnv.d.ts +81 -0
  53. package/dist/ResourcesEnv.d.ts.map +1 -0
  54. package/dist/ResourcesEnv.js +104 -0
  55. package/dist/ResourcesEnv.js.map +1 -0
  56. package/dist/ResourcesErrors.d.ts +5 -1
  57. package/dist/ResourcesErrors.d.ts.map +1 -1
  58. package/dist/ResourcesErrors.js +5 -2
  59. package/dist/ResourcesErrors.js.map +1 -1
  60. package/dist/ResourcesToken.d.ts +9 -0
  61. package/dist/ResourcesToken.d.ts.map +1 -1
  62. package/dist/ResourcesToken.js +20 -7
  63. package/dist/ResourcesToken.js.map +1 -1
  64. package/dist/RuntimeResources.d.ts +18 -3
  65. package/dist/RuntimeResources.d.ts.map +1 -1
  66. package/dist/RuntimeResources.js +53 -29
  67. package/dist/RuntimeResources.js.map +1 -1
  68. package/dist/TransportResource.d.ts +1 -32
  69. package/dist/TransportResource.d.ts.map +1 -1
  70. package/dist/TransportResource.js +1 -19
  71. package/dist/TransportResource.js.map +1 -1
  72. package/dist/Workflow.js +2 -2
  73. package/dist/Workflow.js.map +1 -1
  74. package/package.json +14 -2
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ResourcesCache.js","sourceRoot":"","sources":["../src/ResourcesCache.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,81 @@
1
+ import { Effect, Schema } from 'effect';
2
+ import { type JsonObject, type RecordSchema } from './ResourceRecords.js';
3
+ import { RuntimeReadCache } from './ResourcesCache.js';
4
+ import { type InspectedResource } from './RuntimeResources.js';
5
+ /** Per-read cache control, as in `@ontemper/resources`. */
6
+ export interface RuntimeResolveOptions {
7
+ /** `false` reads the resolver and replaces what the cache held for this read. */
8
+ cache?: boolean;
9
+ /** How long this answer stays fresh; default 30 s (`UNNBOUND_RUNTIME_RESOLVE_CACHE_MAX_AGE`). */
10
+ ttlMs?: number;
11
+ }
12
+ /** The resource record as `inspect` returns it: literal fields only, secrets left to `resolve`. */
13
+ export type RuntimeResourceRecord = InspectedResource;
14
+ export interface RuntimeSelectResourceInput {
15
+ resourceTypeKey: string;
16
+ match: Record<string, string>;
17
+ }
18
+ export interface RuntimeSelectResourceOutput {
19
+ key: string;
20
+ }
21
+ /** Where a warning goes; the SDK line logger on stdout by default. */
22
+ export interface RuntimeEnvLogger {
23
+ readonly warn: (fields: Readonly<Record<string, string | number>>, message: string) => void;
24
+ }
25
+ /** Cache settings; each defaults to its `@ontemper/resources` environment variable, then to the legacy default. */
26
+ export interface RuntimeEnvConfig {
27
+ readonly now?: () => number;
28
+ readonly defaultTtlMs?: number;
29
+ /** How long past its TTL a value still serves while the resolver is unavailable; 0 turns stale serving off. */
30
+ readonly staleIfErrorMs?: number;
31
+ /** The same window for `select`, shorter because a selection can authorize a tenant the API now refuses. */
32
+ readonly selectStaleIfErrorMs?: number;
33
+ readonly notFoundTtlMs?: number;
34
+ readonly maxEntries?: number;
35
+ /** Distinct `select` 404s per minute; past it, a 404 stays cached until the minute ends. 0 turns it off. */
36
+ readonly missCapPerMinute?: number;
37
+ readonly logger?: RuntimeEnvLogger;
38
+ }
39
+ declare const makeClient: Effect.Effect<{
40
+ tunnelToken: Effect.Effect<string, import("./ResourcesErrors.js").ResourcesUnauthorizedError, never>;
41
+ variable: (key: string) => Effect.Effect<string, import("./RuntimeResources.js").ReadError, never>;
42
+ resolve: (key: string) => Effect.Effect<Schema.Json, import("./RuntimeResources.js").ReadError, never>;
43
+ inspect: (key: string) => Effect.Effect<InspectedResource, import("./RuntimeResources.js").ReadError>;
44
+ select: (selector: import("./RuntimeResources.js").ResourceSelector) => Effect.Effect<string, import("./ResourcesErrors.js").ResourceNotSelectableError | import("./RuntimeResources.js").ReadError, never>;
45
+ }, never, import("effect/http/HttpClient").HttpClient>;
46
+ type Client = Effect.Success<typeof makeClient>;
47
+ /** `env.resources`: the reads of `@ontemper/resources` `ResourceAccessor`. */
48
+ export declare class RuntimeResourceReads {
49
+ private readonly cache;
50
+ private readonly connect;
51
+ constructor(cache: RuntimeReadCache, connect: () => Promise<Client>);
52
+ /** The record without its secret fields: type, scope, and literal values. */
53
+ inspect(key: string, options?: RuntimeResolveOptions): Promise<RuntimeResourceRecord>;
54
+ /** The value with every secret field filled in; given a `schema` (such as `SftpResource`), the decoded value. */
55
+ resolve(key: string, schema?: undefined, options?: RuntimeResolveOptions): Promise<JsonObject>;
56
+ resolve<S extends RecordSchema>(key: string, schema: S, options?: RuntimeResolveOptions): Promise<S['Type']>;
57
+ /** The key of the record whose selectable field matches; feed it to `resolve`. */
58
+ select(input: RuntimeSelectResourceInput, options?: RuntimeResolveOptions): Promise<RuntimeSelectResourceOutput>;
59
+ }
60
+ /** `env.variables`: live Variable reads through the runtime resolver. */
61
+ export declare class RuntimeVariableReads {
62
+ private readonly cache;
63
+ private readonly connect;
64
+ constructor(cache: RuntimeReadCache, connect: () => Promise<Client>);
65
+ /** The Variable's live value. */
66
+ get(key: string, options?: RuntimeResolveOptions): Promise<string>;
67
+ }
68
+ /** One reader per process, with the Run token of `UNNBOUND_RUNTIME_TOKEN_FILE` or `UNNBOUND_RUNTIME_TOKEN`. */
69
+ export declare class RuntimeEnv {
70
+ readonly resources: RuntimeResourceReads;
71
+ readonly variables: RuntimeVariableReads;
72
+ private client;
73
+ constructor(config?: RuntimeEnvConfig);
74
+ }
75
+ /**
76
+ * Promise reads of Resources and Variables, with the signatures of `@ontemper/resources` `env`. Errors reject with
77
+ * the SDK's Resource errors; `ResourceNotFoundError` means that no record answers the key or the `select` match.
78
+ */
79
+ export declare const env: Pick<RuntimeEnv, 'resources' | 'variables'>;
80
+ export {};
81
+ //# sourceMappingURL=ResourcesEnv.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ResourcesEnv.d.ts","sourceRoot":"","sources":["../src/ResourcesEnv.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,104 @@
1
+ import { Cause, ConfigProvider, Effect, Exit, Layer, Option, Schema } from 'effect';
2
+ import { FetchHttpClient } from 'effect/http';
3
+ import { loggerLayer, writeStdoutLine } from './Logger.js';
4
+ import { decodeRecord } from './ResourceRecords.js';
5
+ import { RuntimeReadCache } from './ResourcesCache.js';
6
+ import { InvalidResourceError } from './ResourcesErrors.js';
7
+ import { runtimeResourceClient } from './RuntimeResources.js';
8
+ const normalizeKey = (key) => {
9
+ const normalized = key.trim();
10
+ if (!normalized)
11
+ throw new Error('Runtime resolver key is required.');
12
+ return normalized;
13
+ };
14
+ // Key order must not split the cache: `{a,b}` and `{b,a}` select the same record.
15
+ const selectTarget = ({ resourceTypeKey, match }) => JSON.stringify([
16
+ resourceTypeKey,
17
+ Object.keys(match)
18
+ .sort()
19
+ .map((field) => [field, match[field]]),
20
+ ]);
21
+ const decodeJsonObject = Schema.decodeUnknownOption(Schema.Record(Schema.String, Schema.MutableJson));
22
+ // The resolver answers a record as a JSON object; anything else cannot serve the read.
23
+ const asRecord = (key, value) => {
24
+ const record = Option.getOrUndefined(decodeJsonObject(value));
25
+ return record !== undefined
26
+ ? Effect.succeed(record)
27
+ : Effect.fail(new InvalidResourceError({ target: `key ${key}`, message: `Resource ${key} did not resolve to a JSON object` }));
28
+ };
29
+ // The live environment on every read, as `workflow()` provides it; Effect's default provider keeps a first-use copy.
30
+ const liveConfig = Layer.unwrap(Effect.sync(() => ConfigProvider.layer(ConfigProvider.fromEnvRecord(process.env, { preserveEmptyStrings: true }))));
31
+ const standalone = loggerLayer(writeStdoutLine).pipe(Layer.orDie, Layer.provideMerge(liveConfig));
32
+ const run = async (effect) => {
33
+ const exit = await Effect.runPromiseExit(effect.pipe(Effect.provide(liveConfig)));
34
+ if (Exit.isSuccess(exit))
35
+ return exit.value;
36
+ throw Cause.squash(exit.cause);
37
+ };
38
+ const sdkLogger = {
39
+ warn: (fields, message) => Effect.runFork(Effect.logWarning(message).pipe(Effect.annotateLogs(fields), Effect.provide(standalone))),
40
+ };
41
+ const makeClient = runtimeResourceClient('unexpired');
42
+ // A resolve 404 cannot tell a missing record from a broken reference inside a found one; inspect answers 404 only
43
+ // for the first, as the `./resources` PostgreSQL pool reads it.
44
+ const resolveRecord = (client, key) => client.resolve(key).pipe(Effect.catchTag('ResourceNotFoundError', (notFound) => client.inspect(key).pipe(Effect.catchTag('ResourceNotFoundError', () => Effect.fail(notFound)), Effect.flatMap(() => Effect.fail(new InvalidResourceError({ target: notFound.target, message: notFound.message }))))), Effect.flatMap((value) => asRecord(key, value)));
45
+ /** `env.resources`: the reads of `@ontemper/resources` `ResourceAccessor`. */
46
+ export class RuntimeResourceReads {
47
+ cache;
48
+ connect;
49
+ constructor(cache, connect) {
50
+ this.cache = cache;
51
+ this.connect = connect;
52
+ }
53
+ /** The record without its secret fields: type, scope, and literal values. */
54
+ async inspect(key, options) {
55
+ const normalized = normalizeKey(key);
56
+ return this.cache.read(`resource.inspect:${normalized}`, options, this.cache.readPolicy, async () => run((await this.connect()).inspect(normalized)));
57
+ }
58
+ async resolve(key, schema, options) {
59
+ const normalized = normalizeKey(key);
60
+ const value = await this.cache.read(`resource.resolve:${normalized}`, options, this.cache.readPolicy, async () => run(resolveRecord(await this.connect(), normalized)));
61
+ return schema === undefined ? value : run(decodeRecord(schema, normalized, value));
62
+ }
63
+ /** The key of the record whose selectable field matches; feed it to `resolve`. */
64
+ async select(input, options) {
65
+ const selector = { resourceTypeKey: input.resourceTypeKey, match: { ...input.match } };
66
+ const key = await this.cache.read(`resource.select:${selectTarget(selector)}`, options, this.cache.selectPolicy, async () => run((await this.connect()).select(selector)));
67
+ return { key };
68
+ }
69
+ }
70
+ /** `env.variables`: live Variable reads through the runtime resolver. */
71
+ export class RuntimeVariableReads {
72
+ cache;
73
+ connect;
74
+ constructor(cache, connect) {
75
+ this.cache = cache;
76
+ this.connect = connect;
77
+ }
78
+ /** The Variable's live value. */
79
+ async get(key, options) {
80
+ const normalized = normalizeKey(key);
81
+ return this.cache.read(`variable.resolve:${normalized}`, options, this.cache.readPolicy, async () => run((await this.connect()).variable(normalized)));
82
+ }
83
+ }
84
+ /** One reader per process, with the Run token of `UNNBOUND_RUNTIME_TOKEN_FILE` or `UNNBOUND_RUNTIME_TOKEN`. */
85
+ export class RuntimeEnv {
86
+ resources;
87
+ variables;
88
+ client;
89
+ constructor(config = {}) {
90
+ const cache = new RuntimeReadCache({ ...config, logger: config.logger ?? sdkLogger });
91
+ const connect = () => {
92
+ this.client ??= Effect.runPromise(makeClient.pipe(Effect.provide(FetchHttpClient.layer)));
93
+ return this.client;
94
+ };
95
+ this.resources = new RuntimeResourceReads(cache, connect);
96
+ this.variables = new RuntimeVariableReads(cache, connect);
97
+ }
98
+ }
99
+ /**
100
+ * Promise reads of Resources and Variables, with the signatures of `@ontemper/resources` `env`. Errors reject with
101
+ * the SDK's Resource errors; `ResourceNotFoundError` means that no record answers the key or the `select` match.
102
+ */
103
+ export const env = new RuntimeEnv();
104
+ //# sourceMappingURL=ResourcesEnv.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ResourcesEnv.js","sourceRoot":"","sources":["../src/ResourcesEnv.ts"],"names":[],"mappings":"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"}
@@ -28,8 +28,12 @@ export declare class ResourcesUnauthorizedError extends ResourcesUnauthorizedErr
28
28
  }
29
29
  declare const ResourcesUnavailableError_base: Schema.Class<ResourcesUnavailableError, Schema.TaggedStruct<"ResourcesUnavailableError", {
30
30
  readonly message: Schema.String;
31
+ readonly status: Schema.optional<Schema.Number>;
31
32
  }>, import("effect/Cause").YieldableError>;
32
- /** The runtime API gave no usable answer: a transport failure, a timeout, a 5xx, or a body the SDK cannot read. */
33
+ /**
34
+ * The runtime API gave no usable answer: a transport failure, a timeout, a 5xx, a status the contract does not
35
+ * declare, or a body the SDK cannot read. `status` is the HTTP status when an answer arrived.
36
+ */
33
37
  export declare class ResourcesUnavailableError extends ResourcesUnavailableError_base {
34
38
  }
35
39
  export {};
@@ -1 +1 @@
1
- {"version":3,"file":"ResourcesErrors.d.ts","sourceRoot":"","sources":["../src/ResourcesErrors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;;;;;AAIhC,2HAA2H;AAC3H,qBAAa,qBAAsB,SAAQ,0BAGzC;CAAG;;;;;AAEL,+HAA+H;AAC/H,qBAAa,0BAA2B,SAAQ,+BAM/C;CAAG;;;;;AAEJ,sJAAsJ;AACtJ,qBAAa,oBAAqB,SAAQ,yBAGxC;CAAG;;;;AAEL,4IAA4I;AAC5I,qBAAa,0BAA2B,SAAQ,+BAG/C;CAAG;;;;AAEJ,mHAAmH;AACnH,qBAAa,yBAA0B,SAAQ,8BAG9C;CAAG"}
1
+ {"version":3,"file":"ResourcesErrors.d.ts","sourceRoot":"","sources":["../src/ResourcesErrors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;;;;;AAIhC,2HAA2H;AAC3H,qBAAa,qBAAsB,SAAQ,0BAGzC;CAAG;;;;;AAEL,+HAA+H;AAC/H,qBAAa,0BAA2B,SAAQ,+BAM/C;CAAG;;;;;AAEJ,sJAAsJ;AACtJ,qBAAa,oBAAqB,SAAQ,yBAGxC;CAAG;;;;AAEL,4IAA4I;AAC5I,qBAAa,0BAA2B,SAAQ,+BAG/C;CAAG;;;;;AAEJ;;;GAGG;AACH,qBAAa,yBAA0B,SAAQ,8BAG9C;CAAG"}
@@ -21,7 +21,10 @@ export class InvalidResourceError extends Schema.TaggedError()('InvalidResourceE
21
21
  /** The runtime identity is missing or refused: no API URL or runtime token, a provider that never published a fresh token, or a 401/403. */
22
22
  export class ResourcesUnauthorizedError extends Schema.TaggedError()('ResourcesUnauthorizedError', { message: Schema.String }) {
23
23
  }
24
- /** The runtime API gave no usable answer: a transport failure, a timeout, a 5xx, or a body the SDK cannot read. */
25
- export class ResourcesUnavailableError extends Schema.TaggedError()('ResourcesUnavailableError', { message: Schema.String }) {
24
+ /**
25
+ * The runtime API gave no usable answer: a transport failure, a timeout, a 5xx, a status the contract does not
26
+ * declare, or a body the SDK cannot read. `status` is the HTTP status when an answer arrived.
27
+ */
28
+ export class ResourcesUnavailableError extends Schema.TaggedError()('ResourcesUnavailableError', { message: Schema.String, status: Schema.optional(Schema.Number) }) {
26
29
  }
27
30
  //# sourceMappingURL=ResourcesErrors.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ResourcesErrors.js","sourceRoot":"","sources":["../src/ResourcesErrors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAEhC,gHAAgH;AAEhH,2HAA2H;AAC3H,MAAM,OAAO,qBAAsB,SAAQ,MAAM,CAAC,WAAW,EAAyB,CAAC,uBAAuB,EAAE;IAC9G,MAAM,EAAE,MAAM,CAAC,MAAM;IACrB,OAAO,EAAE,MAAM,CAAC,MAAM;CACvB,CAAC;CAAG;AAEL,+HAA+H;AAC/H,MAAM,OAAO,0BAA2B,SAAQ,MAAM,CAAC,WAAW,EAA8B,CAC9F,4BAA4B,EAC5B;IACE,MAAM,EAAE,MAAM,CAAC,MAAM;IACrB,OAAO,EAAE,MAAM,CAAC,MAAM;CACvB,CACF;CAAG;AAEJ,sJAAsJ;AACtJ,MAAM,OAAO,oBAAqB,SAAQ,MAAM,CAAC,WAAW,EAAwB,CAAC,sBAAsB,EAAE;IAC3G,MAAM,EAAE,MAAM,CAAC,MAAM;IACrB,OAAO,EAAE,MAAM,CAAC,MAAM;CACvB,CAAC;CAAG;AAEL,4IAA4I;AAC5I,MAAM,OAAO,0BAA2B,SAAQ,MAAM,CAAC,WAAW,EAA8B,CAC9F,4BAA4B,EAC5B,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,CAC3B;CAAG;AAEJ,mHAAmH;AACnH,MAAM,OAAO,yBAA0B,SAAQ,MAAM,CAAC,WAAW,EAA6B,CAC5F,2BAA2B,EAC3B,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,CAC3B;CAAG"}
1
+ {"version":3,"file":"ResourcesErrors.js","sourceRoot":"","sources":["../src/ResourcesErrors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAEhC,gHAAgH;AAEhH,2HAA2H;AAC3H,MAAM,OAAO,qBAAsB,SAAQ,MAAM,CAAC,WAAW,EAAyB,CAAC,uBAAuB,EAAE;IAC9G,MAAM,EAAE,MAAM,CAAC,MAAM;IACrB,OAAO,EAAE,MAAM,CAAC,MAAM;CACvB,CAAC;CAAG;AAEL,+HAA+H;AAC/H,MAAM,OAAO,0BAA2B,SAAQ,MAAM,CAAC,WAAW,EAA8B,CAC9F,4BAA4B,EAC5B;IACE,MAAM,EAAE,MAAM,CAAC,MAAM;IACrB,OAAO,EAAE,MAAM,CAAC,MAAM;CACvB,CACF;CAAG;AAEJ,sJAAsJ;AACtJ,MAAM,OAAO,oBAAqB,SAAQ,MAAM,CAAC,WAAW,EAAwB,CAAC,sBAAsB,EAAE;IAC3G,MAAM,EAAE,MAAM,CAAC,MAAM;IACrB,OAAO,EAAE,MAAM,CAAC,MAAM;CACvB,CAAC;CAAG;AAEL,4IAA4I;AAC5I,MAAM,OAAO,0BAA2B,SAAQ,MAAM,CAAC,WAAW,EAA8B,CAC9F,4BAA4B,EAC5B,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,CAC3B;CAAG;AAEJ;;;GAGG;AACH,MAAM,OAAO,yBAA0B,SAAQ,MAAM,CAAC,WAAW,EAA6B,CAC5F,2BAA2B,EAC3B,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CACnE;CAAG"}
@@ -1,10 +1,19 @@
1
1
  import { Effect } from 'effect';
2
2
  import { ResourcesUnauthorizedError } from './ResourcesErrors.js';
3
+ /** The provider published no usable token in time; the promise `env` reads it as an outage, as `@ontemper/resources` did. */
4
+ export declare const TOKEN_NOT_PUBLISHED = "Runtime resolver token provider did not publish a fresh token.";
5
+ /**
6
+ * Which token a read sends. `refreshWindow` waits for a token outside the refresh window: a database tunnel re-checks
7
+ * it every 2 s. `unexpired` sends any unexpired token at once and waits 2 s for an expired one, as the legacy
8
+ * resolver did, so a stalled provider costs a short wait and an outage instead of a 35 s stall.
9
+ */
10
+ export type RuntimeTokenPolicy = 'refreshWindow' | 'unexpired';
3
11
  export interface RuntimeTokens {
4
12
  /** The provider's token when it outlives the refresh window, otherwise the next one it publishes. */
5
13
  readonly current: Effect.Effect<string, ResourcesUnauthorizedError>;
6
14
  /** The first usable token other than the one the runtime API just refused. */
7
15
  readonly replacing: (refused: string) => Effect.Effect<string, ResourcesUnauthorizedError>;
8
16
  }
17
+ export declare const makeRuntimeTokensWith: (policy: RuntimeTokenPolicy) => Effect.Effect<RuntimeTokens>;
9
18
  export declare const makeRuntimeTokens: Effect.Effect<RuntimeTokens>;
10
19
  //# sourceMappingURL=ResourcesToken.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ResourcesToken.d.ts","sourceRoot":"","sources":["../src/ResourcesToken.ts"],"names":[],"mappings":"AACA,OAAO,EAAkC,MAAM,EAAsC,MAAM,QAAQ,CAAC;AACpG,OAAO,EAAE,0BAA0B,EAAE,MAAM,sBAAsB,CAAC;AAwElE,MAAM,WAAW,aAAa;IAC5B,qGAAqG;IACrG,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,0BAA0B,CAAC,CAAC;IACpE,8EAA8E;IAC9E,QAAQ,CAAC,SAAS,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,0BAA0B,CAAC,CAAC;CAC5F;AAED,eAAO,MAAM,iBAAiB,EAAE,MAAM,CAAC,MAAM,CAAC,aAAa,CAWzD,CAAC"}
1
+ {"version":3,"file":"ResourcesToken.d.ts","sourceRoot":"","sources":["../src/ResourcesToken.ts"],"names":[],"mappings":"AACA,OAAO,EAAkC,MAAM,EAAsC,MAAM,QAAQ,CAAC;AACpG,OAAO,EAAE,0BAA0B,EAAE,MAAM,sBAAsB,CAAC;AAElE,6HAA6H;AAC7H,eAAO,MAAM,mBAAmB,mEAAmE,CAAC;AAqBpG;;;;GAIG;AACH,MAAM,MAAM,kBAAkB,GAAG,eAAe,GAAG,WAAW,CAAC;AAoD/D,MAAM,WAAW,aAAa;IAC5B,qGAAqG;IACrG,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,0BAA0B,CAAC,CAAC;IACpE,8EAA8E;IAC9E,QAAQ,CAAC,SAAS,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,0BAA0B,CAAC,CAAC;CAC5F;AAED,eAAO,MAAM,qBAAqB,WAAY,kBAAkB,KAAG,MAAM,CAAC,MAAM,CAAC,aAAa,CAqB1F,CAAC;AAEL,eAAO,MAAM,iBAAiB,EAAE,MAAM,CAAC,MAAM,CAAC,aAAa,CAA0C,CAAC"}
@@ -1,6 +1,8 @@
1
1
  import { readFile } from 'node:fs/promises';
2
2
  import { Cache, Clock, Config, Duration, Effect, Option, Redacted, Schedule, Schema } from 'effect';
3
3
  import { ResourcesUnauthorizedError } from './ResourcesErrors.js';
4
+ /** The provider published no usable token in time; the promise `env` reads it as an outage, as `@ontemper/resources` did. */
5
+ export const TOKEN_NOT_PUBLISHED = 'Runtime resolver token provider did not publish a fresh token.';
4
6
  /** A token this close to `exp` could lapse mid-request, so it counts as spent. */
5
7
  const REFRESH_WINDOW_MS = 30_000;
6
8
  /** Providers republish well inside this: the k8s refresher every 30 s, the Firecracker host on every renewal. */
@@ -8,11 +10,13 @@ const PUBLISH_TIMEOUT = Duration.seconds(35);
8
10
  const POLL_INTERVAL = Duration.millis(100);
9
11
  const TokenExpiry = Schema.StringFromBase64Url.pipe(Schema.decodeTo(Schema.fromJsonString(Schema.Struct({ exp: Schema.Number }))));
10
12
  const decodeTokenExpiry = Schema.decodeUnknownOption(TokenExpiry);
11
- /** Only a JWT that outlives the refresh window is sent; one without `exp` never is, as in `@ontemper/resources`. */
12
- const outlivesRefreshWindow = (token, now) => Option.match(decodeTokenExpiry(token.split('.')[1]), {
13
+ /** Whether a JWT outlives `marginMs` from `now`; one without `exp` never does, as in `@ontemper/resources`. */
14
+ const outlives = (token, now, marginMs) => Option.match(decodeTokenExpiry(token.split('.')[1]), {
13
15
  onNone: () => false,
14
- onSome: ({ exp }) => exp * 1000 - now > REFRESH_WINDOW_MS,
16
+ onSome: ({ exp }) => exp * 1000 - now > marginMs,
15
17
  });
18
+ const outlivesRefreshWindow = (token, now) => outlives(token, now, REFRESH_WINDOW_MS);
19
+ const EXPIRED_TOKEN_WAIT = Duration.seconds(2);
16
20
  const TokenSources = Config.all({
17
21
  file: Config.option(Config.String('UNNBOUND_RUNTIME_TOKEN_FILE')),
18
22
  token: Config.option(Config.Redacted('UNNBOUND_RUNTIME_TOKEN')),
@@ -47,19 +51,28 @@ const awaitPublished = (refused) => Effect.gen(function* () {
47
51
  // `until` stops only on Some; stable Effect no longer narrows the repeated value to it.
48
52
  Effect.map((published) => Option.getOrThrow(published)), Effect.timeoutOrElse({
49
53
  duration: PUBLISH_TIMEOUT,
50
- orElse: () => Effect.fail(new ResourcesUnauthorizedError({ message: 'Runtime resolver token provider did not publish a fresh token.' })),
54
+ orElse: () => Effect.fail(new ResourcesUnauthorizedError({ message: TOKEN_NOT_PUBLISHED })),
51
55
  }));
52
- export const makeRuntimeTokens = Effect.gen(function* () {
56
+ export const makeRuntimeTokensWith = (policy) => Effect.gen(function* () {
53
57
  // Waiters on one refused token share a single poll; a refusal of a newer token starts its own.
54
58
  const published = yield* Cache.makeWith(awaitPublished, { capacity: 8, timeToLive: () => Duration.zero });
55
59
  const replacing = (refused) => Cache.get(published, refused);
56
60
  const current = Effect.gen(function* () {
57
61
  const token = yield* readToken;
58
62
  const now = yield* Clock.currentTimeMillis;
59
- if (Option.isSome(token) && outlivesRefreshWindow(token.value, now))
63
+ if (Option.isNone(token))
64
+ return yield* replacing('');
65
+ if (policy === 'refreshWindow') {
66
+ return outlivesRefreshWindow(token.value, now) ? token.value : yield* replacing(token.value);
67
+ }
68
+ if (outlives(token.value, now, 0))
60
69
  return token.value;
61
- return yield* replacing(Option.getOrElse(token, () => ''));
70
+ return yield* replacing(token.value).pipe(Effect.timeoutOrElse({
71
+ duration: EXPIRED_TOKEN_WAIT,
72
+ orElse: () => Effect.fail(new ResourcesUnauthorizedError({ message: TOKEN_NOT_PUBLISHED })),
73
+ }));
62
74
  });
63
75
  return { current, replacing };
64
76
  });
77
+ export const makeRuntimeTokens = makeRuntimeTokensWith('refreshWindow');
65
78
  //# sourceMappingURL=ResourcesToken.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ResourcesToken.js","sourceRoot":"","sources":["../src/ResourcesToken.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ResourcesToken.js","sourceRoot":"","sources":["../src/ResourcesToken.ts"],"names":[],"mappings":"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"}
@@ -2,20 +2,35 @@ import { Context, Effect, Layer, Redacted, Schema } from 'effect';
2
2
  import { HttpClient } from 'effect/http';
3
3
  import { type RuntimeInspectedResourceSchema, type SelectResourceRuntimeInputSchema } from './Contract/RuntimeApi.js';
4
4
  import { InvalidResourceError, ResourceNotFoundError, ResourceNotSelectableError, ResourcesUnauthorizedError, ResourcesUnavailableError } from './ResourcesErrors.js';
5
+ import { type RuntimeTokenPolicy } from './ResourcesToken.js';
5
6
  /** Finds the one record of a type whose `x-selectable` field equals the value a tenant presented. */
6
7
  export type ResourceSelector = typeof SelectResourceRuntimeInputSchema.Type;
7
- export type ReadError = ResourceNotFoundError | ResourcesUnauthorizedError | ResourcesUnavailableError;
8
+ export type ReadError = ResourceNotFoundError | InvalidResourceError | ResourcesUnauthorizedError | ResourcesUnavailableError;
8
9
  /** The resolver's answer to `inspect`: literal fields and metadata, never a secret. */
9
10
  export type InspectedResource = typeof RuntimeInspectedResourceSchema.Type;
10
- /** Uncached runtime reads for the PostgreSQL subpath: a record, its metadata, and the current runtime token. */
11
+ /** Uncached runtime reads and the current runtime token; the promise `env` sends any unexpired token, as legacy did. */
12
+ export declare const runtimeResourceClient: (policy: RuntimeTokenPolicy) => Effect.Effect<{
13
+ /**
14
+ * The token for one database tunnel; re-read on every call, never cached by the caller. The tunnel re-checks it
15
+ * every 2 s, so a token in its 30 s refresh window would end the connection when it expires.
16
+ */
17
+ tunnelToken: Effect.Effect<string, ResourcesUnauthorizedError, never>;
18
+ variable: (key: string) => Effect.Effect<string, ReadError, never>;
19
+ resolve: (key: string) => Effect.Effect<Schema.Json, ReadError, never>;
20
+ inspect: (key: string) => Effect.Effect<InspectedResource, ReadError>;
21
+ select: (selector: ResourceSelector) => Effect.Effect<string, ResourceNotSelectableError | ReadError, never>;
22
+ }, never, HttpClient.HttpClient>;
23
+ /** The `./postgresql` client: tunnel tokens must outlive their refresh window. */
11
24
  export declare const makeRuntimeResourceClient: Effect.Effect<{
12
25
  /**
13
26
  * The token for one database tunnel; re-read on every call, never cached by the caller. The tunnel re-checks it
14
27
  * every 2 s, so a token in its 30 s refresh window would end the connection when it expires.
15
28
  */
16
29
  tunnelToken: Effect.Effect<string, ResourcesUnauthorizedError, never>;
17
- resolve: (key: string) => Effect.Effect<Schema.Json, InvalidResourceError | ReadError, never>;
30
+ variable: (key: string) => Effect.Effect<string, ReadError, never>;
31
+ resolve: (key: string) => Effect.Effect<Schema.Json, ReadError, never>;
18
32
  inspect: (key: string) => Effect.Effect<InspectedResource, ReadError>;
33
+ select: (selector: ResourceSelector) => Effect.Effect<string, ResourceNotSelectableError | ReadError, never>;
19
34
  }, never, HttpClient.HttpClient>;
20
35
  /** What declared resources read through: the Temper runtime API in production, fixed values in tests. */
21
36
  export interface ResourceReader {
@@ -1 +1 @@
1
- {"version":3,"file":"RuntimeResources.d.ts","sourceRoot":"","sources":["../src/RuntimeResources.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,OAAO,EAAY,MAAM,EAAQ,KAAK,EAAU,QAAQ,EAAE,MAAM,EAAc,MAAM,QAAQ,CAAC;AAErH,OAAO,EAAE,UAAU,EAA2C,MAAM,aAAa,CAAC;AAElF,OAAO,EAQL,KAAK,8BAA8B,EACnC,KAAK,gCAAgC,EACtC,MAAM,0BAA0B,CAAC;AAElC,OAAO,EACL,oBAAoB,EACpB,qBAAqB,EACrB,0BAA0B,EAC1B,0BAA0B,EAC1B,yBAAyB,EAC1B,MAAM,sBAAsB,CAAC;AAY9B,qGAAqG;AACrG,MAAM,MAAM,gBAAgB,GAAG,OAAO,gCAAgC,CAAC,IAAI,CAAC;AAE5E,MAAM,MAAM,SAAS,GAAG,qBAAqB,GAAG,0BAA0B,GAAG,yBAAyB,CAAC;AA0BvG,uFAAuF;AACvF,MAAM,MAAM,iBAAiB,GAAG,OAAO,8BAA8B,CAAC,IAAI,CAAC;AAoG3E,gHAAgH;AAChH,eAAO,MAAM,yBAAyB;IACpC;;;OAGG;;mBAEY,MAAM;mBASN,MAAM,KAAG,MAAM,CAAC,MAAM,CAAC,iBAAiB,EAAE,SAAS,CAAC;gCAQlE,CAAC;AAsDJ,yGAAyG;AACzG,MAAM,WAAW,cAAc;IAC7B,wGAAwG;IACxG,QAAQ,CAAC,QAAQ,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,CAAC,CAAC;IACxF,uEAAuE;IACvE,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,MAAM,EAAE,CACf,QAAQ,EAAE,gBAAgB,KACvB,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,GAAG,0BAA0B,GAAG,oBAAoB,CAAC,CAAC;CAC3F;;AAED;;;GAGG;AACH,qBAAa,gBAAiB,SAAQ,qBAErC;IAEC,MAAM,CAAC,QAAQ,CAAC,KAAK,8DAAiD;CACvE"}
1
+ {"version":3,"file":"RuntimeResources.d.ts","sourceRoot":"","sources":["../src/RuntimeResources.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,OAAO,EAAY,MAAM,EAAQ,KAAK,EAAU,QAAQ,EAAE,MAAM,EAAc,MAAM,QAAQ,CAAC;AAErH,OAAO,EAAE,UAAU,EAA2C,MAAM,aAAa,CAAC;AAElF,OAAO,EAQL,KAAK,8BAA8B,EACnC,KAAK,gCAAgC,EACtC,MAAM,0BAA0B,CAAC;AAElC,OAAO,EACL,oBAAoB,EACpB,qBAAqB,EACrB,0BAA0B,EAC1B,0BAA0B,EAC1B,yBAAyB,EAC1B,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAyB,KAAK,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAWrF,qGAAqG;AACrG,MAAM,MAAM,gBAAgB,GAAG,OAAO,gCAAgC,CAAC,IAAI,CAAC;AAE5E,MAAM,MAAM,SAAS,GACjB,qBAAqB,GACrB,oBAAoB,GACpB,0BAA0B,GAC1B,yBAAyB,CAAC;AA0B9B,uFAAuF;AACvF,MAAM,MAAM,iBAAiB,GAAG,OAAO,8BAA8B,CAAC,IAAI,CAAC;AAuJ3E,wHAAwH;AACxH,eAAO,MAAM,qBAAqB,WAAY,kBAAkB;IAI1D;;;OAGG;;oBAEa,MAAM;mBACP,MAAM;mBACN,MAAM,KAAG,MAAM,CAAC,MAAM,CAAC,iBAAiB,EAAE,SAAS,CAAC;uBAChD,gBAAgB;gCAErC,CAAC;AAEL,kFAAkF;AAClF,eAAO,MAAM,yBAAyB;IAbhC;;;OAGG;;oBAEa,MAAM;mBACP,MAAM;mBACN,MAAM,KAAG,MAAM,CAAC,MAAM,CAAC,iBAAiB,EAAE,SAAS,CAAC;uBAChD,gBAAgB;gCAKsC,CAAC;AA8BhF,yGAAyG;AACzG,MAAM,WAAW,cAAc;IAC7B,wGAAwG;IACxG,QAAQ,CAAC,QAAQ,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,CAAC,CAAC;IACxF,uEAAuE;IACvE,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,MAAM,EAAE,CACf,QAAQ,EAAE,gBAAgB,KACvB,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,GAAG,0BAA0B,GAAG,oBAAoB,CAAC,CAAC;CAC3F;;AAED;;;GAGG;AACH,qBAAa,gBAAiB,SAAQ,qBAErC;IAEC,MAAM,CAAC,QAAQ,CAAC,KAAK,8DAAiD;CACvE"}
@@ -5,7 +5,7 @@ import { HttpApiClient } from 'effect/http-api';
5
5
  import { ResourcesRuntimeApi, } from './Contract/RuntimeApi.js';
6
6
  import { registerSecrets } from './Redaction.js';
7
7
  import { InvalidResourceError, ResourceNotFoundError, ResourceNotSelectableError, ResourcesUnauthorizedError, ResourcesUnavailableError, } from './ResourcesErrors.js';
8
- import { makeRuntimeTokens } from './ResourcesToken.js';
8
+ import { makeRuntimeTokensWith } from './ResourcesToken.js';
9
9
  // Resolved values are live configuration: an edit, or a revoked secret, reaches a warm process within this window.
10
10
  const CACHE_TTL = Duration.seconds(30);
11
11
  // Bounds memory for a workflow that selects across many tenants; the least recently read entry goes first.
@@ -27,8 +27,8 @@ const statusOfRuntimeError = {
27
27
  RuntimeResourcesUnavailableError: 503,
28
28
  };
29
29
  // One authenticated runtime API caller; `RuntimeResources` and the `@temper/workflow/resources` pools share it.
30
- const makeRuntimeCaller = Effect.gen(function* () {
31
- const tokens = yield* makeRuntimeTokens;
30
+ const runtimeCaller = (policy) => Effect.gen(function* () {
31
+ const tokens = yield* makeRuntimeTokensWith(policy);
32
32
  // Each attempt's scope owns its request: leaving the scope aborts it, so no response outlives its attempt.
33
33
  const platform = HttpClient.withScope(yield* HttpClient.HttpClient).pipe(HttpClient.mapRequestEffect((request) => Config.NonEmptyString('UNNBOUND_API_URL').pipe(Effect.map((apiUrl) => HttpClientRequest.prependUrl(request, apiUrl)), Effect.mapError(() => new ApiUrlMissing()))));
34
34
  // A 401's body is the fixed `Unauthorized`; failing before it is read lets a refused attempt end at once.
@@ -46,9 +46,13 @@ const makeRuntimeCaller = Effect.gen(function* () {
46
46
  case 'TokenRefused':
47
47
  return new ResourcesUnauthorizedError({ message: failed('401 Unauthorized') });
48
48
  case 'HttpClientError':
49
- return new ResourcesUnavailableError({
50
- message: failed(error.response === undefined ? error.message : `${error.response.status}`),
51
- });
49
+ // An undeclared 4xx is still an answer; the promise `env` drops its cached value on it, as legacy did.
50
+ return error.response === undefined
51
+ ? new ResourcesUnavailableError({ message: failed(error.message) })
52
+ : new ResourcesUnavailableError({
53
+ message: failed(`${error.response.status}`),
54
+ status: error.response.status,
55
+ });
52
56
  case 'SchemaError':
53
57
  return new ResourcesUnavailableError({ message: failed('unreadable answer') });
54
58
  default: {
@@ -58,7 +62,10 @@ const makeRuntimeCaller = Effect.gen(function* () {
58
62
  return new ResourcesUnauthorizedError({ message });
59
63
  if (status === 404)
60
64
  return new ResourceNotFoundError({ target, message });
61
- return refuse(status, message) ?? new ResourcesUnavailableError({ message });
65
+ return (refuse(status, message) ??
66
+ (status >= 400 && status < 500
67
+ ? new InvalidResourceError({ target, message })
68
+ : new ResourcesUnavailableError({ message })));
62
69
  }
63
70
  }
64
71
  };
@@ -76,41 +83,58 @@ const makeRuntimeCaller = Effect.gen(function* () {
76
83
  const first = yield* attempt(client.resourcesRuntime, token).pipe(Effect.map(Option.some), Effect.catchTag('TokenRefused', () => Effect.succeedNone));
77
84
  if (Option.isSome(first))
78
85
  return first.value;
79
- return yield* attempt(client.resourcesRuntime, yield* tokens.replacing(token));
86
+ // A refused token stays a refusal if its provider cannot replace it; a cached credential must never outlive it.
87
+ const replacement = yield* tokens.replacing(token).pipe(Effect.mapError(() => new TokenRefused()));
88
+ return yield* attempt(client.resourcesRuntime, replacement);
80
89
  }).pipe(Effect.catchIf((error) => error._tag !== 'ResourcesUnauthorizedError' && error._tag !== 'ResourcesUnavailableError', (error) => Effect.fail(toReadError(error))));
81
90
  };
82
91
  return { tokens, call };
83
92
  });
84
93
  // Registers the answer's secrets in the caller's context, so a cached read masks them like a fresh one.
85
94
  const unwrap = (read) => read.pipe(Effect.tap(({ redactionMasks }) => registerSecrets(redactionMasks ?? [])), Effect.map(({ value }) => value));
86
- /** Uncached runtime reads for the PostgreSQL subpath: a record, its metadata, and the current runtime token. */
87
- export const makeRuntimeResourceClient = Effect.map(makeRuntimeCaller, ({ tokens, call }) => ({
88
- /**
89
- * The token for one database tunnel; re-read on every call, never cached by the caller. The tunnel re-checks it
90
- * every 2 s, so a token in its 30 s refresh window would end the connection when it expires.
91
- */
92
- tunnelToken: tokens.current,
93
- resolve: (key) => unwrap(call('resolveResource', `key ${key}`, (api, authorization) => api.resolveResource({ headers: { authorization }, payload: { key } }), (status, message) => (status === 409 ? new InvalidResourceError({ target: `key ${key}`, message }) : undefined))),
94
- inspect: (key) => unwrap(call('inspectResource', `key ${key}`, (api, authorization) => api.inspectResource({ headers: { authorization }, payload: { key } }))),
95
- }));
96
- const ResourcesMake = Effect.gen(function* () {
97
- const { call } = yield* makeRuntimeCaller;
98
- const cache = (lookup) => Cache.makeWith(lookup, {
99
- capacity: CACHE_CAPACITY,
100
- // A failure is not kept: the next read asks the resolver again.
101
- timeToLive: (exit) => (Exit.isSuccess(exit) ? CACHE_TTL : Duration.zero),
102
- });
103
- const variables = yield* cache((key) => call('resolveVariable', `key ${key}`, (api, authorization) => api.resolveVariable({ headers: { authorization }, payload: { key } })));
104
- const values = yield* cache((key) => call('resolveResource', `key ${key}`, (api, authorization) => api.resolveResource({ headers: { authorization }, payload: { key } }), (status, message) => (status === 409 ? new InvalidResourceError({ target: `key ${key}`, message }) : undefined)));
105
- // Keyed by value: `{a,b}` and `{b,a}` share one entry, and each tenant's presented value gets its own.
106
- const selections = yield* cache((selector) => {
95
+ const makeRuntimeCaller = runtimeCaller('refreshWindow');
96
+ // The four runtime reads, uncached; each answer still carries its `redactionMasks`.
97
+ const runtimeReads = (call) => ({
98
+ variable: (key) => call('resolveVariable', `key ${key}`, (api, authorization) => api.resolveVariable({ headers: { authorization }, payload: { key } })),
99
+ resolve: (key) => call('resolveResource', `key ${key}`, (api, authorization) => api.resolveResource({ headers: { authorization }, payload: { key } }), (status, message) => (status === 409 ? new InvalidResourceError({ target: `key ${key}`, message }) : undefined)),
100
+ inspect: (key) => call('inspectResource', `key ${key}`, (api, authorization) => api.inspectResource({ headers: { authorization }, payload: { key } })),
101
+ select: (selector) => {
107
102
  const target = `${selector.resourceTypeKey} matching ${Object.keys(selector.match).join(', ')}`;
108
103
  return call('selectResource', target, (api, authorization) => api.selectResource({ headers: { authorization }, payload: selector }), (status, message) => status === 400
109
104
  ? new ResourceNotSelectableError({ target, message })
110
105
  : status === 409
111
106
  ? new InvalidResourceError({ target, message })
112
107
  : undefined);
108
+ },
109
+ });
110
+ /** Uncached runtime reads and the current runtime token; the promise `env` sends any unexpired token, as legacy did. */
111
+ export const runtimeResourceClient = (policy) => Effect.map(runtimeCaller(policy), ({ tokens, call }) => {
112
+ const reads = runtimeReads(call);
113
+ return {
114
+ /**
115
+ * The token for one database tunnel; re-read on every call, never cached by the caller. The tunnel re-checks it
116
+ * every 2 s, so a token in its 30 s refresh window would end the connection when it expires.
117
+ */
118
+ tunnelToken: tokens.current,
119
+ variable: (key) => unwrap(reads.variable(key)),
120
+ resolve: (key) => unwrap(reads.resolve(key)),
121
+ inspect: (key) => unwrap(reads.inspect(key)),
122
+ select: (selector) => Effect.map(unwrap(reads.select(selector)), (selected) => selected.key),
123
+ };
124
+ });
125
+ /** The `./postgresql` client: tunnel tokens must outlive their refresh window. */
126
+ export const makeRuntimeResourceClient = runtimeResourceClient('refreshWindow');
127
+ const ResourcesMake = Effect.gen(function* () {
128
+ const reads = runtimeReads((yield* makeRuntimeCaller).call);
129
+ const cache = (lookup) => Cache.makeWith(lookup, {
130
+ capacity: CACHE_CAPACITY,
131
+ // A failure is not kept: the next read asks the resolver again.
132
+ timeToLive: (exit) => (Exit.isSuccess(exit) ? CACHE_TTL : Duration.zero),
113
133
  });
134
+ const variables = yield* cache(reads.variable);
135
+ const values = yield* cache(reads.resolve);
136
+ // Keyed by value: `{a,b}` and `{b,a}` share one entry, and each tenant's presented value gets its own.
137
+ const selections = yield* cache(reads.select);
114
138
  return RuntimeResources.of({
115
139
  variable: (key) => Effect.map(unwrap(Cache.get(variables, key)), Redacted.make),
116
140
  // Each caller gets its own copy: the cached value is shared across requests for 30 s.