easy-ping 0.8.1 → 0.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (118) hide show
  1. package/README.md +17 -11
  2. package/dist/adapter-C3uFRpEN.d.cts +10 -0
  3. package/dist/adapter-DoCRPi9I.d.ts +10 -0
  4. package/dist/adapters/drizzle.cjs +6 -4
  5. package/dist/adapters/drizzle.cjs.map +1 -1
  6. package/dist/adapters/drizzle.js +7 -5
  7. package/dist/adapters/drizzle.js.map +1 -1
  8. package/dist/adapters/mongodb.cjs.map +1 -1
  9. package/dist/adapters/mongodb.d.cts +1 -1
  10. package/dist/adapters/mongodb.d.ts +1 -1
  11. package/dist/adapters/mongodb.js +1 -1
  12. package/dist/adapters/mysql.cjs +7 -4
  13. package/dist/adapters/mysql.cjs.map +1 -1
  14. package/dist/adapters/mysql.d.cts +4 -3
  15. package/dist/adapters/mysql.d.ts +4 -3
  16. package/dist/adapters/mysql.js +3 -3
  17. package/dist/adapters/postgres.cjs +3 -3
  18. package/dist/adapters/postgres.cjs.map +1 -1
  19. package/dist/adapters/postgres.d.cts +2 -2
  20. package/dist/adapters/postgres.d.ts +2 -2
  21. package/dist/adapters/postgres.js +7 -7
  22. package/dist/adapters/postgres.js.map +1 -1
  23. package/dist/adapters/sqlite.cjs +8 -5
  24. package/dist/adapters/sqlite.cjs.map +1 -1
  25. package/dist/adapters/sqlite.d.cts +4 -3
  26. package/dist/adapters/sqlite.d.ts +4 -3
  27. package/dist/adapters/sqlite.js +3 -3
  28. package/dist/chunk-A4HX5YTG.js +413 -0
  29. package/dist/chunk-A4HX5YTG.js.map +1 -0
  30. package/dist/{chunk-JOVIZXO6.js → chunk-CFLVAF2R.js} +20 -6
  31. package/dist/chunk-CFLVAF2R.js.map +1 -0
  32. package/dist/{chunk-2EYKPF5A.js → chunk-CMWOIYVQ.js} +3 -3
  33. package/dist/{chunk-2EYKPF5A.js.map → chunk-CMWOIYVQ.js.map} +1 -1
  34. package/dist/{chunk-HY47TQMY.js → chunk-HSB5T3LD.js} +11 -8
  35. package/dist/chunk-HSB5T3LD.js.map +1 -0
  36. package/dist/{chunk-E4IZ2CQC.js → chunk-JN3UCQBP.js} +2 -2
  37. package/dist/chunk-JN3UCQBP.js.map +1 -0
  38. package/dist/{chunk-3VOQOGDR.js → chunk-O2PBBL5X.js} +24 -6
  39. package/dist/chunk-O2PBBL5X.js.map +1 -0
  40. package/dist/{chunk-M4R77BJD.js → chunk-UM2L26PV.js} +10 -7
  41. package/dist/chunk-UM2L26PV.js.map +1 -0
  42. package/dist/dialect-CvBJSydR.d.cts +10 -0
  43. package/dist/dialect-CvBJSydR.d.ts +10 -0
  44. package/dist/index.cjs +74 -10
  45. package/dist/index.cjs.map +1 -1
  46. package/dist/index.d.cts +4 -2
  47. package/dist/index.d.ts +4 -2
  48. package/dist/index.js +39 -7
  49. package/dist/index.js.map +1 -1
  50. package/dist/node.cjs +14 -2
  51. package/dist/node.cjs.map +1 -1
  52. package/dist/node.js +15 -3
  53. package/dist/node.js.map +1 -1
  54. package/dist/{plugin-C4fikLl7.d.ts → plugin-Bp68CCnd.d.ts} +1 -0
  55. package/dist/{plugin-6S8tpH0n.d.cts → plugin-p4HS8yjS.d.cts} +1 -0
  56. package/dist/plugins/digests.cjs +19 -12
  57. package/dist/plugins/digests.cjs.map +1 -1
  58. package/dist/plugins/digests.d.cts +1 -1
  59. package/dist/plugins/digests.d.ts +1 -1
  60. package/dist/plugins/digests.js +5 -12
  61. package/dist/plugins/digests.js.map +1 -1
  62. package/dist/plugins/mobile-push.cjs +2 -1
  63. package/dist/plugins/mobile-push.cjs.map +1 -1
  64. package/dist/plugins/mobile-push.d.cts +1 -1
  65. package/dist/plugins/mobile-push.d.ts +1 -1
  66. package/dist/plugins/mobile-push.js +3 -2
  67. package/dist/plugins/mobile-push.js.map +1 -1
  68. package/dist/plugins/preferences-client.cjs.map +1 -1
  69. package/dist/plugins/preferences-client.d.cts +1 -1
  70. package/dist/plugins/preferences-client.d.ts +1 -1
  71. package/dist/plugins/preferences-client.js +1 -1
  72. package/dist/plugins/preferences.cjs.map +1 -1
  73. package/dist/plugins/preferences.d.cts +1 -1
  74. package/dist/plugins/preferences.d.ts +1 -1
  75. package/dist/plugins/preferences.js +1 -1
  76. package/dist/plugins/push.cjs.map +1 -1
  77. package/dist/plugins/push.d.cts +1 -1
  78. package/dist/plugins/push.d.ts +1 -1
  79. package/dist/plugins/push.js +1 -1
  80. package/dist/plugins/telegram.cjs +22 -1
  81. package/dist/plugins/telegram.cjs.map +1 -1
  82. package/dist/plugins/telegram.d.cts +1 -1
  83. package/dist/plugins/telegram.d.ts +1 -1
  84. package/dist/plugins/telegram.js +23 -2
  85. package/dist/plugins/telegram.js.map +1 -1
  86. package/dist/providers/expo-push.cjs +1 -1
  87. package/dist/providers/expo-push.cjs.map +1 -1
  88. package/dist/providers/expo-push.js +1 -1
  89. package/dist/providers/expo-push.js.map +1 -1
  90. package/dist/providers/web-push.cjs +3 -7
  91. package/dist/providers/web-push.cjs.map +1 -1
  92. package/dist/providers/web-push.d.cts +1 -1
  93. package/dist/providers/web-push.d.ts +1 -1
  94. package/dist/providers/web-push.js +3 -7
  95. package/dist/providers/web-push.js.map +1 -1
  96. package/dist/react-native.cjs +20 -2
  97. package/dist/react-native.cjs.map +1 -1
  98. package/dist/react-native.js +20 -2
  99. package/dist/react-native.js.map +1 -1
  100. package/dist/react.cjs +20 -2
  101. package/dist/react.cjs.map +1 -1
  102. package/dist/react.js +20 -2
  103. package/dist/react.js.map +1 -1
  104. package/dist/schema.cjs +336 -123
  105. package/dist/schema.cjs.map +1 -1
  106. package/dist/schema.d.cts +28 -2
  107. package/dist/schema.d.ts +28 -2
  108. package/dist/schema.js +3 -3
  109. package/package.json +1 -1
  110. package/dist/adapter-B7R4rXtJ.d.cts +0 -17
  111. package/dist/adapter-B7R4rXtJ.d.ts +0 -17
  112. package/dist/chunk-3VOQOGDR.js.map +0 -1
  113. package/dist/chunk-E4IZ2CQC.js.map +0 -1
  114. package/dist/chunk-HY47TQMY.js.map +0 -1
  115. package/dist/chunk-JOVIZXO6.js.map +0 -1
  116. package/dist/chunk-M4R77BJD.js.map +0 -1
  117. package/dist/chunk-XIDVLYNQ.js +0 -209
  118. package/dist/chunk-XIDVLYNQ.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/adapters/postgres/adapter.ts","../../src/adapters/postgres/helpers.ts","../../src/adapters/postgres/signals.ts"],"names":["quote"],"mappings":"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","file":"postgres.js","sourcesContent":["import type {\n ClaimArgs,\n ClaimedDelivery,\n DatabaseAdapter,\n DeliveryRelease,\n FeedPage,\n FeedQuery,\n InsertNotification,\n} from \"../../core/adapter\";\nimport { decodeBase64Url, encodeBase64Url } from \"../../core/base64url\";\nimport { isOperator, type QueryOptions, type WhereClause } from \"../../core/store\";\nimport type { Channel, DeliveryRecord, DeliveryStatus, NotificationRecord } from \"../../core/types\";\nimport { toSnakeCase } from \"../../schema/declaration\";\nimport { quote, Statement } from \"../sql/statement\";\n\ntype Row = Record<string, unknown>;\n\n/** Run one parameterised statement, return rows: the whole driver contract. */\nexport type SqlQuery = (text: string, params: readonly unknown[]) => Promise<readonly Row[]>;\n\nexport type PostgresAdapterOptions = {\n /** Table-name prefix. Must match the instance's `tablePrefix`. */\n prefix?: string;\n /** Makes createNotifications atomic. Optional; without it each write is still safe. */\n transaction?: <T>(fn: (query: SqlQuery) => Promise<T>) => Promise<T>;\n};\n\nconst str = (value: unknown): string => String(value);\nconst nullableStr = (value: unknown): string | null => (value == null ? null : String(value));\nconst num = (value: unknown): number => Number(value);\nconst date = (value: unknown): Date => (value instanceof Date ? value : new Date(String(value)));\nconst nullableDate = (value: unknown): Date | null =>\n value == null ? null : value instanceof Date ? value : new Date(String(value));\n\nconst encodeCursor = (createdAt: Date, id: string) =>\n encodeBase64Url(`${createdAt.toISOString()}|${id}`);\n\nfunction decodeCursor(cursor: string): { createdAt: Date; id: string } | null {\n const decoded = decodeBase64Url(cursor);\n if (!decoded) return null;\n\n const [iso, id] = decoded.split(\"|\");\n if (!iso || !id) return null;\n\n const createdAt = new Date(iso);\n return Number.isNaN(createdAt.getTime()) ? null : { createdAt, id };\n}\n\nfunction toNotification(row: Row): NotificationRecord {\n return {\n id: str(row.id),\n userId: str(row.user_id),\n type: str(row.type),\n payload: typeof row.payload === \"string\" ? JSON.parse(row.payload) : row.payload,\n actorId: nullableStr(row.actor_id),\n groupKey: nullableStr(row.group_key),\n dedupeKey: nullableStr(row.dedupe_key),\n seenAt: nullableDate(row.seen_at),\n readAt: nullableDate(row.read_at),\n archivedAt: nullableDate(row.archived_at),\n createdAt: date(row.created_at),\n };\n}\n\nfunction toDelivery(row: Row): DeliveryRecord {\n return {\n id: str(row.id),\n notificationId: str(row.notification_id),\n channel: str(row.channel) as Channel,\n status: str(row.status) as DeliveryStatus,\n attempts: num(row.attempts),\n maxAttempts: num(row.max_attempts),\n notBefore: date(row.not_before),\n claimedAt: nullableDate(row.claimed_at),\n claimedBy: nullableStr(row.claimed_by),\n lastError: nullableStr(row.last_error),\n updatedAt: date(row.updated_at),\n };\n}\n\n/** Appends ` WHERE …` for a PluginStore clause. Values are always bound. */\nfunction appendWhere(statement: Statement, where: WhereClause): void {\n const entries = Object.entries(where);\n if (entries.length === 0) return;\n\n statement.raw(\" WHERE \");\n\n entries.forEach(([field, condition], index) => {\n if (index > 0) statement.raw(\" AND \");\n const column = quote(toSnakeCase(field));\n\n if (condition === null) {\n statement.raw(`${column} IS NULL`);\n return;\n }\n\n if (!isOperator(condition)) {\n statement.raw(`${column} = `).value(condition);\n return;\n }\n\n const operator = condition as Record<string, unknown>;\n\n if (\"in\" in operator) {\n const list = operator.in as readonly (string | number)[];\n // An empty IN () is a syntax error.\n if (list.length === 0) statement.raw(\"FALSE\");\n else statement.raw(`${column} IN (`).list(list).raw(\")\");\n return;\n }\n\n if (\"lt\" in operator) statement.raw(`${column} < `).value(operator.lt);\n else if (\"lte\" in operator) statement.raw(`${column} <= `).value(operator.lte);\n else if (\"gt\" in operator) statement.raw(`${column} > `).value(operator.gt);\n else if (\"gte\" in operator) statement.raw(`${column} >= `).value(operator.gte);\n else if (\"not\" in operator) {\n if (operator.not === null) statement.raw(`${column} IS NOT NULL`);\n else statement.raw(`${column} IS DISTINCT FROM `).value(operator.not);\n } else statement.raw(\"TRUE\");\n });\n}\n\n/** Postgres through any driver, no ORM. Deliberately Postgres-specific: ON CONFLICT, FOR UPDATE SKIP LOCKED, IS DISTINCT FROM. RFC 0003. */\nexport function postgresAdapter(\n query: SqlQuery,\n options: PostgresAdapterOptions = {},\n): DatabaseAdapter {\n const prefix = options.prefix ?? \"\";\n\n const NOTIFICATION = quote(`${prefix}notification`);\n const DELIVERY = quote(`${prefix}notification_delivery`);\n\n const run = async (statement: Statement, exec: SqlQuery = query) =>\n exec(statement.text, statement.params);\n\n const atomically = <T>(fn: (exec: SqlQuery) => Promise<T>): Promise<T> =>\n options.transaction ? options.transaction(fn) : fn(query);\n\n return {\n name: \"postgres\",\n naming: \"snake_case\",\n serializesJson: true,\n\n async createNotifications(input: readonly InsertNotification[]) {\n if (input.length === 0) return { created: [], deduped: [] };\n\n // App clock, not now(): markSeen compares against app-side cutoffs and NTP skew broke it.\n const now = new Date();\n\n return atomically(async (exec) => {\n const insert = new Statement().raw(\n `INSERT INTO ${NOTIFICATION} ` +\n \"(id, user_id, type, payload, actor_id, group_key, dedupe_key, created_at) VALUES \",\n );\n\n input.forEach((row, index) => {\n if (index > 0) insert.raw(\", \");\n insert.tuple([\n [row.id, \"text\"],\n [row.userId, \"text\"],\n [row.type, \"text\"],\n [JSON.stringify(row.payload ?? null), \"jsonb\"],\n [row.actorId ?? null, \"text\"],\n [row.groupKey ?? null, \"text\"],\n [row.dedupeKey ?? null, \"text\"],\n [now, \"timestamptz\"],\n ]);\n });\n\n // NULL dedupe keys never conflict, so undeduped rows coexist.\n insert.raw(\" ON CONFLICT (user_id, dedupe_key) DO NOTHING RETURNING id\");\n\n const inserted = await run(insert, exec);\n const created = new Set(inserted.map((row) => str(row.id)));\n\n const deliveries = input\n .filter((row) => created.has(row.id))\n .flatMap((row) => row.deliveries.map((delivery) => ({ row, delivery })));\n\n if (deliveries.length > 0) {\n const insertDeliveries = new Statement().raw(\n `INSERT INTO ${DELIVERY} ` +\n \"(id, notification_id, channel, max_attempts, not_before, updated_at) VALUES \",\n );\n\n deliveries.forEach(({ row, delivery }, index) => {\n if (index > 0) insertDeliveries.raw(\", \");\n insertDeliveries.tuple([\n [delivery.id, \"text\"],\n [row.id, \"text\"],\n [delivery.channel, \"text\"],\n [delivery.maxAttempts, \"integer\"],\n [delivery.notBefore, \"timestamptz\"],\n [now, \"timestamptz\"],\n ]);\n });\n\n await run(insertDeliveries, exec);\n }\n\n return {\n created: [...created],\n deduped: input.filter((row) => !created.has(row.id)).map((row) => row.id),\n };\n });\n },\n\n async claimPendingDeliveries(args: ClaimArgs): Promise<readonly ClaimedDelivery[]> {\n const now = args.now ?? new Date();\n const staleBefore = new Date(now.getTime() - args.leaseMs);\n\n // SKIP LOCKED lets concurrent sweeps step around each other. RFC 0003 §5.\n const statement = new Statement()\n .raw(`WITH claimed AS (UPDATE ${DELIVERY} SET status = 'claimed', claimed_at = `)\n .value(now)\n .raw(\"::timestamptz, claimed_by = \")\n .value(args.claimToken)\n .raw(`::text WHERE id IN (SELECT id FROM ${DELIVERY} WHERE (status = 'pending' OR `)\n .raw(\"(status = 'claimed' AND claimed_at < \")\n .value(staleBefore)\n .raw(\"::timestamptz)) AND not_before <= \")\n .value(now)\n .raw(\"::timestamptz AND attempts < max_attempts\");\n\n if (args.channels && args.channels.length > 0) {\n statement.raw(\" AND channel IN (\").list(args.channels).raw(\")\");\n }\n if (args.ids && args.ids.length > 0) {\n statement.raw(\" AND id IN (\").list(args.ids).raw(\")\");\n }\n\n statement\n .raw(\" ORDER BY not_before ASC, id ASC LIMIT \")\n .value(args.limit)\n .raw(\" FOR UPDATE SKIP LOCKED)\")\n .raw(\" RETURNING id, notification_id, channel, attempts, max_attempts)\")\n .raw(\n \" SELECT c.id, c.notification_id, c.channel, c.attempts, c.max_attempts,\" +\n \" n.user_id, n.type, n.payload, n.actor_id FROM claimed c\" +\n ` JOIN ${NOTIFICATION} n ON n.id = c.notification_id`,\n );\n\n const rows = await run(statement);\n\n return rows.map((row) => ({\n id: str(row.id),\n notificationId: str(row.notification_id),\n channel: str(row.channel) as Channel,\n attempts: num(row.attempts),\n maxAttempts: num(row.max_attempts),\n notification: {\n userId: str(row.user_id),\n type: str(row.type),\n payload: typeof row.payload === \"string\" ? JSON.parse(row.payload) : row.payload,\n actorId: nullableStr(row.actor_id),\n },\n }));\n },\n\n async releaseDeliveries(releases: readonly DeliveryRelease[]) {\n if (releases.length === 0) return;\n const now = new Date();\n\n // No claimed_by predicate on purpose: terminal state beats a wedged row. RFC 0003 §6.\n const statement = new Statement().raw(\n `UPDATE ${DELIVERY} d SET status = CASE` +\n \" WHEN v.result = 'sent' THEN 'sent'\" +\n \" WHEN v.result = 'skipped' THEN 'skipped'\" +\n \" WHEN v.retryable AND d.attempts + 1 < d.max_attempts THEN 'pending'\" +\n \" ELSE 'failed' END,\" +\n \" attempts = CASE WHEN v.result IN ('sent', 'skipped')\" +\n \" THEN d.attempts ELSE d.attempts + 1 END,\" +\n \" last_error = v.error,\" +\n \" not_before = COALESCE(v.not_before, d.not_before),\" +\n \" claimed_at = NULL, claimed_by = NULL, updated_at = \",\n );\n\n statement.value(now).raw(\"::timestamptz FROM (VALUES \");\n\n releases.forEach(({ id, outcome, nextAttemptAt }, index) => {\n if (index > 0) statement.raw(\", \");\n statement.tuple([\n [id, \"text\"],\n [outcome.result, \"text\"],\n [outcome.result === \"failed\" && outcome.retryable, \"boolean\"],\n [\n outcome.result === \"failed\"\n ? outcome.error.slice(0, 2000)\n : outcome.result === \"skipped\"\n ? outcome.reason.slice(0, 2000)\n : null,\n \"text\",\n ],\n [nextAttemptAt ?? null, \"timestamptz\"],\n ]);\n });\n\n statement.raw(\") AS v(id, result, retryable, error, not_before) WHERE d.id = v.id\");\n\n await run(statement);\n },\n\n async listNotifications(feed: FeedQuery): Promise<FeedPage> {\n const cursor = feed.cursor ? decodeCursor(feed.cursor) : null;\n\n const statement = new Statement()\n .raw(`SELECT * FROM ${NOTIFICATION} WHERE user_id = `)\n .value(feed.userId)\n .raw(\"::text AND archived_at IS NULL\");\n\n if (feed.unreadOnly) statement.raw(\" AND read_at IS NULL\");\n\n if (cursor) {\n statement\n .raw(\" AND (created_at, id) < (\")\n .value(cursor.createdAt)\n .raw(\"::timestamptz, \")\n .value(cursor.id)\n .raw(\"::text)\");\n }\n\n statement.raw(\" ORDER BY created_at DESC, id DESC LIMIT \").value(feed.limit + 1);\n\n const rows = await run(statement);\n const page = rows.slice(0, feed.limit).map(toNotification);\n const last = page.at(-1);\n\n return {\n notifications: page,\n nextCursor: rows.length > feed.limit && last ? encodeCursor(last.createdAt, last.id) : null,\n };\n },\n\n async countUnseen(userId: string) {\n const rows = await run(\n new Statement()\n .raw(`SELECT count(*)::int AS count FROM ${NOTIFICATION} WHERE user_id = `)\n .value(userId)\n .raw(\"::text AND seen_at IS NULL AND archived_at IS NULL\"),\n );\n return num(rows[0]?.count ?? 0);\n },\n\n async markSeen(userId: string, before: Date) {\n await run(\n new Statement()\n .raw(`UPDATE ${NOTIFICATION} SET seen_at = `)\n .value(new Date())\n .raw(\"::timestamptz WHERE user_id = \")\n .value(userId)\n .raw(\"::text AND seen_at IS NULL AND created_at <= \")\n .value(before)\n .raw(\"::timestamptz\"),\n );\n },\n\n async markRead(userId: string, notificationIds: readonly string[]) {\n if (notificationIds.length === 0) return 0;\n\n // Scoped by user_id (RFC 0002 §2); no read_at IS NULL filter so re-marking stays idempotent.\n const rows = await run(\n new Statement()\n .raw(`UPDATE ${NOTIFICATION} SET read_at = COALESCE(read_at, `)\n .value(new Date())\n .raw(\"::timestamptz) WHERE user_id = \")\n .value(userId)\n .raw(\"::text AND id IN (\")\n .list(notificationIds)\n .raw(\") RETURNING id\"),\n );\n return rows.length;\n },\n\n async markAllRead(userId: string) {\n const rows = await run(\n new Statement()\n .raw(`UPDATE ${NOTIFICATION} SET read_at = `)\n .value(new Date())\n .raw(\"::timestamptz WHERE user_id = \")\n .value(userId)\n .raw(\"::text AND read_at IS NULL RETURNING id\"),\n );\n return rows.length;\n },\n\n async getFailedDeliveries(args: { since: Date; limit: number }) {\n const rows = await run(\n new Statement()\n .raw(`SELECT * FROM ${DELIVERY} WHERE status = 'failed' AND updated_at >= `)\n .value(args.since)\n .raw(\"::timestamptz ORDER BY updated_at DESC LIMIT \")\n .value(args.limit),\n );\n return rows.map(toDelivery);\n },\n\n async queryTable(table: string, where: WhereClause, queryOptions: QueryOptions) {\n const statement = new Statement().raw(`SELECT * FROM ${quote(table)}`);\n appendWhere(statement, where);\n\n if (queryOptions.orderBy) {\n const direction = queryOptions.orderBy.direction === \"desc\" ? \"DESC\" : \"ASC\";\n statement.raw(` ORDER BY ${quote(toSnakeCase(queryOptions.orderBy.field))} ${direction}`);\n }\n if (queryOptions.limit) statement.raw(\" LIMIT \").value(queryOptions.limit);\n\n return [...(await run(statement))];\n },\n\n async insertRows(\n table: string,\n rows: readonly Record<string, unknown>[],\n onConflict?: readonly string[],\n ) {\n if (rows.length === 0) return 0;\n\n const columns = Object.keys(rows[0] ?? {});\n if (columns.length === 0) return 0;\n\n const statement = new Statement().raw(\n `INSERT INTO ${quote(table)} (${columns.map((c) => quote(toSnakeCase(c))).join(\", \")}) VALUES `,\n );\n\n rows.forEach((row, index) => {\n if (index > 0) statement.raw(\", \");\n statement\n .raw(\"(\")\n .list(columns.map((column) => row[column]))\n .raw(\")\");\n });\n\n if (onConflict && onConflict.length > 0) {\n const assignments = columns\n .filter((column) => !onConflict.includes(column))\n .map((column) => {\n const quoted = quote(toSnakeCase(column));\n return `${quoted} = EXCLUDED.${quoted}`;\n });\n\n statement.raw(\n ` ON CONFLICT (${onConflict.map((f) => quote(toSnakeCase(f))).join(\", \")}) DO UPDATE SET ${assignments.join(\", \")}`,\n );\n }\n\n statement.raw(\" RETURNING 1 AS ok\");\n return (await run(statement)).length;\n },\n\n async updateRows(table: string, where: WhereClause, set: Record<string, unknown>) {\n const assignments = Object.entries(set);\n if (assignments.length === 0) return 0;\n\n const statement = new Statement().raw(`UPDATE ${quote(table)} SET `);\n\n assignments.forEach(([field, value], index) => {\n if (index > 0) statement.raw(\", \");\n statement.raw(`${quote(toSnakeCase(field))} = `).value(value);\n });\n\n appendWhere(statement, where);\n statement.raw(\" RETURNING 1 AS ok\");\n\n return (await run(statement)).length;\n },\n\n async deleteRows(table: string, where: WhereClause) {\n const statement = new Statement().raw(`DELETE FROM ${quote(table)}`);\n appendWhere(statement, where);\n statement.raw(\" RETURNING 1 AS ok\");\n\n return (await run(statement)).length;\n },\n };\n}\n","import type { SchemaDeclaration } from \"../../core/plugin\";\nimport { coreSchema, renderPostgresDdl } from \"../../schema\";\nimport type { SqlQuery } from \"./adapter\";\n\n/** The slice of pg's Pool this needs, structurally. */\nexport type PgPoolLike = {\n connect(): Promise<{\n query(text: string, params?: readonly unknown[]): Promise<{ rows: Record<string, unknown>[] }>;\n release(): void;\n }>;\n};\n\n/** The `transaction` option for node-postgres. */\nexport function pgTransaction(pool: PgPoolLike) {\n return async <T>(fn: (query: SqlQuery) => Promise<T>): Promise<T> => {\n const client = await pool.connect();\n try {\n await client.query(\"BEGIN\");\n const result = await fn(async (text, params) => (await client.query(text, params)).rows);\n await client.query(\"COMMIT\");\n return result;\n } catch (error) {\n await client.query(\"ROLLBACK\");\n throw error;\n } finally {\n client.release();\n }\n };\n}\n\nexport type CreateTablesOptions = {\n /** Must match the prefix given to the adapter. */\n prefix?: string;\n /** Plugin schemas, e.g. `pushSchema`. */\n plugins?: readonly SchemaDeclaration[];\n};\n\n/** Creates core and plugin tables, IF NOT EXISTS. Bootstrap, not migration. */\nexport async function createPostgresTables(\n query: SqlQuery,\n options: CreateTablesOptions = {},\n): Promise<number> {\n const schemas: readonly SchemaDeclaration[] = [coreSchema, ...(options.plugins ?? [])];\n\n let count = 0;\n for (const schema of schemas) {\n for (const statement of renderPostgresDdl(schema, options.prefix)) {\n await query(statement, []);\n count += 1;\n }\n }\n return count;\n}\n","import { createBridgedSignals, type Signals } from \"../../core/signals\";\n\n/** postgres.js's `sql` already has this shape. For node-postgres, see `pgListenNotify`. */\nexport type ListenNotifyLike = {\n listen(\n channel: string,\n onNotify: (payload: string) => void,\n ): Promise<{ unlisten(): Promise<void> }>;\n notify(channel: string, payload: string): Promise<unknown>;\n};\n\nexport type PostgresSignalsOptions = {\n /** The one Postgres channel every easy-ping signal travels on. Default `easy_ping`. */\n channel?: string;\n onError?: (error: unknown) => void;\n};\n\nconst originId = () => Math.random().toString(36).slice(2, 10);\n\n/**\n * Cross-replica wake-ups over LISTEN/NOTIFY: no extra table, no extra service.\n * Every logical channel (`inbox:<userId>`, `deliveries`) rides one Postgres\n * channel as the payload, because Postgres channel names are identifiers and\n * user ids are not. RFC 0006 §4C.\n */\nexport function postgresSignals(\n sql: ListenNotifyLike,\n options: PostgresSignalsOptions = {},\n): Signals {\n const channel = options.channel ?? \"easy_ping\";\n const onError = options.onError ?? (() => {});\n const origin = originId();\n const handlers = new Map<string, Set<() => void>>();\n let listening: Promise<{ unlisten(): Promise<void> }> | undefined;\n\n const dispatch = (payload: string) => {\n const separator = payload.indexOf(\"|\");\n if (separator < 0) return;\n // Postgres hands a NOTIFY back to the connection that sent it; local subscribers already heard it.\n if (payload.slice(0, separator) === origin) return;\n for (const handler of handlers.get(payload.slice(separator + 1)) ?? []) handler();\n };\n\n const ensureListening = () => {\n listening ??= sql.listen(channel, dispatch).catch((error) => {\n listening = undefined;\n throw error;\n });\n return listening;\n };\n\n const bridged = createBridgedSignals(\n {\n publish: async (logical) => {\n await sql.notify(channel, `${origin}|${logical}`);\n },\n subscribe: async (logical, handler) => {\n let set = handlers.get(logical);\n if (!set) {\n set = new Set();\n handlers.set(logical, set);\n }\n set.add(handler);\n await ensureListening();\n return () => {\n set?.delete(handler);\n if (set?.size === 0) handlers.delete(logical);\n };\n },\n },\n onError,\n );\n\n return {\n ...bridged,\n close: async () => {\n const pending = listening;\n listening = undefined;\n handlers.clear();\n if (pending) await (await pending).unlisten();\n },\n };\n}\n\n/** The slice of a node-postgres Client used for LISTEN. One dedicated, connected client. */\nexport type PgListenClientLike = {\n query(text: string): Promise<unknown>;\n on(\n event: \"notification\",\n handler: (message: { channel: string; payload?: string }) => void,\n ): unknown;\n off(\n event: \"notification\",\n handler: (message: { channel: string; payload?: string }) => void,\n ): unknown;\n};\n\n/** Adapts a dedicated node-postgres Client (not a Pool: LISTEN is per connection) to `ListenNotifyLike`. */\nexport function pgListenNotify(client: PgListenClientLike): ListenNotifyLike {\n const quote = (name: string) => `\"${name.replace(/\"/g, '\"\"')}\"`;\n const literal = (value: string) => `'${value.replace(/'/g, \"''\")}'`;\n return {\n async listen(channel, onNotify) {\n const handler = (message: { channel: string; payload?: string }) => {\n if (message.channel === channel && message.payload !== undefined) onNotify(message.payload);\n };\n client.on(\"notification\", handler);\n await client.query(`LISTEN ${quote(channel)}`);\n return {\n unlisten: async () => {\n client.off(\"notification\", handler);\n await client.query(`UNLISTEN ${quote(channel)}`);\n },\n };\n },\n notify: (channel, payload) =>\n client.query(`SELECT pg_notify(${literal(channel)}, ${literal(payload)})`),\n };\n}\n"]}
1
+ {"version":3,"sources":["../../src/adapters/postgres/adapter.ts","../../src/adapters/postgres/helpers.ts","../../src/adapters/postgres/signals.ts"],"names":["quote"],"mappings":"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","file":"postgres.js","sourcesContent":["import type {\n ClaimArgs,\n ClaimedDelivery,\n DatabaseAdapter,\n DeliveryRelease,\n FeedPage,\n FeedQuery,\n InsertNotification,\n} from \"../../core/adapter\";\nimport { decodeBase64Url, encodeBase64Url } from \"../../core/base64url\";\nimport { isOperator, type QueryOptions, type WhereClause } from \"../../core/store\";\nimport type { Channel, DeliveryRecord, DeliveryStatus, NotificationRecord } from \"../../core/types\";\nimport { toSnakeCase } from \"../../schema/declaration\";\nimport { quote, Statement } from \"../sql/statement\";\n\ntype Row = Record<string, unknown>;\n\n/** Run one parameterised statement, return rows: the whole driver contract. */\nexport type SqlQuery = (text: string, params: readonly unknown[]) => Promise<readonly Row[]>;\n\nexport type PostgresAdapterOptions = {\n /** Table-name prefix. Must match the instance's `tablePrefix`. */\n prefix?: string;\n /** Makes createNotifications atomic. Optional; without it each write is still safe. */\n transaction?: <T>(fn: (query: SqlQuery) => Promise<T>) => Promise<T>;\n};\n\nconst str = (value: unknown): string => String(value);\nconst nullableStr = (value: unknown): string | null => (value == null ? null : String(value));\nconst num = (value: unknown): number => Number(value);\nconst date = (value: unknown): Date => (value instanceof Date ? value : new Date(String(value)));\nconst nullableDate = (value: unknown): Date | null =>\n value == null ? null : value instanceof Date ? value : new Date(String(value));\n\nconst encodeCursor = (createdAt: Date, id: string) =>\n encodeBase64Url(`${createdAt.toISOString()}|${id}`);\n\nfunction decodeCursor(cursor: string): { createdAt: Date; id: string } | null {\n const decoded = decodeBase64Url(cursor);\n if (!decoded) return null;\n\n const [iso, id] = decoded.split(\"|\");\n if (!iso || !id) return null;\n\n const createdAt = new Date(iso);\n return Number.isNaN(createdAt.getTime()) ? null : { createdAt, id };\n}\n\nfunction toNotification(row: Row): NotificationRecord {\n return {\n id: str(row.id),\n userId: str(row.user_id),\n type: str(row.type),\n payload: typeof row.payload === \"string\" ? JSON.parse(row.payload) : row.payload,\n actorId: nullableStr(row.actor_id),\n groupKey: nullableStr(row.group_key),\n dedupeKey: nullableStr(row.dedupe_key),\n seenAt: nullableDate(row.seen_at),\n readAt: nullableDate(row.read_at),\n archivedAt: nullableDate(row.archived_at),\n createdAt: date(row.created_at),\n };\n}\n\nfunction toDelivery(row: Row): DeliveryRecord {\n return {\n id: str(row.id),\n notificationId: str(row.notification_id),\n channel: str(row.channel) as Channel,\n status: str(row.status) as DeliveryStatus,\n attempts: num(row.attempts),\n maxAttempts: num(row.max_attempts),\n notBefore: date(row.not_before),\n claimedAt: nullableDate(row.claimed_at),\n claimedBy: nullableStr(row.claimed_by),\n lastError: nullableStr(row.last_error),\n updatedAt: date(row.updated_at),\n };\n}\n\n/** Appends ` WHERE …` for a PluginStore clause. Values are always bound. */\nfunction appendWhere(statement: Statement, where: WhereClause): void {\n const entries = Object.entries(where);\n if (entries.length === 0) return;\n\n statement.raw(\" WHERE \");\n\n entries.forEach(([field, condition], index) => {\n if (index > 0) statement.raw(\" AND \");\n const column = quote(toSnakeCase(field));\n\n if (condition === null) {\n statement.raw(`${column} IS NULL`);\n return;\n }\n\n if (!isOperator(condition)) {\n statement.raw(`${column} = `).value(condition);\n return;\n }\n\n const operator = condition as Record<string, unknown>;\n\n if (\"in\" in operator) {\n const list = operator.in as readonly (string | number)[];\n // An empty IN () is a syntax error.\n if (list.length === 0) statement.raw(\"FALSE\");\n else statement.raw(`${column} IN (`).list(list).raw(\")\");\n return;\n }\n\n if (\"lt\" in operator) statement.raw(`${column} < `).value(operator.lt);\n else if (\"lte\" in operator) statement.raw(`${column} <= `).value(operator.lte);\n else if (\"gt\" in operator) statement.raw(`${column} > `).value(operator.gt);\n else if (\"gte\" in operator) statement.raw(`${column} >= `).value(operator.gte);\n else if (\"not\" in operator) {\n if (operator.not === null) statement.raw(`${column} IS NOT NULL`);\n else statement.raw(`${column} IS DISTINCT FROM `).value(operator.not);\n } else statement.raw(\"TRUE\");\n });\n}\n\n/** Postgres through any driver, no ORM. Deliberately Postgres-specific: ON CONFLICT, FOR UPDATE SKIP LOCKED, IS DISTINCT FROM. RFC 0003. */\nexport function postgresAdapter(\n query: SqlQuery,\n options: PostgresAdapterOptions = {},\n): DatabaseAdapter {\n const prefix = options.prefix ?? \"\";\n\n const NOTIFICATION = quote(`${prefix}notification`);\n const DELIVERY = quote(`${prefix}notification_delivery`);\n\n const run = async (statement: Statement, exec: SqlQuery = query) =>\n exec(statement.text, statement.params);\n\n const atomically = <T>(fn: (exec: SqlQuery) => Promise<T>): Promise<T> =>\n options.transaction ? options.transaction(fn) : fn(query);\n\n return {\n name: \"postgres\",\n naming: \"snake_case\",\n serializesJson: true,\n\n async createNotifications(input: readonly InsertNotification[]) {\n if (input.length === 0) return { created: [], deduped: [] };\n\n // App clock, not now(): markSeen compares against app-side cutoffs and NTP skew broke it.\n const now = new Date();\n\n return atomically(async (exec) => {\n const insert = new Statement().raw(\n `INSERT INTO ${NOTIFICATION} ` +\n \"(id, user_id, type, payload, actor_id, group_key, dedupe_key, created_at) VALUES \",\n );\n\n input.forEach((row, index) => {\n if (index > 0) insert.raw(\", \");\n insert.tuple([\n [row.id, \"text\"],\n [row.userId, \"text\"],\n [row.type, \"text\"],\n [JSON.stringify(row.payload ?? null), \"jsonb\"],\n [row.actorId ?? null, \"text\"],\n [row.groupKey ?? null, \"text\"],\n [row.dedupeKey ?? null, \"text\"],\n [now, \"timestamptz\"],\n ]);\n });\n\n // NULL dedupe keys never conflict, so undeduped rows coexist.\n insert.raw(\" ON CONFLICT (user_id, dedupe_key) DO NOTHING RETURNING id\");\n\n const inserted = await run(insert, exec);\n const created = new Set(inserted.map((row) => str(row.id)));\n\n const deliveries = input\n .filter((row) => created.has(row.id))\n .flatMap((row) => row.deliveries.map((delivery) => ({ row, delivery })));\n\n if (deliveries.length > 0) {\n const insertDeliveries = new Statement().raw(\n `INSERT INTO ${DELIVERY} ` +\n \"(id, notification_id, channel, max_attempts, not_before, updated_at) VALUES \",\n );\n\n deliveries.forEach(({ row, delivery }, index) => {\n if (index > 0) insertDeliveries.raw(\", \");\n insertDeliveries.tuple([\n [delivery.id, \"text\"],\n [row.id, \"text\"],\n [delivery.channel, \"text\"],\n [delivery.maxAttempts, \"integer\"],\n [delivery.notBefore, \"timestamptz\"],\n [now, \"timestamptz\"],\n ]);\n });\n\n await run(insertDeliveries, exec);\n }\n\n return {\n created: [...created],\n deduped: input.filter((row) => !created.has(row.id)).map((row) => row.id),\n };\n });\n },\n\n async claimPendingDeliveries(args: ClaimArgs): Promise<readonly ClaimedDelivery[]> {\n const now = args.now ?? new Date();\n const staleBefore = new Date(now.getTime() - args.leaseMs);\n\n // SKIP LOCKED lets concurrent sweeps step around each other. RFC 0003 §5.\n const statement = new Statement()\n .raw(`WITH claimed AS (UPDATE ${DELIVERY} SET status = 'claimed', claimed_at = `)\n .value(now)\n .raw(\"::timestamptz, claimed_by = \")\n .value(args.claimToken)\n .raw(`::text WHERE id IN (SELECT id FROM ${DELIVERY} WHERE (status = 'pending' OR `)\n .raw(\"(status = 'claimed' AND claimed_at < \")\n .value(staleBefore)\n .raw(\"::timestamptz)) AND not_before <= \")\n .value(now)\n .raw(\"::timestamptz AND attempts < max_attempts\");\n\n if (args.channels && args.channels.length > 0) {\n statement.raw(\" AND channel IN (\").list(args.channels).raw(\")\");\n }\n if (args.ids && args.ids.length > 0) {\n statement.raw(\" AND id IN (\").list(args.ids).raw(\")\");\n }\n\n statement\n .raw(\" ORDER BY not_before ASC, id ASC LIMIT \")\n .value(args.limit)\n .raw(\" FOR UPDATE SKIP LOCKED)\")\n .raw(\" RETURNING id, notification_id, channel, attempts, max_attempts)\")\n .raw(\n \" SELECT c.id, c.notification_id, c.channel, c.attempts, c.max_attempts,\" +\n \" n.user_id, n.type, n.payload, n.actor_id FROM claimed c\" +\n ` JOIN ${NOTIFICATION} n ON n.id = c.notification_id`,\n );\n\n const rows = await run(statement);\n\n return rows.map((row) => ({\n id: str(row.id),\n notificationId: str(row.notification_id),\n channel: str(row.channel) as Channel,\n attempts: num(row.attempts),\n maxAttempts: num(row.max_attempts),\n notification: {\n userId: str(row.user_id),\n type: str(row.type),\n payload: typeof row.payload === \"string\" ? JSON.parse(row.payload) : row.payload,\n actorId: nullableStr(row.actor_id),\n },\n }));\n },\n\n async releaseDeliveries(releases: readonly DeliveryRelease[]) {\n if (releases.length === 0) return;\n const now = new Date();\n\n // No claimed_by predicate on purpose: terminal state beats a wedged row. RFC 0003 §6.\n const statement = new Statement().raw(\n `UPDATE ${DELIVERY} d SET status = CASE` +\n \" WHEN v.result = 'sent' THEN 'sent'\" +\n \" WHEN v.result = 'skipped' THEN 'skipped'\" +\n \" WHEN v.retryable AND d.attempts + 1 < d.max_attempts THEN 'pending'\" +\n \" ELSE 'failed' END,\" +\n \" attempts = CASE WHEN v.result IN ('sent', 'skipped')\" +\n \" THEN d.attempts ELSE d.attempts + 1 END,\" +\n \" last_error = v.error,\" +\n \" not_before = COALESCE(v.not_before, d.not_before),\" +\n \" claimed_at = NULL, claimed_by = NULL, updated_at = \",\n );\n\n statement.value(now).raw(\"::timestamptz FROM (VALUES \");\n\n releases.forEach(({ id, outcome, nextAttemptAt }, index) => {\n if (index > 0) statement.raw(\", \");\n statement.tuple([\n [id, \"text\"],\n [outcome.result, \"text\"],\n [outcome.result === \"failed\" && outcome.retryable, \"boolean\"],\n [\n outcome.result === \"failed\"\n ? outcome.error.slice(0, 2000)\n : outcome.result === \"skipped\"\n ? outcome.reason.slice(0, 2000)\n : null,\n \"text\",\n ],\n [nextAttemptAt ?? null, \"timestamptz\"],\n ]);\n });\n\n statement.raw(\") AS v(id, result, retryable, error, not_before) WHERE d.id = v.id\");\n\n await run(statement);\n },\n\n async listNotifications(feed: FeedQuery): Promise<FeedPage> {\n const cursor = feed.cursor ? decodeCursor(feed.cursor) : null;\n\n const statement = new Statement()\n .raw(`SELECT * FROM ${NOTIFICATION} WHERE user_id = `)\n .value(feed.userId)\n .raw(\"::text AND archived_at IS NULL\");\n\n if (feed.unreadOnly) statement.raw(\" AND read_at IS NULL\");\n\n if (cursor) {\n statement\n .raw(\" AND (created_at, id) < (\")\n .value(cursor.createdAt)\n .raw(\"::timestamptz, \")\n .value(cursor.id)\n .raw(\"::text)\");\n }\n\n statement.raw(\" ORDER BY created_at DESC, id DESC LIMIT \").value(feed.limit + 1);\n\n const rows = await run(statement);\n const page = rows.slice(0, feed.limit).map(toNotification);\n const last = page.at(-1);\n\n return {\n notifications: page,\n nextCursor: rows.length > feed.limit && last ? encodeCursor(last.createdAt, last.id) : null,\n };\n },\n\n async countUnseen(userId: string) {\n const rows = await run(\n new Statement()\n .raw(`SELECT count(*)::int AS count FROM ${NOTIFICATION} WHERE user_id = `)\n .value(userId)\n .raw(\"::text AND seen_at IS NULL AND archived_at IS NULL\"),\n );\n return num(rows[0]?.count ?? 0);\n },\n\n async markSeen(userId: string, before: Date) {\n await run(\n new Statement()\n .raw(`UPDATE ${NOTIFICATION} SET seen_at = `)\n .value(new Date())\n .raw(\"::timestamptz WHERE user_id = \")\n .value(userId)\n .raw(\"::text AND seen_at IS NULL AND created_at <= \")\n .value(before)\n .raw(\"::timestamptz\"),\n );\n },\n\n async markRead(userId: string, notificationIds: readonly string[]) {\n if (notificationIds.length === 0) return 0;\n\n // Scoped by user_id (RFC 0002 §2); no read_at IS NULL filter so re-marking stays idempotent.\n const rows = await run(\n new Statement()\n .raw(`UPDATE ${NOTIFICATION} SET read_at = COALESCE(read_at, `)\n .value(new Date())\n .raw(\"::timestamptz) WHERE user_id = \")\n .value(userId)\n .raw(\"::text AND id IN (\")\n .list(notificationIds)\n .raw(\") RETURNING id\"),\n );\n return rows.length;\n },\n\n async markAllRead(userId: string) {\n const rows = await run(\n new Statement()\n .raw(`UPDATE ${NOTIFICATION} SET read_at = `)\n .value(new Date())\n .raw(\"::timestamptz WHERE user_id = \")\n .value(userId)\n .raw(\"::text AND read_at IS NULL RETURNING id\"),\n );\n return rows.length;\n },\n\n async getFailedDeliveries(args: { since: Date; limit: number }) {\n const rows = await run(\n new Statement()\n .raw(`SELECT * FROM ${DELIVERY} WHERE status = 'failed' AND updated_at >= `)\n .value(args.since)\n .raw(\"::timestamptz ORDER BY updated_at DESC LIMIT \")\n .value(args.limit),\n );\n return rows.map(toDelivery);\n },\n\n async queryTable(table: string, where: WhereClause, queryOptions: QueryOptions) {\n const statement = new Statement().raw(`SELECT * FROM ${quote(table)}`);\n appendWhere(statement, where);\n\n if (queryOptions.orderBy) {\n const direction = queryOptions.orderBy.direction === \"desc\" ? \"DESC\" : \"ASC\";\n statement.raw(` ORDER BY ${quote(toSnakeCase(queryOptions.orderBy.field))} ${direction}`);\n }\n if (queryOptions.limit) statement.raw(\" LIMIT \").value(queryOptions.limit);\n\n return [...(await run(statement))];\n },\n\n async insertRows(\n table: string,\n rows: readonly Record<string, unknown>[],\n onConflict?: readonly string[],\n ) {\n if (rows.length === 0) return 0;\n\n const columns = Object.keys(rows[0] ?? {});\n if (columns.length === 0) return 0;\n\n const statement = new Statement().raw(\n `INSERT INTO ${quote(table)} (${columns.map((c) => quote(toSnakeCase(c))).join(\", \")}) VALUES `,\n );\n\n rows.forEach((row, index) => {\n if (index > 0) statement.raw(\", \");\n statement\n .raw(\"(\")\n .list(columns.map((column) => row[column]))\n .raw(\")\");\n });\n\n if (onConflict && onConflict.length > 0) {\n const assignments = columns\n .filter((column) => !onConflict.includes(column))\n .map((column) => {\n const quoted = quote(toSnakeCase(column));\n return `${quoted} = EXCLUDED.${quoted}`;\n });\n\n const target = onConflict.map((f) => quote(toSnakeCase(f))).join(\", \");\n statement.raw(\n assignments.length === 0\n ? ` ON CONFLICT (${target}) DO NOTHING`\n : ` ON CONFLICT (${target}) DO UPDATE SET ${assignments.join(\", \")}`,\n );\n }\n\n statement.raw(\" RETURNING 1 AS ok\");\n return (await run(statement)).length;\n },\n\n async updateRows(table: string, where: WhereClause, set: Record<string, unknown>) {\n const assignments = Object.entries(set);\n if (assignments.length === 0) return 0;\n\n const statement = new Statement().raw(`UPDATE ${quote(table)} SET `);\n\n assignments.forEach(([field, value], index) => {\n if (index > 0) statement.raw(\", \");\n statement.raw(`${quote(toSnakeCase(field))} = `).value(value);\n });\n\n appendWhere(statement, where);\n statement.raw(\" RETURNING 1 AS ok\");\n\n return (await run(statement)).length;\n },\n\n async deleteRows(table: string, where: WhereClause) {\n const statement = new Statement().raw(`DELETE FROM ${quote(table)}`);\n appendWhere(statement, where);\n statement.raw(\" RETURNING 1 AS ok\");\n\n return (await run(statement)).length;\n },\n };\n}\n","import type { SchemaDeclaration } from \"../../core/plugin\";\nimport { coreSchema, renderPostgresDdl } from \"../../schema\";\nimport type { SqlQuery } from \"./adapter\";\n\n/** The slice of pg's Pool this needs, structurally. */\nexport type PgPoolLike = {\n connect(): Promise<{\n query(text: string, params?: readonly unknown[]): Promise<{ rows: Record<string, unknown>[] }>;\n release(): void;\n }>;\n};\n\n/** The `transaction` option for node-postgres. */\nexport function pgTransaction(pool: PgPoolLike) {\n return async <T>(fn: (query: SqlQuery) => Promise<T>): Promise<T> => {\n const client = await pool.connect();\n try {\n await client.query(\"BEGIN\");\n const result = await fn(async (text, params) => (await client.query(text, params)).rows);\n await client.query(\"COMMIT\");\n return result;\n } catch (error) {\n await client.query(\"ROLLBACK\");\n throw error;\n } finally {\n client.release();\n }\n };\n}\n\nexport type CreateTablesOptions = {\n /** Must match the prefix given to the adapter. */\n prefix?: string;\n /** Plugin schemas, e.g. `pushSchema`. */\n plugins?: readonly SchemaDeclaration[];\n};\n\n/** Creates core and plugin tables, IF NOT EXISTS. Bootstrap, not migration. */\nexport async function createPostgresTables(\n query: SqlQuery,\n options: CreateTablesOptions = {},\n): Promise<number> {\n const schemas: readonly SchemaDeclaration[] = [coreSchema, ...(options.plugins ?? [])];\n\n let count = 0;\n for (const schema of schemas) {\n for (const statement of renderPostgresDdl(schema, options.prefix)) {\n await query(statement, []);\n count += 1;\n }\n }\n return count;\n}\n","import { createBridgedSignals, type Signals } from \"../../core/signals\";\n\n/** postgres.js's `sql` already has this shape. For node-postgres, see `pgListenNotify`. */\nexport type ListenNotifyLike = {\n listen(\n channel: string,\n onNotify: (payload: string) => void,\n ): Promise<{ unlisten(): Promise<void> }>;\n notify(channel: string, payload: string): Promise<unknown>;\n};\n\nexport type PostgresSignalsOptions = {\n /** The one Postgres channel every easy-ping signal travels on. Default `easy_ping`. */\n channel?: string;\n onError?: (error: unknown) => void;\n};\n\nconst originId = () => Math.random().toString(36).slice(2, 10);\n\n/**\n * Cross-replica wake-ups over LISTEN/NOTIFY: no extra table, no extra service.\n * Every logical channel (`inbox:<userId>`, `deliveries`) rides one Postgres\n * channel as the payload, because Postgres channel names are identifiers and\n * user ids are not. RFC 0006 §4C.\n */\nexport function postgresSignals(\n sql: ListenNotifyLike,\n options: PostgresSignalsOptions = {},\n): Signals {\n const channel = options.channel ?? \"easy_ping\";\n const onError = options.onError ?? (() => {});\n const origin = originId();\n const handlers = new Map<string, Set<() => void>>();\n let listening: Promise<{ unlisten(): Promise<void> }> | undefined;\n\n const dispatch = (payload: string) => {\n const separator = payload.indexOf(\"|\");\n if (separator < 0) return;\n // Postgres hands a NOTIFY back to the connection that sent it; local subscribers already heard it.\n if (payload.slice(0, separator) === origin) return;\n for (const handler of handlers.get(payload.slice(separator + 1)) ?? []) handler();\n };\n\n const ensureListening = () => {\n listening ??= sql.listen(channel, dispatch).catch((error) => {\n listening = undefined;\n throw error;\n });\n return listening;\n };\n\n const bridged = createBridgedSignals(\n {\n publish: async (logical) => {\n await sql.notify(channel, `${origin}|${logical}`);\n },\n subscribe: async (logical, handler) => {\n let set = handlers.get(logical);\n if (!set) {\n set = new Set();\n handlers.set(logical, set);\n }\n set.add(handler);\n await ensureListening();\n return () => {\n set?.delete(handler);\n if (set?.size === 0) handlers.delete(logical);\n };\n },\n },\n onError,\n );\n\n return {\n ...bridged,\n close: async () => {\n const pending = listening;\n listening = undefined;\n handlers.clear();\n if (pending) await (await pending).unlisten();\n },\n };\n}\n\n/** The slice of a node-postgres Client used for LISTEN. One dedicated, connected client. */\nexport type PgListenClientLike = {\n query(text: string, values?: readonly unknown[]): Promise<unknown>;\n on(\n event: \"notification\",\n handler: (message: { channel: string; payload?: string }) => void,\n ): unknown;\n off(\n event: \"notification\",\n handler: (message: { channel: string; payload?: string }) => void,\n ): unknown;\n};\n\n/** Adapts a dedicated node-postgres Client (not a Pool: LISTEN is per connection) to `ListenNotifyLike`. */\nexport function pgListenNotify(client: PgListenClientLike): ListenNotifyLike {\n const quote = (name: string) => `\"${name.replace(/\"/g, '\"\"')}\"`;\n return {\n async listen(channel, onNotify) {\n const handler = (message: { channel: string; payload?: string }) => {\n if (message.channel === channel && message.payload !== undefined) onNotify(message.payload);\n };\n client.on(\"notification\", handler);\n await client.query(`LISTEN ${quote(channel)}`);\n return {\n unlisten: async () => {\n client.off(\"notification\", handler);\n await client.query(`UNLISTEN ${quote(channel)}`);\n },\n };\n },\n notify: (channel, payload) => client.query(\"SELECT pg_notify($1, $2)\", [channel, payload]),\n };\n}\n"]}
@@ -501,7 +501,7 @@ function sqliteAdapter(query, options = {}) {
501
501
  }
502
502
 
503
503
  // src/schema/render-sqlite.ts
504
- var SQL_TYPE = {
504
+ var SQLITE_TYPE = {
505
505
  string: "TEXT",
506
506
  number: "INTEGER",
507
507
  boolean: "INTEGER",
@@ -518,14 +518,17 @@ var defaultClause = (spec) => {
518
518
  if (typeof spec.default === "boolean") return ` DEFAULT ${spec.default ? 1 : 0}`;
519
519
  return ` DEFAULT ${spec.default}`;
520
520
  };
521
+ function sqliteColumnDefinition(field, spec) {
522
+ const nullability = spec.required ? " NOT NULL" : "";
523
+ return `${quote2(toSnakeCase(field))} ${SQLITE_TYPE[spec.type]}${nullability}${defaultClause(spec)}`;
524
+ }
521
525
  function renderSqliteDdl(schema, prefix = "") {
522
526
  const statements = [];
523
527
  for (const table of Object.values(schema)) {
524
528
  const name = quote2(prefix + table.tableName);
525
- const columns = Object.entries(table.fields).map(([field, spec]) => {
526
- const nullability = spec.required ? " NOT NULL" : "";
527
- return ` ${quote2(toSnakeCase(field))} ${SQL_TYPE[spec.type]}${nullability}${defaultClause(spec)}`;
528
- });
529
+ const columns = Object.entries(table.fields).map(
530
+ ([field, spec]) => ` ${sqliteColumnDefinition(field, spec)}`
531
+ );
529
532
  if (table.primaryKey?.length) {
530
533
  columns.push(
531
534
  ` PRIMARY KEY (${table.primaryKey.map((f) => quote2(toSnakeCase(f))).join(", ")})`