@rei-standard/amsg-server 2.6.0-next.8 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (91) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +861 -35
  3. package/dist/adapters/d1.d.ts +693 -0
  4. package/dist/adapters/factory.d.ts +39 -0
  5. package/dist/adapters/interface.d.ts +384 -0
  6. package/dist/adapters/neon.d.ts +105 -0
  7. package/dist/adapters/pg-shared.d.ts +194 -0
  8. package/dist/adapters/pg.d.ts +101 -0
  9. package/dist/adapters/schema.d.ts +57 -0
  10. package/dist/adapters/schema.sqlite.d.ts +80 -0
  11. package/dist/chunk-7NMQFTDJ.cjs +148 -0
  12. package/dist/{chunk-GOBCWCJP.mjs → chunk-GN44PST5.mjs} +68 -1
  13. package/dist/chunk-RL7V7VSS.mjs +8784 -0
  14. package/dist/chunk-TKDISKCF.cjs +163 -0
  15. package/dist/chunk-XKUWMYVF.mjs +163 -0
  16. package/dist/chunk-YBDQJVFQ.cjs +8784 -0
  17. package/dist/cloudflare/single-user-worker.d.ts +39 -0
  18. package/dist/cloudflare.cjs +35 -2
  19. package/dist/cloudflare.d.ts +11 -2
  20. package/dist/cloudflare.mjs +36 -3
  21. package/dist/handlers/cancel-message.d.ts +3 -0
  22. package/dist/handlers/capabilities.d.ts +4 -0
  23. package/dist/handlers/client-state-namespaces.d.ts +5 -0
  24. package/dist/handlers/client-state.d.ts +7 -0
  25. package/dist/handlers/cloud-data.d.ts +4 -0
  26. package/dist/handlers/get-message.d.ts +3 -0
  27. package/dist/handlers/get-user-key.d.ts +3 -0
  28. package/dist/handlers/init-tenant.d.ts +23 -0
  29. package/dist/handlers/llm-credentials.d.ts +5 -0
  30. package/dist/handlers/messages.d.ts +3 -0
  31. package/dist/handlers/outbox.d.ts +9 -0
  32. package/dist/handlers/push-subscription.d.ts +5 -0
  33. package/dist/handlers/schedule-message.d.ts +3 -0
  34. package/dist/handlers/send-notifications.d.ts +3 -0
  35. package/dist/handlers/single-user-init.d.ts +13 -0
  36. package/dist/handlers/update-message.d.ts +3 -0
  37. package/dist/handlers/vapid-public-key.d.ts +19 -0
  38. package/dist/index.cjs +133 -44
  39. package/dist/index.d.cts +145 -766
  40. package/dist/index.d.ts +145 -766
  41. package/dist/index.mjs +125 -36
  42. package/dist/lib/agentic-fire.d.ts +177 -0
  43. package/dist/lib/client-state-store.d.ts +88 -0
  44. package/dist/lib/cloud-data-cleanup.d.ts +36 -0
  45. package/dist/lib/cloud-data-guard.d.ts +14 -0
  46. package/dist/lib/cloud-data-inventory.d.ts +15 -0
  47. package/dist/lib/constant-time.d.ts +14 -0
  48. package/dist/lib/db-errors.d.ts +10 -0
  49. package/dist/lib/encryption.d.ts +48 -0
  50. package/dist/lib/errors.d.ts +273 -0
  51. package/dist/lib/llm-credentials-store.d.ts +147 -0
  52. package/dist/lib/llm.d.ts +12 -0
  53. package/dist/lib/message-processor.d.ts +82 -0
  54. package/dist/lib/outbox-store.d.ts +162 -0
  55. package/dist/lib/push-policy.d.ts +11 -0
  56. package/dist/lib/push-subscription-store.d.ts +94 -0
  57. package/dist/lib/recurrence.d.ts +51 -0
  58. package/dist/lib/request.d.ts +182 -0
  59. package/dist/lib/result-emitter.d.ts +60 -0
  60. package/dist/lib/retry-policy.d.ts +11 -0
  61. package/dist/lib/run-tick.d.ts +121 -0
  62. package/dist/lib/schema-version.d.ts +50 -0
  63. package/dist/lib/state-accessors.d.ts +70 -0
  64. package/dist/lib/state-chunks.d.ts +65 -0
  65. package/dist/lib/task-projection.d.ts +92 -0
  66. package/dist/lib/validation.d.ts +97 -0
  67. package/dist/lib/version.d.ts +7 -0
  68. package/dist/lib/webcrypto-utils.d.ts +1 -0
  69. package/dist/lib/webpush-webcrypto.d.ts +78 -0
  70. package/dist/{neon-QJ7KYHEX.mjs → neon-GKLT4UY3.mjs} +116 -44
  71. package/dist/{neon-V4VOH55N.cjs → neon-XHPJZESV.cjs} +121 -49
  72. package/dist/{pg-6X74HKMX.cjs → pg-FHXQ6BJP.cjs} +109 -48
  73. package/dist/{pg-DFJSFOJQ.mjs → pg-J4YXRQP5.mjs} +104 -43
  74. package/dist/single-user.d.ts +106 -0
  75. package/dist/tenant/blob-store.d.ts +30 -0
  76. package/dist/tenant/context.d.ts +47 -0
  77. package/dist/tenant/single-user-context.d.ts +29 -0
  78. package/dist/tenant/token.d.ts +26 -0
  79. package/package.json +3 -3
  80. package/dist/chunk-DCKCAGFV.cjs +0 -81
  81. package/dist/chunk-HQHRXSQA.cjs +0 -2710
  82. package/dist/chunk-LEE5KQ7Y.mjs +0 -2710
  83. package/dist/cloudflare-CH3dBl5b.d.cts +0 -4235
  84. package/dist/cloudflare-CH3dBl5b.d.ts +0 -4235
  85. package/dist/cloudflare.d.cts +0 -2
  86. package/dist/neon-D8Z2Nn97.d.cts +0 -295
  87. package/dist/neon-PqNFJIz2.d.ts +0 -295
  88. package/dist/pg-C48FwCWW.d.cts +0 -289
  89. package/dist/pg-C5gtWUfU.d.ts +0 -289
  90. package/dist/schema-BHuyH_6Z.d.cts +0 -88
  91. package/dist/schema-BHuyH_6Z.d.ts +0 -88
@@ -0,0 +1,39 @@
1
+ /**
2
+ * @param {(env: Object) => Object|Promise<Object>} buildConfig
3
+ * @param {{ onError?: (info: { stage: 'config'|'request'|'tick'|'cloud-cleanup', error: unknown, cause: import('../lib/errors.js').ErrorCause, path: string|null }) => void|Promise<void> }} [options]
4
+ * `onError` 在 fetch 或 cron 出错时调一次(best-effort,自身抛错只记日志)。
5
+ * cron 那条路上没有调用方能看到错误响应,这个 hook 是宿主唯一的出口。
6
+ */
7
+ export function createSingleUserCloudflareWorker(buildConfig: (env: any) => any | Promise<any>, options?: {
8
+ onError?: (info: {
9
+ stage: "config" | "request" | "tick" | "cloud-cleanup";
10
+ error: unknown;
11
+ cause: import("../lib/errors.js").ErrorCause;
12
+ path: string | null;
13
+ }) => void | Promise<void>;
14
+ }): {
15
+ fetch: (request: any, env: any) => Promise<Response>;
16
+ scheduled: (event: any, env: any) => Promise<{
17
+ ok: true;
18
+ summary: any;
19
+ cloudCleanupCause?: import("../lib/errors.js").ErrorCause;
20
+ } | {
21
+ ok: false;
22
+ cause: import("../lib/errors.js").ErrorCause;
23
+ cloudCleanupCause?: import("../lib/errors.js").ErrorCause;
24
+ }>;
25
+ runTask: (uuid: string, env: any) => Promise<{
26
+ ran: false;
27
+ reason: "not_configured" | "not_found" | "already_settled" | "not_due" | "retry_pending";
28
+ status?: string;
29
+ nextSendAt?: string;
30
+ retryAfter?: string;
31
+ } | {
32
+ ran: true;
33
+ summary: any;
34
+ }>;
35
+ getSchemaVersion: (env: any) => Promise<import("../lib/schema-version.js").SchemaVersionResult>;
36
+ ensureSchema: (env: any) => Promise<import("../lib/schema-version.js").EnsureSchemaResult>;
37
+ };
38
+ export const CORS_ALLOW_HEADERS: "Content-Type, Content-Encoding, X-User-Id, X-Payload-Encrypted, X-Encryption-Version, X-Response-Encrypted, X-Client-Token";
39
+ export const CORS_ALLOW_METHODS: "GET, POST, PUT, DELETE, OPTIONS";
@@ -12,7 +12,6 @@
12
12
 
13
13
 
14
14
 
15
- var _chunkHQHRXSQAcjs = require('./chunk-HQHRXSQA.cjs');
16
15
 
17
16
 
18
17
 
@@ -27,4 +26,38 @@ var _chunkHQHRXSQAcjs = require('./chunk-HQHRXSQA.cjs');
27
26
 
28
27
 
29
28
 
30
- exports.MAX_PUSH_PAYLOAD_BYTES = _chunkHQHRXSQAcjs.MAX_PUSH_PAYLOAD_BYTES; exports.WEB_PUSH_ENCRYPTION_OVERHEAD_BYTES = _chunkHQHRXSQAcjs.WEB_PUSH_ENCRYPTION_OVERHEAD_BYTES; exports.WEB_PUSH_MAX_BODY_BYTES = _chunkHQHRXSQAcjs.WEB_PUSH_MAX_BODY_BYTES; exports.createD1Adapter = _chunkHQHRXSQAcjs.createD1Adapter; exports.createSingleUserCloudflareWorker = _chunkHQHRXSQAcjs.createSingleUserCloudflareWorker; exports.createSingleUserServer = _chunkHQHRXSQAcjs.createSingleUserServer; exports.createWebCryptoWebPush = _chunkHQHRXSQAcjs.createWebCryptoWebPush; exports.decryptFromStorage = _chunkHQHRXSQAcjs.decryptFromStorage; exports.decryptPayload = _chunkHQHRXSQAcjs.decryptPayload; exports.deriveUserEncryptionKey = _chunkHQHRXSQAcjs.deriveUserEncryptionKey; exports.encryptForStorage = _chunkHQHRXSQAcjs.encryptForStorage; exports.measurePushPayload = _chunkHQHRXSQAcjs.measurePushPayload; exports.runScheduledTick = _chunkHQHRXSQAcjs.runScheduledTick;
29
+
30
+
31
+ var _chunkYBDQJVFQcjs = require('./chunk-YBDQJVFQ.cjs');
32
+ require('./chunk-7NMQFTDJ.cjs');
33
+
34
+
35
+
36
+
37
+
38
+
39
+
40
+
41
+
42
+
43
+
44
+
45
+
46
+
47
+
48
+
49
+
50
+
51
+
52
+
53
+
54
+
55
+
56
+
57
+
58
+
59
+
60
+
61
+
62
+
63
+ exports.DEFAULT_MAX_DELIVERY_RETRIES = _chunkYBDQJVFQcjs.DEFAULT_MAX_DELIVERY_RETRIES; exports.DEFAULT_MAX_REQUEST_BODY_BYTES = _chunkYBDQJVFQcjs.DEFAULT_MAX_REQUEST_BODY_BYTES; exports.MAX_DEFER_AFTER_MS = _chunkYBDQJVFQcjs.MAX_DEFER_AFTER_MS; exports.MAX_PUSH_PAYLOAD_BYTES = _chunkYBDQJVFQcjs.MAX_PUSH_PAYLOAD_BYTES; exports.NonRetryableError = _chunkYBDQJVFQcjs.NonRetryableError; exports.PUSH_ENVELOPE_RESERVED_BYTES = _chunkYBDQJVFQcjs.PUSH_ENVELOPE_RESERVED_BYTES; exports.SCHEMA_VERSION = _chunkYBDQJVFQcjs.SCHEMA_VERSION; exports.WEB_PUSH_ENCRYPTION_OVERHEAD_BYTES = _chunkYBDQJVFQcjs.WEB_PUSH_ENCRYPTION_OVERHEAD_BYTES; exports.WEB_PUSH_MAX_BODY_BYTES = _chunkYBDQJVFQcjs.WEB_PUSH_MAX_BODY_BYTES; exports.advanceOccurrence = _chunkYBDQJVFQcjs.advanceOccurrence; exports.createD1Adapter = _chunkYBDQJVFQcjs.createD1Adapter; exports.createSingleUserCloudflareWorker = _chunkYBDQJVFQcjs.createSingleUserCloudflareWorker; exports.createSingleUserServer = _chunkYBDQJVFQcjs.createSingleUserServer; exports.createWebCryptoWebPush = _chunkYBDQJVFQcjs.createWebCryptoWebPush; exports.decryptFromStorage = _chunkYBDQJVFQcjs.decryptFromStorage; exports.decryptPayload = _chunkYBDQJVFQcjs.decryptPayload; exports.deriveUserEncryptionKey = _chunkYBDQJVFQcjs.deriveUserEncryptionKey; exports.encryptForStorage = _chunkYBDQJVFQcjs.encryptForStorage; exports.ensureSchema = _chunkYBDQJVFQcjs.ensureSchema; exports.getSchemaVersion = _chunkYBDQJVFQcjs.getSchemaVersion; exports.isNonRetryableError = _chunkYBDQJVFQcjs.isNonRetryableError; exports.isValidTimeZoneId = _chunkYBDQJVFQcjs.isValidTimeZoneId; exports.measurePushPayload = _chunkYBDQJVFQcjs.measurePushPayload; exports.nextFutureOccurrence = _chunkYBDQJVFQcjs.nextFutureOccurrence; exports.planNextOccurrence = _chunkYBDQJVFQcjs.planNextOccurrence; exports.readRequestBody = _chunkYBDQJVFQcjs.readRequestBody; exports.runScheduledTick = _chunkYBDQJVFQcjs.runScheduledTick; exports.runTask = _chunkYBDQJVFQcjs.runTask; exports.summarizeErrorCause = _chunkYBDQJVFQcjs.summarizeErrorCause;
@@ -1,2 +1,11 @@
1
- export { M as MAX_PUSH_PAYLOAD_BYTES, W as WEB_PUSH_ENCRYPTION_OVERHEAD_BYTES, f as WEB_PUSH_MAX_BODY_BYTES, h as createD1Adapter, j as createSingleUserCloudflareWorker, k as createSingleUserServer, l as createWebCryptoWebPush, m as decryptFromStorage, n as decryptPayload, o as deriveUserEncryptionKey, q as encryptForStorage, v as measurePushPayload, r as runScheduledTick } from './cloudflare-CH3dBl5b.js';
2
- import '@rei-standard/amsg-shared';
1
+ export { createSingleUserCloudflareWorker } from "./cloudflare/single-user-worker.js";
2
+ export { createSingleUserServer } from "./single-user.js";
3
+ export { createD1Adapter } from "./adapters/d1.js";
4
+ export { MAX_DEFER_AFTER_MS } from "./lib/agentic-fire.js";
5
+ export { createWebCryptoWebPush, measurePushPayload, MAX_PUSH_PAYLOAD_BYTES, PUSH_ENVELOPE_RESERVED_BYTES, WEB_PUSH_MAX_BODY_BYTES, WEB_PUSH_ENCRYPTION_OVERHEAD_BYTES } from "./lib/webpush-webcrypto.js";
6
+ export { runScheduledTick, runTask, DEFAULT_MAX_DELIVERY_RETRIES } from "./lib/run-tick.js";
7
+ export { getSchemaVersion, ensureSchema, SCHEMA_VERSION } from "./lib/schema-version.js";
8
+ export { summarizeErrorCause, NonRetryableError, isNonRetryableError } from "./lib/errors.js";
9
+ export { isValidTimeZoneId, advanceOccurrence, nextFutureOccurrence, planNextOccurrence } from "./lib/recurrence.js";
10
+ export { readRequestBody, DEFAULT_MAX_REQUEST_BODY_BYTES } from "./lib/request.js";
11
+ export { deriveUserEncryptionKey, decryptPayload, encryptForStorage, decryptFromStorage } from "./lib/encryption.js";
@@ -1,7 +1,14 @@
1
1
  import {
2
+ DEFAULT_MAX_DELIVERY_RETRIES,
3
+ DEFAULT_MAX_REQUEST_BODY_BYTES,
4
+ MAX_DEFER_AFTER_MS,
2
5
  MAX_PUSH_PAYLOAD_BYTES,
6
+ NonRetryableError,
7
+ PUSH_ENVELOPE_RESERVED_BYTES,
8
+ SCHEMA_VERSION,
3
9
  WEB_PUSH_ENCRYPTION_OVERHEAD_BYTES,
4
10
  WEB_PUSH_MAX_BODY_BYTES,
11
+ advanceOccurrence,
5
12
  createD1Adapter,
6
13
  createSingleUserCloudflareWorker,
7
14
  createSingleUserServer,
@@ -10,13 +17,30 @@ import {
10
17
  decryptPayload,
11
18
  deriveUserEncryptionKey,
12
19
  encryptForStorage,
20
+ ensureSchema,
21
+ getSchemaVersion,
22
+ isNonRetryableError,
23
+ isValidTimeZoneId,
13
24
  measurePushPayload,
14
- runScheduledTick
15
- } from "./chunk-LEE5KQ7Y.mjs";
25
+ nextFutureOccurrence,
26
+ planNextOccurrence,
27
+ readRequestBody,
28
+ runScheduledTick,
29
+ runTask,
30
+ summarizeErrorCause
31
+ } from "./chunk-RL7V7VSS.mjs";
32
+ import "./chunk-GN44PST5.mjs";
16
33
  export {
34
+ DEFAULT_MAX_DELIVERY_RETRIES,
35
+ DEFAULT_MAX_REQUEST_BODY_BYTES,
36
+ MAX_DEFER_AFTER_MS,
17
37
  MAX_PUSH_PAYLOAD_BYTES,
38
+ NonRetryableError,
39
+ PUSH_ENVELOPE_RESERVED_BYTES,
40
+ SCHEMA_VERSION,
18
41
  WEB_PUSH_ENCRYPTION_OVERHEAD_BYTES,
19
42
  WEB_PUSH_MAX_BODY_BYTES,
43
+ advanceOccurrence,
20
44
  createD1Adapter,
21
45
  createSingleUserCloudflareWorker,
22
46
  createSingleUserServer,
@@ -25,6 +49,15 @@ export {
25
49
  decryptPayload,
26
50
  deriveUserEncryptionKey,
27
51
  encryptForStorage,
52
+ ensureSchema,
53
+ getSchemaVersion,
54
+ isNonRetryableError,
55
+ isValidTimeZoneId,
28
56
  measurePushPayload,
29
- runScheduledTick
57
+ nextFutureOccurrence,
58
+ planNextOccurrence,
59
+ readRequestBody,
60
+ runScheduledTick,
61
+ runTask,
62
+ summarizeErrorCause
30
63
  };
@@ -0,0 +1,3 @@
1
+ export function createCancelMessageHandler(ctx: any): {
2
+ DELETE: (url: any, headers: any) => Promise<any>;
3
+ };
@@ -0,0 +1,4 @@
1
+ export function createCapabilitiesHandler(ctx: any): {
2
+ GET: (url: any, headers: any) => Promise<any>;
3
+ };
4
+ export const SERVER_FEATURES: readonly string[];
@@ -0,0 +1,5 @@
1
+ export function createClientStateNamespacesHandler(ctx: any): {
2
+ GET: (url: any, headers: any) => Promise<any>;
3
+ };
4
+ /** 一次最多列几个命名空间(也是 `limit` 的上限)。 */
5
+ export const MAX_CLIENT_STATE_NAMESPACES: 200;
@@ -0,0 +1,7 @@
1
+ export function createClientStateHandler(ctx: any): {
2
+ PUT: (headers: any, body: any) => Promise<any>;
3
+ GET: (url: any, headers: any) => Promise<any>;
4
+ DELETE: (url: any, headers: any) => Promise<any>;
5
+ };
6
+ export const MAX_STATE_VALUE_BYTES: number;
7
+ export const MAX_STATE_ENTRIES_PER_REQUEST: 200;
@@ -0,0 +1,4 @@
1
+ export function createCloudDataHandler(ctx: any): {
2
+ GET: (url: any, headers: any) => Promise<any>;
3
+ POST: (url: any, headers: any, body: any) => Promise<any>;
4
+ };
@@ -0,0 +1,3 @@
1
+ export function createGetMessageHandler(ctx: any): {
2
+ GET: (url: any, headers: any) => Promise<any>;
3
+ };
@@ -0,0 +1,3 @@
1
+ export function createGetUserKeyHandler(ctx: any): {
2
+ GET: (url: any, headers: any) => Promise<any>;
3
+ };
@@ -0,0 +1,23 @@
1
+ export function createInitTenantHandler(ctx: any): {
2
+ POST: (headers: any, body: any) => Promise<{
3
+ status: number;
4
+ body: {
5
+ success: boolean;
6
+ error: any;
7
+ data?: undefined;
8
+ };
9
+ } | {
10
+ status: number;
11
+ body: {
12
+ success: boolean;
13
+ data: {
14
+ tenantId: any;
15
+ tenantToken: any;
16
+ cronToken: any;
17
+ cronWebhookUrl: any;
18
+ masterKeyFingerprint: any;
19
+ };
20
+ error?: undefined;
21
+ };
22
+ }>;
23
+ };
@@ -0,0 +1,5 @@
1
+ export function createLlmCredentialsHandler(ctx: any): {
2
+ PUT: (headers: any, body: any) => Promise<any>;
3
+ GET: (url: any, headers: any) => Promise<any>;
4
+ DELETE: (url: any, headers: any, body: any) => Promise<any>;
5
+ };
@@ -0,0 +1,3 @@
1
+ export function createMessagesHandler(ctx: any): {
2
+ GET: (url: any, headers: any) => Promise<any>;
3
+ };
@@ -0,0 +1,9 @@
1
+ export function createOutboxHandler(ctx: any): {
2
+ GET: (url: any, headers: any) => Promise<any>;
3
+ POST: (headers: any, body: any) => Promise<any>;
4
+ DELETE: (url: any, headers: any, body: any) => Promise<any>;
5
+ };
6
+ export const MAX_OUTBOX_PAGE_SIZE: 100;
7
+ export const DEFAULT_OUTBOX_PAGE_SIZE: 50;
8
+ export const MAX_OUTBOX_ACK_IDS: 200;
9
+ export const MAX_OUTBOX_DELETE_IDS: 200;
@@ -0,0 +1,5 @@
1
+ export function createPushSubscriptionHandler(ctx: any): {
2
+ PUT: (headers: any, body: any) => Promise<any>;
3
+ GET: (url: any, headers: any) => Promise<any>;
4
+ DELETE: (url: any, headers: any) => Promise<any>;
5
+ };
@@ -0,0 +1,3 @@
1
+ export function createScheduleMessageHandler(ctx: any): {
2
+ POST: (headers: any, body: any) => Promise<any>;
3
+ };
@@ -0,0 +1,3 @@
1
+ export function createSendNotificationsHandler(ctx: any): {
2
+ POST: (urlOrHeaders: any, maybeHeaders: any) => Promise<any>;
3
+ };
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Handler: single-user-init
3
+ *
4
+ * Idempotent "just create the tables" endpoint for single-user deployments
5
+ * (the degenerate form of init-tenant). Reuses resolveTenant purely to enforce
6
+ * the optional shared secret, then runs initSchema. Issues no token.
7
+ *
8
+ * @param {Object} ctx - Single-user server context (ctx.tenantManager).
9
+ * @returns {{ POST: function }}
10
+ */
11
+ export function createSingleUserInitHandler(ctx: any): {
12
+ POST: Function;
13
+ };
@@ -0,0 +1,3 @@
1
+ export function createUpdateMessageHandler(ctx: any): {
2
+ PUT: (url: any, headers: any, body: any) => Promise<any>;
3
+ };
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Handler: vapid-public-key
3
+ *
4
+ * Exposes this worker's own VAPID public key so a browser frontend can build a
5
+ * Web Push subscription (`applicationServerKey`) at runtime. Each self-hosted
6
+ * worker owns its keypair, so the key can't be baked into the frontend — it
7
+ * pulls it from here.
8
+ *
9
+ * Auth funnels through the same resolveTenant as every other endpoint, so with
10
+ * a serverToken configured this route requires `X-Client-Token` too (the
11
+ * all-or-nothing contract). The public key itself is not a secret; gating it
12
+ * just keeps every endpoint consistent.
13
+ *
14
+ * @param {Object} ctx - Server context ({ vapid, tenantManager, ... }).
15
+ * @returns {{ GET: function }}
16
+ */
17
+ export function createVapidPublicKeyHandler(ctx: any): {
18
+ GET: Function;
19
+ };
package/dist/index.cjs CHANGED
@@ -27,7 +27,54 @@
27
27
 
28
28
 
29
29
 
30
- var _chunkHQHRXSQAcjs = require('./chunk-HQHRXSQA.cjs');
30
+
31
+
32
+
33
+
34
+
35
+
36
+
37
+
38
+
39
+
40
+
41
+
42
+
43
+
44
+
45
+
46
+
47
+
48
+
49
+
50
+
51
+
52
+
53
+
54
+
55
+
56
+
57
+
58
+
59
+
60
+
61
+
62
+
63
+
64
+
65
+
66
+
67
+
68
+
69
+
70
+
71
+
72
+
73
+
74
+
75
+
76
+ var _chunkYBDQJVFQcjs = require('./chunk-YBDQJVFQ.cjs');
77
+ require('./chunk-7NMQFTDJ.cjs');
31
78
 
32
79
  // src/server/adapters/factory.js
33
80
  async function createAdapter(config) {
@@ -43,11 +90,11 @@ async function createAdapter(config) {
43
90
  }
44
91
  switch (config.driver) {
45
92
  case "neon": {
46
- const { NeonAdapter } = await Promise.resolve().then(() => _interopRequireWildcard(require("./neon-V4VOH55N.cjs")));
93
+ const { NeonAdapter } = await Promise.resolve().then(() => _interopRequireWildcard(require("./neon-XHPJZESV.cjs")));
47
94
  return new NeonAdapter(config.connectionString);
48
95
  }
49
96
  case "pg": {
50
- const { PgAdapter } = await Promise.resolve().then(() => _interopRequireWildcard(require("./pg-6X74HKMX.cjs")));
97
+ const { PgAdapter } = await Promise.resolve().then(() => _interopRequireWildcard(require("./pg-FHXQ6BJP.cjs")));
51
98
  return new PgAdapter(config.connectionString);
52
99
  }
53
100
  default:
@@ -60,7 +107,7 @@ async function createAdapter(config) {
60
107
  // src/server/handlers/init-tenant.js
61
108
  function createInitTenantHandler(ctx) {
62
109
  async function POST(headers, body) {
63
- const initSecret = _chunkHQHRXSQAcjs.getHeader.call(void 0, headers, "x-init-secret");
110
+ const initSecret = _chunkYBDQJVFQcjs.getHeader.call(void 0, headers, "x-init-secret");
64
111
  if (ctx.tenant.initSecret && initSecret !== ctx.tenant.initSecret) {
65
112
  return {
66
113
  status: 401,
@@ -73,7 +120,7 @@ function createInitTenantHandler(ctx) {
73
120
  }
74
121
  };
75
122
  }
76
- const parsed = _chunkHQHRXSQAcjs.parseJsonBody.call(void 0, body);
123
+ const parsed = _chunkYBDQJVFQcjs.parseJsonBody.call(void 0, body);
77
124
  if (!parsed.ok) {
78
125
  return {
79
126
  status: 400,
@@ -87,7 +134,7 @@ function createInitTenantHandler(ctx) {
87
134
  const tenantId = payload.tenantId || void 0;
88
135
  const driver = payload.driver;
89
136
  const databaseUrl = payload.databaseUrl || payload.connectionString;
90
- if (tenantId && !_chunkHQHRXSQAcjs.isValidUUIDv4.call(void 0, tenantId)) {
137
+ if (tenantId && !_chunkYBDQJVFQcjs.isValidUUIDv4.call(void 0, tenantId)) {
91
138
  return {
92
139
  status: 400,
93
140
  body: {
@@ -207,7 +254,7 @@ function createSendNotificationsHandler(ctx) {
207
254
  }
208
255
  };
209
256
  }
210
- const data = await _chunkHQHRXSQAcjs.runScheduledTick.call(void 0, { ...ctx, db, masterKey });
257
+ const data = await _chunkYBDQJVFQcjs.runScheduledTick.call(void 0, { ...ctx, db, masterKey });
211
258
  return { status: 200, body: { success: true, data } };
212
259
  }
213
260
  return { POST };
@@ -216,14 +263,6 @@ function createSendNotificationsHandler(ctx) {
216
263
  // src/server/tenant/blob-store.js
217
264
  var _crypto = require('crypto');
218
265
  var inMemoryNamespaces = /* @__PURE__ */ new Map();
219
- function base64UrlEncode(input) {
220
- return Buffer.from(input).toString("base64").replace(/\+/g, "-").replace(/\//g, "_").replace(/=+$/g, "");
221
- }
222
- function base64UrlDecode(input) {
223
- const normalized = input.replace(/-/g, "+").replace(/_/g, "/");
224
- const padLength = (4 - normalized.length % 4) % 4;
225
- return Buffer.from(normalized + "=".repeat(padLength), "base64");
226
- }
227
266
  function getKekBuffer(kek) {
228
267
  const value = String(kek || "").trim();
229
268
  if (!value) {
@@ -237,16 +276,16 @@ function encryptConfig(config, kekBuffer) {
237
276
  const plaintext = Buffer.from(JSON.stringify(config), "utf8");
238
277
  const ciphertext = Buffer.concat([cipher.update(plaintext), cipher.final()]);
239
278
  const authTag = cipher.getAuthTag();
240
- return `v1.${base64UrlEncode(iv)}.${base64UrlEncode(authTag)}.${base64UrlEncode(ciphertext)}`;
279
+ return `v1.${_chunkYBDQJVFQcjs.bytesToBase64Url.call(void 0, iv)}.${_chunkYBDQJVFQcjs.bytesToBase64Url.call(void 0, authTag)}.${_chunkYBDQJVFQcjs.bytesToBase64Url.call(void 0, ciphertext)}`;
241
280
  }
242
281
  function decryptConfig(encrypted, kekBuffer) {
243
282
  const parts = String(encrypted || "").split(".");
244
283
  if (parts.length !== 4 || parts[0] !== "v1") {
245
284
  throw new Error("INVALID_TENANT_CONFIG");
246
285
  }
247
- const iv = base64UrlDecode(parts[1]);
248
- const authTag = base64UrlDecode(parts[2]);
249
- const ciphertext = base64UrlDecode(parts[3]);
286
+ const iv = _chunkYBDQJVFQcjs.base64UrlToBytes.call(void 0, parts[1]);
287
+ const authTag = _chunkYBDQJVFQcjs.base64UrlToBytes.call(void 0, parts[2]);
288
+ const ciphertext = _chunkYBDQJVFQcjs.base64UrlToBytes.call(void 0, parts[3]);
250
289
  const decipher = _crypto.createDecipheriv.call(void 0, "aes-256-gcm", kekBuffer, iv);
251
290
  decipher.setAuthTag(authTag);
252
291
  const plaintext = Buffer.concat([decipher.update(ciphertext), decipher.final()]).toString("utf8");
@@ -313,16 +352,8 @@ function createTenantBlobStore(options) {
313
352
 
314
353
  // src/server/tenant/token.js
315
354
 
316
- function base64UrlEncode2(input) {
317
- return Buffer.from(input).toString("base64").replace(/\+/g, "-").replace(/\//g, "_").replace(/=+$/g, "");
318
- }
319
- function base64UrlDecode2(input) {
320
- const normalized = input.replace(/-/g, "+").replace(/_/g, "/");
321
- const padLength = (4 - normalized.length % 4) % 4;
322
- return Buffer.from(normalized + "=".repeat(padLength), "base64");
323
- }
324
355
  function sign(input, secret) {
325
- return base64UrlEncode2(_crypto.createHmac.call(void 0, "sha256", secret).update(input).digest());
356
+ return _chunkYBDQJVFQcjs.bytesToBase64Url.call(void 0, _crypto.createHmac.call(void 0, "sha256", secret).update(input).digest());
326
357
  }
327
358
  function nowEpochSeconds() {
328
359
  return Math.floor(Date.now() / 1e3);
@@ -338,8 +369,8 @@ function createTenantToken(params, secret) {
338
369
  v: 1
339
370
  };
340
371
  const header = { alg: "HS256", typ: "JWT" };
341
- const encodedHeader = base64UrlEncode2(JSON.stringify(header));
342
- const encodedPayload = base64UrlEncode2(JSON.stringify(payload));
372
+ const encodedHeader = _chunkYBDQJVFQcjs.bytesToBase64Url.call(void 0, _chunkYBDQJVFQcjs.utf8.call(void 0, JSON.stringify(header)));
373
+ const encodedPayload = _chunkYBDQJVFQcjs.bytesToBase64Url.call(void 0, _chunkYBDQJVFQcjs.utf8.call(void 0, JSON.stringify(payload)));
343
374
  const signingInput = `${encodedHeader}.${encodedPayload}`;
344
375
  const signature = sign(signingInput, secret);
345
376
  return `${signingInput}.${signature}`;
@@ -355,20 +386,20 @@ function verifyTenantToken(token, secret, options = {}) {
355
386
  const [encodedHeader, encodedPayload, receivedSignature] = parts;
356
387
  const signingInput = `${encodedHeader}.${encodedPayload}`;
357
388
  const expectedSignature = sign(signingInput, secret);
358
- let receivedBuffer;
359
- let expectedBuffer;
389
+ let receivedBytes;
390
+ let expectedBytes;
360
391
  try {
361
- receivedBuffer = base64UrlDecode2(receivedSignature);
362
- expectedBuffer = base64UrlDecode2(expectedSignature);
392
+ receivedBytes = _chunkYBDQJVFQcjs.base64UrlToBytes.call(void 0, receivedSignature);
393
+ expectedBytes = _chunkYBDQJVFQcjs.base64UrlToBytes.call(void 0, expectedSignature);
363
394
  } catch (e) {
364
395
  throw new Error("INVALID_TENANT_AUTH");
365
396
  }
366
- if (receivedBuffer.length !== expectedBuffer.length || !_crypto.timingSafeEqual.call(void 0, receivedBuffer, expectedBuffer)) {
397
+ if (!_chunkYBDQJVFQcjs.timingSafeEqualBytes.call(void 0, receivedBytes, expectedBytes)) {
367
398
  throw new Error("INVALID_TENANT_AUTH");
368
399
  }
369
400
  let payload;
370
401
  try {
371
- payload = JSON.parse(base64UrlDecode2(encodedPayload).toString("utf8"));
402
+ payload = JSON.parse(_chunkYBDQJVFQcjs.utf8Decode.call(void 0, _chunkYBDQJVFQcjs.base64UrlToBytes.call(void 0, encodedPayload)));
372
403
  } catch (e2) {
373
404
  throw new Error("INVALID_TENANT_AUTH");
374
405
  }
@@ -442,8 +473,17 @@ function createTenantContextManager(options) {
442
473
  async function getOrCreateAdapter(dbConfig) {
443
474
  const cacheKey = `${dbConfig.driver}:${dbConfig.connectionString}`;
444
475
  if (!adapterCache.has(cacheKey)) {
445
- const adapter = await adapterFactory(dbConfig);
446
- adapterCache.set(cacheKey, adapter);
476
+ const created = (async () => {
477
+ const adapter = await adapterFactory(dbConfig);
478
+ if (typeof adapter.initSchema === "function") {
479
+ await adapter.initSchema();
480
+ }
481
+ return adapter;
482
+ })().catch((error) => {
483
+ adapterCache.delete(cacheKey);
484
+ throw error;
485
+ });
486
+ adapterCache.set(cacheKey, created);
447
487
  }
448
488
  return adapterCache.get(cacheKey);
449
489
  }
@@ -571,6 +611,14 @@ async function createReiServer(config) {
571
611
  privateKey: vapid.privateKey || ""
572
612
  },
573
613
  webpush: webpushModule,
614
+ // 分片传输的限额(与 installReiSW 的 multipart 同一份)。instant 消息在
615
+ // schedule-message 里就地投递、定时消息走 send-notifications 的 tick,两条路
616
+ // 都从这个 ctx 展开,所以配一次两边都认。
617
+ multipart: config.multipart || null,
618
+ // 定时任务投递失败后的重试次数上限(默认 3),send-notifications 展开 ctx
619
+ // 时带进 runScheduledTick。
620
+ maxGenerationRetries: config.maxGenerationRetries,
621
+ maxDeliveryRetries: config.maxDeliveryRetries,
574
622
  tenant: {
575
623
  initSecret
576
624
  },
@@ -579,12 +627,15 @@ async function createReiServer(config) {
579
627
  return {
580
628
  handlers: {
581
629
  initTenant: createInitTenantHandler(ctx),
582
- getUserKey: _chunkHQHRXSQAcjs.createGetUserKeyHandler.call(void 0, ctx),
583
- scheduleMessage: _chunkHQHRXSQAcjs.createScheduleMessageHandler.call(void 0, ctx),
630
+ getUserKey: _chunkYBDQJVFQcjs.createGetUserKeyHandler.call(void 0, ctx),
631
+ scheduleMessage: _chunkYBDQJVFQcjs.createScheduleMessageHandler.call(void 0, ctx),
584
632
  sendNotifications: createSendNotificationsHandler(ctx),
585
- updateMessage: _chunkHQHRXSQAcjs.createUpdateMessageHandler.call(void 0, ctx),
586
- cancelMessage: _chunkHQHRXSQAcjs.createCancelMessageHandler.call(void 0, ctx),
587
- messages: _chunkHQHRXSQAcjs.createMessagesHandler.call(void 0, ctx)
633
+ updateMessage: _chunkYBDQJVFQcjs.createUpdateMessageHandler.call(void 0, ctx),
634
+ cancelMessage: _chunkYBDQJVFQcjs.createCancelMessageHandler.call(void 0, ctx),
635
+ messages: _chunkYBDQJVFQcjs.createMessagesHandler.call(void 0, ctx),
636
+ getMessage: _chunkYBDQJVFQcjs.createGetMessageHandler.call(void 0, ctx),
637
+ pushSubscription: _chunkYBDQJVFQcjs.createPushSubscriptionHandler.call(void 0, ctx),
638
+ llmCredentials: _chunkYBDQJVFQcjs.createLlmCredentialsHandler.call(void 0, ctx)
588
639
  }
589
640
  };
590
641
  }
@@ -614,4 +665,42 @@ async function createReiServer(config) {
614
665
 
615
666
 
616
667
 
617
- exports.MAX_PUSH_PAYLOAD_BYTES = _chunkHQHRXSQAcjs.MAX_PUSH_PAYLOAD_BYTES; exports.WEB_PUSH_ENCRYPTION_OVERHEAD_BYTES = _chunkHQHRXSQAcjs.WEB_PUSH_ENCRYPTION_OVERHEAD_BYTES; exports.WEB_PUSH_MAX_BODY_BYTES = _chunkHQHRXSQAcjs.WEB_PUSH_MAX_BODY_BYTES; exports.createAdapter = createAdapter; exports.createD1Adapter = _chunkHQHRXSQAcjs.createD1Adapter; exports.createReiServer = createReiServer; exports.createSingleUserCloudflareWorker = _chunkHQHRXSQAcjs.createSingleUserCloudflareWorker; exports.createSingleUserServer = _chunkHQHRXSQAcjs.createSingleUserServer; exports.createTenantToken = createTenantToken; exports.createWebCryptoWebPush = _chunkHQHRXSQAcjs.createWebCryptoWebPush; exports.decryptFromStorage = _chunkHQHRXSQAcjs.decryptFromStorage; exports.decryptPayload = _chunkHQHRXSQAcjs.decryptPayload; exports.deriveUserEncryptionKey = _chunkHQHRXSQAcjs.deriveUserEncryptionKey; exports.encryptForStorage = _chunkHQHRXSQAcjs.encryptForStorage; exports.isValidISO8601 = _chunkHQHRXSQAcjs.isValidISO8601; exports.isValidUUID = _chunkHQHRXSQAcjs.isValidUUID; exports.isValidUUIDv4 = _chunkHQHRXSQAcjs.isValidUUIDv4; exports.isValidUrl = _chunkHQHRXSQAcjs.isValidUrl; exports.measurePushPayload = _chunkHQHRXSQAcjs.measurePushPayload; exports.runScheduledTick = _chunkHQHRXSQAcjs.runScheduledTick; exports.validateAvatarUrl = _chunkHQHRXSQAcjs.validateAvatarUrl; exports.validateLlmMessagesArray = _chunkHQHRXSQAcjs.validateLlmMessagesArray; exports.validateScheduleMessagePayload = _chunkHQHRXSQAcjs.validateScheduleMessagePayload; exports.validateSplitPattern = _chunkHQHRXSQAcjs.validateSplitPattern; exports.verifyTenantToken = verifyTenantToken;
668
+
669
+
670
+
671
+
672
+
673
+
674
+
675
+
676
+
677
+
678
+
679
+
680
+
681
+
682
+
683
+
684
+
685
+
686
+
687
+
688
+
689
+
690
+
691
+
692
+
693
+
694
+
695
+
696
+
697
+
698
+
699
+
700
+
701
+
702
+
703
+
704
+
705
+
706
+ exports.CORS_ALLOW_HEADERS = _chunkYBDQJVFQcjs.CORS_ALLOW_HEADERS; exports.CORS_ALLOW_METHODS = _chunkYBDQJVFQcjs.CORS_ALLOW_METHODS; exports.CRED_ID_MAX_LENGTH = _chunkYBDQJVFQcjs.CRED_ID_MAX_LENGTH; exports.CRED_PUT_BATCH_MAX = _chunkYBDQJVFQcjs.CRED_PUT_BATCH_MAX; exports.CRED_REFS_MAX_ENTRIES = _chunkYBDQJVFQcjs.CRED_REFS_MAX_ENTRIES; exports.CRED_ROWS_PER_USER_MAX = _chunkYBDQJVFQcjs.CRED_ROWS_PER_USER_MAX; exports.DEFAULT_CLAIM_LEASE_MS = _chunkYBDQJVFQcjs.DEFAULT_CLAIM_LEASE_MS; exports.DEFAULT_HEARTBEAT_LEASE_TTL_MS = _chunkYBDQJVFQcjs.DEFAULT_HEARTBEAT_LEASE_TTL_MS; exports.DEFAULT_LEASE_HEARTBEAT_MS = _chunkYBDQJVFQcjs.DEFAULT_LEASE_HEARTBEAT_MS; exports.DEFAULT_MAX_DELIVERY_RETRIES = _chunkYBDQJVFQcjs.DEFAULT_MAX_DELIVERY_RETRIES; exports.DEFAULT_MAX_REQUEST_BODY_BYTES = _chunkYBDQJVFQcjs.DEFAULT_MAX_REQUEST_BODY_BYTES; exports.DEFAULT_MAX_SCHEDULED_TASKS_PER_FIRE = _chunkYBDQJVFQcjs.DEFAULT_MAX_SCHEDULED_TASKS_PER_FIRE; exports.DEFAULT_MAX_TOOL_ITERATIONS = _chunkYBDQJVFQcjs.DEFAULT_MAX_TOOL_ITERATIONS; exports.DEFAULT_TOTAL_TIMEOUT_MS = _chunkYBDQJVFQcjs.DEFAULT_TOTAL_TIMEOUT_MS; exports.DeploymentConfigError = _chunkYBDQJVFQcjs.DeploymentConfigError; exports.MAX_DEFER_AFTER_MS = _chunkYBDQJVFQcjs.MAX_DEFER_AFTER_MS; exports.MAX_PUSH_PAYLOAD_BYTES = _chunkYBDQJVFQcjs.MAX_PUSH_PAYLOAD_BYTES; exports.MAX_TASK_PAYLOAD_BYTES = _chunkYBDQJVFQcjs.MAX_TASK_PAYLOAD_BYTES; exports.MIN_SCHEDULE_LEAD_MS = _chunkYBDQJVFQcjs.MIN_SCHEDULE_LEAD_MS; exports.NonRetryableError = _chunkYBDQJVFQcjs.NonRetryableError; exports.PUSH_ENVELOPE_RESERVED_BYTES = _chunkYBDQJVFQcjs.PUSH_ENVELOPE_RESERVED_BYTES; exports.SCHEMA_VERSION = _chunkYBDQJVFQcjs.SCHEMA_VERSION; exports.WEB_PUSH_ENCRYPTION_OVERHEAD_BYTES = _chunkYBDQJVFQcjs.WEB_PUSH_ENCRYPTION_OVERHEAD_BYTES; exports.WEB_PUSH_MAX_BODY_BYTES = _chunkYBDQJVFQcjs.WEB_PUSH_MAX_BODY_BYTES; exports.advanceOccurrence = _chunkYBDQJVFQcjs.advanceOccurrence; exports.createAdapter = createAdapter; exports.createD1Adapter = _chunkYBDQJVFQcjs.createD1Adapter; exports.createReiServer = createReiServer; exports.createSingleUserCloudflareWorker = _chunkYBDQJVFQcjs.createSingleUserCloudflareWorker; exports.createSingleUserServer = _chunkYBDQJVFQcjs.createSingleUserServer; exports.createTenantToken = createTenantToken; exports.createWebCryptoWebPush = _chunkYBDQJVFQcjs.createWebCryptoWebPush; exports.decryptFromStorage = _chunkYBDQJVFQcjs.decryptFromStorage; exports.decryptPayload = _chunkYBDQJVFQcjs.decryptPayload; exports.deriveUserEncryptionKey = _chunkYBDQJVFQcjs.deriveUserEncryptionKey; exports.encryptForStorage = _chunkYBDQJVFQcjs.encryptForStorage; exports.ensureSchema = _chunkYBDQJVFQcjs.ensureSchema; exports.getSchemaVersion = _chunkYBDQJVFQcjs.getSchemaVersion; exports.hasChatCredRef = _chunkYBDQJVFQcjs.hasChatCredRef; exports.isNonRetryableError = _chunkYBDQJVFQcjs.isNonRetryableError; exports.isValidCredId = _chunkYBDQJVFQcjs.isValidCredId; exports.isValidISO8601 = _chunkYBDQJVFQcjs.isValidISO8601; exports.isValidTimeZoneId = _chunkYBDQJVFQcjs.isValidTimeZoneId; exports.isValidUUID = _chunkYBDQJVFQcjs.isValidUUID; exports.isValidUUIDv4 = _chunkYBDQJVFQcjs.isValidUUIDv4; exports.isValidUrl = _chunkYBDQJVFQcjs.isValidUrl; exports.measurePushPayload = _chunkYBDQJVFQcjs.measurePushPayload; exports.nextFutureOccurrence = _chunkYBDQJVFQcjs.nextFutureOccurrence; exports.planNextOccurrence = _chunkYBDQJVFQcjs.planNextOccurrence; exports.readRequestBody = _chunkYBDQJVFQcjs.readRequestBody; exports.resolveLlmCredential = _chunkYBDQJVFQcjs.resolveLlmCredential; exports.runScheduledTick = _chunkYBDQJVFQcjs.runScheduledTick; exports.runTask = _chunkYBDQJVFQcjs.runTask; exports.sanitizeErrorSummary = _chunkYBDQJVFQcjs.sanitizeErrorSummary; exports.summarizeErrorCause = _chunkYBDQJVFQcjs.summarizeErrorCause; exports.supportsLlmCredentialsStore = _chunkYBDQJVFQcjs.supportsLlmCredentialsStore; exports.validateAvatarUrl = _chunkYBDQJVFQcjs.validateAvatarUrl; exports.validateCredRefs = _chunkYBDQJVFQcjs.validateCredRefs; exports.validateCredValue = _chunkYBDQJVFQcjs.validateCredValue; exports.validateLlmMessagesArray = _chunkYBDQJVFQcjs.validateLlmMessagesArray; exports.validateScheduleMessagePayload = _chunkYBDQJVFQcjs.validateScheduleMessagePayload; exports.validateSplitPattern = _chunkYBDQJVFQcjs.validateSplitPattern; exports.verifyTenantToken = verifyTenantToken;