@absolutejs/sync-pack-digest 0.2.2 → 0.2.3

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/index.js CHANGED
@@ -1,4 +1,19 @@
1
1
  // @bun
2
+ var __defProp = Object.defineProperty;
3
+ var __returnValue = (v) => v;
4
+ function __exportSetter(name, newValue) {
5
+ this[name] = __returnValue.bind(null, newValue);
6
+ }
7
+ var __export = (target, all) => {
8
+ for (var name in all)
9
+ __defProp(target, name, {
10
+ get: all[name],
11
+ enumerable: true,
12
+ configurable: true,
13
+ set: __exportSetter.bind(all, name)
14
+ });
15
+ };
16
+
2
17
  // src/index.ts
3
18
  import {
4
19
  defineCollection,
@@ -190,5 +205,5 @@ export {
190
205
  createDigestPack
191
206
  };
192
207
 
193
- //# debugId=4FECC5659F9B261864756E2164756E21
208
+ //# debugId=32B544E03C734D9664756E2164756E21
194
209
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -4,7 +4,7 @@
4
4
  "sourcesContent": [
5
5
  "/**\n * `@absolutejs/sync-pack-digest` — scheduled per-actor digest pack for\n * `@absolutejs/sync`.\n *\n * Cron-fires a schedule that iterates the host's actor list, asks the host\n * to build a digest payload for each actor since their last cursor, and\n * dispatches it through a host-provided `send` adapter. Owns one table\n * (`digest_cursors`) with one row per actor; nothing else.\n *\n * Per-actor failures are caught and logged so one bad send doesn't block\n * the rest. The whole-handler retry shim from sync 1.9.0 is wired but off\n * by default (digest fires are usually fine to skip on transient infra\n * failures — the next cron fire catches up).\n *\n * @example\n * ```ts\n * import { createSyncEngine } from '@absolutejs/sync/engine';\n * import { createDigestPack } from '@absolutejs/sync-pack-digest';\n *\n * const engine = createSyncEngine();\n * engine.registerPack(createDigestPack({\n * cron: '0 8 * * 1', // Mondays 8am\n * listActors: () => db.users.allActiveIds(),\n * buildDigest: async (actorId, since) => {\n * const items = await db.feed.since(actorId, since ?? new Date(0));\n * if (items.length === 0) return null;\n * return {\n * to: await db.users.email(actorId),\n * subject: `Your weekly digest`,\n * body: render(items),\n * };\n * },\n * send: async (msg) => await resend.send(msg),\n * }));\n * ```\n */\n\nimport {\n\tdefineCollection,\n\tdefineSchedule,\n\tdefineSchema,\n\tdefineSyncPack,\n\tfield,\n\ttype CollectionContext,\n\ttype RetryPolicy,\n\ttype SyncPack,\n\ttype TableReader,\n\ttype TableWriter\n} from '@absolutejs/sync/engine';\n\n/** One row per actor — created on first successful send, updated after each. */\nexport type DigestCursor = {\n\t/** Row id (= actorId). */\n\tid: string;\n\tactorId: string;\n\t/** Epoch ms of the most recent successful send. */\n\tlastSentAt: number;\n\t/** Subject line of the most recent successful send (for observability). */\n\tlastSubject: string;\n};\n\n/** The payload the host's `buildDigest` returns. Returning `null` skips. */\nexport type DigestPayload = {\n\tto: string;\n\tsubject: string;\n\tbody: string;\n};\n\n/** Storage adapter the pack uses for the cursors table. */\nexport type DigestStore = {\n\treader: TableReader<CollectionContext>;\n\twriter: TableWriter<DigestCursor, CollectionContext, unknown>;\n\tgetById: (id: string) => DigestCursor | undefined;\n};\n\n/** Default in-memory store. */\nexport const createInMemoryDigestStore = (): DigestStore => {\n\tconst rows = new Map<string, DigestCursor>();\n\treturn {\n\t\tgetById: (id) => rows.get(id),\n\t\treader: {\n\t\t\tall: () => [...rows.values()]\n\t\t},\n\t\twriter: {\n\t\t\tdelete: (row) => {\n\t\t\t\trows.delete((row as { id: string }).id);\n\t\t\t},\n\t\t\tinsert: (data) => {\n\t\t\t\trows.set(data.id, data);\n\t\t\t\treturn data;\n\t\t\t},\n\t\t\tupdate: (data) => {\n\t\t\t\tconst prior = rows.get(data.id);\n\t\t\t\tconst merged = { ...(prior ?? {}), ...data } as DigestCursor;\n\t\t\t\trows.set(data.id, merged);\n\t\t\t\treturn merged;\n\t\t\t}\n\t\t}\n\t};\n};\n\nconst DEFAULT_CRON = '0 8 * * 1';\nconst DEFAULT_MAX_ACTORS_PER_FIRE = 1000;\nconst DEFAULT_MIN_HOURS_BETWEEN_DIGESTS = 168;\n\n/** Factory config. `send`, `buildDigest`, and `listActors` are required. */\nexport type DigestPackConfig<Ctx = CollectionContext> = {\n\t/**\n\t * Prefix applied to the owned table name AND every collection/schedule\n\t * the pack exposes. Default `\"\"`.\n\t */\n\tprefix?: string;\n\t/**\n\t * Cron pattern for the digest fire (`@elysiajs/cron` / croner syntax).\n\t * Default `\"0 8 * * 1\"` (Mondays 08:00).\n\t */\n\tcron?: string;\n\t/**\n\t * Host-supplied email sender. The pack does NOT own transport (no SMTP\n\t * client, no Resend/SES/Postmark dep). Throws are caught per-actor.\n\t */\n\tsend: (msg: DigestPayload) => Promise<void>;\n\t/**\n\t * Build the digest payload for one actor. `since` is the actor's last\n\t * successful send timestamp, or `null` if they've never received one.\n\t * Return `null` to skip this fire silently (no content for this actor).\n\t */\n\tbuildDigest: (\n\t\tactorId: string,\n\t\tsince: Date | null\n\t) => Promise<DigestPayload | null>;\n\t/**\n\t * Yield the actor ids the schedule should iterate per fire. The host's\n\t * own data layer is the source of truth for \"who exists\" — the pack\n\t * just maintains per-actor cursors.\n\t */\n\tlistActors: () =>\n\t\t| Iterable<string>\n\t\t| Promise<Iterable<string>>;\n\t/**\n\t * Cap on actors processed per fire (back-pressure). The rest wait for\n\t * the next cron fire. Default `1000`.\n\t */\n\tmaxActorsPerFire?: number;\n\t/**\n\t * Minimum hours between digests for a given actor. An actor whose\n\t * cursor is fresher than this is skipped on the fire. Default `168`\n\t * (one week — matches the weekly default cron).\n\t */\n\tminHoursBetweenDigests?: number;\n\t/**\n\t * Extract the current actor id from ctx — used to scope the cursor\n\t * collection so each actor sees their own row. Default\n\t * `(ctx) => ctx.userId`.\n\t */\n\tgetActorId?: (ctx: Ctx) => string | undefined;\n\t/**\n\t * Outer schedule retry policy. The pack catches per-actor failures\n\t * already, so this only retries the whole handler on classified\n\t * transient infrastructure failures (e.g. DB serialization). Default\n\t * undefined — digest fires miss skip on infra failure and catch up\n\t * next cron.\n\t */\n\tretry?: RetryPolicy;\n\t/** Override the storage adapter. Default: per-instance in-memory. */\n\tstore?: DigestStore;\n\t/** Wall-clock function. Default `Date.now`. */\n\tnow?: () => number;\n\t/**\n\t * Hook for surfacing per-actor failures. Defaults to `console.error`.\n\t * The pack swallows the error after this call so the schedule keeps\n\t * going for the rest of the actor list.\n\t */\n\tonActorFailure?: (info: {\n\t\tactorId: string;\n\t\tphase: 'buildDigest' | 'send' | 'cursor';\n\t\terror: unknown;\n\t}) => void;\n\t/**\n\t * When `true`, the schedule builds each digest as usual but does NOT\n\t * call `send` and does NOT update cursors. Use for hosting QA, preview\n\t * fires from staging, or \"what would the next digest look like?\"\n\t * tooling. Built payloads are surfaced through `onActorPreview` so\n\t * the host can render them to an admin UI.\n\t */\n\tdryRun?: boolean;\n\t/**\n\t * Called for each actor whose digest was successfully built, regardless\n\t * of `dryRun`. In dry-run mode this is the only way to observe what\n\t * WOULD have been sent. In live mode it fires before `send`.\n\t */\n\tonActorPreview?: (info: { actorId: string; payload: DigestPayload }) => void;\n};\n\nconst resolveActor = (\n\tgetActorId: NonNullable<DigestPackConfig['getActorId']>,\n\tctx: unknown\n): string | undefined => getActorId(ctx as CollectionContext);\n\n/**\n * Build a {@link SyncPack} that exposes scheduled per-actor digests. Each\n * call returns a fresh pack with its own cursor store (unless overridden).\n */\nexport const createDigestPack = <Ctx = CollectionContext>(\n\tconfig: DigestPackConfig<Ctx>\n): SyncPack => {\n\tconst prefix = config.prefix ?? '';\n\tconst table = `${prefix}digest_cursors`;\n\tconst collectionName = table;\n\tconst scheduleName = `${prefix}digest:fire`;\n\tconst cron = config.cron ?? DEFAULT_CRON;\n\tconst maxActorsPerFire =\n\t\tconfig.maxActorsPerFire ?? DEFAULT_MAX_ACTORS_PER_FIRE;\n\tconst minIntervalMs =\n\t\t(config.minHoursBetweenDigests ??\n\t\t\tDEFAULT_MIN_HOURS_BETWEEN_DIGESTS) *\n\t\t60 *\n\t\t60 *\n\t\t1000;\n\tconst store = config.store ?? createInMemoryDigestStore();\n\tconst now = config.now ?? Date.now;\n\tconst getActorId = (config.getActorId ??\n\t\t((ctx: CollectionContext) =>\n\t\t\t(ctx as { userId?: string }).userId)) as (\n\t\tctx: CollectionContext\n\t) => string | undefined;\n\tconst onActorFailure =\n\t\tconfig.onActorFailure ??\n\t\t((info) => {\n\t\t\t// eslint-disable-next-line no-console\n\t\t\tconsole.error(\n\t\t\t\t`[sync-pack-digest] actor \"${info.actorId}\" failed at ${info.phase}:`,\n\t\t\t\tinfo.error\n\t\t\t);\n\t\t});\n\n\tconst pack: SyncPack = {\n\t\tname: '@absolutejs/sync-pack-digest',\n\t\townsTables: [table],\n\t\treadsTables: [],\n\t\tversion: '0.2.0',\n\n\t\tschemas: defineSchema({\n\t\t\t[table]: {\n\t\t\t\tfields: {\n\t\t\t\t\tid: field.string,\n\t\t\t\t\tactorId: field.string,\n\t\t\t\t\tlastSentAt: field.number,\n\t\t\t\t\tlastSubject: field.string\n\t\t\t\t}\n\t\t\t}\n\t\t}),\n\n\t\treaders: { [table]: store.reader },\n\t\twriters: { [table]: store.writer },\n\n\t\tpermissions: {\n\t\t\t[table]: {\n\t\t\t\t// Each actor sees only their own cursor — the cursor row\n\t\t\t\t// surfaces \"your last digest was at X\" to the user without\n\t\t\t\t// leaking other actors' state. Hosts who want a global\n\t\t\t\t// admin view register their own permissions on top.\n\t\t\t\tread: (ctx: unknown, row: DigestCursor) => {\n\t\t\t\t\tconst callerId = resolveActor(getActorId, ctx);\n\t\t\t\t\treturn callerId !== undefined && row.actorId === callerId;\n\t\t\t\t},\n\t\t\t\t// Writes flow only through the pack's schedule; deny\n\t\t\t\t// outside writers by stamping actorId === caller, which\n\t\t\t\t// fails for any non-actor (the schedule runs trusted and\n\t\t\t\t// bypasses these checks).\n\t\t\t\tinsert: (ctx: unknown, row: DigestCursor) => {\n\t\t\t\t\tconst callerId = resolveActor(getActorId, ctx);\n\t\t\t\t\treturn callerId !== undefined && row.actorId === callerId;\n\t\t\t\t},\n\t\t\t\tupdate: (ctx: unknown, row: DigestCursor) => {\n\t\t\t\t\tconst callerId = resolveActor(getActorId, ctx);\n\t\t\t\t\treturn callerId !== undefined && row.actorId === callerId;\n\t\t\t\t},\n\t\t\t\tdelete: (ctx: unknown, row: DigestCursor) => {\n\t\t\t\t\tconst callerId = resolveActor(getActorId, ctx);\n\t\t\t\t\tif (callerId === undefined) return false;\n\t\t\t\t\tif ((row as { actorId?: string }).actorId !== undefined) {\n\t\t\t\t\t\treturn (row as { actorId: string }).actorId === callerId;\n\t\t\t\t\t}\n\t\t\t\t\tconst id = (row as { id?: string }).id;\n\t\t\t\t\tif (id === undefined) return false;\n\t\t\t\t\treturn store.getById(id)?.actorId === callerId;\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\tcollections: [\n\t\t\tdefineCollection<DigestCursor, void, CollectionContext>({\n\t\t\t\tname: collectionName,\n\t\t\t\ttables: [table],\n\t\t\t\tkey: (row) => row.id,\n\t\t\t\thydrate: (_params, ctx) => {\n\t\t\t\t\tconst callerId = resolveActor(getActorId, ctx);\n\t\t\t\t\tif (callerId === undefined) return [];\n\t\t\t\t\treturn (store.reader.all(ctx) as DigestCursor[]).filter(\n\t\t\t\t\t\t(row) => row.actorId === callerId\n\t\t\t\t\t);\n\t\t\t\t},\n\t\t\t\tmatch: (row, _params, ctx) => {\n\t\t\t\t\tconst callerId = resolveActor(getActorId, ctx);\n\t\t\t\t\treturn (\n\t\t\t\t\t\tcallerId !== undefined && row.actorId === callerId\n\t\t\t\t\t);\n\t\t\t\t},\n\t\t\t\tauthorize: (_params, ctx) =>\n\t\t\t\t\tresolveActor(getActorId, ctx) !== undefined\n\t\t\t})\n\t\t],\n\n\t\tschedules: [\n\t\t\tdefineSchedule({\n\t\t\t\tname: scheduleName,\n\t\t\t\tpattern: cron,\n\t\t\t\t...(config.retry !== undefined ? { retry: config.retry } : {}),\n\t\t\t\trun: async ({ actions }) => {\n\t\t\t\t\tconst t = now();\n\t\t\t\t\tconst actors = await config.listActors();\n\t\t\t\t\tlet processed = 0;\n\t\t\t\t\tfor (const actorId of actors) {\n\t\t\t\t\t\tif (processed >= maxActorsPerFire) break;\n\t\t\t\t\t\tconst cursor = store.getById(actorId);\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\tcursor !== undefined &&\n\t\t\t\t\t\t\tt - cursor.lastSentAt < minIntervalMs\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t// Not yet due for this actor.\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tlet payload: DigestPayload | null;\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tconst since =\n\t\t\t\t\t\t\t\tcursor === undefined\n\t\t\t\t\t\t\t\t\t? null\n\t\t\t\t\t\t\t\t\t: new Date(cursor.lastSentAt);\n\t\t\t\t\t\t\tpayload = await config.buildDigest(actorId, since);\n\t\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t\tonActorFailure({\n\t\t\t\t\t\t\t\tactorId,\n\t\t\t\t\t\t\t\terror,\n\t\t\t\t\t\t\t\tphase: 'buildDigest'\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (payload === null) {\n\t\t\t\t\t\t\t// Host signalled no content for this actor — skip\n\t\t\t\t\t\t\t// without bumping the cursor.\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// Surface the built payload for both live and dry-run\n\t\t\t\t\t\t// callers. Lets a host preview / audit / log each digest.\n\t\t\t\t\t\tconfig.onActorPreview?.({ actorId, payload });\n\t\t\t\t\t\tif (config.dryRun === true) {\n\t\t\t\t\t\t\t// dryRun: skip send AND cursor write. Count it as\n\t\t\t\t\t\t\t// processed so maxActorsPerFire still caps the loop.\n\t\t\t\t\t\t\tprocessed++;\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tawait config.send(payload);\n\t\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t\tonActorFailure({\n\t\t\t\t\t\t\t\tactorId,\n\t\t\t\t\t\t\t\terror,\n\t\t\t\t\t\t\t\tphase: 'send'\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tprocessed++;\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tconst next: DigestCursor = {\n\t\t\t\t\t\t\t\tid: actorId,\n\t\t\t\t\t\t\t\tactorId,\n\t\t\t\t\t\t\t\tlastSentAt: t,\n\t\t\t\t\t\t\t\tlastSubject: payload.subject\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\tif (cursor === undefined) {\n\t\t\t\t\t\t\t\tawait actions.insert(table, next);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tawait actions.update(table, next);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t\t// The email already went out — losing the cursor\n\t\t\t\t\t\t\t// update means the actor may double-receive on\n\t\t\t\t\t\t\t// the next fire. We log so the operator sees it.\n\t\t\t\t\t\t\tonActorFailure({\n\t\t\t\t\t\t\t\tactorId,\n\t\t\t\t\t\t\t\terror,\n\t\t\t\t\t\t\t\tphase: 'cursor'\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t})\n\t\t]\n\t};\n\n\treturn defineSyncPack(pack);\n};\n"
6
6
  ],
7
- "mappings": "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",
8
- "debugId": "4FECC5659F9B261864756E2164756E21",
7
+ "mappings": "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",
8
+ "debugId": "32B544E03C734D9664756E2164756E21",
9
9
  "names": []
10
10
  }
@@ -0,0 +1,3 @@
1
+ import type { SyncPack } from '@absolutejs/sync/engine';
2
+ import type { DigestPackConfig } from './index';
3
+ export declare const manifest: import("@absolutejs/manifest").PackageManifest<DigestPackConfig, SyncPack>;