@rei-standard/amsg-server 2.6.0-next.13 → 2.6.0-next.16
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 +109 -1
- package/dist/adapters/d1.d.ts +130 -0
- package/dist/adapters/interface.d.ts +67 -0
- package/dist/adapters/neon.d.ts +20 -58
- package/dist/adapters/pg-shared.d.ts +114 -0
- package/dist/adapters/pg.d.ts +20 -58
- package/dist/adapters/schema.d.ts +1 -1
- package/dist/adapters/schema.sqlite.d.ts +15 -1
- package/dist/{chunk-B2FDV7YK.mjs → chunk-34I2YSWE.mjs} +10 -0
- package/dist/{chunk-5IOYCCFD.cjs → chunk-H4V7OXHE.cjs} +1326 -384
- package/dist/{chunk-TV7N3RTH.mjs → chunk-KVHR3RCU.mjs} +1324 -382
- package/dist/{chunk-V2SDWGUB.cjs → chunk-OUPM4HAV.cjs} +10 -0
- package/dist/chunk-TFFBMYA2.cjs +95 -0
- package/dist/chunk-UYROU4L3.mjs +95 -0
- package/dist/cloudflare/single-user-worker.d.ts +35 -2
- package/dist/cloudflare.cjs +17 -2
- package/dist/cloudflare.d.ts +3 -1
- package/dist/cloudflare.mjs +18 -3
- package/dist/handlers/outbox.d.ts +7 -0
- package/dist/index.cjs +72 -36
- package/dist/index.d.cts +5 -2
- package/dist/index.d.ts +5 -2
- package/dist/index.mjs +53 -17
- package/dist/lib/client-state-store.d.ts +18 -3
- package/dist/lib/errors.d.ts +93 -0
- package/dist/lib/message-processor.d.ts +8 -2
- package/dist/lib/outbox-store.d.ts +33 -0
- package/dist/lib/push-subscription-store.d.ts +10 -2
- package/dist/lib/request.d.ts +36 -0
- package/dist/lib/run-tick.d.ts +38 -0
- package/dist/lib/schema-version.d.ts +50 -0
- package/dist/lib/validation.d.ts +1 -7
- package/dist/{neon-3ASBLLCM.cjs → neon-G3G4TDAY.cjs} +52 -112
- package/dist/{neon-CUIGAB2T.mjs → neon-GBUF4G76.mjs} +44 -104
- package/dist/{pg-IEZTAR43.cjs → pg-C3JZKBUM.cjs} +49 -112
- package/dist/{pg-KMJPL6QV.mjs → pg-MRXP5MHJ.mjs} +41 -104
- package/dist/single-user.d.ts +4 -0
- package/package.json +2 -2
|
@@ -12,6 +12,7 @@ var TABLE_SQL = `
|
|
|
12
12
|
serialize_group VARCHAR(64),
|
|
13
13
|
status VARCHAR(50) NOT NULL DEFAULT 'pending' CHECK (status IN ('pending', 'sent', 'failed')),
|
|
14
14
|
retry_count INTEGER DEFAULT 0,
|
|
15
|
+
last_error TEXT,
|
|
15
16
|
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
|
|
16
17
|
updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
|
|
17
18
|
)
|
|
@@ -31,6 +32,14 @@ var MIGRATIONS = [
|
|
|
31
32
|
name: "add_serialize_group",
|
|
32
33
|
sql: "ALTER TABLE scheduled_messages ADD COLUMN IF NOT EXISTS serialize_group VARCHAR(64)",
|
|
33
34
|
description: "Serialization group for runScheduledTick serializeBy (2.6.0)"
|
|
35
|
+
},
|
|
36
|
+
{
|
|
37
|
+
name: "add_last_error",
|
|
38
|
+
// 上一次投递失败的脱敏摘要(JSON:{ at, occurrence, reason })。payload 里
|
|
39
|
+
// 的 lastError 是密文里的完整记录,这一列是它的明文出口——payload 本身
|
|
40
|
+
// 解密失败时也写得进去,GET /message 对已失败的行也读得出来。
|
|
41
|
+
sql: "ALTER TABLE scheduled_messages ADD COLUMN IF NOT EXISTS last_error TEXT",
|
|
42
|
+
description: "Sanitized last delivery-failure summary (2.6.0)"
|
|
34
43
|
}
|
|
35
44
|
];
|
|
36
45
|
var INDEXES = [
|
|
@@ -108,6 +117,7 @@ var UPDATABLE_COLUMNS = /* @__PURE__ */ new Set([
|
|
|
108
117
|
"serialize_group",
|
|
109
118
|
"status",
|
|
110
119
|
"retry_count",
|
|
120
|
+
"last_error",
|
|
111
121
|
"created_at",
|
|
112
122
|
"updated_at"
|
|
113
123
|
]);
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } }// src/server/adapters/pg-shared.js
|
|
2
|
+
async function claimTask(query, taskId, expectedNextSendAt, leaseUntil, serializeGroup = null) {
|
|
3
|
+
const grouped = typeof serializeGroup === "string" && serializeGroup.length > 0;
|
|
4
|
+
const params = [leaseUntil, taskId, expectedNextSendAt];
|
|
5
|
+
let setClause = "lease_until = $1, updated_at = NOW()";
|
|
6
|
+
let groupGuard = "";
|
|
7
|
+
if (grouped) {
|
|
8
|
+
params.push(serializeGroup);
|
|
9
|
+
setClause = "lease_until = $1, serialize_group = $4, updated_at = NOW()";
|
|
10
|
+
groupGuard = `
|
|
11
|
+
AND NOT EXISTS (
|
|
12
|
+
SELECT 1 FROM scheduled_messages busy
|
|
13
|
+
WHERE busy.serialize_group = $4 AND busy.id <> $2
|
|
14
|
+
AND busy.status = 'pending' AND busy.lease_until > NOW()
|
|
15
|
+
)`;
|
|
16
|
+
}
|
|
17
|
+
const rows = await query(
|
|
18
|
+
`UPDATE scheduled_messages
|
|
19
|
+
SET ${setClause}
|
|
20
|
+
WHERE id = $2 AND status = 'pending'
|
|
21
|
+
AND date_trunc('milliseconds', next_send_at)
|
|
22
|
+
= date_trunc('milliseconds', $3::timestamptz)
|
|
23
|
+
AND (lease_until IS NULL OR lease_until <= NOW())${groupGuard}
|
|
24
|
+
RETURNING id`,
|
|
25
|
+
params
|
|
26
|
+
);
|
|
27
|
+
if (rows.length === 0) return false;
|
|
28
|
+
if (!grouped) return true;
|
|
29
|
+
const conflict = await query(
|
|
30
|
+
`SELECT 1 FROM scheduled_messages busy
|
|
31
|
+
WHERE busy.serialize_group = $1 AND busy.id <> $2
|
|
32
|
+
AND busy.status = 'pending' AND busy.lease_until > NOW()
|
|
33
|
+
LIMIT 1`,
|
|
34
|
+
[serializeGroup, taskId]
|
|
35
|
+
);
|
|
36
|
+
if (conflict.length === 0) return true;
|
|
37
|
+
await query(
|
|
38
|
+
"UPDATE scheduled_messages SET lease_until = NULL, updated_at = NOW() WHERE id = $1",
|
|
39
|
+
[taskId]
|
|
40
|
+
);
|
|
41
|
+
return false;
|
|
42
|
+
}
|
|
43
|
+
async function renewTaskLease(query, taskId, leaseUntil) {
|
|
44
|
+
const rows = await query(
|
|
45
|
+
`UPDATE scheduled_messages SET lease_until = $1
|
|
46
|
+
WHERE id = $2 AND status = 'pending' AND lease_until IS NOT NULL
|
|
47
|
+
RETURNING id`,
|
|
48
|
+
[leaseUntil, taskId]
|
|
49
|
+
);
|
|
50
|
+
return rows.length > 0;
|
|
51
|
+
}
|
|
52
|
+
async function getTaskStatusInfo(query, uuid, userId) {
|
|
53
|
+
const rows = await query(
|
|
54
|
+
"SELECT status, last_error FROM scheduled_messages WHERE uuid = $1 AND user_id = $2 LIMIT 1",
|
|
55
|
+
[uuid, userId]
|
|
56
|
+
);
|
|
57
|
+
if (rows.length === 0) return null;
|
|
58
|
+
return { status: rows[0].status, last_error: _nullishCoalesce(rows[0].last_error, () => ( null)) };
|
|
59
|
+
}
|
|
60
|
+
async function getPushSubscription(query, userId) {
|
|
61
|
+
const rows = await query(
|
|
62
|
+
"SELECT subscription, updated_at FROM push_subscriptions WHERE user_id = $1 LIMIT 1",
|
|
63
|
+
[userId]
|
|
64
|
+
);
|
|
65
|
+
if (rows.length === 0) return null;
|
|
66
|
+
return { subscription: rows[0].subscription, updated_at: Number(rows[0].updated_at) };
|
|
67
|
+
}
|
|
68
|
+
async function upsertPushSubscription(query, userId, encryptedSubscription, updatedAt) {
|
|
69
|
+
const rows = await query(
|
|
70
|
+
`INSERT INTO push_subscriptions (user_id, subscription, updated_at)
|
|
71
|
+
VALUES ($1, $2, $3)
|
|
72
|
+
ON CONFLICT (user_id) DO UPDATE SET
|
|
73
|
+
subscription = EXCLUDED.subscription,
|
|
74
|
+
updated_at = EXCLUDED.updated_at
|
|
75
|
+
RETURNING user_id`,
|
|
76
|
+
[userId, encryptedSubscription, updatedAt]
|
|
77
|
+
);
|
|
78
|
+
return rows.length > 0;
|
|
79
|
+
}
|
|
80
|
+
async function deletePushSubscription(query, userId) {
|
|
81
|
+
const rows = await query(
|
|
82
|
+
"DELETE FROM push_subscriptions WHERE user_id = $1 RETURNING user_id",
|
|
83
|
+
[userId]
|
|
84
|
+
);
|
|
85
|
+
return rows.length > 0;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
exports.claimTask = claimTask; exports.renewTaskLease = renewTaskLease; exports.getTaskStatusInfo = getTaskStatusInfo; exports.getPushSubscription = getPushSubscription; exports.upsertPushSubscription = upsertPushSubscription; exports.deletePushSubscription = deletePushSubscription;
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
// src/server/adapters/pg-shared.js
|
|
2
|
+
async function claimTask(query, taskId, expectedNextSendAt, leaseUntil, serializeGroup = null) {
|
|
3
|
+
const grouped = typeof serializeGroup === "string" && serializeGroup.length > 0;
|
|
4
|
+
const params = [leaseUntil, taskId, expectedNextSendAt];
|
|
5
|
+
let setClause = "lease_until = $1, updated_at = NOW()";
|
|
6
|
+
let groupGuard = "";
|
|
7
|
+
if (grouped) {
|
|
8
|
+
params.push(serializeGroup);
|
|
9
|
+
setClause = "lease_until = $1, serialize_group = $4, updated_at = NOW()";
|
|
10
|
+
groupGuard = `
|
|
11
|
+
AND NOT EXISTS (
|
|
12
|
+
SELECT 1 FROM scheduled_messages busy
|
|
13
|
+
WHERE busy.serialize_group = $4 AND busy.id <> $2
|
|
14
|
+
AND busy.status = 'pending' AND busy.lease_until > NOW()
|
|
15
|
+
)`;
|
|
16
|
+
}
|
|
17
|
+
const rows = await query(
|
|
18
|
+
`UPDATE scheduled_messages
|
|
19
|
+
SET ${setClause}
|
|
20
|
+
WHERE id = $2 AND status = 'pending'
|
|
21
|
+
AND date_trunc('milliseconds', next_send_at)
|
|
22
|
+
= date_trunc('milliseconds', $3::timestamptz)
|
|
23
|
+
AND (lease_until IS NULL OR lease_until <= NOW())${groupGuard}
|
|
24
|
+
RETURNING id`,
|
|
25
|
+
params
|
|
26
|
+
);
|
|
27
|
+
if (rows.length === 0) return false;
|
|
28
|
+
if (!grouped) return true;
|
|
29
|
+
const conflict = await query(
|
|
30
|
+
`SELECT 1 FROM scheduled_messages busy
|
|
31
|
+
WHERE busy.serialize_group = $1 AND busy.id <> $2
|
|
32
|
+
AND busy.status = 'pending' AND busy.lease_until > NOW()
|
|
33
|
+
LIMIT 1`,
|
|
34
|
+
[serializeGroup, taskId]
|
|
35
|
+
);
|
|
36
|
+
if (conflict.length === 0) return true;
|
|
37
|
+
await query(
|
|
38
|
+
"UPDATE scheduled_messages SET lease_until = NULL, updated_at = NOW() WHERE id = $1",
|
|
39
|
+
[taskId]
|
|
40
|
+
);
|
|
41
|
+
return false;
|
|
42
|
+
}
|
|
43
|
+
async function renewTaskLease(query, taskId, leaseUntil) {
|
|
44
|
+
const rows = await query(
|
|
45
|
+
`UPDATE scheduled_messages SET lease_until = $1
|
|
46
|
+
WHERE id = $2 AND status = 'pending' AND lease_until IS NOT NULL
|
|
47
|
+
RETURNING id`,
|
|
48
|
+
[leaseUntil, taskId]
|
|
49
|
+
);
|
|
50
|
+
return rows.length > 0;
|
|
51
|
+
}
|
|
52
|
+
async function getTaskStatusInfo(query, uuid, userId) {
|
|
53
|
+
const rows = await query(
|
|
54
|
+
"SELECT status, last_error FROM scheduled_messages WHERE uuid = $1 AND user_id = $2 LIMIT 1",
|
|
55
|
+
[uuid, userId]
|
|
56
|
+
);
|
|
57
|
+
if (rows.length === 0) return null;
|
|
58
|
+
return { status: rows[0].status, last_error: rows[0].last_error ?? null };
|
|
59
|
+
}
|
|
60
|
+
async function getPushSubscription(query, userId) {
|
|
61
|
+
const rows = await query(
|
|
62
|
+
"SELECT subscription, updated_at FROM push_subscriptions WHERE user_id = $1 LIMIT 1",
|
|
63
|
+
[userId]
|
|
64
|
+
);
|
|
65
|
+
if (rows.length === 0) return null;
|
|
66
|
+
return { subscription: rows[0].subscription, updated_at: Number(rows[0].updated_at) };
|
|
67
|
+
}
|
|
68
|
+
async function upsertPushSubscription(query, userId, encryptedSubscription, updatedAt) {
|
|
69
|
+
const rows = await query(
|
|
70
|
+
`INSERT INTO push_subscriptions (user_id, subscription, updated_at)
|
|
71
|
+
VALUES ($1, $2, $3)
|
|
72
|
+
ON CONFLICT (user_id) DO UPDATE SET
|
|
73
|
+
subscription = EXCLUDED.subscription,
|
|
74
|
+
updated_at = EXCLUDED.updated_at
|
|
75
|
+
RETURNING user_id`,
|
|
76
|
+
[userId, encryptedSubscription, updatedAt]
|
|
77
|
+
);
|
|
78
|
+
return rows.length > 0;
|
|
79
|
+
}
|
|
80
|
+
async function deletePushSubscription(query, userId) {
|
|
81
|
+
const rows = await query(
|
|
82
|
+
"DELETE FROM push_subscriptions WHERE user_id = $1 RETURNING user_id",
|
|
83
|
+
[userId]
|
|
84
|
+
);
|
|
85
|
+
return rows.length > 0;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
export {
|
|
89
|
+
claimTask,
|
|
90
|
+
renewTaskLease,
|
|
91
|
+
getTaskStatusInfo,
|
|
92
|
+
getPushSubscription,
|
|
93
|
+
upsertPushSubscription,
|
|
94
|
+
deletePushSubscription
|
|
95
|
+
};
|
|
@@ -1,4 +1,37 @@
|
|
|
1
|
-
|
|
1
|
+
/**
|
|
2
|
+
* @param {(env: Object) => Object|Promise<Object>} buildConfig
|
|
3
|
+
* @param {{ onError?: (info: { stage: 'config'|'request'|'tick', 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";
|
|
10
|
+
error: unknown;
|
|
11
|
+
cause: import("../lib/errors.js").ErrorCause;
|
|
12
|
+
path: string | null;
|
|
13
|
+
}) => void | Promise<void>;
|
|
14
|
+
}): {
|
|
2
15
|
fetch: (request: any, env: any) => Promise<Response>;
|
|
3
|
-
scheduled: (event: any, env: any) => Promise<
|
|
16
|
+
scheduled: (event: any, env: any) => Promise<{
|
|
17
|
+
ok: true;
|
|
18
|
+
summary: any;
|
|
19
|
+
} | {
|
|
20
|
+
ok: false;
|
|
21
|
+
cause: import("../lib/errors.js").ErrorCause;
|
|
22
|
+
}>;
|
|
23
|
+
runTask: (uuid: string, env: any) => Promise<{
|
|
24
|
+
ran: false;
|
|
25
|
+
reason: "not_configured" | "not_found" | "already_settled" | "not_due" | "retry_pending";
|
|
26
|
+
status?: string;
|
|
27
|
+
nextSendAt?: string;
|
|
28
|
+
retryAfter?: string;
|
|
29
|
+
} | {
|
|
30
|
+
ran: true;
|
|
31
|
+
summary: any;
|
|
32
|
+
}>;
|
|
33
|
+
getSchemaVersion: (env: any) => Promise<import("../lib/schema-version.js").SchemaVersionResult>;
|
|
34
|
+
ensureSchema: (env: any) => Promise<import("../lib/schema-version.js").EnsureSchemaResult>;
|
|
4
35
|
};
|
|
36
|
+
export const CORS_ALLOW_HEADERS: "Content-Type, X-User-Id, X-Payload-Encrypted, X-Encryption-Version, X-Response-Encrypted, X-Client-Token";
|
|
37
|
+
export const CORS_ALLOW_METHODS: "GET, POST, PUT, DELETE, OPTIONS";
|
package/dist/cloudflare.cjs
CHANGED
|
@@ -17,7 +17,6 @@
|
|
|
17
17
|
|
|
18
18
|
|
|
19
19
|
|
|
20
|
-
var _chunk5IOYCCFDcjs = require('./chunk-5IOYCCFD.cjs');
|
|
21
20
|
|
|
22
21
|
|
|
23
22
|
|
|
@@ -25,6 +24,8 @@ var _chunk5IOYCCFDcjs = require('./chunk-5IOYCCFD.cjs');
|
|
|
25
24
|
|
|
26
25
|
|
|
27
26
|
|
|
27
|
+
var _chunkH4V7OXHEcjs = require('./chunk-H4V7OXHE.cjs');
|
|
28
|
+
require('./chunk-OUPM4HAV.cjs');
|
|
28
29
|
|
|
29
30
|
|
|
30
31
|
|
|
@@ -37,4 +38,18 @@ var _chunk5IOYCCFDcjs = require('./chunk-5IOYCCFD.cjs');
|
|
|
37
38
|
|
|
38
39
|
|
|
39
40
|
|
|
40
|
-
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
exports.MAX_PUSH_PAYLOAD_BYTES = _chunkH4V7OXHEcjs.MAX_PUSH_PAYLOAD_BYTES; exports.NonRetryableError = _chunkH4V7OXHEcjs.NonRetryableError; exports.PUSH_ENVELOPE_RESERVED_BYTES = _chunkH4V7OXHEcjs.PUSH_ENVELOPE_RESERVED_BYTES; exports.SCHEMA_VERSION = _chunkH4V7OXHEcjs.SCHEMA_VERSION; exports.WEB_PUSH_ENCRYPTION_OVERHEAD_BYTES = _chunkH4V7OXHEcjs.WEB_PUSH_ENCRYPTION_OVERHEAD_BYTES; exports.WEB_PUSH_MAX_BODY_BYTES = _chunkH4V7OXHEcjs.WEB_PUSH_MAX_BODY_BYTES; exports.advanceOccurrence = _chunkH4V7OXHEcjs.advanceOccurrence; exports.createD1Adapter = _chunkH4V7OXHEcjs.createD1Adapter; exports.createSingleUserCloudflareWorker = _chunkH4V7OXHEcjs.createSingleUserCloudflareWorker; exports.createSingleUserServer = _chunkH4V7OXHEcjs.createSingleUserServer; exports.createWebCryptoWebPush = _chunkH4V7OXHEcjs.createWebCryptoWebPush; exports.decryptFromStorage = _chunkH4V7OXHEcjs.decryptFromStorage; exports.decryptPayload = _chunkH4V7OXHEcjs.decryptPayload; exports.deriveUserEncryptionKey = _chunkH4V7OXHEcjs.deriveUserEncryptionKey; exports.encryptForStorage = _chunkH4V7OXHEcjs.encryptForStorage; exports.ensureSchema = _chunkH4V7OXHEcjs.ensureSchema; exports.getSchemaVersion = _chunkH4V7OXHEcjs.getSchemaVersion; exports.isNonRetryableError = _chunkH4V7OXHEcjs.isNonRetryableError; exports.isValidTimeZoneId = _chunkH4V7OXHEcjs.isValidTimeZoneId; exports.measurePushPayload = _chunkH4V7OXHEcjs.measurePushPayload; exports.nextFutureOccurrence = _chunkH4V7OXHEcjs.nextFutureOccurrence; exports.planNextOccurrence = _chunkH4V7OXHEcjs.planNextOccurrence; exports.runScheduledTick = _chunkH4V7OXHEcjs.runScheduledTick; exports.runTask = _chunkH4V7OXHEcjs.runTask; exports.summarizeErrorCause = _chunkH4V7OXHEcjs.summarizeErrorCause;
|
package/dist/cloudflare.d.ts
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
export { createSingleUserCloudflareWorker } from "./cloudflare/single-user-worker.js";
|
|
2
2
|
export { createSingleUserServer } from "./single-user.js";
|
|
3
3
|
export { createD1Adapter } from "./adapters/d1.js";
|
|
4
|
-
export { runScheduledTick } from "./lib/run-tick.js";
|
|
5
4
|
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";
|
|
5
|
+
export { runScheduledTick, runTask } from "./lib/run-tick.js";
|
|
6
|
+
export { getSchemaVersion, ensureSchema, SCHEMA_VERSION } from "./lib/schema-version.js";
|
|
7
|
+
export { summarizeErrorCause, NonRetryableError, isNonRetryableError } from "./lib/errors.js";
|
|
6
8
|
export { isValidTimeZoneId, advanceOccurrence, nextFutureOccurrence, planNextOccurrence } from "./lib/recurrence.js";
|
|
7
9
|
export { deriveUserEncryptionKey, decryptPayload, encryptForStorage, decryptFromStorage } from "./lib/encryption.js";
|
package/dist/cloudflare.mjs
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import {
|
|
2
2
|
MAX_PUSH_PAYLOAD_BYTES,
|
|
3
|
+
NonRetryableError,
|
|
3
4
|
PUSH_ENVELOPE_RESERVED_BYTES,
|
|
5
|
+
SCHEMA_VERSION,
|
|
4
6
|
WEB_PUSH_ENCRYPTION_OVERHEAD_BYTES,
|
|
5
7
|
WEB_PUSH_MAX_BODY_BYTES,
|
|
6
8
|
advanceOccurrence,
|
|
@@ -12,15 +14,23 @@ import {
|
|
|
12
14
|
decryptPayload,
|
|
13
15
|
deriveUserEncryptionKey,
|
|
14
16
|
encryptForStorage,
|
|
17
|
+
ensureSchema,
|
|
18
|
+
getSchemaVersion,
|
|
19
|
+
isNonRetryableError,
|
|
15
20
|
isValidTimeZoneId,
|
|
16
21
|
measurePushPayload,
|
|
17
22
|
nextFutureOccurrence,
|
|
18
23
|
planNextOccurrence,
|
|
19
|
-
runScheduledTick
|
|
20
|
-
|
|
24
|
+
runScheduledTick,
|
|
25
|
+
runTask,
|
|
26
|
+
summarizeErrorCause
|
|
27
|
+
} from "./chunk-KVHR3RCU.mjs";
|
|
28
|
+
import "./chunk-34I2YSWE.mjs";
|
|
21
29
|
export {
|
|
22
30
|
MAX_PUSH_PAYLOAD_BYTES,
|
|
31
|
+
NonRetryableError,
|
|
23
32
|
PUSH_ENVELOPE_RESERVED_BYTES,
|
|
33
|
+
SCHEMA_VERSION,
|
|
24
34
|
WEB_PUSH_ENCRYPTION_OVERHEAD_BYTES,
|
|
25
35
|
WEB_PUSH_MAX_BODY_BYTES,
|
|
26
36
|
advanceOccurrence,
|
|
@@ -32,9 +42,14 @@ export {
|
|
|
32
42
|
decryptPayload,
|
|
33
43
|
deriveUserEncryptionKey,
|
|
34
44
|
encryptForStorage,
|
|
45
|
+
ensureSchema,
|
|
46
|
+
getSchemaVersion,
|
|
47
|
+
isNonRetryableError,
|
|
35
48
|
isValidTimeZoneId,
|
|
36
49
|
measurePushPayload,
|
|
37
50
|
nextFutureOccurrence,
|
|
38
51
|
planNextOccurrence,
|
|
39
|
-
runScheduledTick
|
|
52
|
+
runScheduledTick,
|
|
53
|
+
runTask,
|
|
54
|
+
summarizeErrorCause
|
|
40
55
|
};
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export function createOutboxHandler(ctx: any): {
|
|
2
|
+
GET: (url: any, headers: any) => Promise<any>;
|
|
3
|
+
POST: (headers: any, body: any) => Promise<any>;
|
|
4
|
+
};
|
|
5
|
+
export const MAX_OUTBOX_PAGE_SIZE: 100;
|
|
6
|
+
export const DEFAULT_OUTBOX_PAGE_SIZE: 50;
|
|
7
|
+
export const MAX_OUTBOX_ACK_IDS: 200;
|
package/dist/index.cjs
CHANGED
|
@@ -39,7 +39,25 @@
|
|
|
39
39
|
|
|
40
40
|
|
|
41
41
|
|
|
42
|
-
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
var _chunkH4V7OXHEcjs = require('./chunk-H4V7OXHE.cjs');
|
|
60
|
+
require('./chunk-OUPM4HAV.cjs');
|
|
43
61
|
|
|
44
62
|
// src/server/adapters/factory.js
|
|
45
63
|
async function createAdapter(config) {
|
|
@@ -55,11 +73,11 @@ async function createAdapter(config) {
|
|
|
55
73
|
}
|
|
56
74
|
switch (config.driver) {
|
|
57
75
|
case "neon": {
|
|
58
|
-
const { NeonAdapter } = await Promise.resolve().then(() => _interopRequireWildcard(require("./neon-
|
|
76
|
+
const { NeonAdapter } = await Promise.resolve().then(() => _interopRequireWildcard(require("./neon-G3G4TDAY.cjs")));
|
|
59
77
|
return new NeonAdapter(config.connectionString);
|
|
60
78
|
}
|
|
61
79
|
case "pg": {
|
|
62
|
-
const { PgAdapter } = await Promise.resolve().then(() => _interopRequireWildcard(require("./pg-
|
|
80
|
+
const { PgAdapter } = await Promise.resolve().then(() => _interopRequireWildcard(require("./pg-C3JZKBUM.cjs")));
|
|
63
81
|
return new PgAdapter(config.connectionString);
|
|
64
82
|
}
|
|
65
83
|
default:
|
|
@@ -72,7 +90,7 @@ async function createAdapter(config) {
|
|
|
72
90
|
// src/server/handlers/init-tenant.js
|
|
73
91
|
function createInitTenantHandler(ctx) {
|
|
74
92
|
async function POST(headers, body) {
|
|
75
|
-
const initSecret =
|
|
93
|
+
const initSecret = _chunkH4V7OXHEcjs.getHeader.call(void 0, headers, "x-init-secret");
|
|
76
94
|
if (ctx.tenant.initSecret && initSecret !== ctx.tenant.initSecret) {
|
|
77
95
|
return {
|
|
78
96
|
status: 401,
|
|
@@ -85,7 +103,7 @@ function createInitTenantHandler(ctx) {
|
|
|
85
103
|
}
|
|
86
104
|
};
|
|
87
105
|
}
|
|
88
|
-
const parsed =
|
|
106
|
+
const parsed = _chunkH4V7OXHEcjs.parseJsonBody.call(void 0, body);
|
|
89
107
|
if (!parsed.ok) {
|
|
90
108
|
return {
|
|
91
109
|
status: 400,
|
|
@@ -99,7 +117,7 @@ function createInitTenantHandler(ctx) {
|
|
|
99
117
|
const tenantId = payload.tenantId || void 0;
|
|
100
118
|
const driver = payload.driver;
|
|
101
119
|
const databaseUrl = payload.databaseUrl || payload.connectionString;
|
|
102
|
-
if (tenantId && !
|
|
120
|
+
if (tenantId && !_chunkH4V7OXHEcjs.isValidUUIDv4.call(void 0, tenantId)) {
|
|
103
121
|
return {
|
|
104
122
|
status: 400,
|
|
105
123
|
body: {
|
|
@@ -219,7 +237,7 @@ function createSendNotificationsHandler(ctx) {
|
|
|
219
237
|
}
|
|
220
238
|
};
|
|
221
239
|
}
|
|
222
|
-
const data = await
|
|
240
|
+
const data = await _chunkH4V7OXHEcjs.runScheduledTick.call(void 0, { ...ctx, db, masterKey });
|
|
223
241
|
return { status: 200, body: { success: true, data } };
|
|
224
242
|
}
|
|
225
243
|
return { POST };
|
|
@@ -228,14 +246,6 @@ function createSendNotificationsHandler(ctx) {
|
|
|
228
246
|
// src/server/tenant/blob-store.js
|
|
229
247
|
var _crypto = require('crypto');
|
|
230
248
|
var inMemoryNamespaces = /* @__PURE__ */ new Map();
|
|
231
|
-
function base64UrlEncode(input) {
|
|
232
|
-
return Buffer.from(input).toString("base64").replace(/\+/g, "-").replace(/\//g, "_").replace(/=+$/g, "");
|
|
233
|
-
}
|
|
234
|
-
function base64UrlDecode(input) {
|
|
235
|
-
const normalized = input.replace(/-/g, "+").replace(/_/g, "/");
|
|
236
|
-
const padLength = (4 - normalized.length % 4) % 4;
|
|
237
|
-
return Buffer.from(normalized + "=".repeat(padLength), "base64");
|
|
238
|
-
}
|
|
239
249
|
function getKekBuffer(kek) {
|
|
240
250
|
const value = String(kek || "").trim();
|
|
241
251
|
if (!value) {
|
|
@@ -249,16 +259,16 @@ function encryptConfig(config, kekBuffer) {
|
|
|
249
259
|
const plaintext = Buffer.from(JSON.stringify(config), "utf8");
|
|
250
260
|
const ciphertext = Buffer.concat([cipher.update(plaintext), cipher.final()]);
|
|
251
261
|
const authTag = cipher.getAuthTag();
|
|
252
|
-
return `v1.${
|
|
262
|
+
return `v1.${_chunkH4V7OXHEcjs.bytesToBase64Url.call(void 0, iv)}.${_chunkH4V7OXHEcjs.bytesToBase64Url.call(void 0, authTag)}.${_chunkH4V7OXHEcjs.bytesToBase64Url.call(void 0, ciphertext)}`;
|
|
253
263
|
}
|
|
254
264
|
function decryptConfig(encrypted, kekBuffer) {
|
|
255
265
|
const parts = String(encrypted || "").split(".");
|
|
256
266
|
if (parts.length !== 4 || parts[0] !== "v1") {
|
|
257
267
|
throw new Error("INVALID_TENANT_CONFIG");
|
|
258
268
|
}
|
|
259
|
-
const iv =
|
|
260
|
-
const authTag =
|
|
261
|
-
const ciphertext =
|
|
269
|
+
const iv = _chunkH4V7OXHEcjs.base64UrlToBytes.call(void 0, parts[1]);
|
|
270
|
+
const authTag = _chunkH4V7OXHEcjs.base64UrlToBytes.call(void 0, parts[2]);
|
|
271
|
+
const ciphertext = _chunkH4V7OXHEcjs.base64UrlToBytes.call(void 0, parts[3]);
|
|
262
272
|
const decipher = _crypto.createDecipheriv.call(void 0, "aes-256-gcm", kekBuffer, iv);
|
|
263
273
|
decipher.setAuthTag(authTag);
|
|
264
274
|
const plaintext = Buffer.concat([decipher.update(ciphertext), decipher.final()]).toString("utf8");
|
|
@@ -326,7 +336,7 @@ function createTenantBlobStore(options) {
|
|
|
326
336
|
// src/server/tenant/token.js
|
|
327
337
|
|
|
328
338
|
function sign(input, secret) {
|
|
329
|
-
return
|
|
339
|
+
return _chunkH4V7OXHEcjs.bytesToBase64Url.call(void 0, _crypto.createHmac.call(void 0, "sha256", secret).update(input).digest());
|
|
330
340
|
}
|
|
331
341
|
function nowEpochSeconds() {
|
|
332
342
|
return Math.floor(Date.now() / 1e3);
|
|
@@ -342,8 +352,8 @@ function createTenantToken(params, secret) {
|
|
|
342
352
|
v: 1
|
|
343
353
|
};
|
|
344
354
|
const header = { alg: "HS256", typ: "JWT" };
|
|
345
|
-
const encodedHeader =
|
|
346
|
-
const encodedPayload =
|
|
355
|
+
const encodedHeader = _chunkH4V7OXHEcjs.bytesToBase64Url.call(void 0, _chunkH4V7OXHEcjs.utf8.call(void 0, JSON.stringify(header)));
|
|
356
|
+
const encodedPayload = _chunkH4V7OXHEcjs.bytesToBase64Url.call(void 0, _chunkH4V7OXHEcjs.utf8.call(void 0, JSON.stringify(payload)));
|
|
347
357
|
const signingInput = `${encodedHeader}.${encodedPayload}`;
|
|
348
358
|
const signature = sign(signingInput, secret);
|
|
349
359
|
return `${signingInput}.${signature}`;
|
|
@@ -362,17 +372,17 @@ function verifyTenantToken(token, secret, options = {}) {
|
|
|
362
372
|
let receivedBytes;
|
|
363
373
|
let expectedBytes;
|
|
364
374
|
try {
|
|
365
|
-
receivedBytes =
|
|
366
|
-
expectedBytes =
|
|
375
|
+
receivedBytes = _chunkH4V7OXHEcjs.base64UrlToBytes.call(void 0, receivedSignature);
|
|
376
|
+
expectedBytes = _chunkH4V7OXHEcjs.base64UrlToBytes.call(void 0, expectedSignature);
|
|
367
377
|
} catch (e) {
|
|
368
378
|
throw new Error("INVALID_TENANT_AUTH");
|
|
369
379
|
}
|
|
370
|
-
if (!
|
|
380
|
+
if (!_chunkH4V7OXHEcjs.timingSafeEqualBytes.call(void 0, receivedBytes, expectedBytes)) {
|
|
371
381
|
throw new Error("INVALID_TENANT_AUTH");
|
|
372
382
|
}
|
|
373
383
|
let payload;
|
|
374
384
|
try {
|
|
375
|
-
payload = JSON.parse(
|
|
385
|
+
payload = JSON.parse(_chunkH4V7OXHEcjs.utf8Decode.call(void 0, _chunkH4V7OXHEcjs.base64UrlToBytes.call(void 0, encodedPayload)));
|
|
376
386
|
} catch (e2) {
|
|
377
387
|
throw new Error("INVALID_TENANT_AUTH");
|
|
378
388
|
}
|
|
@@ -446,8 +456,17 @@ function createTenantContextManager(options) {
|
|
|
446
456
|
async function getOrCreateAdapter(dbConfig) {
|
|
447
457
|
const cacheKey = `${dbConfig.driver}:${dbConfig.connectionString}`;
|
|
448
458
|
if (!adapterCache.has(cacheKey)) {
|
|
449
|
-
const
|
|
450
|
-
|
|
459
|
+
const created = (async () => {
|
|
460
|
+
const adapter = await adapterFactory(dbConfig);
|
|
461
|
+
if (typeof adapter.initSchema === "function") {
|
|
462
|
+
await adapter.initSchema();
|
|
463
|
+
}
|
|
464
|
+
return adapter;
|
|
465
|
+
})().catch((error) => {
|
|
466
|
+
adapterCache.delete(cacheKey);
|
|
467
|
+
throw error;
|
|
468
|
+
});
|
|
469
|
+
adapterCache.set(cacheKey, created);
|
|
451
470
|
}
|
|
452
471
|
return adapterCache.get(cacheKey);
|
|
453
472
|
}
|
|
@@ -583,14 +602,14 @@ async function createReiServer(config) {
|
|
|
583
602
|
return {
|
|
584
603
|
handlers: {
|
|
585
604
|
initTenant: createInitTenantHandler(ctx),
|
|
586
|
-
getUserKey:
|
|
587
|
-
scheduleMessage:
|
|
605
|
+
getUserKey: _chunkH4V7OXHEcjs.createGetUserKeyHandler.call(void 0, ctx),
|
|
606
|
+
scheduleMessage: _chunkH4V7OXHEcjs.createScheduleMessageHandler.call(void 0, ctx),
|
|
588
607
|
sendNotifications: createSendNotificationsHandler(ctx),
|
|
589
|
-
updateMessage:
|
|
590
|
-
cancelMessage:
|
|
591
|
-
messages:
|
|
592
|
-
getMessage:
|
|
593
|
-
pushSubscription:
|
|
608
|
+
updateMessage: _chunkH4V7OXHEcjs.createUpdateMessageHandler.call(void 0, ctx),
|
|
609
|
+
cancelMessage: _chunkH4V7OXHEcjs.createCancelMessageHandler.call(void 0, ctx),
|
|
610
|
+
messages: _chunkH4V7OXHEcjs.createMessagesHandler.call(void 0, ctx),
|
|
611
|
+
getMessage: _chunkH4V7OXHEcjs.createGetMessageHandler.call(void 0, ctx),
|
|
612
|
+
pushSubscription: _chunkH4V7OXHEcjs.createPushSubscriptionHandler.call(void 0, ctx)
|
|
594
613
|
}
|
|
595
614
|
};
|
|
596
615
|
}
|
|
@@ -625,4 +644,21 @@ async function createReiServer(config) {
|
|
|
625
644
|
|
|
626
645
|
|
|
627
646
|
|
|
628
|
-
|
|
647
|
+
|
|
648
|
+
|
|
649
|
+
|
|
650
|
+
|
|
651
|
+
|
|
652
|
+
|
|
653
|
+
|
|
654
|
+
|
|
655
|
+
|
|
656
|
+
|
|
657
|
+
|
|
658
|
+
|
|
659
|
+
|
|
660
|
+
|
|
661
|
+
|
|
662
|
+
|
|
663
|
+
|
|
664
|
+
exports.CORS_ALLOW_HEADERS = _chunkH4V7OXHEcjs.CORS_ALLOW_HEADERS; exports.CORS_ALLOW_METHODS = _chunkH4V7OXHEcjs.CORS_ALLOW_METHODS; exports.DEFAULT_CLAIM_LEASE_MS = _chunkH4V7OXHEcjs.DEFAULT_CLAIM_LEASE_MS; exports.DEFAULT_HEARTBEAT_LEASE_TTL_MS = _chunkH4V7OXHEcjs.DEFAULT_HEARTBEAT_LEASE_TTL_MS; exports.DEFAULT_LEASE_HEARTBEAT_MS = _chunkH4V7OXHEcjs.DEFAULT_LEASE_HEARTBEAT_MS; exports.DEFAULT_MAX_SCHEDULED_TASKS_PER_FIRE = _chunkH4V7OXHEcjs.DEFAULT_MAX_SCHEDULED_TASKS_PER_FIRE; exports.DEFAULT_MAX_TOOL_ITERATIONS = _chunkH4V7OXHEcjs.DEFAULT_MAX_TOOL_ITERATIONS; exports.DEFAULT_TOTAL_TIMEOUT_MS = _chunkH4V7OXHEcjs.DEFAULT_TOTAL_TIMEOUT_MS; exports.MAX_PUSH_PAYLOAD_BYTES = _chunkH4V7OXHEcjs.MAX_PUSH_PAYLOAD_BYTES; exports.MIN_SCHEDULE_LEAD_MS = _chunkH4V7OXHEcjs.MIN_SCHEDULE_LEAD_MS; exports.NonRetryableError = _chunkH4V7OXHEcjs.NonRetryableError; exports.PUSH_ENVELOPE_RESERVED_BYTES = _chunkH4V7OXHEcjs.PUSH_ENVELOPE_RESERVED_BYTES; exports.SCHEMA_VERSION = _chunkH4V7OXHEcjs.SCHEMA_VERSION; exports.WEB_PUSH_ENCRYPTION_OVERHEAD_BYTES = _chunkH4V7OXHEcjs.WEB_PUSH_ENCRYPTION_OVERHEAD_BYTES; exports.WEB_PUSH_MAX_BODY_BYTES = _chunkH4V7OXHEcjs.WEB_PUSH_MAX_BODY_BYTES; exports.advanceOccurrence = _chunkH4V7OXHEcjs.advanceOccurrence; exports.createAdapter = createAdapter; exports.createD1Adapter = _chunkH4V7OXHEcjs.createD1Adapter; exports.createReiServer = createReiServer; exports.createSingleUserCloudflareWorker = _chunkH4V7OXHEcjs.createSingleUserCloudflareWorker; exports.createSingleUserServer = _chunkH4V7OXHEcjs.createSingleUserServer; exports.createTenantToken = createTenantToken; exports.createWebCryptoWebPush = _chunkH4V7OXHEcjs.createWebCryptoWebPush; exports.decryptFromStorage = _chunkH4V7OXHEcjs.decryptFromStorage; exports.decryptPayload = _chunkH4V7OXHEcjs.decryptPayload; exports.deriveUserEncryptionKey = _chunkH4V7OXHEcjs.deriveUserEncryptionKey; exports.encryptForStorage = _chunkH4V7OXHEcjs.encryptForStorage; exports.ensureSchema = _chunkH4V7OXHEcjs.ensureSchema; exports.getSchemaVersion = _chunkH4V7OXHEcjs.getSchemaVersion; exports.isNonRetryableError = _chunkH4V7OXHEcjs.isNonRetryableError; exports.isValidISO8601 = _chunkH4V7OXHEcjs.isValidISO8601; exports.isValidTimeZoneId = _chunkH4V7OXHEcjs.isValidTimeZoneId; exports.isValidUUID = _chunkH4V7OXHEcjs.isValidUUID; exports.isValidUUIDv4 = _chunkH4V7OXHEcjs.isValidUUIDv4; exports.isValidUrl = _chunkH4V7OXHEcjs.isValidUrl; exports.measurePushPayload = _chunkH4V7OXHEcjs.measurePushPayload; exports.nextFutureOccurrence = _chunkH4V7OXHEcjs.nextFutureOccurrence; exports.planNextOccurrence = _chunkH4V7OXHEcjs.planNextOccurrence; exports.runScheduledTick = _chunkH4V7OXHEcjs.runScheduledTick; exports.runTask = _chunkH4V7OXHEcjs.runTask; exports.sanitizeErrorSummary = _chunkH4V7OXHEcjs.sanitizeErrorSummary; exports.summarizeErrorCause = _chunkH4V7OXHEcjs.summarizeErrorCause; exports.validateAvatarUrl = _chunkH4V7OXHEcjs.validateAvatarUrl; exports.validateLlmMessagesArray = _chunkH4V7OXHEcjs.validateLlmMessagesArray; exports.validateScheduleMessagePayload = _chunkH4V7OXHEcjs.validateScheduleMessagePayload; exports.validateSplitPattern = _chunkH4V7OXHEcjs.validateSplitPattern; exports.verifyTenantToken = verifyTenantToken;
|
package/dist/index.d.cts
CHANGED
|
@@ -45,8 +45,6 @@ export function createReiServer(config: ReiServerConfig): Promise<ReiServer>;
|
|
|
45
45
|
export { createAdapter } from "./adapters/factory.js";
|
|
46
46
|
export { createD1Adapter } from "./adapters/d1.js";
|
|
47
47
|
export { createSingleUserServer } from "./single-user.js";
|
|
48
|
-
export { runScheduledTick } from "./lib/run-tick.js";
|
|
49
|
-
export { createSingleUserCloudflareWorker } from "./cloudflare/single-user-worker.js";
|
|
50
48
|
export type VapidConfig = {
|
|
51
49
|
/**
|
|
52
50
|
* - VAPID contact email (e.g. mailto:…).
|
|
@@ -137,6 +135,11 @@ export type ReiServer = {
|
|
|
137
135
|
*/
|
|
138
136
|
handlers: ReiHandlers;
|
|
139
137
|
};
|
|
138
|
+
export { runScheduledTick, runTask, DEFAULT_CLAIM_LEASE_MS, DEFAULT_LEASE_HEARTBEAT_MS, DEFAULT_HEARTBEAT_LEASE_TTL_MS, sanitizeErrorSummary } from "./lib/run-tick.js";
|
|
139
|
+
export { NonRetryableError, isNonRetryableError, summarizeErrorCause } from "./lib/errors.js";
|
|
140
|
+
export { getSchemaVersion, ensureSchema, SCHEMA_VERSION } from "./lib/schema-version.js";
|
|
141
|
+
export { DEFAULT_MAX_TOOL_ITERATIONS, DEFAULT_TOTAL_TIMEOUT_MS, DEFAULT_MAX_SCHEDULED_TASKS_PER_FIRE, MIN_SCHEDULE_LEAD_MS } from "./lib/agentic-fire.js";
|
|
142
|
+
export { CORS_ALLOW_HEADERS, CORS_ALLOW_METHODS, createSingleUserCloudflareWorker } from "./cloudflare/single-user-worker.js";
|
|
140
143
|
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";
|
|
141
144
|
export { deriveUserEncryptionKey, decryptPayload, encryptForStorage, decryptFromStorage } from "./lib/encryption.js";
|
|
142
145
|
export { validateScheduleMessagePayload, validateLlmMessagesArray, validateSplitPattern, validateAvatarUrl, isValidISO8601, isValidUrl, isValidUUID, isValidUUIDv4, isValidTimeZoneId } from "./lib/validation.js";
|
package/dist/index.d.ts
CHANGED
|
@@ -45,8 +45,6 @@ export function createReiServer(config: ReiServerConfig): Promise<ReiServer>;
|
|
|
45
45
|
export { createAdapter } from "./adapters/factory.js";
|
|
46
46
|
export { createD1Adapter } from "./adapters/d1.js";
|
|
47
47
|
export { createSingleUserServer } from "./single-user.js";
|
|
48
|
-
export { runScheduledTick } from "./lib/run-tick.js";
|
|
49
|
-
export { createSingleUserCloudflareWorker } from "./cloudflare/single-user-worker.js";
|
|
50
48
|
export type VapidConfig = {
|
|
51
49
|
/**
|
|
52
50
|
* - VAPID contact email (e.g. mailto:…).
|
|
@@ -137,6 +135,11 @@ export type ReiServer = {
|
|
|
137
135
|
*/
|
|
138
136
|
handlers: ReiHandlers;
|
|
139
137
|
};
|
|
138
|
+
export { runScheduledTick, runTask, DEFAULT_CLAIM_LEASE_MS, DEFAULT_LEASE_HEARTBEAT_MS, DEFAULT_HEARTBEAT_LEASE_TTL_MS, sanitizeErrorSummary } from "./lib/run-tick.js";
|
|
139
|
+
export { NonRetryableError, isNonRetryableError, summarizeErrorCause } from "./lib/errors.js";
|
|
140
|
+
export { getSchemaVersion, ensureSchema, SCHEMA_VERSION } from "./lib/schema-version.js";
|
|
141
|
+
export { DEFAULT_MAX_TOOL_ITERATIONS, DEFAULT_TOTAL_TIMEOUT_MS, DEFAULT_MAX_SCHEDULED_TASKS_PER_FIRE, MIN_SCHEDULE_LEAD_MS } from "./lib/agentic-fire.js";
|
|
142
|
+
export { CORS_ALLOW_HEADERS, CORS_ALLOW_METHODS, createSingleUserCloudflareWorker } from "./cloudflare/single-user-worker.js";
|
|
140
143
|
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";
|
|
141
144
|
export { deriveUserEncryptionKey, decryptPayload, encryptForStorage, decryptFromStorage } from "./lib/encryption.js";
|
|
142
145
|
export { validateScheduleMessagePayload, validateLlmMessagesArray, validateSplitPattern, validateAvatarUrl, isValidISO8601, isValidUrl, isValidUUID, isValidUUIDv4, isValidTimeZoneId } from "./lib/validation.js";
|