@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.
- package/LICENSE +21 -0
- package/README.md +861 -35
- package/dist/adapters/d1.d.ts +693 -0
- package/dist/adapters/factory.d.ts +39 -0
- package/dist/adapters/interface.d.ts +384 -0
- package/dist/adapters/neon.d.ts +105 -0
- package/dist/adapters/pg-shared.d.ts +194 -0
- package/dist/adapters/pg.d.ts +101 -0
- package/dist/adapters/schema.d.ts +57 -0
- package/dist/adapters/schema.sqlite.d.ts +80 -0
- package/dist/chunk-7NMQFTDJ.cjs +148 -0
- package/dist/{chunk-GOBCWCJP.mjs → chunk-GN44PST5.mjs} +68 -1
- package/dist/chunk-RL7V7VSS.mjs +8784 -0
- package/dist/chunk-TKDISKCF.cjs +163 -0
- package/dist/chunk-XKUWMYVF.mjs +163 -0
- package/dist/chunk-YBDQJVFQ.cjs +8784 -0
- package/dist/cloudflare/single-user-worker.d.ts +39 -0
- package/dist/cloudflare.cjs +35 -2
- package/dist/cloudflare.d.ts +11 -2
- package/dist/cloudflare.mjs +36 -3
- package/dist/handlers/cancel-message.d.ts +3 -0
- package/dist/handlers/capabilities.d.ts +4 -0
- package/dist/handlers/client-state-namespaces.d.ts +5 -0
- package/dist/handlers/client-state.d.ts +7 -0
- package/dist/handlers/cloud-data.d.ts +4 -0
- package/dist/handlers/get-message.d.ts +3 -0
- package/dist/handlers/get-user-key.d.ts +3 -0
- package/dist/handlers/init-tenant.d.ts +23 -0
- package/dist/handlers/llm-credentials.d.ts +5 -0
- package/dist/handlers/messages.d.ts +3 -0
- package/dist/handlers/outbox.d.ts +9 -0
- package/dist/handlers/push-subscription.d.ts +5 -0
- package/dist/handlers/schedule-message.d.ts +3 -0
- package/dist/handlers/send-notifications.d.ts +3 -0
- package/dist/handlers/single-user-init.d.ts +13 -0
- package/dist/handlers/update-message.d.ts +3 -0
- package/dist/handlers/vapid-public-key.d.ts +19 -0
- package/dist/index.cjs +133 -44
- package/dist/index.d.cts +145 -766
- package/dist/index.d.ts +145 -766
- package/dist/index.mjs +125 -36
- package/dist/lib/agentic-fire.d.ts +177 -0
- package/dist/lib/client-state-store.d.ts +88 -0
- package/dist/lib/cloud-data-cleanup.d.ts +36 -0
- package/dist/lib/cloud-data-guard.d.ts +14 -0
- package/dist/lib/cloud-data-inventory.d.ts +15 -0
- package/dist/lib/constant-time.d.ts +14 -0
- package/dist/lib/db-errors.d.ts +10 -0
- package/dist/lib/encryption.d.ts +48 -0
- package/dist/lib/errors.d.ts +273 -0
- package/dist/lib/llm-credentials-store.d.ts +147 -0
- package/dist/lib/llm.d.ts +12 -0
- package/dist/lib/message-processor.d.ts +82 -0
- package/dist/lib/outbox-store.d.ts +162 -0
- package/dist/lib/push-policy.d.ts +11 -0
- package/dist/lib/push-subscription-store.d.ts +94 -0
- package/dist/lib/recurrence.d.ts +51 -0
- package/dist/lib/request.d.ts +182 -0
- package/dist/lib/result-emitter.d.ts +60 -0
- package/dist/lib/retry-policy.d.ts +11 -0
- package/dist/lib/run-tick.d.ts +121 -0
- package/dist/lib/schema-version.d.ts +50 -0
- package/dist/lib/state-accessors.d.ts +70 -0
- package/dist/lib/state-chunks.d.ts +65 -0
- package/dist/lib/task-projection.d.ts +92 -0
- package/dist/lib/validation.d.ts +97 -0
- package/dist/lib/version.d.ts +7 -0
- package/dist/lib/webcrypto-utils.d.ts +1 -0
- package/dist/lib/webpush-webcrypto.d.ts +78 -0
- package/dist/{neon-QJ7KYHEX.mjs → neon-GKLT4UY3.mjs} +116 -44
- package/dist/{neon-V4VOH55N.cjs → neon-XHPJZESV.cjs} +121 -49
- package/dist/{pg-6X74HKMX.cjs → pg-FHXQ6BJP.cjs} +109 -48
- package/dist/{pg-DFJSFOJQ.mjs → pg-J4YXRQP5.mjs} +104 -43
- package/dist/single-user.d.ts +106 -0
- package/dist/tenant/blob-store.d.ts +30 -0
- package/dist/tenant/context.d.ts +47 -0
- package/dist/tenant/single-user-context.d.ts +29 -0
- package/dist/tenant/token.d.ts +26 -0
- package/package.json +3 -3
- package/dist/chunk-DCKCAGFV.cjs +0 -81
- package/dist/chunk-HQHRXSQA.cjs +0 -2710
- package/dist/chunk-LEE5KQ7Y.mjs +0 -2710
- package/dist/cloudflare-CH3dBl5b.d.cts +0 -4235
- package/dist/cloudflare-CH3dBl5b.d.ts +0 -4235
- package/dist/cloudflare.d.cts +0 -2
- package/dist/neon-D8Z2Nn97.d.cts +0 -295
- package/dist/neon-PqNFJIz2.d.ts +0 -295
- package/dist/pg-C48FwCWW.d.cts +0 -289
- package/dist/pg-C5gtWUfU.d.ts +0 -289
- package/dist/schema-BHuyH_6Z.d.cts +0 -88
- 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";
|
package/dist/cloudflare.cjs
CHANGED
|
@@ -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
|
-
|
|
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;
|
package/dist/cloudflare.d.ts
CHANGED
|
@@ -1,2 +1,11 @@
|
|
|
1
|
-
export {
|
|
2
|
-
|
|
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";
|
package/dist/cloudflare.mjs
CHANGED
|
@@ -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
|
-
|
|
15
|
-
|
|
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
|
-
|
|
57
|
+
nextFutureOccurrence,
|
|
58
|
+
planNextOccurrence,
|
|
59
|
+
readRequestBody,
|
|
60
|
+
runScheduledTick,
|
|
61
|
+
runTask,
|
|
62
|
+
summarizeErrorCause
|
|
30
63
|
};
|
|
@@ -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,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,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,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,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
|
-
|
|
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-
|
|
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-
|
|
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 =
|
|
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 =
|
|
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 && !
|
|
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
|
|
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.${
|
|
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 =
|
|
248
|
-
const authTag =
|
|
249
|
-
const ciphertext =
|
|
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
|
|
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 =
|
|
342
|
-
const encodedPayload =
|
|
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
|
|
359
|
-
let
|
|
389
|
+
let receivedBytes;
|
|
390
|
+
let expectedBytes;
|
|
360
391
|
try {
|
|
361
|
-
|
|
362
|
-
|
|
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 (
|
|
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(
|
|
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
|
|
446
|
-
|
|
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:
|
|
583
|
-
scheduleMessage:
|
|
630
|
+
getUserKey: _chunkYBDQJVFQcjs.createGetUserKeyHandler.call(void 0, ctx),
|
|
631
|
+
scheduleMessage: _chunkYBDQJVFQcjs.createScheduleMessageHandler.call(void 0, ctx),
|
|
584
632
|
sendNotifications: createSendNotificationsHandler(ctx),
|
|
585
|
-
updateMessage:
|
|
586
|
-
cancelMessage:
|
|
587
|
-
messages:
|
|
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
|
-
|
|
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;
|