bunderstack 0.18.0 → 0.19.1
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/CHANGELOG.md +24 -0
- package/dist/access.js.map +1 -1
- package/dist/api/builder.js.map +1 -1
- package/dist/api/context.js.map +1 -1
- package/dist/api/crud-router.d.ts +121 -0
- package/dist/api/crud-router.d.ts.map +1 -1
- package/dist/api/crud-router.js +110 -4
- package/dist/api/crud-router.js.map +1 -1
- package/dist/api/list-input-schema.d.ts +15 -0
- package/dist/api/list-input-schema.d.ts.map +1 -1
- package/dist/api/list-input-schema.js +16 -0
- package/dist/api/list-input-schema.js.map +1 -1
- package/dist/api/list-spec.js.map +1 -1
- package/dist/api/live-view.d.ts +14 -0
- package/dist/api/live-view.d.ts.map +1 -0
- package/dist/api/live-view.js +42 -0
- package/dist/api/live-view.js.map +1 -0
- package/dist/api/live-window.d.ts +40 -0
- package/dist/api/live-window.d.ts.map +1 -0
- package/dist/api/live-window.js +83 -0
- package/dist/api/live-window.js.map +1 -0
- package/dist/api/openapi.js.map +1 -1
- package/dist/api/realtime-router.js.map +1 -1
- package/dist/api/registry.js.map +1 -1
- package/dist/api/router.js.map +1 -1
- package/dist/api/storage-router.js.map +1 -1
- package/dist/api/types.d.ts +1 -1
- package/dist/api/types.d.ts.map +1 -1
- package/dist/api/types.js.map +1 -1
- package/dist/auth.js.map +1 -1
- package/dist/blueprint-generator.js.map +1 -1
- package/dist/blueprint.js.map +1 -1
- package/dist/cli-skills.js.map +1 -1
- package/dist/cli.js.map +1 -1
- package/dist/config.js.map +1 -1
- package/dist/cron.js.map +1 -1
- package/dist/crud-operations.js.map +1 -1
- package/dist/database/adapter.js.map +1 -1
- package/dist/database/bun-sql.js.map +1 -1
- package/dist/database/libsql.js.map +1 -1
- package/dist/database/pglite.js.map +1 -1
- package/dist/database/postgres-js.js.map +1 -1
- package/dist/db.js.map +1 -1
- package/dist/dialect.js.map +1 -1
- package/dist/email/smtp.js.map +1 -1
- package/dist/email.js.map +1 -1
- package/dist/env.js.map +1 -1
- package/dist/errors.js.map +1 -1
- package/dist/handler.js.map +1 -1
- package/dist/idempotency.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/internal-tables-pg.js.map +1 -1
- package/dist/internal-tables.js.map +1 -1
- package/dist/jobs/cron.js.map +1 -1
- package/dist/jobs/define.js.map +1 -1
- package/dist/jobs/index.js.map +1 -1
- package/dist/jobs/queue.js.map +1 -1
- package/dist/jobs/runtime.js.map +1 -1
- package/dist/jobs/slots.js.map +1 -1
- package/dist/jobs/worker.js.map +1 -1
- package/dist/lifecycle.js.map +1 -1
- package/dist/list-query.js.map +1 -1
- package/dist/live/apply.d.ts +13 -0
- package/dist/live/apply.d.ts.map +1 -0
- package/dist/live/apply.js +32 -0
- package/dist/live/apply.js.map +1 -0
- package/dist/live/index.d.ts +48 -0
- package/dist/live/index.d.ts.map +1 -0
- package/dist/live/index.js +108 -0
- package/dist/live/index.js.map +1 -0
- package/dist/live/protocol.d.ts +44 -0
- package/dist/live/protocol.d.ts.map +1 -0
- package/dist/live/protocol.js +12 -0
- package/dist/live/protocol.js.map +1 -0
- package/dist/live/sse.d.ts +22 -0
- package/dist/live/sse.d.ts.map +1 -0
- package/dist/live/sse.js +41 -0
- package/dist/live/sse.js.map +1 -0
- package/dist/manifest.js.map +1 -1
- package/dist/provision-internals.js.map +1 -1
- package/dist/provision.js.map +1 -1
- package/dist/rate-limit.js.map +1 -1
- package/dist/realtime/facade.js.map +1 -1
- package/dist/realtime/filter.d.ts +34 -5
- package/dist/realtime/filter.d.ts.map +1 -1
- package/dist/realtime/filter.js +62 -25
- package/dist/realtime/filter.js.map +1 -1
- package/dist/realtime/heartbeat.js.map +1 -1
- package/dist/realtime/publisher.js.map +1 -1
- package/dist/schema-export-pg.js.map +1 -1
- package/dist/schema-export.js.map +1 -1
- package/dist/scope.js.map +1 -1
- package/dist/standard-schema.js.map +1 -1
- package/dist/storage/buckets.js.map +1 -1
- package/dist/storage/delete.js.map +1 -1
- package/dist/storage/file-meta.js.map +1 -1
- package/dist/storage/index.js.map +1 -1
- package/dist/storage/local.js.map +1 -1
- package/dist/storage/operations.js.map +1 -1
- package/dist/storage/registry.js.map +1 -1
- package/dist/storage/s3.js.map +1 -1
- package/dist/storage/sweep.js.map +1 -1
- package/dist/storage/thumbnails.js.map +1 -1
- package/dist/testing.js.map +1 -1
- package/dist/typeid-pg.js.map +1 -1
- package/dist/typeid.js.map +1 -1
- package/llms.txt +3 -3
- package/package.json +6 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"filter.js","sourceRoot":"","sources":["../../src/realtime/filter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;
|
|
1
|
+
{"version":3,"file":"filter.js","sourceRoot":"","sources":["../../src/realtime/filter.ts"],"names":[],"mappings":"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","sourcesContent":["import { getEventMeta, withEventMeta } from '@orpc/server'\n\nimport type {\n AccessUser,\n OperationRule,\n ResolvedAccess,\n ResolvedTableAccess,\n} from '../access'\nimport type { RealtimeChange } from './publisher'\n\nimport { checkAccess, rowMatchesScope, tableEntryForName } from '../access'\n\ntype GetSession = () => Promise<{\n user: AccessUser | null\n activeOrganizationId: string | null\n}>\n\nexport interface FilterRealtimeChangesOptions {\n subscriptions: readonly string[]\n access: ResolvedAccess\n request: Request\n getSession: GetSession\n}\n\nexport interface FilterTableChangesOptions {\n /** Events arrive under this name — the schema key they were published with. */\n tableName: string\n entry: ResolvedTableAccess\n /**\n * The operation right this stream reads under: `get` for a subscription to\n * rows, `list` for a live view of a query.\n */\n rule: OperationRule\n request: Request\n getSession: GetSession\n}\n\n/**\n * Whether one change may reach this subscriber: the given right plus the read\n * scope of the row, evaluated against the caller's session. The session\n * resolves at most once per stream.\n */\nexport function createChangeGuard(\n entry: ResolvedTableAccess,\n options: { rule: OperationRule; request: Request; getSession: GetSession },\n): (change: RealtimeChange) => Promise<boolean> {\n let sessionPromise: ReturnType<GetSession> | undefined\n const getSession = () => (sessionPromise ??= options.getSession())\n\n return async (change) => {\n if (!entry.enabled || options.rule === 'deny') return false\n\n const needsSession =\n options.rule !== 'public' || entry.readScope !== undefined\n const session = needsSession\n ? await getSession()\n : { user: null, activeOrganizationId: null }\n const context = {\n request: options.request,\n user: session.user,\n row: change.record,\n session: { activeOrganizationId: session.activeOrganizationId },\n }\n if (!(await checkAccess(options.rule, context, entry.ownerColumn)).allowed) {\n return false\n }\n if (\n entry.readScope &&\n !rowMatchesScope(change.record, entry.readScope(context))\n ) {\n return false\n }\n return true\n }\n}\n\n/** Preserve publisher event metadata (ids) across the projection. */\nfunction project(change: RealtimeChange): RealtimeChange {\n const projected: RealtimeChange = {\n table: change.table,\n action: change.action,\n record: change.record,\n }\n const meta = getEventMeta(change)\n return meta ? withEventMeta(projected, meta) : projected\n}\n\nexport async function* filterRealtimeChanges(\n source: AsyncIterable<RealtimeChange>,\n options: FilterRealtimeChangesOptions,\n): AsyncGenerator<RealtimeChange, void, void> {\n const subscriptions = new Set(options.subscriptions)\n // One guard — and therefore one cached session — per table entry.\n const guards = new Map<\n ResolvedTableAccess,\n ReturnType<typeof createChangeGuard>\n >()\n\n for await (const change of source) {\n // Events name tables by schema key; the SQL-name lookup stays as a fallback\n // for publishers outside the CRUD path that only know the physical name.\n const entry =\n options.access.get(change.table) ??\n tableEntryForName(options.access, change.table)\n if (!entry?.enabled) continue\n\n const recordId = change.record.id\n if (\n !subscriptions.has(change.table) &&\n (recordId == null ||\n !subscriptions.has(`${change.table}/${String(recordId)}`))\n ) {\n continue\n }\n\n let guard = guards.get(entry)\n if (!guard) {\n guard = createChangeGuard(entry, { ...options, rule: entry.get })\n guards.set(entry, guard)\n }\n if (!(await guard(change))) continue\n yield project(change)\n }\n}\n\n/**\n * The same stream narrowed to one table with its access entry known up front —\n * what a live view (`GET /{table}:live`) consumes.\n */\nexport async function* filterTableChanges(\n source: AsyncIterable<RealtimeChange>,\n options: FilterTableChangesOptions,\n): AsyncGenerator<RealtimeChange, void, void> {\n const guard = createChangeGuard(options.entry, options)\n for await (const change of source) {\n if (change.table !== options.tableName) continue\n if (!(await guard(change))) continue\n yield project(change)\n }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"heartbeat.js","sourceRoot":"","sources":["../../src/realtime/heartbeat.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,8BAA8B,GAAG,KAAK,CAAA;AAcnD;;;;GAIG;AACH,MAAM,CAAC,KAAK,SAAS,CAAC,CAAC,qBAAqB,CAC1C,MAAwB,EACxB,OAAsD;IAEtD,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CACzB,CAAC,EACD,OAAO,CAAC,UAAU,IAAI,8BAA8B,CACrD,CAAA;IACD,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,EAAE,CAAA;IAC/C,IAAI,KAAK,GAAmB,EAAE,MAAM,EAAE,SAAS,EAAE,CAAA;IACjD,IAAI,IAA8B,CAAA;IAClC,MAAM,QAAQ,GAAG,GAAmB,EAAE,CAAC,KAAK,CAAA;IAE5C,MAAM,WAAW,GAAG,GAAG,EAAE;QACvB,KAAK,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,CAAA;QAC7B,KAAK,QAAQ,CAAC,IAAI,EAAE,CAAC,IAAI,CACvB,CAAC,MAAM,EAAE,EAAE;YACT,KAAK,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,CAAA;YACnC,IAAI,EAAE,EAAE,CAAA;QACV,CAAC,EACD,CAAC,KAAc,EAAE,EAAE;YACjB,KAAK,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,CAAA;YAClC,IAAI,EAAE,EAAE,CAAA;QACV,CAAC,CACF,CAAA;IACH,CAAC,CAAA;IAED,WAAW,EAAE,CAAA;IACb,IAAI,CAAC;QACH,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC;YAChC,IAAI,OAAO,GAAG,QAAQ,EAAE,CAAA;YACxB,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;gBACjC,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;oBAClC,IAAI,OAAO,GAAG,KAAK,CAAA;oBACnB,MAAM,MAAM,GAAG,GAAG,EAAE;wBAClB,IAAI,OAAO;4BAAE,OAAM;wBACnB,OAAO,GAAG,IAAI,CAAA;wBACd,YAAY,CAAC,KAAK,CAAC,CAAA;wBACnB,OAAO,CAAC,MAAM,EAAE,mBAAmB,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;wBACpD,OAAO,EAAE,CAAA;oBACX,CAAC,CAAA;oBACD,MAAM,KAAK,GAAG,UAAU,CAAC,MAAM,EAAE,UAAU,CAAC,CAAA;oBAC5C,OAAO,CAAC,MAAM,EAAE,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAA;oBACjE,IAAI,GAAG,MAAM,CAAA;gBACf,CAAC,CAAC,CAAA;gBACF,IAAI,GAAG,SAAS,CAAA;gBAEhB,IAAI,OAAO,CAAC,MAAM,EAAE,OAAO;oBAAE,MAAK;gBAClC,OAAO,GAAG,QAAQ,EAAE,CAAA;gBACpB,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;oBACjC,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,UAAU,EAAE,CAAA;oBACvC,SAAQ;gBACV,CAAC;YACH,CAAC;YAED,IAAI,OAAO,CAAC,MAAM,KAAK,OAAO;gBAAE,MAAM,OAAO,CAAC,KAAK,CAAA;YACnD,IAAI,OAAO,CAAC,MAAM,CAAC,IAAI;gBAAE,MAAK;YAE9B,MAAM,OAAO,CAAC,MAAM,CAAC,KAAK,CAAA;YAC1B,WAAW,EAAE,CAAA;QACf,CAAC;IACH,CAAC;YAAS,CAAC;QACT,IAAI,GAAG,SAAS,CAAA;QAChB,MAAM,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAA;IAC3B,CAAC;AACH,CAAC"}
|
|
1
|
+
{"version":3,"file":"heartbeat.js","sourceRoot":"","sources":["../../src/realtime/heartbeat.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,8BAA8B,GAAG,KAAK,CAAA;AAcnD;;;;GAIG;AACH,MAAM,CAAC,KAAK,SAAS,CAAC,CAAC,qBAAqB,CAC1C,MAAwB,EACxB,OAAsD;IAEtD,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CACzB,CAAC,EACD,OAAO,CAAC,UAAU,IAAI,8BAA8B,CACrD,CAAA;IACD,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,EAAE,CAAA;IAC/C,IAAI,KAAK,GAAmB,EAAE,MAAM,EAAE,SAAS,EAAE,CAAA;IACjD,IAAI,IAA8B,CAAA;IAClC,MAAM,QAAQ,GAAG,GAAmB,EAAE,CAAC,KAAK,CAAA;IAE5C,MAAM,WAAW,GAAG,GAAG,EAAE;QACvB,KAAK,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,CAAA;QAC7B,KAAK,QAAQ,CAAC,IAAI,EAAE,CAAC,IAAI,CACvB,CAAC,MAAM,EAAE,EAAE;YACT,KAAK,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,CAAA;YACnC,IAAI,EAAE,EAAE,CAAA;QACV,CAAC,EACD,CAAC,KAAc,EAAE,EAAE;YACjB,KAAK,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,CAAA;YAClC,IAAI,EAAE,EAAE,CAAA;QACV,CAAC,CACF,CAAA;IACH,CAAC,CAAA;IAED,WAAW,EAAE,CAAA;IACb,IAAI,CAAC;QACH,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC;YAChC,IAAI,OAAO,GAAG,QAAQ,EAAE,CAAA;YACxB,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;gBACjC,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;oBAClC,IAAI,OAAO,GAAG,KAAK,CAAA;oBACnB,MAAM,MAAM,GAAG,GAAG,EAAE;wBAClB,IAAI,OAAO;4BAAE,OAAM;wBACnB,OAAO,GAAG,IAAI,CAAA;wBACd,YAAY,CAAC,KAAK,CAAC,CAAA;wBACnB,OAAO,CAAC,MAAM,EAAE,mBAAmB,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;wBACpD,OAAO,EAAE,CAAA;oBACX,CAAC,CAAA;oBACD,MAAM,KAAK,GAAG,UAAU,CAAC,MAAM,EAAE,UAAU,CAAC,CAAA;oBAC5C,OAAO,CAAC,MAAM,EAAE,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAA;oBACjE,IAAI,GAAG,MAAM,CAAA;gBACf,CAAC,CAAC,CAAA;gBACF,IAAI,GAAG,SAAS,CAAA;gBAEhB,IAAI,OAAO,CAAC,MAAM,EAAE,OAAO;oBAAE,MAAK;gBAClC,OAAO,GAAG,QAAQ,EAAE,CAAA;gBACpB,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;oBACjC,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,UAAU,EAAE,CAAA;oBACvC,SAAQ;gBACV,CAAC;YACH,CAAC;YAED,IAAI,OAAO,CAAC,MAAM,KAAK,OAAO;gBAAE,MAAM,OAAO,CAAC,KAAK,CAAA;YACnD,IAAI,OAAO,CAAC,MAAM,CAAC,IAAI;gBAAE,MAAK;YAE9B,MAAM,OAAO,CAAC,MAAM,CAAC,KAAK,CAAA;YAC1B,WAAW,EAAE,CAAA;QACf,CAAC;IACH,CAAC;YAAS,CAAC;QACT,IAAI,GAAG,SAAS,CAAA;QAChB,MAAM,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAA;IAC3B,CAAC;AACH,CAAC","sourcesContent":["export const REALTIME_HEARTBEAT_INTERVAL_MS = 5_000\n\n/**\n * A transport-only event. `intervalMs` is the cadence it is sent at, so a\n * client can size its own dead-stream timeout from the server's real setting\n * instead of hardcoding a constant that drifts from it.\n */\nexport type RealtimeHeartbeat = { type: 'heartbeat'; intervalMs: number }\n\ntype SourceState<T> =\n | { status: 'pending' }\n | { status: 'ready'; result: IteratorResult<T> }\n | { status: 'error'; error: unknown }\n\n/**\n * Emits a transport-only event whenever the source has been idle for an\n * interval. Heartbeats are deliberately not published, persisted, or assigned\n * event IDs, so they do not affect replay and resume semantics.\n */\nexport async function* withRealtimeHeartbeat<T>(\n source: AsyncIterable<T>,\n options: { intervalMs?: number; signal?: AbortSignal },\n): AsyncGenerator<T | RealtimeHeartbeat, void, void> {\n const intervalMs = Math.max(\n 1,\n options.intervalMs ?? REALTIME_HEARTBEAT_INTERVAL_MS,\n )\n const iterator = source[Symbol.asyncIterator]()\n let state: SourceState<T> = { status: 'pending' }\n let wake: (() => void) | undefined\n const getState = (): SourceState<T> => state\n\n const requestNext = () => {\n state = { status: 'pending' }\n void iterator.next().then(\n (result) => {\n state = { status: 'ready', result }\n wake?.()\n },\n (error: unknown) => {\n state = { status: 'error', error }\n wake?.()\n },\n )\n }\n\n requestNext()\n try {\n while (!options.signal?.aborted) {\n let current = getState()\n if (current.status === 'pending') {\n await new Promise<void>((resolve) => {\n let settled = false\n const finish = () => {\n if (settled) return\n settled = true\n clearTimeout(timer)\n options.signal?.removeEventListener('abort', finish)\n resolve()\n }\n const timer = setTimeout(finish, intervalMs)\n options.signal?.addEventListener('abort', finish, { once: true })\n wake = finish\n })\n wake = undefined\n\n if (options.signal?.aborted) break\n current = getState()\n if (current.status === 'pending') {\n yield { type: 'heartbeat', intervalMs }\n continue\n }\n }\n\n if (current.status === 'error') throw current.error\n if (current.result.done) break\n\n yield current.result.value\n requestNext()\n }\n } finally {\n wake = undefined\n await iterator.return?.()\n }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"publisher.js","sourceRoot":"","sources":["../../src/realtime/publisher.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAA;AAC7C,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAA;AAqBxD,MAAM,UAAU,6BAA6B,CAC3C,UAAoC,EAAE;IAEtC,OAAO,IAAI,eAAe,CAAiB;QACzC,iBAAiB,EAAE,OAAO,CAAC,iBAAiB;QAC5C,MAAM,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,aAAa,IAAI,GAAG,EAAE;KACjE,CAAC,CAAA;AACJ,CAAC;AAED,MAAM,UAAU,4BAA4B,CAC1C,KAAkB,EAClB,UAA8C,EAC9C,UAA0D,EAAE;IAE5D,OAAO,IAAI,iBAAiB,CAAiB,KAAK,EAAE;QAClD,UAAU;QACV,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,cAAc;QACxC,iBAAiB,EAAE,OAAO,CAAC,iBAAiB;QAC5C,MAAM,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,aAAa,IAAI,GAAG,EAAE;KACjE,CAAC,CAAA;AACJ,CAAC"}
|
|
1
|
+
{"version":3,"file":"publisher.js","sourceRoot":"","sources":["../../src/realtime/publisher.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAA;AAC7C,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAA;AAqBxD,MAAM,UAAU,6BAA6B,CAC3C,UAAoC,EAAE;IAEtC,OAAO,IAAI,eAAe,CAAiB;QACzC,iBAAiB,EAAE,OAAO,CAAC,iBAAiB;QAC5C,MAAM,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,aAAa,IAAI,GAAG,EAAE;KACjE,CAAC,CAAA;AACJ,CAAC;AAED,MAAM,UAAU,4BAA4B,CAC1C,KAAkB,EAClB,UAA8C,EAC9C,UAA0D,EAAE;IAE5D,OAAO,IAAI,iBAAiB,CAAiB,KAAK,EAAE;QAClD,UAAU;QACV,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,cAAc;QACxC,iBAAiB,EAAE,OAAO,CAAC,iBAAiB;QAC5C,MAAM,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,aAAa,IAAI,GAAG,EAAE;KACjE,CAAC,CAAA;AACJ,CAAC","sourcesContent":["import type { Publisher } from '@orpc/publisher'\nimport type { RedisClient } from 'bun'\n\nimport { BunRedisPublisher } from '@orpc/bun'\nimport { MemoryPublisher } from '@orpc/publisher/memory'\n\nexport type RealtimeAction = 'create' | 'update' | 'delete'\n\nexport interface RealtimeChange {\n table: string\n action: RealtimeAction\n record: Record<string, unknown>\n}\n\nexport interface RealtimeEvents extends Record<string, object> {\n change: RealtimeChange\n}\n\nexport type RealtimePublisher = Publisher<RealtimeEvents>\n\nexport interface RealtimePublisherOptions {\n maxBufferedEvents?: number\n resumeSeconds?: number\n}\n\nexport function createMemoryRealtimePublisher(\n options: RealtimePublisherOptions = {},\n): RealtimePublisher {\n return new MemoryPublisher<RealtimeEvents>({\n maxBufferedEvents: options.maxBufferedEvents,\n resume: { enabled: true, seconds: options.resumeSeconds ?? 300 },\n })\n}\n\nexport function createRedisRealtimePublisher(\n redis: RedisClient,\n subscriber: RedisClient | Promise<RedisClient>,\n options: RealtimePublisherOptions & { prefix?: string } = {},\n): RealtimePublisher {\n return new BunRedisPublisher<RealtimeEvents>(redis, {\n subscriber,\n prefix: options.prefix ?? 'bunderstack:',\n maxBufferedEvents: options.maxBufferedEvents,\n resume: { enabled: true, seconds: options.resumeSeconds ?? 300 },\n })\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema-export-pg.js","sourceRoot":"","sources":["../src/schema-export-pg.ts"],"names":[],"mappings":"AAAA,6EAA6E;AAC7E,6EAA6E;AAC7E,OAAO,EACL,wBAAwB,IAAI,sBAAsB,EAClD,mBAAmB,IAAI,iBAAiB,EACxC,kBAAkB,IAAI,gBAAgB,EACtC,wBAAwB,IAAI,sBAAsB,EAClD,iBAAiB,IAAI,eAAe,GACrC,MAAM,sBAAsB,CAAA"}
|
|
1
|
+
{"version":3,"file":"schema-export-pg.js","sourceRoot":"","sources":["../src/schema-export-pg.ts"],"names":[],"mappings":"AAAA,6EAA6E;AAC7E,6EAA6E;AAC7E,OAAO,EACL,wBAAwB,IAAI,sBAAsB,EAClD,mBAAmB,IAAI,iBAAiB,EACxC,kBAAkB,IAAI,gBAAgB,EACtC,wBAAwB,IAAI,sBAAsB,EAClD,iBAAiB,IAAI,eAAe,GACrC,MAAM,sBAAsB,CAAA","sourcesContent":["// src/schema-export-pg.ts — pg twins under the same names bunderstack/schema\n// uses, so `export * from 'bunderstack/schema/pg'` mirrors the sqlite setup.\nexport {\n bunderstackEmailEventsPg as bunderstackEmailEvents,\n bunderstackEmailsPg as bunderstackEmails,\n bunderstackFilesPg as bunderstackFiles,\n bunderstackIdempotencyPg as bunderstackIdempotency,\n bunderstackJobsPg as bunderstackJobs,\n} from './internal-tables-pg'\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema-export.js","sourceRoot":"","sources":["../src/schema-export.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,sBAAsB,EACtB,iBAAiB,EACjB,gBAAgB,EAChB,sBAAsB,EACtB,eAAe,GAChB,MAAM,mBAAmB,CAAA"}
|
|
1
|
+
{"version":3,"file":"schema-export.js","sourceRoot":"","sources":["../src/schema-export.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,sBAAsB,EACtB,iBAAiB,EACjB,gBAAgB,EAChB,sBAAsB,EACtB,eAAe,GAChB,MAAM,mBAAmB,CAAA","sourcesContent":["export {\n bunderstackEmailEvents,\n bunderstackEmails,\n bunderstackFiles,\n bunderstackIdempotency,\n bunderstackJobs,\n} from './internal-tables'\n"]}
|
package/dist/scope.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scope.js","sourceRoot":"","sources":["../src/scope.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE,eAAe,EAAE,OAAO,EAAY,MAAM,aAAa,CAAA;AAIzE,MAAM,UAAU,eAAe,CAC7B,KAA4C,EAC5C,KAAe;IAEf,MAAM,OAAO,GAAG,eAAe,CAAC,KAAK,CAAC,CAAA;IACtC,MAAM,UAAU,GAAU,EAAE,CAAA;IAC5B,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QAClD,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;QACzB,IAAI,CAAC,GAAG;YAAE,SAAQ;QAClB,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAA;IAC9E,CAAC;IACD,OAAO,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;AAC3D,CAAC"}
|
|
1
|
+
{"version":3,"file":"scope.js","sourceRoot":"","sources":["../src/scope.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE,eAAe,EAAE,OAAO,EAAY,MAAM,aAAa,CAAA;AAIzE,MAAM,UAAU,eAAe,CAC7B,KAA4C,EAC5C,KAAe;IAEf,MAAM,OAAO,GAAG,eAAe,CAAC,KAAK,CAAC,CAAA;IACtC,MAAM,UAAU,GAAU,EAAE,CAAA;IAC5B,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QAClD,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;QACzB,IAAI,CAAC,GAAG;YAAE,SAAQ;QAClB,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAA;IAC9E,CAAC;IACD,OAAO,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;AAC3D,CAAC","sourcesContent":["import { and, eq, getTableColumns, inArray, type SQL } from 'drizzle-orm'\n\nimport type { ScopeMap } from './access'\n\nexport function buildScopeWhere(\n table: Parameters<typeof getTableColumns>[0],\n scope: ScopeMap,\n): SQL | undefined {\n const columns = getTableColumns(table)\n const conditions: SQL[] = []\n for (const [name, value] of Object.entries(scope)) {\n const col = columns[name]\n if (!col) continue\n conditions.push(Array.isArray(value) ? inArray(col, value) : eq(col, value))\n }\n return conditions.length ? and(...conditions) : undefined\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"standard-schema.js","sourceRoot":"","sources":["../src/standard-schema.ts"],"names":[],"mappings":"AAWA,MAAM,OAAO,6BAA8B,SAAQ,KAAK;IAC7C,MAAM,CAAuB;IAEtC,YAAY,KAAa,EAAE,MAAyC;QAClE,MAAM,UAAU,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YACxC,IAAI,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAC5C,OAAO,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CACpD;YACD,OAAO,EAAE,KAAK,CAAC,OAAO;SACvB,CAAC,CAAC,CAAA;QACH,KAAK,CACH,UAAU;aACP,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;YACb,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;YAC7C,OAAO,GAAG,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,KAAK,CAAC,OAAO,EAAE,CAAA;QAC9D,CAAC,CAAC;aACD,IAAI,CAAC,IAAI,CAAC,CACd,CAAA;QACD,IAAI,CAAC,IAAI,GAAG,+BAA+B,CAAA;QAC3C,IAAI,CAAC,MAAM,GAAG,UAAU,CAAA;IAC1B,CAAC;CACF;AAED,SAAS,aAAa,CAAC,KAAc;IACnC,OAAO,CACL,OAAO,KAAK,KAAK,QAAQ;QACzB,KAAK,KAAK,IAAI;QACd,MAAM,IAAI,KAAK;QACf,OAAO,KAAK,CAAC,IAAI,KAAK,UAAU,CACjC,CAAA;AACH,CAAC;AAED,MAAM,UAAU,sBAAsB,CACpC,MAAe,EACf,KAAc,EACd,KAAa;IAEb,MAAM,MAAM,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAA;IAClD,IAAI,aAAa,CAAC,MAAM,CAAC,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CACb,iBAAiB,KAAK,wCAAwC,CAC/D,CAAA;IACH,CAAC;IACD,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;QAClB,MAAM,IAAI,6BAA6B,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,CAAA;IAC/D,CAAC;IACD,OAAO,MAAM,CAAC,KAAK,CAAA;AACrB,CAAC"}
|
|
1
|
+
{"version":3,"file":"standard-schema.js","sourceRoot":"","sources":["../src/standard-schema.ts"],"names":[],"mappings":"AAWA,MAAM,OAAO,6BAA8B,SAAQ,KAAK;IAC7C,MAAM,CAAuB;IAEtC,YAAY,KAAa,EAAE,MAAyC;QAClE,MAAM,UAAU,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YACxC,IAAI,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAC5C,OAAO,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CACpD;YACD,OAAO,EAAE,KAAK,CAAC,OAAO;SACvB,CAAC,CAAC,CAAA;QACH,KAAK,CACH,UAAU;aACP,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;YACb,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;YAC7C,OAAO,GAAG,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,KAAK,CAAC,OAAO,EAAE,CAAA;QAC9D,CAAC,CAAC;aACD,IAAI,CAAC,IAAI,CAAC,CACd,CAAA;QACD,IAAI,CAAC,IAAI,GAAG,+BAA+B,CAAA;QAC3C,IAAI,CAAC,MAAM,GAAG,UAAU,CAAA;IAC1B,CAAC;CACF;AAED,SAAS,aAAa,CAAC,KAAc;IACnC,OAAO,CACL,OAAO,KAAK,KAAK,QAAQ;QACzB,KAAK,KAAK,IAAI;QACd,MAAM,IAAI,KAAK;QACf,OAAO,KAAK,CAAC,IAAI,KAAK,UAAU,CACjC,CAAA;AACH,CAAC;AAED,MAAM,UAAU,sBAAsB,CACpC,MAAe,EACf,KAAc,EACd,KAAa;IAEb,MAAM,MAAM,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAA;IAClD,IAAI,aAAa,CAAC,MAAM,CAAC,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CACb,iBAAiB,KAAK,wCAAwC,CAC/D,CAAA;IACH,CAAC;IACD,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;QAClB,MAAM,IAAI,6BAA6B,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,CAAA;IAC/D,CAAC;IACD,OAAO,MAAM,CAAC,KAAK,CAAA;AACrB,CAAC","sourcesContent":["import type { StandardSchemaV1 } from '@standard-schema/spec'\n\nexport type StandardSchema = StandardSchemaV1\nexport type InferStandardOutput<TSchema extends StandardSchemaV1> =\n StandardSchemaV1.InferOutput<TSchema>\n\nexport type StandardSchemaIssue = {\n path: PropertyKey[]\n message: string\n}\n\nexport class StandardSchemaValidationError extends Error {\n readonly issues: StandardSchemaIssue[]\n\n constructor(label: string, issues: readonly StandardSchemaV1.Issue[]) {\n const normalized = issues.map((issue) => ({\n path: [...(issue.path ?? [])].map((segment) =>\n typeof segment === 'object' ? segment.key : segment,\n ),\n message: issue.message,\n }))\n super(\n normalized\n .map((issue) => {\n const path = issue.path.map(String).join('.')\n return `${label}${path ? `.${path}` : ''}: ${issue.message}`\n })\n .join('\\n'),\n )\n this.name = 'StandardSchemaValidationError'\n this.issues = normalized\n }\n}\n\nfunction isPromiseLike(value: unknown): value is PromiseLike<unknown> {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'then' in value &&\n typeof value.then === 'function'\n )\n}\n\nexport function validateStandardSchema<TSchema extends StandardSchemaV1>(\n schema: TSchema,\n value: unknown,\n label: string,\n): StandardSchemaV1.InferOutput<TSchema> {\n const result = schema['~standard'].validate(value)\n if (isPromiseLike(result)) {\n throw new Error(\n `[bunderstack] ${label} schema validation must be synchronous`,\n )\n }\n if (result.issues) {\n throw new StandardSchemaValidationError(label, result.issues)\n }\n return result.value\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"buckets.js","sourceRoot":"","sources":["../../src/storage/buckets.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"buckets.js","sourceRoot":"","sources":["../../src/storage/buckets.ts"],"names":[],"mappings":"AA0EA,8EAA8E;AAC9E,YAAY;AACZ,8EAA8E;AAE9E,MAAM,UAAU,GAA2B;IACzC,CAAC,EAAE,CAAC;IACJ,EAAE,EAAE,IAAI;IACR,EAAE,EAAE,IAAI,GAAG,IAAI;IACf,EAAE,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI;CACvB,CAAA;AAED,MAAM,UAAU,SAAS,CAAC,KAAsB;IAC9C,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC;YACrE,MAAM,IAAI,KAAK,CAAC,+BAA+B,KAAK,GAAG,CAAC,CAAA;QAC1D,CAAC;QACD,OAAO,KAAK,CAAA;IACd,CAAC;IAED,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAA;IAC5B,IAAI,OAAO,KAAK,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,+BAA+B,KAAK,GAAG,CAAC,CAAA;IAE5E,MAAM,KAAK,GAAG,+BAA+B,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;IAC3D,IAAI,CAAC,KAAK;QAAE,MAAM,IAAI,KAAK,CAAC,+BAA+B,KAAK,GAAG,CAAC,CAAA;IAEpE,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,CAAA;IACvB,IAAI,MAAM,KAAK,SAAS;QACtB,MAAM,IAAI,KAAK,CAAC,+BAA+B,KAAK,GAAG,CAAC,CAAA;IAC1D,MAAM,GAAG,GAAG,UAAU,CAAC,MAAM,CAAC,CAAA;IAC9B,MAAM,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAA;IAE3C,IAAI,IAAI,KAAK,EAAE;QAAE,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;IAEvC,MAAM,UAAU,GAAG,UAAU,CAAC,IAAI,CAAC,CAAA;IACnC,IAAI,UAAU,KAAK,SAAS;QAC1B,MAAM,IAAI,KAAK,CAAC,+BAA+B,KAAK,GAAG,CAAC,CAAA;IAE1D,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,UAAU,CAAC,CAAA;AACrC,CAAC;AAED,8EAA8E;AAC9E,uCAAuC;AACvC,8EAA8E;AAE9E;;;;;GAKG;AACH,SAAS,iBAAiB,CACxB,GAAuC;IAEvC,MAAM,QAAQ,GAAG,GAAG,CAAC,yBAAyB,CAAC,CAAA;IAC/C,IAAI,CAAC,QAAQ;QAAE,OAAO,SAAS,CAAA;IAC/B,OAAO;QACL,IAAI,EAAE,IAAI;QACV,MAAM,EAAE,GAAG,CAAC,uBAAuB,CAAC,IAAI,EAAE;QAC1C,MAAM,EAAE,GAAG,CAAC,uBAAuB,CAAC,IAAI,MAAM;QAC9C,QAAQ;QACR,WAAW,EAAE,GAAG,CAAC,8BAA8B,CAAC,IAAI,EAAE;QACtD,eAAe,EAAE,GAAG,CAAC,kCAAkC,CAAC,IAAI,EAAE;QAC9D,SAAS,EAAE,GAAG,CAAC,2BAA2B,CAAC;KAC5C,CAAA;AACH,CAAC;AAED,8EAA8E;AAC9E,4BAA4B;AAC5B,8EAA8E;AAE9E,SAAS,oBAAoB,CAC3B,KAAqC,EACrC,GAAuC;IAEvC,IAAI,CAAC,KAAK;QAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,CAAA;IAEvD,IAAI,OAAO,IAAI,KAAK,IAAI,KAAK,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;QAClD,OAAO;YACL,IAAI,EAAE,OAAO;YACb,IAAI,EAAE,KAAK,CAAC,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK;SACvD,CAAA;IACH,CAAC;IAED,IAAI,IAAI,IAAI,KAAK,IAAI,KAAK,CAAC,EAAE,KAAK,SAAS,EAAE,CAAC;QAC5C,MAAM,KAAK,GAAG,OAAO,KAAK,CAAC,EAAE,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAA;QAC1D,OAAO;YACL,IAAI,EAAE,IAAI;YACV,MAAM,EAAE,GAAG,CAAC,WAAW,CAAC,IAAI,EAAE;YAC9B,MAAM,EAAE,GAAG,CAAC,WAAW,CAAC,IAAI,WAAW;YACvC,QAAQ,EAAE,KAAK,CAAC,QAAQ,IAAI,GAAG,CAAC,aAAa,CAAC;YAC9C,WAAW,EAAE,GAAG,CAAC,kBAAkB,CAAC,IAAI,EAAE;YAC1C,eAAe,EAAE,GAAG,CAAC,sBAAsB,CAAC,IAAI,EAAE;SACnD,CAAA;IACH,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,CAAA;AAC7C,CAAC;AAED,8EAA8E;AAC9E,gCAAgC;AAChC,8EAA8E;AAE9E,SAAS,oBAAoB,CAC3B,WAA8B,EAC9B,aAA8B,EAC9B,GAAuC;IAEvC,uEAAuE;IACvE,8CAA8C;IAC9C,IAAI,GAAG,CAAC,yBAAyB,CAAC;QAAE,OAAO,aAAa,CAAA;IACxD,IAAI,IAAI,IAAI,WAAW,IAAI,WAAW,CAAC,EAAE,KAAK,SAAS,EAAE,CAAC;QACxD,MAAM,KAAK,GAAG,WAAW,CAAC,EAAE,CAAA;QAC5B,OAAO;YACL,IAAI,EAAE,IAAI;YACV,MAAM,EAAE,KAAK,CAAC,MAAM;YACpB,MAAM,EAAE,KAAK,CAAC,MAAM,IAAI,GAAG,CAAC,WAAW,CAAC,IAAI,WAAW;YACvD,QAAQ,EAAE,KAAK,CAAC,QAAQ,IAAI,GAAG,CAAC,aAAa,CAAC;YAC9C,WAAW,EAAE,GAAG,CAAC,kBAAkB,CAAC,IAAI,EAAE;YAC1C,eAAe,EAAE,GAAG,CAAC,sBAAsB,CAAC,IAAI,EAAE;YAClD,SAAS,EAAE,KAAK,CAAC,SAAS;SAC3B,CAAA;IACH,CAAC;IAED,IAAI,OAAO,IAAI,WAAW,IAAI,WAAW,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;QAC9D,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,CAAC,KAAK,EAAE,CAAA;IACnD,CAAC;IAED,OAAO,aAAa,CAAA;AACtB,CAAC;AAED,8EAA8E;AAC9E,oBAAoB;AACpB,8EAA8E;AAE9E,SAAS,mBAAmB,CAC1B,IAAY,EACZ,KAAwB,EACxB,aAA8B,EAC9B,GAAuC;IAEvC,MAAM,UAAU,GAAG,KAAK,CAAC,UAAU,IAAI,SAAS,CAAA;IAChD,MAAM,OAAO,GAAG,oBAAoB,CAAC,KAAK,EAAE,aAAa,EAAE,GAAG,CAAC,CAAA;IAE/D,MAAM,UAAU,GAAkB,UAAU,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAA;IAE9E,MAAM,MAAM,GAA6B;QACvC,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,MAAM,IAAI,eAAe;QAC/C,GAAG,EAAE,KAAK,CAAC,MAAM,EAAE,GAAG,IAAI,UAAU;QACpC,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,MAAM,IAAI,OAAO;KACxC,CAAA;IAED,IAAI,MAAM,GAAyC,SAAS,CAAA;IAC5D,IAAI,KAAK,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QAC/B,MAAM,GAAG,EAAE,CAAA;QACX,IAAI,KAAK,CAAC,MAAM,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;YACvC,MAAM,CAAC,YAAY,GAAG,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;QACvD,CAAC;QACD,IAAI,KAAK,CAAC,MAAM,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YACtC,MAAM,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,MAAM,CAAA;QACrC,CAAC;IACH,CAAC;IAED,IAAI,KAAK,GAAwC,SAAS,CAAA;IAC1D,IAAI,KAAK,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;QAC9B,KAAK,GAAG,EAAE,CAAA;QACV,IAAI,KAAK,CAAC,KAAK,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;YACtC,KAAK,CAAC,YAAY,GAAG,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;QACrD,CAAC;QACD,IAAI,KAAK,CAAC,KAAK,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;YACvC,KAAK,CAAC,aAAa,GAAG,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAA;QACvD,CAAC;IACH,CAAC;IAED,OAAO;QACL,IAAI;QACJ,OAAO;QACP,UAAU;QACV,MAAM;QACN,MAAM;QACN,UAAU,EAAE,KAAK,CAAC,UAAU,IAAI,KAAK;QACrC,SAAS,EAAE,KAAK,CAAC,KAAK,EAAE,IAAI;QAC5B,UAAU,EAAE,KAAK,CAAC,KAAK,EAAE,KAAK;QAC9B,KAAK;KACN,CAAA;AACH,CAAC;AAED,8EAA8E;AAC9E,iBAAiB;AACjB,8EAA8E;AAE9E,MAAM,UAAU,cAAc,CAC5B,KAAqC,EACrC,MAA0C,OAAO,CAAC,GAAG;IAErD,MAAM,aAAa,GACjB,iBAAiB,CAAC,GAAG,CAAC,IAAI,oBAAoB,CAAC,KAAK,EAAE,GAAG,CAAC,CAAA;IAC5D,MAAM,YAAY,GAAG,KAAK,EAAE,OAAO,CAAA;IAEnC,MAAM,aAAa,GAAG,YAAY,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;IACnE,MAAM,iBAAiB,GACrB,KAAK,EAAE,aAAa;QACpB,qEAAqE;QACrE,CAAC,aAAa,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAA;IAE9D,MAAM,OAAO,GAAG,IAAI,GAAG,EAA0B,CAAA;IAEjD,IAAI,CAAC,YAAY,IAAI,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC5D,qCAAqC;QACrC,MAAM,aAAa,GAAG,mBAAmB,CACvC,iBAAiB,EACjB,EAAE,EACF,aAAa,EACb,GAAG,CACJ,CAAA;QACD,OAAO,CAAC,GAAG,CAAC,iBAAiB,EAAE,aAAa,CAAC,CAAA;QAC7C,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,OAAO,EAAE,CAAA;IACtD,CAAC;IAED,qCAAqC;IACrC,IAAI,CAAC,CAAC,iBAAiB,IAAI,YAAY,CAAC,EAAE,CAAC;QACzC,MAAM,IAAI,KAAK,CACb,gCAAgC,iBAAiB,4BAA4B,CAC9E,CAAA;IACH,CAAC;IAED,KAAK,MAAM,CAAC,IAAI,EAAE,WAAW,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,CAAC;QAC/D,OAAO,CAAC,GAAG,CACT,IAAI,EACJ,mBAAmB,CAAC,IAAI,EAAE,WAAW,EAAE,aAAa,EAAE,GAAG,CAAC,CAC3D,CAAA;IACH,CAAC;IAED,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,OAAO,EAAE,CAAA;AACtD,CAAC","sourcesContent":["// src/storage/buckets.ts\nimport type { OperationRule, ScopeResolver } from '../access'\n\n// ---------------------------------------------------------------------------\n// Input types (developer-facing config)\n// ---------------------------------------------------------------------------\n\nexport type BucketBackendInput =\n | {\n s3: {\n bucket: string\n region?: string\n endpoint?: string\n publicUrl?: string\n }\n }\n | { local: string }\n\nexport type BucketConfigInput = {\n visibility?: 'public' | 'private'\n access?: {\n create?: OperationRule\n get?: OperationRule\n delete?: OperationRule\n }\n upload?: { maxSize?: string | number; accept?: string[] }\n transforms?: boolean\n scope?: {\n read?: ScopeResolver\n write?: ScopeResolver\n }\n quota?: { perUser?: string | number; perScope?: string | number }\n} & Partial<BucketBackendInput>\n\nexport type StorageConfigInput = {\n s3?: true | { endpoint?: string }\n local?: true | string\n defaultBucket?: string\n buckets?: Record<string, BucketConfigInput>\n}\n\n// ---------------------------------------------------------------------------\n// Resolved types (internal)\n// ---------------------------------------------------------------------------\n\nexport type ResolvedBackend =\n | { type: 'local'; path: string }\n | {\n type: 's3'\n bucket: string\n region: string\n endpoint?: string\n accessKeyId: string\n secretAccessKey: string\n publicUrl?: string\n }\n\nexport type ResolvedBucket = {\n name: string\n backend: ResolvedBackend\n visibility: 'public' | 'private'\n access: { create: OperationRule; get: OperationRule; delete: OperationRule }\n upload?: { maxSizeBytes?: number; accept?: string[] }\n transforms: boolean\n readScope?: ScopeResolver\n writeScope?: ScopeResolver\n quota?: { perUserBytes?: number; perScopeBytes?: number }\n}\n\nexport type ResolvedStorageBuckets = {\n defaultBucket: string\n buckets: Map<string, ResolvedBucket>\n}\n\n// ---------------------------------------------------------------------------\n// parseSize\n// ---------------------------------------------------------------------------\n\nconst SIZE_UNITS: Record<string, number> = {\n b: 1,\n kb: 1024,\n mb: 1024 * 1024,\n gb: 1024 * 1024 * 1024,\n}\n\nexport function parseSize(value: string | number): number {\n if (typeof value === 'number') {\n if (!Number.isFinite(value) || value < 0 || !Number.isInteger(value)) {\n throw new Error(`[bunderstack] invalid size \"${value}\"`)\n }\n return value\n }\n\n const trimmed = value.trim()\n if (trimmed === '') throw new Error(`[bunderstack] invalid size \"${value}\"`)\n\n const match = /^(\\d+(?:\\.\\d+)?)\\s*([a-z]*)$/i.exec(trimmed)\n if (!match) throw new Error(`[bunderstack] invalid size \"${value}\"`)\n\n const numStr = match[1]\n if (numStr === undefined)\n throw new Error(`[bunderstack] invalid size \"${value}\"`)\n const num = parseFloat(numStr)\n const unit = (match[2] ?? '').toLowerCase()\n\n if (unit === '') return Math.floor(num)\n\n const multiplier = SIZE_UNITS[unit]\n if (multiplier === undefined)\n throw new Error(`[bunderstack] invalid size \"${value}\"`)\n\n return Math.floor(num * multiplier)\n}\n\n// ---------------------------------------------------------------------------\n// Platform override (Bunderhost & co.)\n// ---------------------------------------------------------------------------\n\n/**\n * A deployment platform that injects BUNDERSTACK_S3_ENDPOINT forces every\n * bucket onto that backend — code-level `local`/per-bucket `s3` blocks are\n * ignored so apps deploy unchanged. Logical buckets already prefix object\n * keys (\"<bucket>/<uuid>\"), so one physical bucket per environment suffices.\n */\nfunction platformS3Backend(\n env: Record<string, string | undefined>,\n): ResolvedBackend | undefined {\n const endpoint = env['BUNDERSTACK_S3_ENDPOINT']\n if (!endpoint) return undefined\n return {\n type: 's3',\n bucket: env['BUNDERSTACK_S3_BUCKET'] ?? '',\n region: env['BUNDERSTACK_S3_REGION'] ?? 'auto',\n endpoint,\n accessKeyId: env['BUNDERSTACK_S3_ACCESS_KEY_ID'] ?? '',\n secretAccessKey: env['BUNDERSTACK_S3_SECRET_ACCESS_KEY'] ?? '',\n publicUrl: env['BUNDERSTACK_S3_PUBLIC_URL'],\n }\n}\n\n// ---------------------------------------------------------------------------\n// Shared backend resolution\n// ---------------------------------------------------------------------------\n\nfunction resolveSharedBackend(\n input: StorageConfigInput | undefined,\n env: Record<string, string | undefined>,\n): ResolvedBackend {\n if (!input) return { type: 'local', path: './uploads' }\n\n if ('local' in input && input.local !== undefined) {\n return {\n type: 'local',\n path: input.local === true ? './uploads' : input.local,\n }\n }\n\n if ('s3' in input && input.s3 !== undefined) {\n const s3Cfg = typeof input.s3 === 'object' ? input.s3 : {}\n return {\n type: 's3',\n bucket: env['S3_BUCKET'] ?? '',\n region: env['S3_REGION'] ?? 'us-east-1',\n endpoint: s3Cfg.endpoint ?? env['S3_ENDPOINT'],\n accessKeyId: env['S3_ACCESS_KEY_ID'] ?? '',\n secretAccessKey: env['S3_SECRET_ACCESS_KEY'] ?? '',\n }\n }\n\n return { type: 'local', path: './uploads' }\n}\n\n// ---------------------------------------------------------------------------\n// Per-bucket backend resolution\n// ---------------------------------------------------------------------------\n\nfunction resolveBucketBackend(\n bucketInput: BucketConfigInput,\n sharedBackend: ResolvedBackend,\n env: Record<string, string | undefined>,\n): ResolvedBackend {\n // Platform override active → sharedBackend IS the platform backend and\n // code-level per-bucket backends are ignored.\n if (env['BUNDERSTACK_S3_ENDPOINT']) return sharedBackend\n if ('s3' in bucketInput && bucketInput.s3 !== undefined) {\n const block = bucketInput.s3\n return {\n type: 's3',\n bucket: block.bucket,\n region: block.region ?? env['S3_REGION'] ?? 'us-east-1',\n endpoint: block.endpoint ?? env['S3_ENDPOINT'],\n accessKeyId: env['S3_ACCESS_KEY_ID'] ?? '',\n secretAccessKey: env['S3_SECRET_ACCESS_KEY'] ?? '',\n publicUrl: block.publicUrl,\n }\n }\n\n if ('local' in bucketInput && bucketInput.local !== undefined) {\n return { type: 'local', path: bucketInput.local }\n }\n\n return sharedBackend\n}\n\n// ---------------------------------------------------------------------------\n// Bucket resolution\n// ---------------------------------------------------------------------------\n\nfunction resolveSingleBucket(\n name: string,\n input: BucketConfigInput,\n sharedBackend: ResolvedBackend,\n env: Record<string, string | undefined>,\n): ResolvedBucket {\n const visibility = input.visibility ?? 'private'\n const backend = resolveBucketBackend(input, sharedBackend, env)\n\n const defaultGet: OperationRule = visibility === 'public' ? 'public' : 'owner'\n\n const access: ResolvedBucket['access'] = {\n create: input.access?.create ?? 'authenticated',\n get: input.access?.get ?? defaultGet,\n delete: input.access?.delete ?? 'owner',\n }\n\n let upload: ResolvedBucket['upload'] | undefined = undefined\n if (input.upload !== undefined) {\n upload = {}\n if (input.upload.maxSize !== undefined) {\n upload.maxSizeBytes = parseSize(input.upload.maxSize)\n }\n if (input.upload.accept !== undefined) {\n upload.accept = input.upload.accept\n }\n }\n\n let quota: ResolvedBucket['quota'] | undefined = undefined\n if (input.quota !== undefined) {\n quota = {}\n if (input.quota.perUser !== undefined) {\n quota.perUserBytes = parseSize(input.quota.perUser)\n }\n if (input.quota.perScope !== undefined) {\n quota.perScopeBytes = parseSize(input.quota.perScope)\n }\n }\n\n return {\n name,\n backend,\n visibility,\n access,\n upload,\n transforms: input.transforms ?? false,\n readScope: input.scope?.read,\n writeScope: input.scope?.write,\n quota,\n }\n}\n\n// ---------------------------------------------------------------------------\n// resolveBuckets\n// ---------------------------------------------------------------------------\n\nexport function resolveBuckets(\n input: StorageConfigInput | undefined,\n env: Record<string, string | undefined> = process.env,\n): ResolvedStorageBuckets {\n const sharedBackend =\n platformS3Backend(env) ?? resolveSharedBackend(input, env)\n const bucketsInput = input?.buckets\n\n const declaredNames = bucketsInput ? Object.keys(bucketsInput) : []\n const defaultBucketName =\n input?.defaultBucket ??\n // A single declared bucket is unambiguous — treat it as the default.\n (declaredNames.length === 1 ? declaredNames[0]! : 'default')\n\n const buckets = new Map<string, ResolvedBucket>()\n\n if (!bucketsInput || Object.keys(bucketsInput).length === 0) {\n // Synthesize a single default bucket\n const defaultBucket = resolveSingleBucket(\n defaultBucketName,\n {},\n sharedBackend,\n env,\n )\n buckets.set(defaultBucketName, defaultBucket)\n return { defaultBucket: defaultBucketName, buckets }\n }\n\n // Validate defaultBucket is declared\n if (!(defaultBucketName in bucketsInput)) {\n throw new Error(\n `[bunderstack] defaultBucket \"${defaultBucketName}\" is not a declared bucket`,\n )\n }\n\n for (const [name, bucketInput] of Object.entries(bucketsInput)) {\n buckets.set(\n name,\n resolveSingleBucket(name, bucketInput, sharedBackend, env),\n )\n }\n\n return { defaultBucket: defaultBucketName, buckets }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"delete.js","sourceRoot":"","sources":["../../src/storage/delete.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AAE/C;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,yBAAyB,CAC7C,OAAuB,EACvB,EAAS,EACT,MAAc;IAEd,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QACjB,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,MAAM,eAAe,CAAC,CAAA;QAC3D,6EAA6E;QAC7E,MAAM,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC,CAAC,CAAA;IACzE,CAAC;IACD,MAAM,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;IAC5B,MAAM,iBAAiB,CAAC,EAAE,EAAE,MAAM,CAAC,CAAA;AACrC,CAAC"}
|
|
1
|
+
{"version":3,"file":"delete.js","sourceRoot":"","sources":["../../src/storage/delete.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AAE/C;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,yBAAyB,CAC7C,OAAuB,EACvB,EAAS,EACT,MAAc;IAEd,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QACjB,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,MAAM,eAAe,CAAC,CAAA;QAC3D,6EAA6E;QAC7E,MAAM,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC,CAAC,CAAA;IACzE,CAAC;IACD,MAAM,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;IAC5B,MAAM,iBAAiB,CAAC,EAAE,EAAE,MAAM,CAAC,CAAA;AACrC,CAAC","sourcesContent":["// src/storage/delete.ts\nimport type { AnyDb } from '../dialect'\nimport type { StorageAdapter } from './index'\n\nimport { deleteFileMetaRow } from './file-meta'\n\n/**\n * Delete a logical file: its transform-cache derivatives (under\n * `${fileId}__transforms/`), the original object, and the file-meta row.\n *\n * All deletion goes through this helper so the model stays addable to a future\n * blob/file split (see file-meta.ts header) — never inline `adapter.delete`.\n */\nexport async function deleteFileWithDerivatives(\n adapter: StorageAdapter,\n db: AnyDb,\n fileId: string,\n): Promise<void> {\n if (adapter.list) {\n const derivs = await adapter.list(`${fileId}__transforms/`)\n // Ignore individual derivative-delete errors — orphan sweep is the backstop.\n await Promise.all(derivs.map((k) => adapter.delete(k).catch(() => {})))\n }\n await adapter.delete(fileId)\n await deleteFileMetaRow(db, fileId)\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"file-meta.js","sourceRoot":"","sources":["../../src/storage/file-meta.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"file-meta.js","sourceRoot":"","sources":["../../src/storage/file-meta.ts"],"names":[],"mappings":"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","sourcesContent":["/*\n * DEFERRED — logical/physical blob/file split\n *\n * The current model is 1:1 logical-file = physical-object: one row in\n * bunderstack_file_meta maps to exactly one object in storage. A future\n * blob/file split would introduce:\n *\n * bunderstackBlob { key, bucket, size, contentType, refcount, createdAt }\n * bunderstackFile { id, blobKey, ownerId, scopeJson, status, filename,\n * createdAt, confirmedAt, deletedAt }\n *\n * This would enable:\n * - Soft/shadow delete (file.deletedAt + per-bucket retention policy)\n * - Transfer ownership/scope (mutate file.ownerId / scopeJson, no byte movement)\n * - Duplicate/share to many users or orgs by reference (refcount++) so sharing\n * to N users stores bytes once; or by-copy via S3 CopyObject.\n *\n * Deletion would decrement refcount; bytes removed only at 0; orphan sweep also\n * reaps refcount=0 blobs (self-heals crash mid-decrement).\n *\n * Deferred because refcount correctness is a real cost vs. current need.\n *\n * Two forward-compat invariants keep this addable without breaking the public API:\n * 1. fileId is opaque — clients never parse it.\n * 2. All deletion goes through the storage delete helper, never inline.\n *\n * See docs/plans/2026-06-28-multi-bucket-storage-design.md §6 for full rationale.\n */\n\nimport { eq, and, lt, sql } from 'drizzle-orm'\n\nimport type { ScopeMap } from '../access'\nimport type { AnyDb } from '../dialect'\n\nimport { rowMatchesScope } from '../access'\nimport { bunderstackFiles, filesTableFor } from '../internal-tables'\n\nexport type FileMetaRow = typeof bunderstackFiles.$inferSelect\n\n// ─── CRUD ─────────────────────────────────────────────────────────────────────\n\nexport async function insertPendingFile(\n db: AnyDb,\n input: {\n fileId: string\n bucket: string\n ownerId: string | null\n scopeJson: string | null\n filename: string | null\n contentType: string | null\n },\n): Promise<void> {\n const files = filesTableFor(db)\n await db.insert(files).values({\n fileId: input.fileId,\n bucket: input.bucket,\n ownerId: input.ownerId,\n scopeJson: input.scopeJson,\n filename: input.filename,\n contentType: input.contentType,\n status: 'pending',\n createdAt: Date.now(),\n confirmedAt: null,\n size: null,\n })\n}\n\nexport async function insertReadyFile(\n db: AnyDb,\n input: {\n fileId: string\n bucket: string\n ownerId: string | null\n scopeJson: string | null\n filename: string | null\n contentType: string | null\n size: number | null\n },\n): Promise<void> {\n const files = filesTableFor(db)\n const now = Date.now()\n await db.insert(files).values({\n fileId: input.fileId,\n bucket: input.bucket,\n ownerId: input.ownerId,\n scopeJson: input.scopeJson,\n filename: input.filename,\n contentType: input.contentType,\n size: input.size,\n status: 'ready',\n createdAt: now,\n confirmedAt: now,\n })\n}\n\nexport async function markFileReady(\n db: AnyDb,\n fileId: string,\n patch: { size: number | null; contentType: string | null },\n): Promise<void> {\n const files = filesTableFor(db)\n await db\n .update(files)\n .set({\n status: 'ready',\n confirmedAt: Date.now(),\n size: patch.size,\n contentType: patch.contentType,\n })\n .where(eq(files.fileId, fileId))\n}\n\nexport async function getFileMeta(\n db: AnyDb,\n fileId: string,\n): Promise<FileMetaRow | null> {\n const files = filesTableFor(db)\n const rows = await db\n .select()\n .from(files)\n .where(eq(files.fileId, fileId))\n .limit(1)\n return (rows[0] as FileMetaRow | undefined) ?? null\n}\n\nexport async function deleteFileMetaRow(\n db: AnyDb,\n fileId: string,\n): Promise<void> {\n const files = filesTableFor(db)\n await db.delete(files).where(eq(files.fileId, fileId))\n}\n\n// ─── Sweep ────────────────────────────────────────────────────────────────────\n\nexport async function listStalePendingFiles(\n db: AnyDb,\n olderThanMs: number,\n): Promise<FileMetaRow[]> {\n const files = filesTableFor(db)\n return db\n .select()\n .from(files)\n .where(and(eq(files.status, 'pending'), lt(files.createdAt, olderThanMs)))\n}\n\n// ─── Quota ────────────────────────────────────────────────────────────────────\n\nexport async function sumReadySize(\n db: AnyDb,\n q: { bucket: string; ownerId?: string; scopeJson?: string },\n): Promise<number> {\n const files = filesTableFor(db)\n const conditions = [eq(files.status, 'ready'), eq(files.bucket, q.bucket)]\n if (q.ownerId !== undefined) {\n conditions.push(eq(files.ownerId, q.ownerId))\n }\n if (q.scopeJson !== undefined) {\n conditions.push(eq(files.scopeJson, q.scopeJson))\n }\n\n const rows = await db\n .select({\n total: sql<number>`coalesce(sum(${files.size}), 0)`,\n })\n .from(files)\n .where(and(...conditions))\n\n const raw = rows[0]?.total ?? 0\n return Number(raw)\n}\n\n// ─── Scope helpers ────────────────────────────────────────────────────────────\n\nexport function scopeToJson(scope: ScopeMap | undefined | null): string | null {\n if (scope == null) return null\n const keys = Object.keys(scope)\n if (keys.length === 0) return null\n const sorted = keys.sort()\n const ordered: Record<string, string | string[]> = {}\n for (const k of sorted) {\n const value = scope[k]\n if (value !== undefined) ordered[k] = value\n }\n return JSON.stringify(ordered)\n}\n\nfunction isScopeMap(value: unknown): value is ScopeMap {\n if (value === null || typeof value !== 'object' || Array.isArray(value)) {\n return false\n }\n for (const item of Object.values(value)) {\n if (typeof item === 'string') continue\n if (Array.isArray(item) && item.every((entry) => typeof entry === 'string'))\n continue\n return false\n }\n return true\n}\n\nexport function parseScopeJson(json: string | null): ScopeMap | null {\n if (json == null) return null\n try {\n const parsed = JSON.parse(json)\n return isScopeMap(parsed) ? parsed : null\n } catch {\n // Corrupt/legacy scope_json should not crash a read; treat as no scope.\n return null\n }\n}\n\nexport function fileMatchesScope(\n row: FileMetaRow,\n requesterScope: ScopeMap | undefined,\n): boolean {\n if (requesterScope == null || Object.keys(requesterScope).length === 0) {\n return true\n }\n if (row.scopeJson == null) return false\n const parsed = parseScopeJson(row.scopeJson) ?? {}\n return rowMatchesScope(parsed, requesterScope)\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/storage/index.ts"],"names":[],"mappings":"AAAA,uBAAuB;AACvB,OAAO,EAAE,mBAAmB,EAAE,MAAM,SAAS,CAAA;AAC7C,OAAO,EAAE,gBAAgB,EAAE,MAAM,MAAM,CAAA;AAGvC,OAAO,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/storage/index.ts"],"names":[],"mappings":"AAAA,uBAAuB;AACvB,OAAO,EAAE,mBAAmB,EAAE,MAAM,SAAS,CAAA;AAC7C,OAAO,EAAE,gBAAgB,EAAE,MAAM,MAAM,CAAA;AAGvC,OAAO,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAA","sourcesContent":["// src/storage/index.ts\nimport { LocalStorageAdapter } from './local'\nimport { S3StorageAdapter } from './s3'\n\nexport type { LocalStorageAdapter, S3StorageAdapter }\nexport { createStorageOperations } from './operations'\nexport type {\n PrepareUploadResult,\n StorageDownload,\n StorageExecutionContext,\n StorageOperations,\n StorageOperationsOptions,\n} from './operations'\n\nexport interface PresignPutOptions {\n contentType?: string\n expiresIn: number\n}\nexport interface PresignGetOptions {\n expiresIn: number\n}\n\nexport interface StorageAdapter {\n upload(\n fileId: string,\n data: Blob | ArrayBuffer,\n contentType: string,\n ): Promise<void>\n get(fileId: string): Promise<Response>\n delete(fileId: string): Promise<void>\n exists(fileId: string): Promise<boolean>\n // Optional — present on S3, absent on local (router uses proxy path for local)\n presignPut?(key: string, opts: PresignPutOptions): Promise<string>\n presignGet?(key: string, opts: PresignGetOptions): Promise<string>\n stat?(key: string): Promise<{ size: number; contentType: string } | null>\n publicUrlFor?(key: string): string | undefined\n /** List full object keys under a prefix (used to reap transform derivatives). */\n list?(prefix: string): Promise<string[]>\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"local.js","sourceRoot":"","sources":["../../src/storage/local.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"local.js","sourceRoot":"","sources":["../../src/storage/local.ts"],"names":[],"mappings":"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","sourcesContent":["// src/storage/local.ts\nimport { mkdir, readdir } from 'node:fs/promises'\nimport { join } from 'node:path'\n\nexport class LocalStorageAdapter {\n private readonly basePath: string\n constructor(basePath: string) {\n this.basePath = basePath\n }\n\n private filePath(fileId: string) {\n return join(this.basePath, fileId)\n }\n\n async upload(\n fileId: string,\n data: Blob | ArrayBuffer,\n contentType: string,\n ): Promise<void> {\n await mkdir(this.basePath, { recursive: true })\n const bytes = data instanceof Blob ? await data.arrayBuffer() : data\n await Bun.write(\n Bun.file(this.filePath(fileId), { type: contentType }),\n bytes,\n )\n }\n\n async get(fileId: string): Promise<Response> {\n const file = Bun.file(this.filePath(fileId))\n if (!(await file.exists()))\n return new Response('Not found', { status: 404 })\n return new Response(file, {\n headers: {\n 'Content-Type': file.type,\n 'Cache-Control': 'public, max-age=31536000',\n },\n })\n }\n\n async delete(fileId: string): Promise<void> {\n const file = Bun.file(this.filePath(fileId))\n if (await file.exists()) await file.unlink()\n }\n\n async exists(fileId: string): Promise<boolean> {\n return Bun.file(this.filePath(fileId)).exists()\n }\n\n async stat(\n key: string,\n ): Promise<{ size: number; contentType: string } | null> {\n const file = Bun.file(this.filePath(key))\n if (!(await file.exists())) return null\n return { size: file.size, contentType: file.type }\n }\n\n async list(prefix: string): Promise<string[]> {\n const cleanPrefix = prefix.replace(/\\/$/, '')\n const dir = join(this.basePath, cleanPrefix)\n let entries: string[]\n try {\n entries = await readdir(dir)\n } catch {\n // Missing dir (or prefix isn't a directory) → no derivatives.\n return []\n }\n return entries.map((name) => `${cleanPrefix}/${name}`)\n }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"operations.js","sourceRoot":"","sources":["../../src/storage/operations.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"operations.js","sourceRoot":"","sources":["../../src/storage/operations.ts"],"names":[],"mappings":"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","sourcesContent":["import { randomUUID } from 'node:crypto'\nimport { extname } from 'node:path'\n\nimport type { AccessContext, OperationRule } from '../access'\nimport type { AnyDb } from '../dialect'\nimport type { BucketStorageRegistry } from './registry'\n\nimport { checkAccess } from '../access'\nimport { BunderstackError } from '../errors'\nimport { deleteFileWithDerivatives } from './delete'\nimport {\n deleteFileMetaRow,\n fileMatchesScope,\n getFileMeta,\n insertPendingFile,\n insertReadyFile,\n markFileReady,\n scopeToJson,\n sumReadySize,\n type FileMetaRow,\n} from './file-meta'\nimport { parseTransformSpec, transformHash, transformImage } from './thumbnails'\n\nexport interface StorageExecutionContext {\n request: Request\n user: AccessContext['user']\n session: { activeOrganizationId: string | null }\n}\n\nexport interface StorageOperationsOptions {\n registry: BucketStorageRegistry\n db: AnyDb\n presignExpiresSec?: number\n}\n\nexport type PrepareUploadResult =\n | { mode: 'proxy'; uploadUrl: string }\n | {\n mode: 'presign'\n fileId: string\n uploadUrl: string\n method: 'PUT'\n confirmUrl: string\n }\n\nexport type StorageDownload =\n | { kind: 'redirect'; status: 302; url: string }\n | {\n kind: 'body'\n status: number\n body: ConstructorParameters<typeof Response>[0]\n headers: Headers\n }\n\nconst FILE_OWNER_COLUMN = 'ownerId'\n\nfunction matchMime(type: string, accept?: string[]): boolean {\n if (!accept || accept.length === 0) return true\n if (!type) return false\n return accept.some(\n (pattern) =>\n pattern === type ||\n (pattern.endsWith('/*') && type.startsWith(pattern.slice(0, -1))),\n )\n}\n\nfunction accessContext(\n context: StorageExecutionContext,\n extra: { row?: FileMetaRow; body?: Record<string, unknown> } = {},\n): AccessContext {\n return {\n request: context.request,\n user: context.user,\n session: context.session,\n row: extra.row,\n body: extra.body,\n }\n}\n\nasync function gate(rule: OperationRule, context: AccessContext) {\n const result = await checkAccess(rule, context, FILE_OWNER_COLUMN)\n if (!result.allowed) {\n throw new BunderstackError(\n result.status === 401 ? 'UNAUTHORIZED' : 'FORBIDDEN',\n result.status === 401 ? 'Authentication required' : 'Forbidden',\n )\n }\n}\n\nfunction notFound(message = 'Not found'): never {\n throw new BunderstackError('NOT_FOUND', message)\n}\n\nfunction sanitizeFilename(name: string): string {\n return name.replace(/[\"\\\\\\r\\n]/g, '')\n}\n\nasync function quotaExceeded(\n db: AnyDb,\n bucket: string,\n quota: { perUserBytes?: number; perScopeBytes?: number },\n ownerId: string | undefined,\n scopeJson: string | null,\n incoming: number,\n): Promise<boolean> {\n if (quota.perUserBytes !== undefined && ownerId !== undefined) {\n const current = await sumReadySize(db, { bucket, ownerId })\n if (current + incoming > quota.perUserBytes) return true\n }\n if (quota.perScopeBytes !== undefined && scopeJson != null) {\n const current = await sumReadySize(db, { bucket, scopeJson })\n if (current + incoming > quota.perScopeBytes) return true\n }\n return false\n}\n\nexport function createStorageOperations(options: StorageOperationsOptions) {\n const { registry, db } = options\n const presignExpiresSec = options.presignExpiresSec ?? 60\n\n const bucketEntry = (name: string) => {\n const entry = registry.get(name)\n if (!entry) notFound('Unknown bucket')\n return entry\n }\n\n return {\n async prepareUpload(\n bucketName: string,\n body: { filename?: string; contentType?: string },\n context: StorageExecutionContext,\n ): Promise<PrepareUploadResult> {\n const { bucket, adapter } = bucketEntry(bucketName)\n const ctx = accessContext(context, { body })\n await gate(bucket.access.create, ctx)\n\n if (!adapter.presignPut) {\n return { mode: 'proxy', uploadUrl: `/api/files/${bucket.name}` }\n }\n\n const scopeJson = scopeToJson(bucket.writeScope?.(ctx))\n if (\n bucket.quota &&\n (await quotaExceeded(\n db,\n bucket.name,\n bucket.quota,\n context.user?.id,\n scopeJson,\n bucket.upload?.maxSizeBytes ?? 0,\n ))\n ) {\n throw new BunderstackError('PAYLOAD_TOO_LARGE', 'Quota exceeded')\n }\n\n const fileId = `${bucket.name}/${randomUUID()}${extname(body.filename ?? '')}`\n await insertPendingFile(db, {\n fileId,\n bucket: bucket.name,\n ownerId: context.user?.id ?? null,\n scopeJson,\n filename: body.filename ?? null,\n contentType: body.contentType ?? null,\n })\n const uploadUrl = await adapter.presignPut(fileId, {\n contentType: body.contentType,\n expiresIn: presignExpiresSec,\n })\n const id = fileId.slice(`${bucket.name}/`.length)\n return {\n mode: 'presign',\n fileId,\n uploadUrl,\n method: 'PUT',\n confirmUrl: `/api/files/${bucket.name}/${id}/confirm`,\n }\n },\n\n async upload(\n bucketName: string,\n file: File,\n context: StorageExecutionContext,\n ) {\n const { bucket, adapter } = bucketEntry(bucketName)\n const ctx = accessContext(context)\n await gate(bucket.access.create, ctx)\n\n if (!matchMime(file.type, bucket.upload?.accept)) {\n throw new BunderstackError(\n 'BAD_REQUEST',\n `Content type ${file.type || '(none)'} not allowed`,\n )\n }\n if (\n bucket.upload?.maxSizeBytes !== undefined &&\n file.size > bucket.upload.maxSizeBytes\n ) {\n throw new BunderstackError('PAYLOAD_TOO_LARGE', 'File too large')\n }\n\n const scopeJson = scopeToJson(bucket.readScope?.(ctx))\n if (\n bucket.quota &&\n (await quotaExceeded(\n db,\n bucket.name,\n bucket.quota,\n context.user?.id,\n scopeJson,\n file.size,\n ))\n ) {\n throw new BunderstackError('PAYLOAD_TOO_LARGE', 'Quota exceeded')\n }\n\n const fileId = `${bucket.name}/${randomUUID()}${extname(file.name)}`\n await adapter.upload(fileId, await file.arrayBuffer(), file.type)\n await insertReadyFile(db, {\n fileId,\n bucket: bucket.name,\n ownerId: context.user?.id ?? null,\n scopeJson,\n filename: file.name || null,\n contentType: file.type || null,\n size: file.size,\n })\n const id = fileId.slice(`${bucket.name}/`.length)\n return {\n status: 201 as const,\n fileId,\n url: `/api/files/${bucket.name}/${id}`,\n }\n },\n\n async confirmUpload(\n bucketName: string,\n id: string,\n context: StorageExecutionContext,\n ) {\n const { bucket, adapter } = bucketEntry(bucketName)\n const fileId = `${bucketName}/${id}`\n const row = await getFileMeta(db, fileId)\n if (!row || row.bucket !== bucketName) notFound()\n if (row.ownerId != null && row.ownerId !== (context.user?.id ?? null)) {\n throw new BunderstackError('FORBIDDEN', 'Forbidden')\n }\n\n const result = { fileId, url: `/api/files/${bucketName}/${id}` }\n if (row.status === 'ready') return result\n\n const info = await adapter.stat?.(fileId)\n if (!info) notFound()\n\n const rejectUpload = async (message: string, validation = false) => {\n await adapter.delete(fileId)\n await deleteFileMetaRow(db, fileId)\n throw new BunderstackError(\n validation ? 'BAD_REQUEST' : 'PAYLOAD_TOO_LARGE',\n message,\n )\n }\n if (\n bucket.upload?.maxSizeBytes !== undefined &&\n info.size > bucket.upload.maxSizeBytes\n ) {\n await rejectUpload('File too large')\n }\n if (!matchMime(info.contentType, bucket.upload?.accept)) {\n await rejectUpload(\n `Content type ${info.contentType || '(none)'} not allowed`,\n true,\n )\n }\n if (\n bucket.quota &&\n (await quotaExceeded(\n db,\n bucket.name,\n bucket.quota,\n row.ownerId ?? undefined,\n row.scopeJson,\n info.size,\n ))\n ) {\n await rejectUpload('Quota exceeded')\n }\n\n await markFileReady(db, fileId, info)\n return result\n },\n\n async download(\n bucketName: string,\n id: string,\n query: Record<string, string>,\n context: StorageExecutionContext,\n ): Promise<StorageDownload> {\n const { bucket, adapter } = bucketEntry(bucketName)\n const fileId = `${bucketName}/${id}`\n const row = await getFileMeta(db, fileId)\n if (!row || row.status !== 'ready' || row.bucket !== bucketName)\n notFound()\n\n const ctx = accessContext(context, { row })\n await gate(bucket.access.get, ctx)\n if (!fileMatchesScope(row, bucket.readScope?.(ctx))) notFound()\n\n const spec = parseTransformSpec(query)\n if (spec) {\n if (!bucket.transforms) {\n throw new BunderstackError(\n 'BAD_REQUEST',\n 'Transforms not enabled for this bucket',\n )\n }\n const ext = spec.format ? `.${spec.format}` : extname(fileId) || '.jpg'\n const cacheKey = `${fileId}__transforms/${transformHash(spec)}${ext}`\n if (await adapter.exists(cacheKey)) {\n const cached = await adapter.get(cacheKey)\n const headers = new Headers(cached.headers)\n headers.set('Cache-Control', 'public, max-age=31536000')\n return {\n kind: 'body',\n status: cached.status,\n body: cached.body,\n headers,\n }\n }\n\n const original = await adapter.get(fileId)\n if (original.status === 404) notFound()\n const transformed = await transformImage(\n Buffer.from(await original.arrayBuffer()),\n spec,\n )\n const contentType = spec.format\n ? `image/${spec.format}`\n : (original.headers.get('Content-Type') ?? 'image/jpeg')\n const body = Uint8Array.from(transformed).buffer\n await adapter.upload(cacheKey, body, contentType)\n return {\n kind: 'body',\n status: 200,\n body,\n headers: new Headers({\n 'Content-Type': contentType,\n 'Cache-Control': 'public, max-age=31536000',\n }),\n }\n }\n\n if (bucket.visibility === 'public' && adapter.publicUrlFor) {\n const url = adapter.publicUrlFor(fileId)\n if (url) return { kind: 'redirect', status: 302, url }\n }\n if (bucket.visibility === 'private' && adapter.presignGet) {\n return {\n kind: 'redirect',\n status: 302,\n url: await adapter.presignGet(fileId, {\n expiresIn: presignExpiresSec,\n }),\n }\n }\n\n const response = await adapter.get(fileId)\n const headers = new Headers(response.headers)\n if (response.status !== 404 && row.filename) {\n headers.set(\n 'Content-Disposition',\n `inline; filename=\"${sanitizeFilename(row.filename)}\"`,\n )\n }\n return {\n kind: 'body',\n status: response.status,\n body: response.body,\n headers,\n }\n },\n\n async delete(\n bucketName: string,\n id: string,\n context: StorageExecutionContext,\n ): Promise<void> {\n const { bucket, adapter } = bucketEntry(bucketName)\n const fileId = `${bucketName}/${id}`\n const row = await getFileMeta(db, fileId)\n if (!row || row.bucket !== bucketName) notFound()\n const ctx = accessContext(context, { row })\n await gate(bucket.access.delete, ctx)\n if (!fileMatchesScope(row, bucket.readScope?.(ctx))) notFound()\n await deleteFileWithDerivatives(adapter, db, fileId)\n },\n }\n}\n\nexport type StorageOperations = ReturnType<typeof createStorageOperations>\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/storage/registry.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,mBAAmB,EAAE,MAAM,SAAS,CAAA;AAC7C,OAAO,EAAE,gBAAgB,EAAE,MAAM,MAAM,CAAA;AAQvC,MAAM,UAAU,aAAa,CAAC,OAAwB;IACpD,IAAI,OAAO,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;QAC7B,OAAO,IAAI,mBAAmB,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;IAC9C,CAAC;IACD,OAAO,IAAI,gBAAgB,CAAC;QAC1B,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,WAAW,EAAE,OAAO,CAAC,WAAW;QAChC,eAAe,EAAE,OAAO,CAAC,eAAe;QACxC,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,SAAS,EAAE,OAAO,CAAC,SAAS;KAC7B,CAAC,CAAA;AACJ,CAAC;AAED,MAAM,UAAU,oBAAoB,CAClC,QAAgC;IAEhC,MAAM,QAAQ,GAA0B,IAAI,GAAG,EAAE,CAAA;IACjD,KAAK,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,QAAQ,CAAC,OAAO,EAAE,CAAC;QAC9C,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;IACxE,CAAC;IACD,OAAO,QAAQ,CAAA;AACjB,CAAC"}
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/storage/registry.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,mBAAmB,EAAE,MAAM,SAAS,CAAA;AAC7C,OAAO,EAAE,gBAAgB,EAAE,MAAM,MAAM,CAAA;AAQvC,MAAM,UAAU,aAAa,CAAC,OAAwB;IACpD,IAAI,OAAO,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;QAC7B,OAAO,IAAI,mBAAmB,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;IAC9C,CAAC;IACD,OAAO,IAAI,gBAAgB,CAAC;QAC1B,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,WAAW,EAAE,OAAO,CAAC,WAAW;QAChC,eAAe,EAAE,OAAO,CAAC,eAAe;QACxC,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,SAAS,EAAE,OAAO,CAAC,SAAS;KAC7B,CAAC,CAAA;AACJ,CAAC;AAED,MAAM,UAAU,oBAAoB,CAClC,QAAgC;IAEhC,MAAM,QAAQ,GAA0B,IAAI,GAAG,EAAE,CAAA;IACjD,KAAK,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,QAAQ,CAAC,OAAO,EAAE,CAAC;QAC9C,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;IACxE,CAAC;IACD,OAAO,QAAQ,CAAA;AACjB,CAAC","sourcesContent":["// src/storage/registry.ts\nimport type {\n ResolvedBackend,\n ResolvedBucket,\n ResolvedStorageBuckets,\n} from './buckets'\nimport type { StorageAdapter } from './index'\n\nimport { LocalStorageAdapter } from './local'\nimport { S3StorageAdapter } from './s3'\n\nexport interface BucketStorage {\n bucket: ResolvedBucket\n adapter: StorageAdapter\n}\nexport type BucketStorageRegistry = Map<string, BucketStorage>\n\nexport function createAdapter(backend: ResolvedBackend): StorageAdapter {\n if (backend.type === 'local') {\n return new LocalStorageAdapter(backend.path)\n }\n return new S3StorageAdapter({\n bucket: backend.bucket,\n region: backend.region,\n accessKeyId: backend.accessKeyId,\n secretAccessKey: backend.secretAccessKey,\n endpoint: backend.endpoint,\n publicUrl: backend.publicUrl,\n })\n}\n\nexport function createBucketStorages(\n resolved: ResolvedStorageBuckets,\n): BucketStorageRegistry {\n const registry: BucketStorageRegistry = new Map()\n for (const [name, bucket] of resolved.buckets) {\n registry.set(name, { bucket, adapter: createAdapter(bucket.backend) })\n }\n return registry\n}\n"]}
|
package/dist/storage/s3.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"s3.js","sourceRoot":"","sources":["../../src/storage/s3.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"s3.js","sourceRoot":"","sources":["../../src/storage/s3.ts"],"names":[],"mappings":"AAgBA,MAAM,OAAO,gBAAgB;IACnB,MAAM,CAAmC;IAChC,SAAS,CAAS;IAEnC,YAAY,GAAa;QACvB,IAAI,CAAC,MAAM,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC;YAC7B,MAAM,EAAE,GAAG,CAAC,MAAM;YAClB,MAAM,EAAE,GAAG,CAAC,MAAM;YAClB,WAAW,EAAE,GAAG,CAAC,WAAW;YAC5B,eAAe,EAAE,GAAG,CAAC,eAAe;YACpC,GAAG,CAAC,GAAG,CAAC,QAAQ,IAAI,EAAE,QAAQ,EAAE,GAAG,CAAC,QAAQ,EAAE,CAAC;SAChD,CAAC,CAAA;QACF,IAAI,CAAC,SAAS,GAAG,GAAG,CAAC,SAAS,CAAA;IAChC,CAAC;IAED,KAAK,CAAC,MAAM,CACV,MAAc,EACd,IAAwB,EACxB,WAAmB;QAEnB,MAAM,KAAK,GAAG,IAAI,YAAY,IAAI,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,IAAI,CAAA;QACpE,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,CAAA;IAC/D,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,MAAc;QACtB,sEAAsE;QACtE,uEAAuE;QACvE,uEAAuE;QACvE,6BAA6B;QAC7B,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;QACpC,IAAI,CAAC,IAAI;YAAE,OAAO,IAAI,QAAQ,CAAC,WAAW,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAA;QAC5D,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;QACrC,OAAO,IAAI,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE;YACjC,OAAO,EAAE;gBACP,cAAc,EAAE,IAAI,CAAC,WAAW,IAAI,0BAA0B;aAC/D;SACF,CAAC,CAAA;IACJ,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,MAAc;QACzB,MAAM,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;IAClC,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,MAAc;QACzB,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;IACnC,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,GAAW,EAAE,IAAuB;QACnD,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE;YAC9B,MAAM,EAAE,KAAK;YACb,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,GAAG,CAAC,IAAI,CAAC,WAAW,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC;SACpD,CAAC,CAAA;IACJ,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,GAAW,EAAE,IAAuB;QACnD,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE;YAC9B,MAAM,EAAE,KAAK;YACb,SAAS,EAAE,IAAI,CAAC,SAAS;SAC1B,CAAC,CAAA;IACJ,CAAC;IAED,KAAK,CAAC,IAAI,CACR,GAAW;QAEX,IAAI,CAAC;YACH,MAAM,CAAC,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;YACrC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,WAAW,EAAE,CAAC,CAAC,IAAI,EAAE,CAAA;QAC9C,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAA;QACb,CAAC;IACH,CAAC;IAED,YAAY,CAAC,GAAW;QACtB,IAAI,CAAC,IAAI,CAAC,SAAS;YAAE,OAAO,SAAS,CAAA;QACrC,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,GAAG,EAAE,CAAA;IACtD,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,MAAc;QACvB,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC,CAAA;QAC9C,OAAO,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,EAAE,CAAA;IAC9C,CAAC;CACF","sourcesContent":["// src/storage/s3.ts\nimport type {\n PresignGetOptions,\n PresignPutOptions,\n StorageAdapter,\n} from './index'\n\ninterface S3Config {\n bucket: string\n region: string\n accessKeyId: string\n secretAccessKey: string\n endpoint?: string\n publicUrl?: string\n}\n\nexport class S3StorageAdapter implements StorageAdapter {\n private client: InstanceType<typeof Bun.S3Client>\n private readonly publicUrl?: string\n\n constructor(cfg: S3Config) {\n this.client = new Bun.S3Client({\n bucket: cfg.bucket,\n region: cfg.region,\n accessKeyId: cfg.accessKeyId,\n secretAccessKey: cfg.secretAccessKey,\n ...(cfg.endpoint && { endpoint: cfg.endpoint }),\n })\n this.publicUrl = cfg.publicUrl\n }\n\n async upload(\n fileId: string,\n data: Blob | ArrayBuffer,\n contentType: string,\n ): Promise<void> {\n const bytes = data instanceof Blob ? await data.arrayBuffer() : data\n await this.client.write(fileId, bytes, { type: contentType })\n }\n\n async get(fileId: string): Promise<Response> {\n // `stat` (a HEAD, same cost as `exists`) is the only way to learn the\n // stored Content-Type: a lazily-constructed `client.file(key)` reports\n // `type: \"\"` — it never stats, and unlike `Bun.file` it does not guess\n // from the extension either.\n const info = await this.stat(fileId)\n if (!info) return new Response('Not found', { status: 404 })\n const file = this.client.file(fileId)\n return new Response(file.stream(), {\n headers: {\n 'Content-Type': info.contentType || 'application/octet-stream',\n },\n })\n }\n\n async delete(fileId: string): Promise<void> {\n await this.client.delete(fileId)\n }\n\n async exists(fileId: string): Promise<boolean> {\n return this.client.exists(fileId)\n }\n\n async presignPut(key: string, opts: PresignPutOptions): Promise<string> {\n return this.client.presign(key, {\n method: 'PUT',\n expiresIn: opts.expiresIn,\n ...(opts.contentType && { type: opts.contentType }),\n })\n }\n\n async presignGet(key: string, opts: PresignGetOptions): Promise<string> {\n return this.client.presign(key, {\n method: 'GET',\n expiresIn: opts.expiresIn,\n })\n }\n\n async stat(\n key: string,\n ): Promise<{ size: number; contentType: string } | null> {\n try {\n const s = await this.client.stat(key)\n return { size: s.size, contentType: s.type }\n } catch {\n return null\n }\n }\n\n publicUrlFor(key: string): string | undefined {\n if (!this.publicUrl) return undefined\n return `${this.publicUrl.replace(/\\/$/, '')}/${key}`\n }\n\n async list(prefix: string): Promise<string[]> {\n const res = await this.client.list({ prefix })\n return res.contents?.map((c) => c.key) ?? []\n }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sweep.js","sourceRoot":"","sources":["../../src/storage/sweep.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAA;AAEtE;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,QAA+B,EAC/B,EAAS,EACT,WAAmB;IAEnB,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,WAAW,CAAA;IACvC,MAAM,IAAI,GAAG,MAAM,qBAAqB,CAAC,EAAE,EAAE,MAAM,CAAC,CAAA;IACpD,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,OAAO,CAAA;QACjD,MAAM,OAAO,EAAE,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAA;QACjD,MAAM,iBAAiB,CAAC,EAAE,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;IACzC,CAAC;IACD,OAAO,IAAI,CAAC,MAAM,CAAA;AACpB,CAAC"}
|
|
1
|
+
{"version":3,"file":"sweep.js","sourceRoot":"","sources":["../../src/storage/sweep.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAA;AAEtE;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,QAA+B,EAC/B,EAAS,EACT,WAAmB;IAEnB,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,WAAW,CAAA;IACvC,MAAM,IAAI,GAAG,MAAM,qBAAqB,CAAC,EAAE,EAAE,MAAM,CAAC,CAAA;IACpD,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,OAAO,CAAA;QACjD,MAAM,OAAO,EAAE,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAA;QACjD,MAAM,iBAAiB,CAAC,EAAE,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;IACzC,CAAC;IACD,OAAO,IAAI,CAAC,MAAM,CAAA;AACpB,CAAC","sourcesContent":["// src/storage/sweep.ts\nimport type { AnyDb } from '../dialect'\nimport type { BucketStorageRegistry } from './registry'\n\nimport { deleteFileMetaRow, listStalePendingFiles } from './file-meta'\n\n/**\n * Reap stale `pending` file-meta rows (two-phase uploads that never confirmed)\n * older than `olderThanMs`. For each, best-effort delete the object (it may\n * never have landed) then remove the meta row. Returns the number reaped.\n */\nexport async function sweepOrphans(\n registry: BucketStorageRegistry,\n db: AnyDb,\n olderThanMs: number,\n): Promise<number> {\n const cutoff = Date.now() - olderThanMs\n const rows = await listStalePendingFiles(db, cutoff)\n for (const row of rows) {\n const adapter = registry.get(row.bucket)?.adapter\n await adapter?.delete(row.fileId).catch(() => {})\n await deleteFileMetaRow(db, row.fileId)\n }\n return rows.length\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"thumbnails.js","sourceRoot":"","sources":["../../src/storage/thumbnails.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AA+BxC,SAAS,gBAAgB;IACvB,MAAM,IAAI,GAAI,GAAkD,CAAC,KAAK,CAAA;IACtE,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,MAAM,IAAI,KAAK,CACb,4HAA4H,CAC7H,CAAA;IACH,CAAC;IACD,OAAO,IAAI,CAAA;AACb,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,KAAa,EACb,IAAmB;IAEnB,MAAM,KAAK,GAAG,gBAAgB,EAAE,CAAA;IAChC,IAAI,GAAG,GAAG,IAAI,KAAK,CAAC,KAAK,CAAC,CAAA;IAE1B,IAAI,IAAI,CAAC,CAAC,KAAK,SAAS,IAAI,IAAI,CAAC,CAAC,KAAK,SAAS,EAAE,CAAC;QACjD,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,IAAI,MAAM,EAAE,CAAC,CAAA;IAC/D,CAAC;SAAM,IAAI,IAAI,CAAC,CAAC,KAAK,SAAS,EAAE,CAAC;QAChC,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IAC1B,CAAC;SAAM,IAAI,IAAI,CAAC,CAAC,KAAK,SAAS,EAAE,CAAC;QAChC,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAA;IAC7B,CAAC;IAED,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,CAAA;IACtB,QAAQ,IAAI,CAAC,MAAM,EAAE,CAAC;QACpB,KAAK,MAAM;YACT,OAAO,GAAG,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,CAAA;QAC1C,KAAK,KAAK;YACR,OAAO,GAAG,CAAC,GAAG,EAAE,CAAC,MAAM,EAAE,CAAA;QAC3B,KAAK,MAAM;YACT,OAAO,GAAG,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,CAAA;QAC1C;YACE,OAAO,GAAG,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,CAAA;IAC5C,CAAC;AACH,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,IAAmB;IAC/C,OAAO,UAAU,CAAC,QAAQ,CAAC;SACxB,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;SAC5B,MAAM,CAAC,KAAK,CAAC;SACb,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;AACjB,CAAC;AAED,MAAM,UAAU,kBAAkB,CAChC,KAA6B;IAE7B,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,KAAK,CAAA;IAC5C,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,MAAM,IAAI,CAAC,OAAO;QAAE,OAAO,IAAI,CAAA;IAExD,MAAM,IAAI,GAAkB,EAAE,CAAA;IAC9B,IAAI,CAAC;QAAE,IAAI,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAA;IACzB,IAAI,CAAC;QAAE,IAAI,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAA;IACzB,IAAI,GAAG,KAAK,MAAM,IAAI,GAAG,KAAK,QAAQ;QAAE,IAAI,CAAC,GAAG,GAAG,GAAG,CAAA;IACtD,IACE,MAAM,KAAK,MAAM;QACjB,MAAM,KAAK,MAAM;QACjB,MAAM,KAAK,KAAK;QAChB,MAAM,KAAK,MAAM,EACjB,CAAC;QACD,IAAI,CAAC,MAAM,GAAG,MAAM,CAAA;IACtB,CAAC;IACD,IAAI,OAAO;QAAE,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAA;IACvE,OAAO,IAAI,CAAA;AACb,CAAC"}
|
|
1
|
+
{"version":3,"file":"thumbnails.js","sourceRoot":"","sources":["../../src/storage/thumbnails.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AA+BxC,SAAS,gBAAgB;IACvB,MAAM,IAAI,GAAI,GAAkD,CAAC,KAAK,CAAA;IACtE,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,MAAM,IAAI,KAAK,CACb,4HAA4H,CAC7H,CAAA;IACH,CAAC;IACD,OAAO,IAAI,CAAA;AACb,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,KAAa,EACb,IAAmB;IAEnB,MAAM,KAAK,GAAG,gBAAgB,EAAE,CAAA;IAChC,IAAI,GAAG,GAAG,IAAI,KAAK,CAAC,KAAK,CAAC,CAAA;IAE1B,IAAI,IAAI,CAAC,CAAC,KAAK,SAAS,IAAI,IAAI,CAAC,CAAC,KAAK,SAAS,EAAE,CAAC;QACjD,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,IAAI,MAAM,EAAE,CAAC,CAAA;IAC/D,CAAC;SAAM,IAAI,IAAI,CAAC,CAAC,KAAK,SAAS,EAAE,CAAC;QAChC,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IAC1B,CAAC;SAAM,IAAI,IAAI,CAAC,CAAC,KAAK,SAAS,EAAE,CAAC;QAChC,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAA;IAC7B,CAAC;IAED,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,CAAA;IACtB,QAAQ,IAAI,CAAC,MAAM,EAAE,CAAC;QACpB,KAAK,MAAM;YACT,OAAO,GAAG,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,CAAA;QAC1C,KAAK,KAAK;YACR,OAAO,GAAG,CAAC,GAAG,EAAE,CAAC,MAAM,EAAE,CAAA;QAC3B,KAAK,MAAM;YACT,OAAO,GAAG,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,CAAA;QAC1C;YACE,OAAO,GAAG,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,CAAA;IAC5C,CAAC;AACH,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,IAAmB;IAC/C,OAAO,UAAU,CAAC,QAAQ,CAAC;SACxB,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;SAC5B,MAAM,CAAC,KAAK,CAAC;SACb,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;AACjB,CAAC;AAED,MAAM,UAAU,kBAAkB,CAChC,KAA6B;IAE7B,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,KAAK,CAAA;IAC5C,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,MAAM,IAAI,CAAC,OAAO;QAAE,OAAO,IAAI,CAAA;IAExD,MAAM,IAAI,GAAkB,EAAE,CAAA;IAC9B,IAAI,CAAC;QAAE,IAAI,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAA;IACzB,IAAI,CAAC;QAAE,IAAI,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAA;IACzB,IAAI,GAAG,KAAK,MAAM,IAAI,GAAG,KAAK,QAAQ;QAAE,IAAI,CAAC,GAAG,GAAG,GAAG,CAAA;IACtD,IACE,MAAM,KAAK,MAAM;QACjB,MAAM,KAAK,MAAM;QACjB,MAAM,KAAK,KAAK;QAChB,MAAM,KAAK,MAAM,EACjB,CAAC;QACD,IAAI,CAAC,MAAM,GAAG,MAAM,CAAA;IACtB,CAAC;IACD,IAAI,OAAO;QAAE,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAA;IACvE,OAAO,IAAI,CAAA;AACb,CAAC","sourcesContent":["import { createHash } from 'node:crypto'\n\nexport interface TransformSpec {\n w?: number\n h?: number\n fit?: 'fill' | 'inside'\n format?: 'webp' | 'jpeg' | 'png' | 'avif'\n quality?: number\n}\n\n/**\n * `Bun.Image` is newer than some `bun-types` releases, and this file is shipped\n * as source — typing it against the ambient `Bun` namespace turns a consumer's\n * older types into a compile error in their build. Declaring the slice we use\n * keeps this file compiling on any `bun-types`, and the runtime check reports a\n * too-old Bun instead of `undefined is not a constructor`.\n */\ninterface BunImage {\n resize(\n width: number,\n height?: number,\n options?: { fit?: 'fill' | 'inside' },\n ): BunImage\n webp(options?: { quality?: number }): { buffer(): Promise<Buffer> }\n jpeg(options?: { quality?: number }): { buffer(): Promise<Buffer> }\n png(): { buffer(): Promise<Buffer> }\n avif(options?: { quality?: number }): { buffer(): Promise<Buffer> }\n}\n\ntype BunImageConstructor = new (input: Buffer) => BunImage\n\nfunction imageConstructor(): BunImageConstructor {\n const ctor = (Bun as unknown as { Image?: BunImageConstructor }).Image\n if (!ctor) {\n throw new Error(\n '[bunderstack] image transforms need Bun.Image — upgrade Bun (>= 1.3) or request the original file without transform params',\n )\n }\n return ctor\n}\n\nexport async function transformImage(\n input: Buffer,\n spec: TransformSpec,\n): Promise<Buffer> {\n const Image = imageConstructor()\n let img = new Image(input)\n\n if (spec.w !== undefined && spec.h !== undefined) {\n img = img.resize(spec.w, spec.h, { fit: spec.fit ?? 'fill' })\n } else if (spec.w !== undefined) {\n img = img.resize(spec.w)\n } else if (spec.h !== undefined) {\n img = img.resize(0, spec.h)\n }\n\n const q = spec.quality\n switch (spec.format) {\n case 'webp':\n return img.webp({ quality: q }).buffer()\n case 'png':\n return img.png().buffer()\n case 'avif':\n return img.avif({ quality: q }).buffer()\n default:\n return img.jpeg({ quality: q }).buffer()\n }\n}\n\nexport function transformHash(spec: TransformSpec): string {\n return createHash('sha256')\n .update(JSON.stringify(spec))\n .digest('hex')\n .slice(0, 16)\n}\n\nexport function parseTransformSpec(\n query: Record<string, string>,\n): TransformSpec | null {\n const { w, h, fit, format, quality } = query\n if (!w && !h && !fit && !format && !quality) return null\n\n const spec: TransformSpec = {}\n if (w) spec.w = Number(w)\n if (h) spec.h = Number(h)\n if (fit === 'fill' || fit === 'inside') spec.fit = fit\n if (\n format === 'webp' ||\n format === 'jpeg' ||\n format === 'png' ||\n format === 'avif'\n ) {\n spec.format = format\n }\n if (quality) spec.quality = Math.min(100, Math.max(1, Number(quality)))\n return spec\n}\n"]}
|
package/dist/testing.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"testing.js","sourceRoot":"","sources":["../src/testing.ts"],"names":[],"mappings":"AAAA,gEAAgE;AAYhE;;GAEG;AACH,MAAM,UAAU,eAAe,CAG7B,GAAuB,EACvB,QAGS;IAET,MAAM,IAAI,GAAG,GAAG,CAAC,IAA0C,CAAA;IAC3D,IAAI,IAAI,EAAE,GAAG,EAAE,CAAC;QACd,IAAI,CAAC,GAAG,CAAC,UAAU,GAAG,QAEA,CAAA;IACxB,CAAC;AACH,CAAC"}
|
|
1
|
+
{"version":3,"file":"testing.js","sourceRoot":"","sources":["../src/testing.ts"],"names":[],"mappings":"AAAA,gEAAgE;AAYhE;;GAEG;AACH,MAAM,UAAU,eAAe,CAG7B,GAAuB,EACvB,QAGS;IAET,MAAM,IAAI,GAAG,GAAG,CAAC,IAA0C,CAAA;IAC3D,IAAI,IAAI,EAAE,GAAG,EAAE,CAAC;QACd,IAAI,CAAC,GAAG,CAAC,UAAU,GAAG,QAEA,CAAA;IACxB,CAAC;AACH,CAAC","sourcesContent":["// src/testing.ts — test utilities for Bunderstack applications.\n\nexport type AuthSessionResolverLike = {\n api: {\n getSession: (opts: { headers: Headers }) => Promise<unknown>\n }\n}\n\nexport type BunderstackAppLike = {\n auth: unknown\n}\n\n/**\n * Mock the auth session resolver on a Bunderstack app instance for unit testing.\n */\nexport function mockAuthSession<\n TUser extends { id: string; email: string; name?: string; role?: string },\n>(\n app: BunderstackAppLike,\n resolver: (opts: { headers: Headers }) => Promise<{\n user: TUser\n session?: { activeOrganizationId?: string | null } | null\n } | null>,\n): void {\n const auth = app.auth as unknown as AuthSessionResolverLike\n if (auth?.api) {\n auth.api.getSession = resolver as unknown as (opts: {\n headers: Headers\n }) => Promise<unknown>\n }\n}\n"]}
|
package/dist/typeid-pg.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"typeid-pg.js","sourceRoot":"","sources":["../src/typeid-pg.ts"],"names":[],"mappings":"AAAA,2EAA2E;AAC3E,2EAA2E;AAC3E,+CAA+C;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAA;AAEhD,OAAO,EAAE,aAAa,EAAe,MAAM,UAAU,CAAA;AAErD;;;;;;GAMG;AACH,MAAM,UAAU,MAAM,CAAmB,MAAS;IAChD,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC;QACxB,MAAM,IAAI,KAAK,CAAC,2BAA2B,MAAM,GAAG,CAAC,CAAA;IACvD,OAAO,UAAU,CAA0C;QACzD,QAAQ,EAAE,GAAG,EAAE,CAAC,MAAM;KACvB,CAAC,EAAE,CAAA;AACN,CAAC;AAED,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,UAAU,CAAA"}
|
|
1
|
+
{"version":3,"file":"typeid-pg.js","sourceRoot":"","sources":["../src/typeid-pg.ts"],"names":[],"mappings":"AAAA,2EAA2E;AAC3E,2EAA2E;AAC3E,+CAA+C;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAA;AAEhD,OAAO,EAAE,aAAa,EAAe,MAAM,UAAU,CAAA;AAErD;;;;;;GAMG;AACH,MAAM,UAAU,MAAM,CAAmB,MAAS;IAChD,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC;QACxB,MAAM,IAAI,KAAK,CAAC,2BAA2B,MAAM,GAAG,CAAC,CAAA;IACvD,OAAO,UAAU,CAA0C;QACzD,QAAQ,EAAE,GAAG,EAAE,CAAC,MAAM;KACvB,CAAC,EAAE,CAAA;AACN,CAAC;AAED,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,UAAU,CAAA","sourcesContent":["// src/typeid-pg.ts — Postgres twin of the typeid column builder. The codec\n// (generate/parse/encode/decode) is dialect-neutral and lives in ./typeid;\n// only the drizzle customType wrapper differs.\nimport { customType } from 'drizzle-orm/pg-core'\n\nimport { isValidPrefix, type TypeId } from './typeid'\n\n/**\n * Drizzle column builder for a branded TypeID text value (Postgres). Stores a\n * plain `text` column so drizzle-kit migrations and `$inferSelect` work\n * unchanged.\n *\n * id: typeid('post').primaryKey().$defaultFn(() => generate('post'))\n */\nexport function typeid<P extends string>(prefix: P) {\n if (!isValidPrefix(prefix))\n throw new Error(`Invalid typeid prefix: \"${prefix}\"`)\n return customType<{ data: TypeId<P>; driverData: string }>({\n dataType: () => 'text',\n })()\n}\n\nexport { generate, parse, asTypeId, encode, decode } from './typeid'\nexport type { TypeId } from './typeid'\n"]}
|
package/dist/typeid.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"typeid.js","sourceRoot":"","sources":["../src/typeid.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"typeid.js","sourceRoot":"","sources":["../src/typeid.ts"],"names":[],"mappings":"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","sourcesContent":["// src/typeid.ts\n//\n// Zero-dependency TypeID implementation (https://github.com/jetify-com/typeid).\n// Stripe-style prefixed, k-sortable identifiers: `prefix_<26-char base32 UUIDv7>`.\n// The only runtime primitive we need is the raw UUIDv7 bytes, which Bun gives us\n// natively via `Bun.randomUUIDv7(\"buffer\")` — so we don't pull in the `uuid` dep\n// that the reference `typeid-js` package relies on.\n\nimport { customType } from 'drizzle-orm/sqlite-core'\n\n// Crockford base32 alphabet (lowercase, excludes i/l/o/u), as used by the TypeID spec.\nconst ALPHABET = '0123456789abcdefghjkmnpqrstvwxyz'\n\n// Spec prefix rules: lowercase ascii, underscores allowed only internally, 1–63 chars.\nconst PREFIX_RE = /^[a-z]([a-z_]{0,61}[a-z])?$/\n// 26 base32 chars from the alphabet above.\nconst SUFFIX_RE = /^[0-9a-hjkmnp-tv-z]{26}$/\n\ndeclare const typeIdBrand: unique symbol\n\n/** A branded TypeID string. `TypeId<'post'>` is incompatible with `TypeId<'user'>`. */\nexport type TypeId<P extends string> = string & { readonly [typeIdBrand]?: P }\n\n/** Encode a 16-byte UUID into the 26-character base32 suffix. */\nexport function encode(bytes: Uint8Array): string {\n // First two chars cover byte 0: top 3 bits, then low 5 bits.\n let out = ALPHABET[bytes[0]! >> 5]! + ALPHABET[bytes[0]! & 31]!\n // Remaining 15 bytes (120 bits) → 24 groups of 5 bits.\n let buf = 0n\n for (let i = 1; i < 16; i++) buf = (buf << 8n) | BigInt(bytes[i]!)\n const chars: string[] = []\n for (let i = 0; i < 24; i++) {\n chars.push(ALPHABET[Number((buf >> (BigInt(23 - i) * 5n)) & 31n)]!)\n }\n return out + chars.join('')\n}\n\n/** Decode a 26-character base32 suffix back into the original 16 UUID bytes. */\nexport function decode(suffix: string): Uint8Array {\n const map: Record<string, number> = {}\n for (let i = 0; i < ALPHABET.length; i++) map[ALPHABET[i]!] = i\n const bytes = new Uint8Array(16)\n bytes[0] = (map[suffix[0]!]! << 5) | map[suffix[1]!]!\n let buf = 0n\n for (let i = 2; i < 26; i++) buf = (buf << 5n) | BigInt(map[suffix[i]!]!)\n for (let i = 0; i < 15; i++)\n bytes[15 - i] = Number((buf >> BigInt(i * 8)) & 0xffn)\n return bytes\n}\n\n/** Whether a string is a valid, non-empty TypeID prefix. */\nexport function isValidPrefix(prefix: string): boolean {\n return PREFIX_RE.test(prefix)\n}\n\nfunction bytesToUuid(bytes: Uint8Array): string {\n const hex = Array.from(bytes, (b) => b.toString(16).padStart(2, '0')).join('')\n return `${hex.slice(0, 8)}-${hex.slice(8, 12)}-${hex.slice(12, 16)}-${hex.slice(16, 20)}-${hex.slice(20)}`\n}\n\n/** Generate a new, branded TypeID for the given prefix. */\nexport function generate<P extends string>(prefix: P): TypeId<P> {\n if (!isValidPrefix(prefix))\n throw new Error(`Invalid typeid prefix: \"${prefix}\"`)\n const bytes = Bun.randomUUIDv7('buffer')\n return `${prefix}_${encode(bytes)}` as TypeId<P>\n}\n\n/**\n * Parse a TypeID into its parts and the decoded UUID. Throws if the id is\n * malformed or — when `expectedPrefix` is given — if the prefix does not match.\n */\nexport function parse<P extends string>(\n id: string,\n expectedPrefix?: P,\n): { prefix: string; suffix: string; uuid: string } {\n const sep = id.lastIndexOf('_')\n if (sep <= 0) throw new Error(`Malformed typeid: \"${id}\"`)\n const prefix = id.slice(0, sep)\n const suffix = id.slice(sep + 1)\n if (!isValidPrefix(prefix))\n throw new Error(`Malformed typeid prefix: \"${id}\"`)\n if (!SUFFIX_RE.test(suffix))\n throw new Error(`Malformed typeid suffix: \"${id}\"`)\n if (expectedPrefix !== undefined && prefix !== expectedPrefix) {\n throw new Error(\n `Expected typeid prefix \"${expectedPrefix}\" but got \"${prefix}\"`,\n )\n }\n return { prefix, suffix, uuid: bytesToUuid(decode(suffix)) }\n}\n\n/**\n * Escape hatch: validate a raw string against a prefix and brand it as a TypeID.\n * Use at trust boundaries (e.g. a raw URL param) where the string isn't yet typed.\n */\nexport function asTypeId<P extends string>(prefix: P, raw: string): TypeId<P> {\n parse(raw, prefix)\n return raw as TypeId<P>\n}\n\n/**\n * Drizzle column builder for a branded TypeID text value. Stores a plain `text`\n * column so drizzle-kit migrations and `$inferSelect` work unchanged.\n *\n * Use Drizzle's `$defaultFn` when a column should generate IDs on insert:\n *\n * id: typeid('post').primaryKey().$defaultFn(() => generate('post'))\n */\nexport function typeid<P extends string>(prefix: P) {\n if (!isValidPrefix(prefix))\n throw new Error(`Invalid typeid prefix: \"${prefix}\"`)\n return customType<{ data: TypeId<P>; driverData: string }>({\n dataType: () => 'text',\n })()\n}\n"]}
|
package/llms.txt
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
BUNDERSTACK
|
|
2
2
|
|
|
3
3
|
A batteries-included backend framework for Bun. Version 0.17 (beta).
|
|
4
|
-
Docs: https://bunderstack.dev/docs
|
|
4
|
+
Docs: https://bunderstack.kcrz.dev/docs
|
|
5
5
|
This file is written for coding agents. It is dense on purpose.
|
|
6
6
|
|
|
7
7
|
WHAT IT IS
|
|
@@ -13,7 +13,7 @@ subscriptions, and a health check live in the same oRPC graph, reachable both
|
|
|
13
13
|
as typed RPC and as ordinary HTTP.
|
|
14
14
|
|
|
15
15
|
Stack: Bun, Drizzle (+ drizzle-kit), Better Auth, oRPC v2, libSQL or Postgres,
|
|
16
|
-
|
|
16
|
+
Bun.Image. Validation accepts any Standard Schema library; generated schemas use
|
|
17
17
|
Valibot. There is no Hono, no tRPC, and no Zod requirement.
|
|
18
18
|
|
|
19
19
|
Packages: bunderstack (server), bunderstack-query (client + TanStack Query),
|
|
@@ -303,7 +303,7 @@ STORAGE
|
|
|
303
303
|
}
|
|
304
304
|
|
|
305
305
|
Canonical URL: /api/files/{bucket}/{+path}. transforms: true enables on-the-fly
|
|
306
|
-
image derivatives through
|
|
306
|
+
image derivatives through Bun.Image. app.storage exposes delete, bucket, sweep,
|
|
307
307
|
getUrl, and upload for server-generated files.
|
|
308
308
|
|
|
309
309
|
REALTIME
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "bunderstack",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.19.1",
|
|
4
4
|
"description": "Batteries-included backend framework for Bun: type-safe oRPC APIs, auth, storage, realtime, jobs, email, and validated env from one config.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"backend",
|
|
@@ -60,6 +60,10 @@
|
|
|
60
60
|
"types": "./dist/database/postgres-js.d.ts",
|
|
61
61
|
"default": "./dist/database/postgres-js.js"
|
|
62
62
|
},
|
|
63
|
+
"./live": {
|
|
64
|
+
"types": "./dist/live/index.d.ts",
|
|
65
|
+
"default": "./dist/live/index.js"
|
|
66
|
+
},
|
|
63
67
|
"./provision": {
|
|
64
68
|
"types": "./dist/provision.d.ts",
|
|
65
69
|
"default": "./dist/provision.js"
|
|
@@ -107,7 +111,7 @@
|
|
|
107
111
|
"db:push": "drizzle-kit push",
|
|
108
112
|
"dev": "bun --hot ../../examples/standalone/server.ts",
|
|
109
113
|
"prepack": "bun run build",
|
|
110
|
-
"test": "bun test",
|
|
114
|
+
"test": "bun test --parallel --timeout=30000",
|
|
111
115
|
"typecheck": "tsc --noEmit"
|
|
112
116
|
},
|
|
113
117
|
"dependencies": {
|