@rexezuge/runtime 1.0.6 → 1.0.8

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 CHANGED
@@ -17,7 +17,9 @@ Minimal by design: factory + singleton scopes, branded tokens for inference, not
17
17
  ```ts
18
18
  import { Container, type Token } from '@rexezuge/runtime';
19
19
 
20
- interface Mailer { send(to: string): Promise<void> }
20
+ interface Mailer {
21
+ send(to: string): Promise<void>;
22
+ }
21
23
  const MailerToken: Token<Mailer> = 'Mailer';
22
24
 
23
25
  const root = new Container().bindValue(MailerToken, new SmtpMailer());
@@ -47,12 +49,12 @@ for (const warning of config.validate()) console.warn(warning); // warnings, nev
47
49
 
48
50
  ## 3. Worker bases
49
51
 
50
- | Base | Extends for |
51
- | --- | --- |
52
- | `AbstractEntrypointWorker` | HTTP + cron entrypoints (`onRequest` / `onScheduled`) |
53
- | `AbstractDurableObjectWorker` | Durable Object workers |
54
- | `AbstractQueueWorker` | Queue consumers |
55
- | `AbstractWorkflowWorker` | Workflows |
52
+ | Base | Extends for |
53
+ | ----------------------------- | ----------------------------------------------------- |
54
+ | `AbstractEntrypointWorker` | HTTP + cron entrypoints (`onRequest` / `onScheduled`) |
55
+ | `AbstractDurableObjectWorker` | Durable Object workers |
56
+ | `AbstractQueueWorker` | Queue consumers |
57
+ | `AbstractWorkflowWorker` | Workflows |
56
58
 
57
59
  `fetch()` / `scheduled()` log-and-contain: an unhandled throw is a 500 response or a logged cron failure, never a platform crash. There is deliberately no `/__scheduled` HTTP branch — cron runs through the wrangler `triggers.crons` binding. The structural `WorkerExecutionContext` / `WorkerScheduledController` types mean this package typechecks without `@cloudflare/workers-types`.
58
60
 
@@ -1 +1 @@
1
- {"version":3,"file":"RequestScope.d.ts","sourceRoot":"","sources":["../../src/di/RequestScope.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAE7C;;;;;;;;GAQG;AACH,UAAU,aAAa;IACrB,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;IAC1B,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI,CAAC;IACvC,QAAQ,CAAC,GAAG,EAAE,OAAO,CAAC;CACvB;AAID,iBAAS,eAAe,CAAC,CAAC,EAAE,aAAa,EAAE,KAAK,EAAE,SAAS,GAAG,IAAI,CAEjE;AAED;;;;;;GAMG;AACH,iBAAS,eAAe,CAAC,CAAC,EAAE;IAC1B,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;IAC1B,GAAG,CAAC,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI,CAAC;IACxC,QAAQ,CAAC,GAAG,EAAE,OAAO,CAAC;CACvB,GAAG,aAAa,CAEhB;AAED,iBAAS,eAAe,CAAC,CAAC,EAAE,aAAa,GAAG,SAAS,CAIpD;AAED,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,eAAe,EAAE,CAAC;AAC7D,YAAY,EAAE,aAAa,EAAE,CAAC"}
1
+ {"version":3,"file":"RequestScope.d.ts","sourceRoot":"","sources":["../../src/di/RequestScope.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAE7C;;;;;;;;GAQG;AACH,UAAU,aAAa;IACrB,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;IAC1B,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI,CAAC;IACvC,QAAQ,CAAC,GAAG,EAAE,OAAO,CAAC;CACvB;AAID,iBAAS,eAAe,CAAC,CAAC,EAAE,aAAa,EAAE,KAAK,EAAE,SAAS,GAAG,IAAI,CAEjE;AAED;;;;;;GAMG;AACH,iBAAS,eAAe,CAAC,CAAC,EAAE;IAAE,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;IAAC,GAAG,CAAC,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI,CAAC;IAAC,QAAQ,CAAC,GAAG,EAAE,OAAO,CAAA;CAAE,GAAG,aAAa,CAExI;AAED,iBAAS,eAAe,CAAC,CAAC,EAAE,aAAa,GAAG,SAAS,CAIpD;AAED,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,eAAe,EAAE,CAAC;AAC7D,YAAY,EAAE,aAAa,EAAE,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"RequestScope.js","sourceRoot":"","sources":["../../src/di/RequestScope.ts"],"names":[],"mappings":"AAiBA,MAAM,SAAS,GAAG,YAAY,CAAC;AAE/B,SAAS,eAAe,CAAC,CAAgB,EAAE,KAAgB;IACzD,CAAC,CAAC,GAAG,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;AAC1B,CAAC;AAED;;;;;;GAMG;AACH,SAAS,eAAe,CAAC,CAIxB;IACC,OAAO,CAA6B,CAAC;AACvC,CAAC;AAED,SAAS,eAAe,CAAC,CAAgB;IACvC,MAAM,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC,SAAS,CAA0B,CAAC;IACxD,IAAI,CAAC,KAAK;QAAE,MAAM,IAAI,KAAK,CAAC,wEAAwE,CAAC,CAAC;IACtG,OAAO,KAAK,CAAC;AACf,CAAC;AAED,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,eAAe,EAAE,CAAC","sourcesContent":["import type { Container } from './Container';\n\n/**\n * Single-scope-per-request helper.\n *\n * Converged verbatim from `backend-runtime/src/di/RequestScope.ts` (identical in\n * all nine repos). Middleware creates one `Container` per request and stores it\n * on the request context; handlers resolve via `getRequestScope(c)` instead of\n * building a scope per handler — which minted N scopes per request and broke\n * singleton memoization.\n */\ninterface ScopedContext {\n get(key: string): unknown;\n set(key: string, value: unknown): void;\n readonly env: unknown;\n}\n\nconst SCOPE_KEY = '__kitScope';\n\nfunction setRequestScope(c: ScopedContext, scope: Container): void {\n c.set(SCOPE_KEY, scope);\n}\n\n/**\n * Structural adapter for framework contexts.\n *\n * Hono's `Context.get` overloads are not assignable to `ScopedContext['get']`,\n * so call sites used `c as never`. Centralize that single unsafe cast here —\n * one audited location instead of many scattered ones.\n */\nfunction asScopedContext(c: {\n get(key: string): unknown;\n set?(key: string, value: unknown): void;\n readonly env: unknown;\n}): ScopedContext {\n return c as unknown as ScopedContext;\n}\n\nfunction getRequestScope(c: ScopedContext): Container {\n const scope = c.get(SCOPE_KEY) as Container | undefined;\n if (!scope) throw new Error('Request scope is not set. Register the scope middleware before routes.');\n return scope;\n}\n\nexport { setRequestScope, getRequestScope, asScopedContext };\nexport type { ScopedContext };\n"]}
1
+ {"version":3,"file":"RequestScope.js","sourceRoot":"","sources":["../../src/di/RequestScope.ts"],"names":[],"mappings":"AAiBA,MAAM,SAAS,GAAG,YAAY,CAAC;AAE/B,SAAS,eAAe,CAAC,CAAgB,EAAE,KAAgB;IACzD,CAAC,CAAC,GAAG,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;AAC1B,CAAC;AAED;;;;;;GAMG;AACH,SAAS,eAAe,CAAC,CAAgG;IACvH,OAAO,CAA6B,CAAC;AACvC,CAAC;AAED,SAAS,eAAe,CAAC,CAAgB;IACvC,MAAM,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC,SAAS,CAA0B,CAAC;IACxD,IAAI,CAAC,KAAK;QAAE,MAAM,IAAI,KAAK,CAAC,wEAAwE,CAAC,CAAC;IACtG,OAAO,KAAK,CAAC;AACf,CAAC;AAED,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,eAAe,EAAE,CAAC","sourcesContent":["import type { Container } from './Container';\n\n/**\n * Single-scope-per-request helper.\n *\n * Converged verbatim from `backend-runtime/src/di/RequestScope.ts` (identical in\n * all nine repos). Middleware creates one `Container` per request and stores it\n * on the request context; handlers resolve via `getRequestScope(c)` instead of\n * building a scope per handler — which minted N scopes per request and broke\n * singleton memoization.\n */\ninterface ScopedContext {\n get(key: string): unknown;\n set(key: string, value: unknown): void;\n readonly env: unknown;\n}\n\nconst SCOPE_KEY = '__kitScope';\n\nfunction setRequestScope(c: ScopedContext, scope: Container): void {\n c.set(SCOPE_KEY, scope);\n}\n\n/**\n * Structural adapter for framework contexts.\n *\n * Hono's `Context.get` overloads are not assignable to `ScopedContext['get']`,\n * so call sites used `c as never`. Centralize that single unsafe cast here —\n * one audited location instead of many scattered ones.\n */\nfunction asScopedContext(c: { get(key: string): unknown; set?(key: string, value: unknown): void; readonly env: unknown }): ScopedContext {\n return c as unknown as ScopedContext;\n}\n\nfunction getRequestScope(c: ScopedContext): Container {\n const scope = c.get(SCOPE_KEY) as Container | undefined;\n if (!scope) throw new Error('Request scope is not set. Register the scope middleware before routes.');\n return scope;\n}\n\nexport { setRequestScope, getRequestScope, asScopedContext };\nexport type { ScopedContext };\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"KvCache.d.ts","sourceRoot":"","sources":["../../src/kv/KvCache.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"KvCache.d.ts","sourceRoot":"","sources":["../../src/kv/KvCache.ts"],"names":[],"mappings":"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"}
@@ -184,8 +184,7 @@ class KvCache {
184
184
  // the caller sees a count indistinguishable from a complete purge. A
185
185
  // write-invalidation that silently under-purges serves pre-write bytes
186
186
  // for a whole TTL while reporting success, so this is never silent.
187
- logger.warn(`KV purge for ${domain} hit the ${PURGE_MAX_PAGES * PURGE_LIST_LIMIT}-key page cap; ` +
188
- `at least one key may survive invalidation`);
187
+ logger.warn(`KV purge for ${domain} hit the ${PURGE_MAX_PAGES * PURGE_LIST_LIMIT}-key page cap; ` + `at least one key may survive invalidation`);
189
188
  return deleted;
190
189
  }
191
190
  catch (error) {
@@ -1 +1 @@
1
- {"version":3,"file":"KvCache.js","sourceRoot":"","sources":["../../src/kv/KvCache.ts"],"names":[],"mappings":"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","sourcesContent":["import { createLogger } from '../logger';\nimport { KV_DOMAINS, buildKvKey, clampTtl, utf8ByteLength } from './KvDomains';\nimport type { KvDomainName } from './KvDomains';\n\n/**\n * `KvCache` — typed facade over the single `CACHE` KV binding.\n *\n * Converged from `backend-runtime/src/kv/KvCache.ts`, identical in the four\n * repos that cache through KV. Semantics are fail-soft by design: reads return\n * `null` on miss, missing binding, or backend error; writes return `false`\n * when skipped (no binding, oversize value, backend error) and `true` when\n * stored. Callers treat KV as a pure optimization — D1/DO stay authoritative.\n */\n\nconst logger = createLogger('KvCache');\n\ninterface KvListPage {\n keys: Array<{ name: string }>;\n list_complete: boolean;\n cursor?: string;\n}\n\ninterface KvGetWithMetadataResult {\n value: string | ArrayBuffer | null;\n metadata: unknown;\n}\n\ninterface KvNamespaceLike {\n get(key: string): Promise<string | null>;\n get(key: string, type: 'text'): Promise<string | null>;\n get(key: string, type: 'arrayBuffer'): Promise<ArrayBuffer | null>;\n getWithMetadata?(key: string, type: 'arrayBuffer'): Promise<KvGetWithMetadataResult>;\n put(key: string, value: string | ArrayBuffer, options?: { expirationTtl?: number; metadata?: unknown }): Promise<void>;\n delete(key: string): Promise<unknown>;\n list(options: { prefix: string; limit?: number; cursor?: string }): Promise<KvListPage>;\n}\n\ninterface KvPutOptions {\n ttlSeconds?: number;\n}\n\ninterface KvFileMetadata {\n etag: string;\n contentType: string | null;\n}\n\ninterface KvBinaryEntry {\n bytes: Uint8Array;\n metadata: KvFileMetadata;\n}\n\nconst PURGE_LIST_LIMIT = 1000;\nconst PURGE_MAX_PAGES = 10;\n\nclass KvCache {\n public constructor(private readonly namespace?: KvNamespaceLike | null) {}\n\n public get available(): boolean {\n return !!this.namespace;\n }\n\n public async getText(domain: KvDomainName, parts: readonly string[]): Promise<string | null> {\n const ns = this.namespace;\n if (!ns) return null;\n try {\n return await ns.get(buildKvKey(domain, parts));\n } catch (error) {\n logger.debug(`KV get failed for ${domain}: ${error instanceof Error ? error.message : String(error)}`);\n return null;\n }\n }\n\n public async putText(domain: KvDomainName, parts: readonly string[], value: string, options?: KvPutOptions): Promise<boolean> {\n const ns = this.namespace;\n if (!ns) return false;\n // No unknown-domain check: `buildKvKey` below throws for one, and the\n // return type has never been able to express that. A silent `false` here\n // would have made an unknown domain look like a namespace miss.\n const def = KV_DOMAINS[domain];\n if (utf8ByteLength(value) > def.maxValueBytes) {\n logger.debug(`KV put skipped for ${domain}: value exceeds ${def.maxValueBytes} bytes.`);\n return false;\n }\n try {\n const ttl = clampTtl(options?.ttlSeconds, domain);\n await ns.put(buildKvKey(domain, parts), value, { expirationTtl: ttl });\n return true;\n } catch (error) {\n logger.debug(`KV put failed for ${domain}: ${error instanceof Error ? error.message : String(error)}`);\n return false;\n }\n }\n\n public async getJson<T>(domain: KvDomainName, parts: readonly string[]): Promise<T | null> {\n const raw = await this.getText(domain, parts);\n if (raw === null) return null;\n try {\n return JSON.parse(raw) as T;\n } catch {\n return null;\n }\n }\n\n public async putJson(domain: KvDomainName, parts: readonly string[], value: unknown, options?: KvPutOptions): Promise<boolean> {\n let raw: unknown;\n try {\n raw = JSON.stringify(value);\n } catch {\n return false;\n }\n return typeof raw === 'string' && this.putText(domain, parts, raw, options);\n }\n\n /**\n * Binary read for the `asset` domain: value bytes plus `{etag, contentType}`\n * KV metadata in a single entry. Legacy base64-JSON entries carry no metadata\n * and read as a miss here — the caller falls back to `getJson` for one TTL\n * window rather than this layer knowing the legacy shape.\n */\n public async getBinary(domain: KvDomainName, parts: readonly string[]): Promise<KvBinaryEntry | null> {\n const ns = this.namespace;\n if (!ns || typeof ns.getWithMetadata !== 'function') return null;\n try {\n const res = await ns.getWithMetadata(buildKvKey(domain, parts), 'arrayBuffer');\n if (!res || res.value == null) return null;\n const value: unknown = res.value;\n let bytes: Uint8Array | null = null;\n if (value instanceof ArrayBuffer) {\n bytes = new Uint8Array(value.slice(0));\n } else if (value instanceof Uint8Array) {\n bytes = value.slice();\n } else if (typeof value === 'string') {\n bytes = new TextEncoder().encode(value);\n }\n if (!bytes) return null;\n const meta = res.metadata as { etag?: unknown; contentType?: unknown } | null | undefined;\n if (typeof meta !== 'object' || meta === null || typeof meta.etag !== 'string' || meta.etag === '') return null;\n return { bytes, metadata: { etag: meta.etag, contentType: typeof meta.contentType === 'string' ? meta.contentType : null } };\n } catch (error) {\n logger.debug(`KV getBinary failed for ${domain}: ${error instanceof Error ? error.message : String(error)}`);\n return null;\n }\n }\n\n /**\n * Binary write for the `asset` domain. Size is enforced on raw bytes (no\n * base64 inflation) and failures stay fail-soft like `putText`.\n */\n public async putBinary(\n domain: KvDomainName,\n parts: readonly string[],\n bytes: Uint8Array,\n metadata: { etag: string; contentType: string | null },\n options?: KvPutOptions,\n ): Promise<boolean> {\n const ns = this.namespace;\n if (!ns) return false;\n if (!(bytes instanceof Uint8Array)) {\n logger.debug(`KV putBinary skipped for ${domain}: value is not bytes.`);\n return false;\n }\n const def = KV_DOMAINS[domain];\n if (bytes.byteLength > def.maxValueBytes) {\n logger.debug(`KV putBinary skipped for ${domain}: value exceeds ${def.maxValueBytes} bytes.`);\n return false;\n }\n if (typeof metadata?.etag !== 'string' || metadata.etag === '') {\n logger.debug(`KV putBinary skipped for ${domain}: missing etag metadata.`);\n return false;\n }\n try {\n const ttl = clampTtl(options?.ttlSeconds, domain);\n const contentType = typeof metadata.contentType === 'string' ? metadata.contentType : null;\n await ns.put(buildKvKey(domain, parts), bytes.slice().buffer, {\n expirationTtl: ttl,\n metadata: { etag: metadata.etag, contentType },\n });\n return true;\n } catch (error) {\n logger.debug(`KV putBinary failed for ${domain}: ${error instanceof Error ? error.message : String(error)}`);\n return false;\n }\n }\n\n public async del(domain: KvDomainName, parts: readonly string[]): Promise<void> {\n const ns = this.namespace;\n if (!ns) return;\n try {\n await ns.delete(buildKvKey(domain, parts));\n } catch (error) {\n logger.debug(`KV delete failed for ${domain}: ${error instanceof Error ? error.message : String(error)}`);\n }\n }\n\n /**\n * Delete every key under a prefix, page-capped. Restarts from the start after\n * each page: deleting while a positional cursor advances would skip keys.\n */\n public async purgePrefix(domain: KvDomainName, parts: readonly string[] = []): Promise<number> {\n const ns = this.namespace;\n if (!ns) return 0;\n const prefix = parts.length === 0 ? `${domain}:` : buildKvKey(domain, parts);\n let deleted = 0;\n try {\n for (let page = 0; page < PURGE_MAX_PAGES; page += 1) {\n const result = await ns.list({ prefix, limit: PURGE_LIST_LIMIT });\n if (result.keys.length === 0) return deleted;\n for (const key of result.keys) {\n await ns.delete(key.name);\n deleted += 1;\n }\n if (result.keys.length < PURGE_LIST_LIMIT) return deleted;\n }\n // The cap was hit with a full page still coming back, so keys remain and\n // the caller sees a count indistinguishable from a complete purge. A\n // write-invalidation that silently under-purges serves pre-write bytes\n // for a whole TTL while reporting success, so this is never silent.\n logger.warn(\n `KV purge for ${domain} hit the ${PURGE_MAX_PAGES * PURGE_LIST_LIMIT}-key page cap; ` +\n `at least one key may survive invalidation`,\n );\n return deleted;\n } catch (error) {\n logger.warn(`KV purge for ${domain} failed: ${error instanceof Error ? error.message : String(error)}`);\n return deleted;\n }\n }\n}\n\nexport { KvCache, PURGE_LIST_LIMIT, PURGE_MAX_PAGES };\nexport type { KvBinaryEntry, KvFileMetadata, KvNamespaceLike, KvPutOptions };\n"]}
1
+ {"version":3,"file":"KvCache.js","sourceRoot":"","sources":["../../src/kv/KvCache.ts"],"names":[],"mappings":"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","sourcesContent":["import { createLogger } from '../logger';\nimport { KV_DOMAINS, buildKvKey, clampTtl, utf8ByteLength } from './KvDomains';\nimport type { KvDomainName } from './KvDomains';\n\n/**\n * `KvCache` — typed facade over the single `CACHE` KV binding.\n *\n * Converged from `backend-runtime/src/kv/KvCache.ts`, identical in the four\n * repos that cache through KV. Semantics are fail-soft by design: reads return\n * `null` on miss, missing binding, or backend error; writes return `false`\n * when skipped (no binding, oversize value, backend error) and `true` when\n * stored. Callers treat KV as a pure optimization — D1/DO stay authoritative.\n */\n\nconst logger = createLogger('KvCache');\n\ninterface KvListPage {\n keys: Array<{ name: string }>;\n list_complete: boolean;\n cursor?: string;\n}\n\ninterface KvGetWithMetadataResult {\n value: string | ArrayBuffer | null;\n metadata: unknown;\n}\n\ninterface KvNamespaceLike {\n get(key: string): Promise<string | null>;\n get(key: string, type: 'text'): Promise<string | null>;\n get(key: string, type: 'arrayBuffer'): Promise<ArrayBuffer | null>;\n getWithMetadata?(key: string, type: 'arrayBuffer'): Promise<KvGetWithMetadataResult>;\n put(key: string, value: string | ArrayBuffer, options?: { expirationTtl?: number; metadata?: unknown }): Promise<void>;\n delete(key: string): Promise<unknown>;\n list(options: { prefix: string; limit?: number; cursor?: string }): Promise<KvListPage>;\n}\n\ninterface KvPutOptions {\n ttlSeconds?: number;\n}\n\ninterface KvFileMetadata {\n etag: string;\n contentType: string | null;\n}\n\ninterface KvBinaryEntry {\n bytes: Uint8Array;\n metadata: KvFileMetadata;\n}\n\nconst PURGE_LIST_LIMIT = 1000;\nconst PURGE_MAX_PAGES = 10;\n\nclass KvCache {\n public constructor(private readonly namespace?: KvNamespaceLike | null) {}\n\n public get available(): boolean {\n return !!this.namespace;\n }\n\n public async getText(domain: KvDomainName, parts: readonly string[]): Promise<string | null> {\n const ns = this.namespace;\n if (!ns) return null;\n try {\n return await ns.get(buildKvKey(domain, parts));\n } catch (error) {\n logger.debug(`KV get failed for ${domain}: ${error instanceof Error ? error.message : String(error)}`);\n return null;\n }\n }\n\n public async putText(domain: KvDomainName, parts: readonly string[], value: string, options?: KvPutOptions): Promise<boolean> {\n const ns = this.namespace;\n if (!ns) return false;\n // No unknown-domain check: `buildKvKey` below throws for one, and the\n // return type has never been able to express that. A silent `false` here\n // would have made an unknown domain look like a namespace miss.\n const def = KV_DOMAINS[domain];\n if (utf8ByteLength(value) > def.maxValueBytes) {\n logger.debug(`KV put skipped for ${domain}: value exceeds ${def.maxValueBytes} bytes.`);\n return false;\n }\n try {\n const ttl = clampTtl(options?.ttlSeconds, domain);\n await ns.put(buildKvKey(domain, parts), value, { expirationTtl: ttl });\n return true;\n } catch (error) {\n logger.debug(`KV put failed for ${domain}: ${error instanceof Error ? error.message : String(error)}`);\n return false;\n }\n }\n\n public async getJson<T>(domain: KvDomainName, parts: readonly string[]): Promise<T | null> {\n const raw = await this.getText(domain, parts);\n if (raw === null) return null;\n try {\n return JSON.parse(raw) as T;\n } catch {\n return null;\n }\n }\n\n public async putJson(domain: KvDomainName, parts: readonly string[], value: unknown, options?: KvPutOptions): Promise<boolean> {\n let raw: unknown;\n try {\n raw = JSON.stringify(value);\n } catch {\n return false;\n }\n return typeof raw === 'string' && this.putText(domain, parts, raw, options);\n }\n\n /**\n * Binary read for the `asset` domain: value bytes plus `{etag, contentType}`\n * KV metadata in a single entry. Legacy base64-JSON entries carry no metadata\n * and read as a miss here — the caller falls back to `getJson` for one TTL\n * window rather than this layer knowing the legacy shape.\n */\n public async getBinary(domain: KvDomainName, parts: readonly string[]): Promise<KvBinaryEntry | null> {\n const ns = this.namespace;\n if (!ns || typeof ns.getWithMetadata !== 'function') return null;\n try {\n const res = await ns.getWithMetadata(buildKvKey(domain, parts), 'arrayBuffer');\n if (!res || res.value == null) return null;\n const value: unknown = res.value;\n let bytes: Uint8Array | null = null;\n if (value instanceof ArrayBuffer) {\n bytes = new Uint8Array(value.slice(0));\n } else if (value instanceof Uint8Array) {\n bytes = value.slice();\n } else if (typeof value === 'string') {\n bytes = new TextEncoder().encode(value);\n }\n if (!bytes) return null;\n const meta = res.metadata as { etag?: unknown; contentType?: unknown } | null | undefined;\n if (typeof meta !== 'object' || meta === null || typeof meta.etag !== 'string' || meta.etag === '') return null;\n return { bytes, metadata: { etag: meta.etag, contentType: typeof meta.contentType === 'string' ? meta.contentType : null } };\n } catch (error) {\n logger.debug(`KV getBinary failed for ${domain}: ${error instanceof Error ? error.message : String(error)}`);\n return null;\n }\n }\n\n /**\n * Binary write for the `asset` domain. Size is enforced on raw bytes (no\n * base64 inflation) and failures stay fail-soft like `putText`.\n */\n public async putBinary(\n domain: KvDomainName,\n parts: readonly string[],\n bytes: Uint8Array,\n metadata: { etag: string; contentType: string | null },\n options?: KvPutOptions,\n ): Promise<boolean> {\n const ns = this.namespace;\n if (!ns) return false;\n if (!(bytes instanceof Uint8Array)) {\n logger.debug(`KV putBinary skipped for ${domain}: value is not bytes.`);\n return false;\n }\n const def = KV_DOMAINS[domain];\n if (bytes.byteLength > def.maxValueBytes) {\n logger.debug(`KV putBinary skipped for ${domain}: value exceeds ${def.maxValueBytes} bytes.`);\n return false;\n }\n if (typeof metadata?.etag !== 'string' || metadata.etag === '') {\n logger.debug(`KV putBinary skipped for ${domain}: missing etag metadata.`);\n return false;\n }\n try {\n const ttl = clampTtl(options?.ttlSeconds, domain);\n const contentType = typeof metadata.contentType === 'string' ? metadata.contentType : null;\n await ns.put(buildKvKey(domain, parts), bytes.slice().buffer, {\n expirationTtl: ttl,\n metadata: { etag: metadata.etag, contentType },\n });\n return true;\n } catch (error) {\n logger.debug(`KV putBinary failed for ${domain}: ${error instanceof Error ? error.message : String(error)}`);\n return false;\n }\n }\n\n public async del(domain: KvDomainName, parts: readonly string[]): Promise<void> {\n const ns = this.namespace;\n if (!ns) return;\n try {\n await ns.delete(buildKvKey(domain, parts));\n } catch (error) {\n logger.debug(`KV delete failed for ${domain}: ${error instanceof Error ? error.message : String(error)}`);\n }\n }\n\n /**\n * Delete every key under a prefix, page-capped. Restarts from the start after\n * each page: deleting while a positional cursor advances would skip keys.\n */\n public async purgePrefix(domain: KvDomainName, parts: readonly string[] = []): Promise<number> {\n const ns = this.namespace;\n if (!ns) return 0;\n const prefix = parts.length === 0 ? `${domain}:` : buildKvKey(domain, parts);\n let deleted = 0;\n try {\n for (let page = 0; page < PURGE_MAX_PAGES; page += 1) {\n const result = await ns.list({ prefix, limit: PURGE_LIST_LIMIT });\n if (result.keys.length === 0) return deleted;\n for (const key of result.keys) {\n await ns.delete(key.name);\n deleted += 1;\n }\n if (result.keys.length < PURGE_LIST_LIMIT) return deleted;\n }\n // The cap was hit with a full page still coming back, so keys remain and\n // the caller sees a count indistinguishable from a complete purge. A\n // write-invalidation that silently under-purges serves pre-write bytes\n // for a whole TTL while reporting success, so this is never silent.\n logger.warn(\n `KV purge for ${domain} hit the ${PURGE_MAX_PAGES * PURGE_LIST_LIMIT}-key page cap; ` + `at least one key may survive invalidation`,\n );\n return deleted;\n } catch (error) {\n logger.warn(`KV purge for ${domain} failed: ${error instanceof Error ? error.message : String(error)}`);\n return deleted;\n }\n }\n}\n\nexport { KvCache, PURGE_LIST_LIMIT, PURGE_MAX_PAGES };\nexport type { KvBinaryEntry, KvFileMetadata, KvNamespaceLike, KvPutOptions };\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,KAAK,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;AASpD,iBAAS,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,IAAI,QAAQ,CAEpD;AAED,iBAAS,eAAe,CAAC,GAAG,CAAC,EAAE,OAAO,GAAG,QAAQ,CAMhD;AAED,UAAU,MAAM;IACd,KAAK,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;IAChC,IAAI,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;IAC/B,IAAI,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;IAC/B,KAAK,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;CACjC;AAED,iBAAS,YAAY,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,OAAO,GAAG,MAAM,CA+BtF;AAED,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,eAAe,EAAE,CAAC;AACrD,YAAY,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC"}
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,KAAK,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;AASpD,iBAAS,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,IAAI,QAAQ,CAEpD;AAED,iBAAS,eAAe,CAAC,GAAG,CAAC,EAAE,OAAO,GAAG,QAAQ,CAKhD;AAED,UAAU,MAAM;IACd,KAAK,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;IAChC,IAAI,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;IAC/B,IAAI,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;IAC/B,KAAK,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;CACjC;AAED,iBAAS,YAAY,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,OAAO,GAAG,MAAM,CA+BtF;AAED,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,eAAe,EAAE,CAAC;AACrD,YAAY,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"logger.js","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAeA,MAAM,UAAU,GAA6B;IAC3C,KAAK,EAAE,CAAC;IACR,IAAI,EAAE,CAAC;IACP,IAAI,EAAE,CAAC;IACP,KAAK,EAAE,CAAC;CACA,CAAC;AAEX,SAAS,UAAU,CAAC,KAAa;IAC/B,OAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAW,CAAC,QAAQ,CAAC,KAAiB,CAAC,CAAC;AACnF,CAAC;AAED,SAAS,eAAe,CAAC,GAAa;IACpC,MAAM,YAAY,GAChB,GAAG,KAAK,IAAI,IAAI,OAAO,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAE,GAA0C,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACjH,MAAM,OAAO,GAAI,UAAyE,CAAC,OAAO,EAAE,GAAG,EAAE,SAAS,CAAC;IACnH,MAAM,KAAK,GAAG,YAAY,IAAI,OAAO,IAAI,MAAM,CAAC;IAChD,OAAO,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC;AAC5C,CAAC;AASD,SAAS,YAAY,CAAC,SAAkB,EAAE,YAAqB,EAAE,GAAa;IAC5E,MAAM,YAAY,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC;IAC1C,MAAM,QAAQ,GAAG,UAAU,CAAC,YAAY,CAAC,CAAC;IAE1C,MAAM,OAAO,GAAG,CAAC,YAAY,EAAE,SAAS,CAAC;SACtC,MAAM,CAAC,OAAO,CAAC;SACf,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC;SACpB,IAAI,CAAC,GAAG,CAAC,CAAC;IAEb,OAAO;QACL,KAAK,EAAE,CAAC,GAAG,IAAe,EAAQ,EAAE;YAClC,IAAI,UAAU,CAAC,KAAK,IAAI,QAAQ,EAAE,CAAC;gBACjC,OAAO,CAAC,KAAK,CAAC,WAAW,OAAO,EAAE,EAAE,GAAG,IAAI,CAAC,CAAC;YAC/C,CAAC;QACH,CAAC;QACD,IAAI,EAAE,CAAC,GAAG,IAAe,EAAQ,EAAE;YACjC,IAAI,UAAU,CAAC,IAAI,IAAI,QAAQ,EAAE,CAAC;gBAChC,OAAO,CAAC,IAAI,CAAC,UAAU,OAAO,EAAE,EAAE,GAAG,IAAI,CAAC,CAAC;YAC7C,CAAC;QACH,CAAC;QACD,IAAI,EAAE,CAAC,GAAG,IAAe,EAAQ,EAAE;YACjC,IAAI,UAAU,CAAC,IAAI,IAAI,QAAQ,EAAE,CAAC;gBAChC,OAAO,CAAC,IAAI,CAAC,UAAU,OAAO,EAAE,EAAE,GAAG,IAAI,CAAC,CAAC;YAC7C,CAAC;QACH,CAAC;QACD,KAAK,EAAE,CAAC,GAAG,IAAe,EAAQ,EAAE;YAClC,IAAI,UAAU,CAAC,KAAK,IAAI,QAAQ,EAAE,CAAC;gBACjC,OAAO,CAAC,KAAK,CAAC,WAAW,OAAO,EAAE,EAAE,GAAG,IAAI,CAAC,CAAC;YAC/C,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC;AAED,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,eAAe,EAAE,CAAC","sourcesContent":["/**\n * `KvLogger` — the family's console logger with a level floor.\n *\n * Converged from `backend-runtime/src/logger.ts`, which is identical in\n * Durable-DAV, Durable-DAV-Router, Edge-Sonic, Mail-Otter and Mail-Meow (the\n * copies in AWS/ChordDHT's `shared` are the same shape without the env floor).\n *\n * The level resolves from an injected `env` first, then `process.env`, then\n * `info`: Workers have no `process.env` at runtime, so an injected object is\n * the configuration path, and `process.env` is a local-tooling affordance. An\n * unrecognized level floors at `info` rather than throwing — a typo in\n * `LOG_LEVEL` costing a worker a cold start is not a trade worth making.\n */\ntype LogLevel = 'debug' | 'info' | 'warn' | 'error';\n\nconst LOG_LEVELS: Record<LogLevel, number> = {\n debug: 0,\n info: 1,\n warn: 2,\n error: 3,\n} as const;\n\nfunction isLogLevel(level: string): level is LogLevel {\n return (['debug', 'info', 'warn', 'error'] as const).includes(level as LogLevel);\n}\n\nfunction resolveLogLevel(env?: unknown): LogLevel {\n const fromInjected =\n env !== null && typeof env === 'object' ? (env as Record<string, string | undefined>)['LOG_LEVEL'] : undefined;\n const fromEnv = (globalThis as { process?: { env?: Record<string, string | undefined> } }).process?.env?.LOG_LEVEL;\n const level = fromInjected ?? fromEnv ?? 'info';\n return isLogLevel(level) ? level : 'info';\n}\n\ninterface Logger {\n debug(...args: unknown[]): void;\n info(...args: unknown[]): void;\n warn(...args: unknown[]): void;\n error(...args: unknown[]): void;\n}\n\nfunction createLogger(namespace?: string, fullRepoName?: string, env?: unknown): Logger {\n const currentLevel = resolveLogLevel(env);\n const minLevel = LOG_LEVELS[currentLevel];\n\n const argsStr = [fullRepoName, namespace]\n .filter(Boolean)\n .map((s) => `[${s}]`)\n .join(' ');\n\n return {\n debug: (...args: unknown[]): void => {\n if (LOG_LEVELS.debug >= minLevel) {\n console.debug(`[DEBUG] ${argsStr}`, ...args);\n }\n },\n info: (...args: unknown[]): void => {\n if (LOG_LEVELS.info >= minLevel) {\n console.info(`[INFO] ${argsStr}`, ...args);\n }\n },\n warn: (...args: unknown[]): void => {\n if (LOG_LEVELS.warn >= minLevel) {\n console.warn(`[WARN] ${argsStr}`, ...args);\n }\n },\n error: (...args: unknown[]): void => {\n if (LOG_LEVELS.error >= minLevel) {\n console.error(`[ERROR] ${argsStr}`, ...args);\n }\n },\n };\n}\n\nexport { createLogger, isLogLevel, resolveLogLevel };\nexport type { LogLevel, Logger };\n"]}
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAeA,MAAM,UAAU,GAA6B;IAC3C,KAAK,EAAE,CAAC;IACR,IAAI,EAAE,CAAC;IACP,IAAI,EAAE,CAAC;IACP,KAAK,EAAE,CAAC;CACA,CAAC;AAEX,SAAS,UAAU,CAAC,KAAa;IAC/B,OAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAW,CAAC,QAAQ,CAAC,KAAiB,CAAC,CAAC;AACnF,CAAC;AAED,SAAS,eAAe,CAAC,GAAa;IACpC,MAAM,YAAY,GAAG,GAAG,KAAK,IAAI,IAAI,OAAO,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAE,GAA0C,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACpI,MAAM,OAAO,GAAI,UAAyE,CAAC,OAAO,EAAE,GAAG,EAAE,SAAS,CAAC;IACnH,MAAM,KAAK,GAAG,YAAY,IAAI,OAAO,IAAI,MAAM,CAAC;IAChD,OAAO,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC;AAC5C,CAAC;AASD,SAAS,YAAY,CAAC,SAAkB,EAAE,YAAqB,EAAE,GAAa;IAC5E,MAAM,YAAY,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC;IAC1C,MAAM,QAAQ,GAAG,UAAU,CAAC,YAAY,CAAC,CAAC;IAE1C,MAAM,OAAO,GAAG,CAAC,YAAY,EAAE,SAAS,CAAC;SACtC,MAAM,CAAC,OAAO,CAAC;SACf,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC;SACpB,IAAI,CAAC,GAAG,CAAC,CAAC;IAEb,OAAO;QACL,KAAK,EAAE,CAAC,GAAG,IAAe,EAAQ,EAAE;YAClC,IAAI,UAAU,CAAC,KAAK,IAAI,QAAQ,EAAE,CAAC;gBACjC,OAAO,CAAC,KAAK,CAAC,WAAW,OAAO,EAAE,EAAE,GAAG,IAAI,CAAC,CAAC;YAC/C,CAAC;QACH,CAAC;QACD,IAAI,EAAE,CAAC,GAAG,IAAe,EAAQ,EAAE;YACjC,IAAI,UAAU,CAAC,IAAI,IAAI,QAAQ,EAAE,CAAC;gBAChC,OAAO,CAAC,IAAI,CAAC,UAAU,OAAO,EAAE,EAAE,GAAG,IAAI,CAAC,CAAC;YAC7C,CAAC;QACH,CAAC;QACD,IAAI,EAAE,CAAC,GAAG,IAAe,EAAQ,EAAE;YACjC,IAAI,UAAU,CAAC,IAAI,IAAI,QAAQ,EAAE,CAAC;gBAChC,OAAO,CAAC,IAAI,CAAC,UAAU,OAAO,EAAE,EAAE,GAAG,IAAI,CAAC,CAAC;YAC7C,CAAC;QACH,CAAC;QACD,KAAK,EAAE,CAAC,GAAG,IAAe,EAAQ,EAAE;YAClC,IAAI,UAAU,CAAC,KAAK,IAAI,QAAQ,EAAE,CAAC;gBACjC,OAAO,CAAC,KAAK,CAAC,WAAW,OAAO,EAAE,EAAE,GAAG,IAAI,CAAC,CAAC;YAC/C,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC;AAED,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,eAAe,EAAE,CAAC","sourcesContent":["/**\n * `KvLogger` — the family's console logger with a level floor.\n *\n * Converged from `backend-runtime/src/logger.ts`, which is identical in\n * Durable-DAV, Durable-DAV-Router, Edge-Sonic, Mail-Otter and Mail-Meow (the\n * copies in AWS/ChordDHT's `shared` are the same shape without the env floor).\n *\n * The level resolves from an injected `env` first, then `process.env`, then\n * `info`: Workers have no `process.env` at runtime, so an injected object is\n * the configuration path, and `process.env` is a local-tooling affordance. An\n * unrecognized level floors at `info` rather than throwing — a typo in\n * `LOG_LEVEL` costing a worker a cold start is not a trade worth making.\n */\ntype LogLevel = 'debug' | 'info' | 'warn' | 'error';\n\nconst LOG_LEVELS: Record<LogLevel, number> = {\n debug: 0,\n info: 1,\n warn: 2,\n error: 3,\n} as const;\n\nfunction isLogLevel(level: string): level is LogLevel {\n return (['debug', 'info', 'warn', 'error'] as const).includes(level as LogLevel);\n}\n\nfunction resolveLogLevel(env?: unknown): LogLevel {\n const fromInjected = env !== null && typeof env === 'object' ? (env as Record<string, string | undefined>)['LOG_LEVEL'] : undefined;\n const fromEnv = (globalThis as { process?: { env?: Record<string, string | undefined> } }).process?.env?.LOG_LEVEL;\n const level = fromInjected ?? fromEnv ?? 'info';\n return isLogLevel(level) ? level : 'info';\n}\n\ninterface Logger {\n debug(...args: unknown[]): void;\n info(...args: unknown[]): void;\n warn(...args: unknown[]): void;\n error(...args: unknown[]): void;\n}\n\nfunction createLogger(namespace?: string, fullRepoName?: string, env?: unknown): Logger {\n const currentLevel = resolveLogLevel(env);\n const minLevel = LOG_LEVELS[currentLevel];\n\n const argsStr = [fullRepoName, namespace]\n .filter(Boolean)\n .map((s) => `[${s}]`)\n .join(' ');\n\n return {\n debug: (...args: unknown[]): void => {\n if (LOG_LEVELS.debug >= minLevel) {\n console.debug(`[DEBUG] ${argsStr}`, ...args);\n }\n },\n info: (...args: unknown[]): void => {\n if (LOG_LEVELS.info >= minLevel) {\n console.info(`[INFO] ${argsStr}`, ...args);\n }\n },\n warn: (...args: unknown[]): void => {\n if (LOG_LEVELS.warn >= minLevel) {\n console.warn(`[WARN] ${argsStr}`, ...args);\n }\n },\n error: (...args: unknown[]): void => {\n if (LOG_LEVELS.error >= minLevel) {\n console.error(`[ERROR] ${argsStr}`, ...args);\n }\n },\n };\n}\n\nexport { createLogger, isLogLevel, resolveLogLevel };\nexport type { LogLevel, Logger };\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rexezuge/runtime",
3
- "version": "1.0.6",
3
+ "version": "1.0.8",
4
4
  "private": false,
5
5
  "license": "MIT",
6
6
  "repository": {