@rei-standard/amsg-server 2.6.0-next.13 → 2.6.0-next.15
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/dist/adapters/d1.d.ts +106 -0
- package/dist/adapters/interface.d.ts +50 -0
- package/dist/adapters/neon.d.ts +10 -58
- package/dist/adapters/pg-shared.d.ts +114 -0
- package/dist/adapters/pg.d.ts +10 -58
- package/dist/adapters/schema.d.ts +1 -1
- package/dist/adapters/schema.sqlite.d.ts +3 -1
- package/dist/{chunk-B2FDV7YK.mjs → chunk-34I2YSWE.mjs} +10 -0
- package/dist/{chunk-TV7N3RTH.mjs → chunk-D3DQF647.mjs} +1086 -348
- package/dist/{chunk-V2SDWGUB.cjs → chunk-OUPM4HAV.cjs} +10 -0
- package/dist/{chunk-5IOYCCFD.cjs → chunk-TCKPLM3P.cjs} +1086 -348
- package/dist/chunk-TFFBMYA2.cjs +95 -0
- package/dist/chunk-UYROU4L3.mjs +95 -0
- package/dist/cloudflare/single-user-worker.d.ts +2 -0
- package/dist/cloudflare.cjs +3 -2
- package/dist/cloudflare.mjs +2 -1
- package/dist/handlers/outbox.d.ts +7 -0
- package/dist/index.cjs +64 -36
- package/dist/index.d.cts +4 -2
- package/dist/index.d.ts +4 -2
- package/dist/index.mjs +45 -17
- package/dist/lib/client-state-store.d.ts +18 -3
- package/dist/lib/errors.d.ts +50 -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 +28 -0
- package/dist/lib/validation.d.ts +1 -7
- package/dist/{neon-CUIGAB2T.mjs → neon-XLWK27RL.mjs} +29 -104
- package/dist/{neon-3ASBLLCM.cjs → neon-ZWA2U7IZ.cjs} +37 -112
- package/dist/{pg-IEZTAR43.cjs → pg-Q4VU6D75.cjs} +35 -112
- package/dist/{pg-KMJPL6QV.mjs → pg-X63HFEV7.mjs} +27 -104
- package/dist/single-user.d.ts +4 -0
- package/package.json +2 -2
|
@@ -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
|
+
};
|
|
@@ -2,3 +2,5 @@ export function createSingleUserCloudflareWorker(buildConfig: any): {
|
|
|
2
2
|
fetch: (request: any, env: any) => Promise<Response>;
|
|
3
3
|
scheduled: (event: any, env: any) => Promise<void>;
|
|
4
4
|
};
|
|
5
|
+
export const CORS_ALLOW_HEADERS: "Content-Type, X-User-Id, X-Payload-Encrypted, X-Encryption-Version, X-Response-Encrypted, X-Client-Token";
|
|
6
|
+
export const CORS_ALLOW_METHODS: "GET, POST, PUT, DELETE, OPTIONS";
|
package/dist/cloudflare.cjs
CHANGED
|
@@ -17,7 +17,8 @@
|
|
|
17
17
|
|
|
18
18
|
|
|
19
19
|
|
|
20
|
-
var
|
|
20
|
+
var _chunkTCKPLM3Pcjs = require('./chunk-TCKPLM3P.cjs');
|
|
21
|
+
require('./chunk-OUPM4HAV.cjs');
|
|
21
22
|
|
|
22
23
|
|
|
23
24
|
|
|
@@ -37,4 +38,4 @@ var _chunk5IOYCCFDcjs = require('./chunk-5IOYCCFD.cjs');
|
|
|
37
38
|
|
|
38
39
|
|
|
39
40
|
|
|
40
|
-
exports.MAX_PUSH_PAYLOAD_BYTES =
|
|
41
|
+
exports.MAX_PUSH_PAYLOAD_BYTES = _chunkTCKPLM3Pcjs.MAX_PUSH_PAYLOAD_BYTES; exports.PUSH_ENVELOPE_RESERVED_BYTES = _chunkTCKPLM3Pcjs.PUSH_ENVELOPE_RESERVED_BYTES; exports.WEB_PUSH_ENCRYPTION_OVERHEAD_BYTES = _chunkTCKPLM3Pcjs.WEB_PUSH_ENCRYPTION_OVERHEAD_BYTES; exports.WEB_PUSH_MAX_BODY_BYTES = _chunkTCKPLM3Pcjs.WEB_PUSH_MAX_BODY_BYTES; exports.advanceOccurrence = _chunkTCKPLM3Pcjs.advanceOccurrence; exports.createD1Adapter = _chunkTCKPLM3Pcjs.createD1Adapter; exports.createSingleUserCloudflareWorker = _chunkTCKPLM3Pcjs.createSingleUserCloudflareWorker; exports.createSingleUserServer = _chunkTCKPLM3Pcjs.createSingleUserServer; exports.createWebCryptoWebPush = _chunkTCKPLM3Pcjs.createWebCryptoWebPush; exports.decryptFromStorage = _chunkTCKPLM3Pcjs.decryptFromStorage; exports.decryptPayload = _chunkTCKPLM3Pcjs.decryptPayload; exports.deriveUserEncryptionKey = _chunkTCKPLM3Pcjs.deriveUserEncryptionKey; exports.encryptForStorage = _chunkTCKPLM3Pcjs.encryptForStorage; exports.isValidTimeZoneId = _chunkTCKPLM3Pcjs.isValidTimeZoneId; exports.measurePushPayload = _chunkTCKPLM3Pcjs.measurePushPayload; exports.nextFutureOccurrence = _chunkTCKPLM3Pcjs.nextFutureOccurrence; exports.planNextOccurrence = _chunkTCKPLM3Pcjs.planNextOccurrence; exports.runScheduledTick = _chunkTCKPLM3Pcjs.runScheduledTick;
|
package/dist/cloudflare.mjs
CHANGED
|
@@ -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,21 @@
|
|
|
39
39
|
|
|
40
40
|
|
|
41
41
|
|
|
42
|
-
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
var _chunkTCKPLM3Pcjs = require('./chunk-TCKPLM3P.cjs');
|
|
56
|
+
require('./chunk-OUPM4HAV.cjs');
|
|
43
57
|
|
|
44
58
|
// src/server/adapters/factory.js
|
|
45
59
|
async function createAdapter(config) {
|
|
@@ -55,11 +69,11 @@ async function createAdapter(config) {
|
|
|
55
69
|
}
|
|
56
70
|
switch (config.driver) {
|
|
57
71
|
case "neon": {
|
|
58
|
-
const { NeonAdapter } = await Promise.resolve().then(() => _interopRequireWildcard(require("./neon-
|
|
72
|
+
const { NeonAdapter } = await Promise.resolve().then(() => _interopRequireWildcard(require("./neon-ZWA2U7IZ.cjs")));
|
|
59
73
|
return new NeonAdapter(config.connectionString);
|
|
60
74
|
}
|
|
61
75
|
case "pg": {
|
|
62
|
-
const { PgAdapter } = await Promise.resolve().then(() => _interopRequireWildcard(require("./pg-
|
|
76
|
+
const { PgAdapter } = await Promise.resolve().then(() => _interopRequireWildcard(require("./pg-Q4VU6D75.cjs")));
|
|
63
77
|
return new PgAdapter(config.connectionString);
|
|
64
78
|
}
|
|
65
79
|
default:
|
|
@@ -72,7 +86,7 @@ async function createAdapter(config) {
|
|
|
72
86
|
// src/server/handlers/init-tenant.js
|
|
73
87
|
function createInitTenantHandler(ctx) {
|
|
74
88
|
async function POST(headers, body) {
|
|
75
|
-
const initSecret =
|
|
89
|
+
const initSecret = _chunkTCKPLM3Pcjs.getHeader.call(void 0, headers, "x-init-secret");
|
|
76
90
|
if (ctx.tenant.initSecret && initSecret !== ctx.tenant.initSecret) {
|
|
77
91
|
return {
|
|
78
92
|
status: 401,
|
|
@@ -85,7 +99,7 @@ function createInitTenantHandler(ctx) {
|
|
|
85
99
|
}
|
|
86
100
|
};
|
|
87
101
|
}
|
|
88
|
-
const parsed =
|
|
102
|
+
const parsed = _chunkTCKPLM3Pcjs.parseJsonBody.call(void 0, body);
|
|
89
103
|
if (!parsed.ok) {
|
|
90
104
|
return {
|
|
91
105
|
status: 400,
|
|
@@ -99,7 +113,7 @@ function createInitTenantHandler(ctx) {
|
|
|
99
113
|
const tenantId = payload.tenantId || void 0;
|
|
100
114
|
const driver = payload.driver;
|
|
101
115
|
const databaseUrl = payload.databaseUrl || payload.connectionString;
|
|
102
|
-
if (tenantId && !
|
|
116
|
+
if (tenantId && !_chunkTCKPLM3Pcjs.isValidUUIDv4.call(void 0, tenantId)) {
|
|
103
117
|
return {
|
|
104
118
|
status: 400,
|
|
105
119
|
body: {
|
|
@@ -219,7 +233,7 @@ function createSendNotificationsHandler(ctx) {
|
|
|
219
233
|
}
|
|
220
234
|
};
|
|
221
235
|
}
|
|
222
|
-
const data = await
|
|
236
|
+
const data = await _chunkTCKPLM3Pcjs.runScheduledTick.call(void 0, { ...ctx, db, masterKey });
|
|
223
237
|
return { status: 200, body: { success: true, data } };
|
|
224
238
|
}
|
|
225
239
|
return { POST };
|
|
@@ -228,14 +242,6 @@ function createSendNotificationsHandler(ctx) {
|
|
|
228
242
|
// src/server/tenant/blob-store.js
|
|
229
243
|
var _crypto = require('crypto');
|
|
230
244
|
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
245
|
function getKekBuffer(kek) {
|
|
240
246
|
const value = String(kek || "").trim();
|
|
241
247
|
if (!value) {
|
|
@@ -249,16 +255,16 @@ function encryptConfig(config, kekBuffer) {
|
|
|
249
255
|
const plaintext = Buffer.from(JSON.stringify(config), "utf8");
|
|
250
256
|
const ciphertext = Buffer.concat([cipher.update(plaintext), cipher.final()]);
|
|
251
257
|
const authTag = cipher.getAuthTag();
|
|
252
|
-
return `v1.${
|
|
258
|
+
return `v1.${_chunkTCKPLM3Pcjs.bytesToBase64Url.call(void 0, iv)}.${_chunkTCKPLM3Pcjs.bytesToBase64Url.call(void 0, authTag)}.${_chunkTCKPLM3Pcjs.bytesToBase64Url.call(void 0, ciphertext)}`;
|
|
253
259
|
}
|
|
254
260
|
function decryptConfig(encrypted, kekBuffer) {
|
|
255
261
|
const parts = String(encrypted || "").split(".");
|
|
256
262
|
if (parts.length !== 4 || parts[0] !== "v1") {
|
|
257
263
|
throw new Error("INVALID_TENANT_CONFIG");
|
|
258
264
|
}
|
|
259
|
-
const iv =
|
|
260
|
-
const authTag =
|
|
261
|
-
const ciphertext =
|
|
265
|
+
const iv = _chunkTCKPLM3Pcjs.base64UrlToBytes.call(void 0, parts[1]);
|
|
266
|
+
const authTag = _chunkTCKPLM3Pcjs.base64UrlToBytes.call(void 0, parts[2]);
|
|
267
|
+
const ciphertext = _chunkTCKPLM3Pcjs.base64UrlToBytes.call(void 0, parts[3]);
|
|
262
268
|
const decipher = _crypto.createDecipheriv.call(void 0, "aes-256-gcm", kekBuffer, iv);
|
|
263
269
|
decipher.setAuthTag(authTag);
|
|
264
270
|
const plaintext = Buffer.concat([decipher.update(ciphertext), decipher.final()]).toString("utf8");
|
|
@@ -326,7 +332,7 @@ function createTenantBlobStore(options) {
|
|
|
326
332
|
// src/server/tenant/token.js
|
|
327
333
|
|
|
328
334
|
function sign(input, secret) {
|
|
329
|
-
return
|
|
335
|
+
return _chunkTCKPLM3Pcjs.bytesToBase64Url.call(void 0, _crypto.createHmac.call(void 0, "sha256", secret).update(input).digest());
|
|
330
336
|
}
|
|
331
337
|
function nowEpochSeconds() {
|
|
332
338
|
return Math.floor(Date.now() / 1e3);
|
|
@@ -342,8 +348,8 @@ function createTenantToken(params, secret) {
|
|
|
342
348
|
v: 1
|
|
343
349
|
};
|
|
344
350
|
const header = { alg: "HS256", typ: "JWT" };
|
|
345
|
-
const encodedHeader =
|
|
346
|
-
const encodedPayload =
|
|
351
|
+
const encodedHeader = _chunkTCKPLM3Pcjs.bytesToBase64Url.call(void 0, _chunkTCKPLM3Pcjs.utf8.call(void 0, JSON.stringify(header)));
|
|
352
|
+
const encodedPayload = _chunkTCKPLM3Pcjs.bytesToBase64Url.call(void 0, _chunkTCKPLM3Pcjs.utf8.call(void 0, JSON.stringify(payload)));
|
|
347
353
|
const signingInput = `${encodedHeader}.${encodedPayload}`;
|
|
348
354
|
const signature = sign(signingInput, secret);
|
|
349
355
|
return `${signingInput}.${signature}`;
|
|
@@ -362,17 +368,17 @@ function verifyTenantToken(token, secret, options = {}) {
|
|
|
362
368
|
let receivedBytes;
|
|
363
369
|
let expectedBytes;
|
|
364
370
|
try {
|
|
365
|
-
receivedBytes =
|
|
366
|
-
expectedBytes =
|
|
371
|
+
receivedBytes = _chunkTCKPLM3Pcjs.base64UrlToBytes.call(void 0, receivedSignature);
|
|
372
|
+
expectedBytes = _chunkTCKPLM3Pcjs.base64UrlToBytes.call(void 0, expectedSignature);
|
|
367
373
|
} catch (e) {
|
|
368
374
|
throw new Error("INVALID_TENANT_AUTH");
|
|
369
375
|
}
|
|
370
|
-
if (!
|
|
376
|
+
if (!_chunkTCKPLM3Pcjs.timingSafeEqualBytes.call(void 0, receivedBytes, expectedBytes)) {
|
|
371
377
|
throw new Error("INVALID_TENANT_AUTH");
|
|
372
378
|
}
|
|
373
379
|
let payload;
|
|
374
380
|
try {
|
|
375
|
-
payload = JSON.parse(
|
|
381
|
+
payload = JSON.parse(_chunkTCKPLM3Pcjs.utf8Decode.call(void 0, _chunkTCKPLM3Pcjs.base64UrlToBytes.call(void 0, encodedPayload)));
|
|
376
382
|
} catch (e2) {
|
|
377
383
|
throw new Error("INVALID_TENANT_AUTH");
|
|
378
384
|
}
|
|
@@ -446,8 +452,17 @@ function createTenantContextManager(options) {
|
|
|
446
452
|
async function getOrCreateAdapter(dbConfig) {
|
|
447
453
|
const cacheKey = `${dbConfig.driver}:${dbConfig.connectionString}`;
|
|
448
454
|
if (!adapterCache.has(cacheKey)) {
|
|
449
|
-
const
|
|
450
|
-
|
|
455
|
+
const created = (async () => {
|
|
456
|
+
const adapter = await adapterFactory(dbConfig);
|
|
457
|
+
if (typeof adapter.initSchema === "function") {
|
|
458
|
+
await adapter.initSchema();
|
|
459
|
+
}
|
|
460
|
+
return adapter;
|
|
461
|
+
})().catch((error) => {
|
|
462
|
+
adapterCache.delete(cacheKey);
|
|
463
|
+
throw error;
|
|
464
|
+
});
|
|
465
|
+
adapterCache.set(cacheKey, created);
|
|
451
466
|
}
|
|
452
467
|
return adapterCache.get(cacheKey);
|
|
453
468
|
}
|
|
@@ -583,14 +598,14 @@ async function createReiServer(config) {
|
|
|
583
598
|
return {
|
|
584
599
|
handlers: {
|
|
585
600
|
initTenant: createInitTenantHandler(ctx),
|
|
586
|
-
getUserKey:
|
|
587
|
-
scheduleMessage:
|
|
601
|
+
getUserKey: _chunkTCKPLM3Pcjs.createGetUserKeyHandler.call(void 0, ctx),
|
|
602
|
+
scheduleMessage: _chunkTCKPLM3Pcjs.createScheduleMessageHandler.call(void 0, ctx),
|
|
588
603
|
sendNotifications: createSendNotificationsHandler(ctx),
|
|
589
|
-
updateMessage:
|
|
590
|
-
cancelMessage:
|
|
591
|
-
messages:
|
|
592
|
-
getMessage:
|
|
593
|
-
pushSubscription:
|
|
604
|
+
updateMessage: _chunkTCKPLM3Pcjs.createUpdateMessageHandler.call(void 0, ctx),
|
|
605
|
+
cancelMessage: _chunkTCKPLM3Pcjs.createCancelMessageHandler.call(void 0, ctx),
|
|
606
|
+
messages: _chunkTCKPLM3Pcjs.createMessagesHandler.call(void 0, ctx),
|
|
607
|
+
getMessage: _chunkTCKPLM3Pcjs.createGetMessageHandler.call(void 0, ctx),
|
|
608
|
+
pushSubscription: _chunkTCKPLM3Pcjs.createPushSubscriptionHandler.call(void 0, ctx)
|
|
594
609
|
}
|
|
595
610
|
};
|
|
596
611
|
}
|
|
@@ -625,4 +640,17 @@ async function createReiServer(config) {
|
|
|
625
640
|
|
|
626
641
|
|
|
627
642
|
|
|
628
|
-
|
|
643
|
+
|
|
644
|
+
|
|
645
|
+
|
|
646
|
+
|
|
647
|
+
|
|
648
|
+
|
|
649
|
+
|
|
650
|
+
|
|
651
|
+
|
|
652
|
+
|
|
653
|
+
|
|
654
|
+
|
|
655
|
+
|
|
656
|
+
exports.CORS_ALLOW_HEADERS = _chunkTCKPLM3Pcjs.CORS_ALLOW_HEADERS; exports.CORS_ALLOW_METHODS = _chunkTCKPLM3Pcjs.CORS_ALLOW_METHODS; exports.DEFAULT_CLAIM_LEASE_MS = _chunkTCKPLM3Pcjs.DEFAULT_CLAIM_LEASE_MS; exports.DEFAULT_HEARTBEAT_LEASE_TTL_MS = _chunkTCKPLM3Pcjs.DEFAULT_HEARTBEAT_LEASE_TTL_MS; exports.DEFAULT_LEASE_HEARTBEAT_MS = _chunkTCKPLM3Pcjs.DEFAULT_LEASE_HEARTBEAT_MS; exports.DEFAULT_MAX_SCHEDULED_TASKS_PER_FIRE = _chunkTCKPLM3Pcjs.DEFAULT_MAX_SCHEDULED_TASKS_PER_FIRE; exports.DEFAULT_MAX_TOOL_ITERATIONS = _chunkTCKPLM3Pcjs.DEFAULT_MAX_TOOL_ITERATIONS; exports.DEFAULT_TOTAL_TIMEOUT_MS = _chunkTCKPLM3Pcjs.DEFAULT_TOTAL_TIMEOUT_MS; exports.MAX_PUSH_PAYLOAD_BYTES = _chunkTCKPLM3Pcjs.MAX_PUSH_PAYLOAD_BYTES; exports.MIN_SCHEDULE_LEAD_MS = _chunkTCKPLM3Pcjs.MIN_SCHEDULE_LEAD_MS; exports.NonRetryableError = _chunkTCKPLM3Pcjs.NonRetryableError; exports.PUSH_ENVELOPE_RESERVED_BYTES = _chunkTCKPLM3Pcjs.PUSH_ENVELOPE_RESERVED_BYTES; exports.WEB_PUSH_ENCRYPTION_OVERHEAD_BYTES = _chunkTCKPLM3Pcjs.WEB_PUSH_ENCRYPTION_OVERHEAD_BYTES; exports.WEB_PUSH_MAX_BODY_BYTES = _chunkTCKPLM3Pcjs.WEB_PUSH_MAX_BODY_BYTES; exports.advanceOccurrence = _chunkTCKPLM3Pcjs.advanceOccurrence; exports.createAdapter = createAdapter; exports.createD1Adapter = _chunkTCKPLM3Pcjs.createD1Adapter; exports.createReiServer = createReiServer; exports.createSingleUserCloudflareWorker = _chunkTCKPLM3Pcjs.createSingleUserCloudflareWorker; exports.createSingleUserServer = _chunkTCKPLM3Pcjs.createSingleUserServer; exports.createTenantToken = createTenantToken; exports.createWebCryptoWebPush = _chunkTCKPLM3Pcjs.createWebCryptoWebPush; exports.decryptFromStorage = _chunkTCKPLM3Pcjs.decryptFromStorage; exports.decryptPayload = _chunkTCKPLM3Pcjs.decryptPayload; exports.deriveUserEncryptionKey = _chunkTCKPLM3Pcjs.deriveUserEncryptionKey; exports.encryptForStorage = _chunkTCKPLM3Pcjs.encryptForStorage; exports.isNonRetryableError = _chunkTCKPLM3Pcjs.isNonRetryableError; exports.isValidISO8601 = _chunkTCKPLM3Pcjs.isValidISO8601; exports.isValidTimeZoneId = _chunkTCKPLM3Pcjs.isValidTimeZoneId; exports.isValidUUID = _chunkTCKPLM3Pcjs.isValidUUID; exports.isValidUUIDv4 = _chunkTCKPLM3Pcjs.isValidUUIDv4; exports.isValidUrl = _chunkTCKPLM3Pcjs.isValidUrl; exports.measurePushPayload = _chunkTCKPLM3Pcjs.measurePushPayload; exports.nextFutureOccurrence = _chunkTCKPLM3Pcjs.nextFutureOccurrence; exports.planNextOccurrence = _chunkTCKPLM3Pcjs.planNextOccurrence; exports.runScheduledTick = _chunkTCKPLM3Pcjs.runScheduledTick; exports.runTask = _chunkTCKPLM3Pcjs.runTask; exports.sanitizeErrorSummary = _chunkTCKPLM3Pcjs.sanitizeErrorSummary; exports.validateAvatarUrl = _chunkTCKPLM3Pcjs.validateAvatarUrl; exports.validateLlmMessagesArray = _chunkTCKPLM3Pcjs.validateLlmMessagesArray; exports.validateScheduleMessagePayload = _chunkTCKPLM3Pcjs.validateScheduleMessagePayload; exports.validateSplitPattern = _chunkTCKPLM3Pcjs.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,10 @@ 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 } from "./lib/errors.js";
|
|
140
|
+
export { DEFAULT_MAX_TOOL_ITERATIONS, DEFAULT_TOTAL_TIMEOUT_MS, DEFAULT_MAX_SCHEDULED_TASKS_PER_FIRE, MIN_SCHEDULE_LEAD_MS } from "./lib/agentic-fire.js";
|
|
141
|
+
export { CORS_ALLOW_HEADERS, CORS_ALLOW_METHODS, createSingleUserCloudflareWorker } from "./cloudflare/single-user-worker.js";
|
|
140
142
|
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
143
|
export { deriveUserEncryptionKey, decryptPayload, encryptForStorage, decryptFromStorage } from "./lib/encryption.js";
|
|
142
144
|
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,10 @@ 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 } from "./lib/errors.js";
|
|
140
|
+
export { DEFAULT_MAX_TOOL_ITERATIONS, DEFAULT_TOTAL_TIMEOUT_MS, DEFAULT_MAX_SCHEDULED_TASKS_PER_FIRE, MIN_SCHEDULE_LEAD_MS } from "./lib/agentic-fire.js";
|
|
141
|
+
export { CORS_ALLOW_HEADERS, CORS_ALLOW_METHODS, createSingleUserCloudflareWorker } from "./cloudflare/single-user-worker.js";
|
|
140
142
|
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
143
|
export { deriveUserEncryptionKey, decryptPayload, encryptForStorage, decryptFromStorage } from "./lib/encryption.js";
|
|
142
144
|
export { validateScheduleMessagePayload, validateLlmMessagesArray, validateSplitPattern, validateAvatarUrl, isValidISO8601, isValidUrl, isValidUUID, isValidUUIDv4, isValidTimeZoneId } from "./lib/validation.js";
|
package/dist/index.mjs
CHANGED
|
@@ -1,5 +1,15 @@
|
|
|
1
1
|
import {
|
|
2
|
+
CORS_ALLOW_HEADERS,
|
|
3
|
+
CORS_ALLOW_METHODS,
|
|
4
|
+
DEFAULT_CLAIM_LEASE_MS,
|
|
5
|
+
DEFAULT_HEARTBEAT_LEASE_TTL_MS,
|
|
6
|
+
DEFAULT_LEASE_HEARTBEAT_MS,
|
|
7
|
+
DEFAULT_MAX_SCHEDULED_TASKS_PER_FIRE,
|
|
8
|
+
DEFAULT_MAX_TOOL_ITERATIONS,
|
|
9
|
+
DEFAULT_TOTAL_TIMEOUT_MS,
|
|
2
10
|
MAX_PUSH_PAYLOAD_BYTES,
|
|
11
|
+
MIN_SCHEDULE_LEAD_MS,
|
|
12
|
+
NonRetryableError,
|
|
3
13
|
PUSH_ENVELOPE_RESERVED_BYTES,
|
|
4
14
|
WEB_PUSH_ENCRYPTION_OVERHEAD_BYTES,
|
|
5
15
|
WEB_PUSH_MAX_BODY_BYTES,
|
|
@@ -22,6 +32,7 @@ import {
|
|
|
22
32
|
deriveUserEncryptionKey,
|
|
23
33
|
encryptForStorage,
|
|
24
34
|
getHeader,
|
|
35
|
+
isNonRetryableError,
|
|
25
36
|
isValidISO8601,
|
|
26
37
|
isValidTimeZoneId,
|
|
27
38
|
isValidUUID,
|
|
@@ -32,6 +43,8 @@ import {
|
|
|
32
43
|
parseJsonBody,
|
|
33
44
|
planNextOccurrence,
|
|
34
45
|
runScheduledTick,
|
|
46
|
+
runTask,
|
|
47
|
+
sanitizeErrorSummary,
|
|
35
48
|
timingSafeEqualBytes,
|
|
36
49
|
utf8,
|
|
37
50
|
utf8Decode,
|
|
@@ -39,7 +52,8 @@ import {
|
|
|
39
52
|
validateLlmMessagesArray,
|
|
40
53
|
validateScheduleMessagePayload,
|
|
41
54
|
validateSplitPattern
|
|
42
|
-
} from "./chunk-
|
|
55
|
+
} from "./chunk-D3DQF647.mjs";
|
|
56
|
+
import "./chunk-34I2YSWE.mjs";
|
|
43
57
|
|
|
44
58
|
// src/server/adapters/factory.js
|
|
45
59
|
async function createAdapter(config) {
|
|
@@ -55,11 +69,11 @@ async function createAdapter(config) {
|
|
|
55
69
|
}
|
|
56
70
|
switch (config.driver) {
|
|
57
71
|
case "neon": {
|
|
58
|
-
const { NeonAdapter } = await import("./neon-
|
|
72
|
+
const { NeonAdapter } = await import("./neon-XLWK27RL.mjs");
|
|
59
73
|
return new NeonAdapter(config.connectionString);
|
|
60
74
|
}
|
|
61
75
|
case "pg": {
|
|
62
|
-
const { PgAdapter } = await import("./pg-
|
|
76
|
+
const { PgAdapter } = await import("./pg-X63HFEV7.mjs");
|
|
63
77
|
return new PgAdapter(config.connectionString);
|
|
64
78
|
}
|
|
65
79
|
default:
|
|
@@ -228,14 +242,6 @@ function createSendNotificationsHandler(ctx) {
|
|
|
228
242
|
// src/server/tenant/blob-store.js
|
|
229
243
|
import { createCipheriv, createDecipheriv, createHash, randomBytes } from "crypto";
|
|
230
244
|
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
245
|
function getKekBuffer(kek) {
|
|
240
246
|
const value = String(kek || "").trim();
|
|
241
247
|
if (!value) {
|
|
@@ -249,16 +255,16 @@ function encryptConfig(config, kekBuffer) {
|
|
|
249
255
|
const plaintext = Buffer.from(JSON.stringify(config), "utf8");
|
|
250
256
|
const ciphertext = Buffer.concat([cipher.update(plaintext), cipher.final()]);
|
|
251
257
|
const authTag = cipher.getAuthTag();
|
|
252
|
-
return `v1.${
|
|
258
|
+
return `v1.${bytesToBase64Url(iv)}.${bytesToBase64Url(authTag)}.${bytesToBase64Url(ciphertext)}`;
|
|
253
259
|
}
|
|
254
260
|
function decryptConfig(encrypted, kekBuffer) {
|
|
255
261
|
const parts = String(encrypted || "").split(".");
|
|
256
262
|
if (parts.length !== 4 || parts[0] !== "v1") {
|
|
257
263
|
throw new Error("INVALID_TENANT_CONFIG");
|
|
258
264
|
}
|
|
259
|
-
const iv =
|
|
260
|
-
const authTag =
|
|
261
|
-
const ciphertext =
|
|
265
|
+
const iv = base64UrlToBytes(parts[1]);
|
|
266
|
+
const authTag = base64UrlToBytes(parts[2]);
|
|
267
|
+
const ciphertext = base64UrlToBytes(parts[3]);
|
|
262
268
|
const decipher = createDecipheriv("aes-256-gcm", kekBuffer, iv);
|
|
263
269
|
decipher.setAuthTag(authTag);
|
|
264
270
|
const plaintext = Buffer.concat([decipher.update(ciphertext), decipher.final()]).toString("utf8");
|
|
@@ -446,8 +452,17 @@ function createTenantContextManager(options) {
|
|
|
446
452
|
async function getOrCreateAdapter(dbConfig) {
|
|
447
453
|
const cacheKey = `${dbConfig.driver}:${dbConfig.connectionString}`;
|
|
448
454
|
if (!adapterCache.has(cacheKey)) {
|
|
449
|
-
const
|
|
450
|
-
|
|
455
|
+
const created = (async () => {
|
|
456
|
+
const adapter = await adapterFactory(dbConfig);
|
|
457
|
+
if (typeof adapter.initSchema === "function") {
|
|
458
|
+
await adapter.initSchema();
|
|
459
|
+
}
|
|
460
|
+
return adapter;
|
|
461
|
+
})().catch((error) => {
|
|
462
|
+
adapterCache.delete(cacheKey);
|
|
463
|
+
throw error;
|
|
464
|
+
});
|
|
465
|
+
adapterCache.set(cacheKey, created);
|
|
451
466
|
}
|
|
452
467
|
return adapterCache.get(cacheKey);
|
|
453
468
|
}
|
|
@@ -595,7 +610,17 @@ async function createReiServer(config) {
|
|
|
595
610
|
};
|
|
596
611
|
}
|
|
597
612
|
export {
|
|
613
|
+
CORS_ALLOW_HEADERS,
|
|
614
|
+
CORS_ALLOW_METHODS,
|
|
615
|
+
DEFAULT_CLAIM_LEASE_MS,
|
|
616
|
+
DEFAULT_HEARTBEAT_LEASE_TTL_MS,
|
|
617
|
+
DEFAULT_LEASE_HEARTBEAT_MS,
|
|
618
|
+
DEFAULT_MAX_SCHEDULED_TASKS_PER_FIRE,
|
|
619
|
+
DEFAULT_MAX_TOOL_ITERATIONS,
|
|
620
|
+
DEFAULT_TOTAL_TIMEOUT_MS,
|
|
598
621
|
MAX_PUSH_PAYLOAD_BYTES,
|
|
622
|
+
MIN_SCHEDULE_LEAD_MS,
|
|
623
|
+
NonRetryableError,
|
|
599
624
|
PUSH_ENVELOPE_RESERVED_BYTES,
|
|
600
625
|
WEB_PUSH_ENCRYPTION_OVERHEAD_BYTES,
|
|
601
626
|
WEB_PUSH_MAX_BODY_BYTES,
|
|
@@ -611,6 +636,7 @@ export {
|
|
|
611
636
|
decryptPayload,
|
|
612
637
|
deriveUserEncryptionKey,
|
|
613
638
|
encryptForStorage,
|
|
639
|
+
isNonRetryableError,
|
|
614
640
|
isValidISO8601,
|
|
615
641
|
isValidTimeZoneId,
|
|
616
642
|
isValidUUID,
|
|
@@ -620,6 +646,8 @@ export {
|
|
|
620
646
|
nextFutureOccurrence,
|
|
621
647
|
planNextOccurrence,
|
|
622
648
|
runScheduledTick,
|
|
649
|
+
runTask,
|
|
650
|
+
sanitizeErrorSummary,
|
|
623
651
|
validateAvatarUrl,
|
|
624
652
|
validateLlmMessagesArray,
|
|
625
653
|
validateScheduleMessagePayload,
|