@cogenta/core 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (193) hide show
  1. package/dist/cache/entry.d.ts +32 -0
  2. package/dist/cache/entry.d.ts.map +1 -0
  3. package/dist/cache/entry.js +72 -0
  4. package/dist/cache/entry.js.map +1 -0
  5. package/dist/cache/file.d.ts +16 -0
  6. package/dist/cache/file.d.ts.map +1 -0
  7. package/dist/cache/file.js +191 -0
  8. package/dist/cache/file.js.map +1 -0
  9. package/dist/cache/index.d.ts +20 -0
  10. package/dist/cache/index.d.ts.map +1 -0
  11. package/dist/cache/index.js +25 -0
  12. package/dist/cache/index.js.map +1 -0
  13. package/dist/cache/memory.d.ts +11 -0
  14. package/dist/cache/memory.d.ts.map +1 -0
  15. package/dist/cache/memory.js +89 -0
  16. package/dist/cache/memory.js.map +1 -0
  17. package/dist/cache/redis.d.ts +54 -0
  18. package/dist/cache/redis.d.ts.map +1 -0
  19. package/dist/cache/redis.js +167 -0
  20. package/dist/cache/redis.js.map +1 -0
  21. package/dist/cache/types.d.ts +37 -0
  22. package/dist/cache/types.d.ts.map +1 -0
  23. package/dist/cache/types.js +2 -0
  24. package/dist/cache/types.js.map +1 -0
  25. package/dist/config/define-config.d.ts +19 -0
  26. package/dist/config/define-config.d.ts.map +1 -0
  27. package/dist/config/define-config.js +20 -0
  28. package/dist/config/define-config.js.map +1 -0
  29. package/dist/config/env.d.ts +30 -0
  30. package/dist/config/env.d.ts.map +1 -0
  31. package/dist/config/env.js +139 -0
  32. package/dist/config/env.js.map +1 -0
  33. package/dist/config/index.d.ts +7 -0
  34. package/dist/config/index.d.ts.map +1 -0
  35. package/dist/config/index.js +5 -0
  36. package/dist/config/index.js.map +1 -0
  37. package/dist/config/load-config.d.ts +30 -0
  38. package/dist/config/load-config.d.ts.map +1 -0
  39. package/dist/config/load-config.js +83 -0
  40. package/dist/config/load-config.js.map +1 -0
  41. package/dist/config/resolve-config.d.ts +14 -0
  42. package/dist/config/resolve-config.d.ts.map +1 -0
  43. package/dist/config/resolve-config.js +146 -0
  44. package/dist/config/resolve-config.js.map +1 -0
  45. package/dist/config/schema.d.ts +68 -0
  46. package/dist/config/schema.d.ts.map +1 -0
  47. package/dist/config/schema.js +75 -0
  48. package/dist/config/schema.js.map +1 -0
  49. package/dist/config/types.d.ts +126 -0
  50. package/dist/config/types.d.ts.map +1 -0
  51. package/dist/config/types.js +6 -0
  52. package/dist/config/types.js.map +1 -0
  53. package/dist/db/dialect.d.ts +64 -0
  54. package/dist/db/dialect.d.ts.map +1 -0
  55. package/dist/db/dialect.js +147 -0
  56. package/dist/db/dialect.js.map +1 -0
  57. package/dist/db/drizzle.d.ts +35 -0
  58. package/dist/db/drizzle.d.ts.map +1 -0
  59. package/dist/db/drizzle.js +128 -0
  60. package/dist/db/drizzle.js.map +1 -0
  61. package/dist/db/index.d.ts +28 -0
  62. package/dist/db/index.d.ts.map +1 -0
  63. package/dist/db/index.js +30 -0
  64. package/dist/db/index.js.map +1 -0
  65. package/dist/db/mysql.d.ts +39 -0
  66. package/dist/db/mysql.d.ts.map +1 -0
  67. package/dist/db/mysql.js +224 -0
  68. package/dist/db/mysql.js.map +1 -0
  69. package/dist/db/postgres.d.ts +47 -0
  70. package/dist/db/postgres.d.ts.map +1 -0
  71. package/dist/db/postgres.js +174 -0
  72. package/dist/db/postgres.js.map +1 -0
  73. package/dist/db/sqlite.d.ts +41 -0
  74. package/dist/db/sqlite.d.ts.map +1 -0
  75. package/dist/db/sqlite.js +213 -0
  76. package/dist/db/sqlite.js.map +1 -0
  77. package/dist/db/types.d.ts +71 -0
  78. package/dist/db/types.d.ts.map +1 -0
  79. package/dist/db/types.js +2 -0
  80. package/dist/db/types.js.map +1 -0
  81. package/dist/drivers/index.d.ts +5 -0
  82. package/dist/drivers/index.d.ts.map +1 -0
  83. package/dist/drivers/index.js +3 -0
  84. package/dist/drivers/index.js.map +1 -0
  85. package/dist/drivers/registry.d.ts +27 -0
  86. package/dist/drivers/registry.d.ts.map +1 -0
  87. package/dist/drivers/registry.js +162 -0
  88. package/dist/drivers/registry.js.map +1 -0
  89. package/dist/drivers/types.d.ts +59 -0
  90. package/dist/drivers/types.d.ts.map +1 -0
  91. package/dist/drivers/types.js +2 -0
  92. package/dist/drivers/types.js.map +1 -0
  93. package/dist/errors/codes.d.ts +8 -0
  94. package/dist/errors/codes.d.ts.map +1 -0
  95. package/dist/errors/codes.js +201 -0
  96. package/dist/errors/codes.js.map +1 -0
  97. package/dist/errors/cogenta-error.d.ts +38 -0
  98. package/dist/errors/cogenta-error.d.ts.map +1 -0
  99. package/dist/errors/cogenta-error.js +31 -0
  100. package/dist/errors/cogenta-error.js.map +1 -0
  101. package/dist/errors/index.d.ts +5 -0
  102. package/dist/errors/index.d.ts.map +1 -0
  103. package/dist/errors/index.js +3 -0
  104. package/dist/errors/index.js.map +1 -0
  105. package/dist/id.d.ts +5 -0
  106. package/dist/id.d.ts.map +1 -0
  107. package/dist/id.js +82 -0
  108. package/dist/id.js.map +1 -0
  109. package/dist/index.d.ts +12 -0
  110. package/dist/index.d.ts.map +1 -0
  111. package/dist/index.js +12 -0
  112. package/dist/index.js.map +1 -0
  113. package/dist/logger/index.d.ts +5 -0
  114. package/dist/logger/index.d.ts.map +1 -0
  115. package/dist/logger/index.js +4 -0
  116. package/dist/logger/index.js.map +1 -0
  117. package/dist/logger/logger.d.ts +10 -0
  118. package/dist/logger/logger.d.ts.map +1 -0
  119. package/dist/logger/logger.js +108 -0
  120. package/dist/logger/logger.js.map +1 -0
  121. package/dist/logger/redact.d.ts +12 -0
  122. package/dist/logger/redact.d.ts.map +1 -0
  123. package/dist/logger/redact.js +96 -0
  124. package/dist/logger/redact.js.map +1 -0
  125. package/dist/logger/types.d.ts +32 -0
  126. package/dist/logger/types.d.ts.map +1 -0
  127. package/dist/logger/types.js +3 -0
  128. package/dist/logger/types.js.map +1 -0
  129. package/dist/media/format-sniff.d.ts +22 -0
  130. package/dist/media/format-sniff.d.ts.map +1 -0
  131. package/dist/media/format-sniff.js +77 -0
  132. package/dist/media/format-sniff.js.map +1 -0
  133. package/dist/media/index.d.ts +5 -0
  134. package/dist/media/index.d.ts.map +1 -0
  135. package/dist/media/index.js +4 -0
  136. package/dist/media/index.js.map +1 -0
  137. package/dist/media/store.d.ts +13 -0
  138. package/dist/media/store.d.ts.map +1 -0
  139. package/dist/media/store.js +211 -0
  140. package/dist/media/store.js.map +1 -0
  141. package/dist/media/types.d.ts +70 -0
  142. package/dist/media/types.d.ts.map +1 -0
  143. package/dist/media/types.js +2 -0
  144. package/dist/media/types.js.map +1 -0
  145. package/dist/migrations/index.d.ts +4 -0
  146. package/dist/migrations/index.d.ts.map +1 -0
  147. package/dist/migrations/index.js +2 -0
  148. package/dist/migrations/index.js.map +1 -0
  149. package/dist/migrations/migrator.d.ts +18 -0
  150. package/dist/migrations/migrator.d.ts.map +1 -0
  151. package/dist/migrations/migrator.js +247 -0
  152. package/dist/migrations/migrator.js.map +1 -0
  153. package/dist/migrations/types.d.ts +63 -0
  154. package/dist/migrations/types.d.ts.map +1 -0
  155. package/dist/migrations/types.js +2 -0
  156. package/dist/migrations/types.js.map +1 -0
  157. package/dist/queue/bullmq.d.ts +119 -0
  158. package/dist/queue/bullmq.d.ts.map +1 -0
  159. package/dist/queue/bullmq.js +391 -0
  160. package/dist/queue/bullmq.js.map +1 -0
  161. package/dist/queue/database.d.ts +17 -0
  162. package/dist/queue/database.d.ts.map +1 -0
  163. package/dist/queue/database.js +242 -0
  164. package/dist/queue/database.js.map +1 -0
  165. package/dist/queue/index.d.ts +7 -0
  166. package/dist/queue/index.d.ts.map +1 -0
  167. package/dist/queue/index.js +4 -0
  168. package/dist/queue/index.js.map +1 -0
  169. package/dist/queue/types.d.ts +61 -0
  170. package/dist/queue/types.d.ts.map +1 -0
  171. package/dist/queue/types.js +2 -0
  172. package/dist/queue/types.js.map +1 -0
  173. package/dist/storage/index.d.ts +14 -0
  174. package/dist/storage/index.d.ts.map +1 -0
  175. package/dist/storage/index.js +17 -0
  176. package/dist/storage/index.js.map +1 -0
  177. package/dist/storage/key.d.ts +12 -0
  178. package/dist/storage/key.d.ts.map +1 -0
  179. package/dist/storage/key.js +43 -0
  180. package/dist/storage/key.js.map +1 -0
  181. package/dist/storage/local.d.ts +23 -0
  182. package/dist/storage/local.d.ts.map +1 -0
  183. package/dist/storage/local.js +204 -0
  184. package/dist/storage/local.js.map +1 -0
  185. package/dist/storage/s3.d.ts +54 -0
  186. package/dist/storage/s3.d.ts.map +1 -0
  187. package/dist/storage/s3.js +240 -0
  188. package/dist/storage/s3.js.map +1 -0
  189. package/dist/storage/types.d.ts +45 -0
  190. package/dist/storage/types.d.ts.map +1 -0
  191. package/dist/storage/types.js +2 -0
  192. package/dist/storage/types.js.map +1 -0
  193. package/package.json +82 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"database.js","sourceRoot":"","sources":["../../src/queue/database.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ export type { BullmqModule, BullmqQueueDriverOptions, BullmqQueueOptions } from './bullmq.js';
2
+ export { bullmqQueueDriver, createBullmqQueue, loadBullmqModule } from './bullmq.js';
3
+ export type { DatabaseQueueOptions } from './database.js';
4
+ export { createDatabaseQueue } from './database.js';
5
+ export type { EnqueueOptions, Job, JobHandler, JobId, JobState, JobStatus, QueueConfig, QueueDriver, QueueDriverOptions, } from './types.js';
6
+ export { JOB_STATUSES } from './types.js';
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/queue/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,YAAY,EAAE,wBAAwB,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAA;AAC7F,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AACpF,YAAY,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAA;AACzD,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAA;AACnD,YAAY,EACV,cAAc,EACd,GAAG,EACH,UAAU,EACV,KAAK,EACL,QAAQ,EACR,SAAS,EACT,WAAW,EACX,WAAW,EACX,kBAAkB,GACnB,MAAM,YAAY,CAAA;AACnB,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA"}
@@ -0,0 +1,4 @@
1
+ export { bullmqQueueDriver, createBullmqQueue, loadBullmqModule } from './bullmq.js';
2
+ export { createDatabaseQueue } from './database.js';
3
+ export { JOB_STATUSES } from './types.js';
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/queue/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AAEpF,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAA;AAYnD,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA"}
@@ -0,0 +1,61 @@
1
+ export type JobId = string;
2
+ export declare const JOB_STATUSES: readonly ['pending', 'running', 'completed', 'failed', 'cancelled'];
3
+ export type JobStatus = (typeof JOB_STATUSES)[number];
4
+ export interface EnqueueOptions {
5
+ readonly name: string;
6
+ readonly payload?: unknown;
7
+ /** Epoch milliseconds. A job is invisible until then. */
8
+ readonly runAt?: number;
9
+ /** Higher runs first. Ties break by `runAt`, then by insertion order. */
10
+ readonly priority?: number;
11
+ readonly maxAttempts?: number;
12
+ }
13
+ export interface Job<TPayload = unknown> {
14
+ readonly id: JobId;
15
+ readonly name: string;
16
+ readonly payload: TPayload;
17
+ readonly attempt: number;
18
+ readonly maxAttempts: number;
19
+ }
20
+ export interface JobState {
21
+ readonly id: JobId;
22
+ readonly name: string;
23
+ readonly status: JobStatus;
24
+ readonly attempt: number;
25
+ readonly maxAttempts: number;
26
+ readonly runAt: number;
27
+ readonly lastError: string | undefined;
28
+ }
29
+ export type JobHandler<TPayload = unknown> = (job: Job<TPayload>) => Promise<void>;
30
+ export interface QueueDriver {
31
+ enqueue(options: EnqueueOptions): Promise<JobId>;
32
+ /** Registers the handler for a job name. One handler per name. */
33
+ process<TPayload = unknown>(name: string, handler: JobHandler<TPayload>): void;
34
+ /**
35
+ * Runs one batch of due jobs and returns how many were handled.
36
+ *
37
+ * The degraded driver has no worker of its own: something has to call this —
38
+ * a system cron on shared hosting, a loop in a long-lived process elsewhere.
39
+ * That is why it is on the interface rather than hidden inside a driver.
40
+ */
41
+ tick(): Promise<number>;
42
+ cancel(id: JobId): Promise<void>;
43
+ status(id: JobId): Promise<JobState | null>;
44
+ close(): Promise<void>;
45
+ }
46
+ export interface QueueConfig {
47
+ readonly driver?: string;
48
+ readonly url?: string | undefined;
49
+ }
50
+ export interface QueueDriverOptions {
51
+ /** Injected so scheduling and lease expiry are testable without waiting. */
52
+ readonly now?: () => number;
53
+ /**
54
+ * How long a claimed job may run before another worker may take it over.
55
+ * A worker that is killed mid-job must not hold its job forever.
56
+ */
57
+ readonly leaseMs?: number;
58
+ /** Jobs claimed per `tick`. */
59
+ readonly batchSize?: number;
60
+ }
61
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/queue/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,KAAK,GAAG,MAAM,CAAA;AAE1B,eAAO,MAAM,YAAY,YAAI,SAAS,EAAE,SAAS,EAAE,WAAW,EAAE,QAAQ,EAAE,WAAW,CAAU,CAAA;AAE/F,MAAM,MAAM,SAAS,GAAG,CAAC,OAAO,YAAY,CAAC,CAAC,MAAM,CAAC,CAAA;AAErD,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAA;IAC1B,yDAAyD;IACzD,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAA;IACvB,yEAAyE;IACzE,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAA;CAC9B;AAED,MAAM,WAAW,GAAG,CAAC,QAAQ,GAAG,OAAO;IACrC,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAA;IAClB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAA;IAC1B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;CAC7B;AAED,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAA;IAClB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAA;IAC1B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;IAC5B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,CAAA;CACvC;AAED,MAAM,MAAM,UAAU,CAAC,QAAQ,GAAG,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,QAAQ,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;AAElF,MAAM,WAAW,WAAW;IAC1B,OAAO,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,KAAK,CAAC,CAAA;IAChD,kEAAkE;IAClE,OAAO,CAAC,QAAQ,GAAG,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAA;IAC9E;;;;;;OAMG;IACH,IAAI,IAAI,OAAO,CAAC,MAAM,CAAC,CAAA;IACvB,MAAM,CAAC,EAAE,EAAE,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAChC,MAAM,CAAC,EAAE,EAAE,KAAK,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAA;IAC3C,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;CACvB;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;CAClC;AAED,MAAM,WAAW,kBAAkB;IACjC,4EAA4E;IAC5E,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,MAAM,CAAA;IAC3B;;;OAGG;IACH,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAA;IACzB,+BAA+B;IAC/B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAC5B"}
@@ -0,0 +1,2 @@
1
+ export const JOB_STATUSES = ['pending', 'running', 'completed', 'failed', 'cancelled'];
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/queue/types.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,SAAS,EAAE,SAAS,EAAE,WAAW,EAAE,QAAQ,EAAE,WAAW,CAAU,CAAA"}
@@ -0,0 +1,14 @@
1
+ import { type DriverRegistry } from '../drivers/index.js';
2
+ import type { Logger } from '../logger/index.js';
3
+ import type { StorageConfig, StorageDriver, StorageDriverOptions } from './types.js';
4
+ export { assertKey, parseKey } from './key.js';
5
+ export type { LocalStorageOptions } from './local.js';
6
+ export { createLocalStorage, localStorageDriver, signLocalUrl, verifyLocalSignedUrl, } from './local.js';
7
+ export type { S3Modules, S3StorageOptions } from './s3.js';
8
+ export { createS3Storage, loadS3Modules, s3StorageDriver } from './s3.js';
9
+ export type { StorageConfig, StorageDriver, StorageDriverOptions, StorageObjectInfo, StoragePutOptions, } from './types.js';
10
+ export interface StorageRegistryOptions extends StorageDriverOptions {
11
+ readonly logger?: Logger;
12
+ }
13
+ export declare function createStorageRegistry(options?: StorageRegistryOptions): DriverRegistry<StorageDriver, StorageConfig>;
14
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/storage/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAwB,KAAK,cAAc,EAAE,MAAM,qBAAqB,CAAA;AAC/E,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAA;AAGhD,OAAO,KAAK,EAAE,aAAa,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAA;AAEpF,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAA;AAC9C,YAAY,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAA;AACrD,OAAO,EACL,kBAAkB,EAClB,kBAAkB,EAClB,YAAY,EACZ,oBAAoB,GACrB,MAAM,YAAY,CAAA;AACnB,YAAY,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAA;AAC1D,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,SAAS,CAAA;AACzE,YAAY,EACV,aAAa,EACb,aAAa,EACb,oBAAoB,EACpB,iBAAiB,EACjB,iBAAiB,GAClB,MAAM,YAAY,CAAA;AAEnB,MAAM,WAAW,sBAAuB,SAAQ,oBAAoB;IAClE,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CACzB;AAED,wBAAgB,qBAAqB,CACnC,OAAO,GAAE,sBAA2B,GACnC,cAAc,CAAC,aAAa,EAAE,aAAa,CAAC,CAW9C"}
@@ -0,0 +1,17 @@
1
+ import { createDriverRegistry } from '../drivers/index.js';
2
+ import { localStorageDriver } from './local.js';
3
+ import { s3StorageDriver } from './s3.js';
4
+ export { assertKey, parseKey } from './key.js';
5
+ export { createLocalStorage, localStorageDriver, signLocalUrl, verifyLocalSignedUrl, } from './local.js';
6
+ export { createS3Storage, loadS3Modules, s3StorageDriver } from './s3.js';
7
+ export function createStorageRegistry(options = {}) {
8
+ const { logger, ...driverOptions } = options;
9
+ const registry = createDriverRegistry({
10
+ need: 'storage',
11
+ ...(logger === undefined ? {} : { logger }),
12
+ });
13
+ registry.register(s3StorageDriver(driverOptions));
14
+ registry.register(localStorageDriver(driverOptions));
15
+ return registry;
16
+ }
17
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/storage/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAuB,MAAM,qBAAqB,CAAA;AAE/E,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAA;AAC/C,OAAO,EAAE,eAAe,EAAE,MAAM,SAAS,CAAA;AAGzC,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAA;AAE9C,OAAO,EACL,kBAAkB,EAClB,kBAAkB,EAClB,YAAY,EACZ,oBAAoB,GACrB,MAAM,YAAY,CAAA;AAEnB,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,SAAS,CAAA;AAazE,MAAM,UAAU,qBAAqB,CACnC,OAAO,GAA2B,EAAE;IAEpC,MAAM,EAAE,MAAM,EAAE,GAAG,aAAa,EAAE,GAAG,OAAO,CAAA;IAC5C,MAAM,QAAQ,GAAG,oBAAoB,CAA+B;QAClE,IAAI,EAAE,SAAS;QACf,GAAG,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC;KAC5C,CAAC,CAAA;IAEF,QAAQ,CAAC,QAAQ,CAAC,eAAe,CAAC,aAAa,CAAC,CAAC,CAAA;IACjD,QAAQ,CAAC,QAAQ,CAAC,kBAAkB,CAAC,aAAa,CAAC,CAAC,CAAA;IAEpD,OAAO,QAAQ,CAAA;AACjB,CAAC"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Validates an object key and returns its segments.
3
+ *
4
+ * Keys reach this function from uploads, imports and plugins, and the local
5
+ * driver turns them into filesystem paths. `../` in a key would let a caller
6
+ * write anywhere the process can write, so the check is a whitelist of what a
7
+ * segment may contain rather than a blacklist of what it may not — a blacklist
8
+ * loses to URL encoding, Unicode look-alikes and backslashes.
9
+ */
10
+ export declare function parseKey(key: string): string[];
11
+ export declare function assertKey(key: string): void;
12
+ //# sourceMappingURL=key.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"key.d.ts","sourceRoot":"","sources":["../../src/storage/key.ts"],"names":[],"mappings":"AAIA;;;;;;;;GAQG;AACH,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,CAsB9C;AAED,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAE3C"}
@@ -0,0 +1,43 @@
1
+ import { CogentaError } from '../errors/index.js';
2
+ const SEGMENT = /^[a-zA-Z0-9._-]+$/;
3
+ /**
4
+ * Validates an object key and returns its segments.
5
+ *
6
+ * Keys reach this function from uploads, imports and plugins, and the local
7
+ * driver turns them into filesystem paths. `../` in a key would let a caller
8
+ * write anywhere the process can write, so the check is a whitelist of what a
9
+ * segment may contain rather than a blacklist of what it may not — a blacklist
10
+ * loses to URL encoding, Unicode look-alikes and backslashes.
11
+ */
12
+ export function parseKey(key) {
13
+ const invalid = (why) => new CogentaError({
14
+ code: 'STORAGE_FAILED',
15
+ message: `Invalid storage key "${key}": ${why}.`,
16
+ hint: 'Use segments of letters, digits, dot, dash and underscore, separated by "/", for example "media/2026/08/cover.webp".',
17
+ details: { key },
18
+ });
19
+ if (key.length === 0)
20
+ throw invalid('it is empty');
21
+ if (key.length > 1024)
22
+ throw invalid('it is longer than 1024 characters');
23
+ if (key.startsWith('/'))
24
+ throw invalid('it must be relative');
25
+ if (key.includes('\\'))
26
+ throw invalid('backslashes are not allowed');
27
+ if (key.includes('\0'))
28
+ throw invalid('it contains a null byte');
29
+ const segments = key.split('/');
30
+ for (const segment of segments) {
31
+ if (segment === '')
32
+ throw invalid('it has an empty segment');
33
+ if (segment === '.' || segment === '..')
34
+ throw invalid('relative segments are not allowed');
35
+ if (!SEGMENT.test(segment))
36
+ throw invalid(`the segment "${segment}" has forbidden characters`);
37
+ }
38
+ return segments;
39
+ }
40
+ export function assertKey(key) {
41
+ parseKey(key);
42
+ }
43
+ //# sourceMappingURL=key.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"key.js","sourceRoot":"","sources":["../../src/storage/key.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAEjD,MAAM,OAAO,GAAG,mBAAmB,CAAA;AAEnC;;;;;;;;GAQG;AACH,MAAM,UAAU,QAAQ,CAAC,GAAW;IAClC,MAAM,OAAO,GAAG,CAAC,GAAW,EAAgB,EAAE,CAC5C,IAAI,YAAY,CAAC;QACf,IAAI,EAAE,gBAAgB;QACtB,OAAO,EAAE,wBAAwB,GAAG,MAAM,GAAG,GAAG;QAChD,IAAI,EAAE,sHAAsH;QAC5H,OAAO,EAAE,EAAE,GAAG,EAAE;KACjB,CAAC,CAAA;IAEJ,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC;QAAE,MAAM,OAAO,CAAC,aAAa,CAAC,CAAA;IAClD,IAAI,GAAG,CAAC,MAAM,GAAG,IAAI;QAAE,MAAM,OAAO,CAAC,mCAAmC,CAAC,CAAA;IACzE,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,MAAM,OAAO,CAAC,qBAAqB,CAAC,CAAA;IAC7D,IAAI,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC;QAAE,MAAM,OAAO,CAAC,6BAA6B,CAAC,CAAA;IACpE,IAAI,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC;QAAE,MAAM,OAAO,CAAC,yBAAyB,CAAC,CAAA;IAEhE,MAAM,QAAQ,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;IAC/B,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,IAAI,OAAO,KAAK,EAAE;YAAE,MAAM,OAAO,CAAC,yBAAyB,CAAC,CAAA;QAC5D,IAAI,OAAO,KAAK,GAAG,IAAI,OAAO,KAAK,IAAI;YAAE,MAAM,OAAO,CAAC,mCAAmC,CAAC,CAAA;QAC3F,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC;YAAE,MAAM,OAAO,CAAC,gBAAgB,OAAO,4BAA4B,CAAC,CAAA;IAChG,CAAC;IACD,OAAO,QAAQ,CAAA;AACjB,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,GAAW;IACnC,QAAQ,CAAC,GAAG,CAAC,CAAA;AACf,CAAC"}
@@ -0,0 +1,23 @@
1
+ import type { Driver } from '../drivers/index.js';
2
+ import type { StorageConfig, StorageDriver, StorageDriverOptions } from './types.js';
3
+ export interface LocalStorageOptions extends StorageDriverOptions {
4
+ readonly path: string;
5
+ /** Prefix for `publicUrl`. Relative is fine: it is resolved by the browser. */
6
+ readonly baseUrl?: string;
7
+ /**
8
+ * HMAC key for signed URLs. When absent a random one is generated for this
9
+ * process, which means signed URLs stop working after a restart — acceptable
10
+ * for a single-process site, reported by `health()`, and fixed by setting
11
+ * `COGENTA_STORAGE_SIGNING_KEY`.
12
+ */
13
+ readonly signingKey?: string;
14
+ }
15
+ export declare function createLocalStorage(options: LocalStorageOptions): StorageDriver;
16
+ export declare function signLocalUrl(signingKey: string, key: string, expires: number): string;
17
+ /**
18
+ * Checks a URL produced by `signedUrl`. Comparison is constant-time: a plain
19
+ * `===` leaks how much of a forged signature was correct, one byte at a time.
20
+ */
21
+ export declare function verifyLocalSignedUrl(signingKey: string, key: string, expires: number, signature: string, nowSeconds?: number): boolean;
22
+ export declare function localStorageDriver(options?: StorageDriverOptions): Driver<StorageDriver, StorageConfig>;
23
+ //# sourceMappingURL=local.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local.d.ts","sourceRoot":"","sources":["../../src/storage/local.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,MAAM,EAAgB,MAAM,qBAAqB,CAAA;AAG/D,OAAO,KAAK,EACV,aAAa,EACb,aAAa,EACb,oBAAoB,EAGrB,MAAM,YAAY,CAAA;AAEnB,MAAM,WAAW,mBAAoB,SAAQ,oBAAoB;IAC/D,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,+EAA+E;IAC/E,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAA;IACzB;;;;;OAKG;IACH,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAC7B;AAcD,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,mBAAmB,GAAG,aAAa,CAuI9E;AAED,wBAAgB,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAErF;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAClC,UAAU,EAAE,MAAM,EAClB,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,EACjB,UAAU,GAAE,MAAsC,GACjD,OAAO,CAOT;AAED,wBAAgB,kBAAkB,CAChC,OAAO,GAAE,oBAAyB,GACjC,MAAM,CAAC,aAAa,EAAE,aAAa,CAAC,CAiDtC"}
@@ -0,0 +1,204 @@
1
+ import { createHmac, randomBytes, timingSafeEqual } from 'node:crypto';
2
+ import { createReadStream } from 'node:fs';
3
+ import { mkdir, readFile, rm, stat, writeFile } from 'node:fs/promises';
4
+ import { dirname, join } from 'node:path';
5
+ import { pipeline } from 'node:stream/promises';
6
+ import { CogentaError } from '../errors/index.js';
7
+ import { parseKey } from './key.js';
8
+ /** What HTTP calls an unknown type, and what S3 stores by default. */
9
+ const DEFAULT_CONTENT_TYPE = 'application/octet-stream';
10
+ function missing(error) {
11
+ return error?.code === 'ENOENT';
12
+ }
13
+ export function createLocalStorage(options) {
14
+ const now = options.now ?? Date.now;
15
+ const baseUrl = (options.baseUrl ?? '/media').replace(/\/$/, '');
16
+ const signingKey = options.signingKey ?? randomBytes(32).toString('hex');
17
+ // parseKey has already rejected anything that could escape the root, so the
18
+ // join below cannot climb out of it.
19
+ const objectsDir = join(options.path, 'objects');
20
+ const metaDir = join(options.path, 'meta');
21
+ const fileFor = (key) => join(objectsDir, ...parseKey(key));
22
+ // Metadata lives in a parallel tree, never beside the object. Next to it, the
23
+ // sidecar would be addressable as an object itself: readable under a guessable
24
+ // key, overwritable through a forged one, and colliding with any object whose
25
+ // key happens to end in the suffix.
26
+ const metaFor = (key) => `${join(metaDir, ...parseKey(key))}.json`;
27
+ async function readMetadata(key) {
28
+ try {
29
+ return JSON.parse(await readFile(metaFor(key), 'utf8'));
30
+ }
31
+ catch {
32
+ return {};
33
+ }
34
+ }
35
+ return {
36
+ put: async (key, data, putOptions) => {
37
+ const target = fileFor(key);
38
+ await mkdir(dirname(target), { recursive: true });
39
+ try {
40
+ if (Buffer.isBuffer(data)) {
41
+ await writeFile(target, data);
42
+ }
43
+ else {
44
+ const { createWriteStream } = await import('node:fs');
45
+ await pipeline(data, createWriteStream(target));
46
+ }
47
+ }
48
+ catch (error) {
49
+ throw new CogentaError({
50
+ code: 'STORAGE_FAILED',
51
+ message: `Could not write the media object "${key}".`,
52
+ hint: `Check that ${options.path} exists and is writable.`,
53
+ cause: error,
54
+ });
55
+ }
56
+ // Content type is given by the caller and cannot be recovered later, so it
57
+ // is stored rather than dropped because the filesystem has nowhere to put it.
58
+ const metadata = {
59
+ ...(putOptions?.contentType === undefined ? {} : { contentType: putOptions.contentType }),
60
+ ...(putOptions?.cacheControl === undefined
61
+ ? {}
62
+ : { cacheControl: putOptions.cacheControl }),
63
+ };
64
+ if (Object.keys(metadata).length > 0) {
65
+ const metaTarget = metaFor(key);
66
+ await mkdir(dirname(metaTarget), { recursive: true });
67
+ await writeFile(metaTarget, JSON.stringify(metadata), 'utf8');
68
+ }
69
+ else {
70
+ await rm(metaFor(key), { force: true });
71
+ }
72
+ },
73
+ get: async (key) => {
74
+ const target = fileFor(key);
75
+ try {
76
+ await stat(target);
77
+ }
78
+ catch (error) {
79
+ throw new CogentaError({
80
+ code: 'STORAGE_FAILED',
81
+ message: `No media object stored under "${key}".`,
82
+ hint: 'Check the key, or upload the object first.',
83
+ cause: error,
84
+ details: { key },
85
+ });
86
+ }
87
+ return createReadStream(target);
88
+ },
89
+ head: async (key) => {
90
+ try {
91
+ const stats = await stat(fileFor(key));
92
+ const metadata = await readMetadata(key);
93
+ return {
94
+ key,
95
+ size: stats.size,
96
+ // The HTTP default for an unknown type, and what S3 returns for an
97
+ // object stored without one. Returning undefined here instead would
98
+ // make the two drivers disagree for every upload with no declared
99
+ // type — which is most of them.
100
+ contentType: metadata.contentType ?? DEFAULT_CONTENT_TYPE,
101
+ cacheControl: metadata.cacheControl,
102
+ };
103
+ }
104
+ catch (error) {
105
+ if (missing(error))
106
+ return null;
107
+ throw error;
108
+ }
109
+ },
110
+ delete: async (key) => {
111
+ await rm(fileFor(key), { force: true });
112
+ await rm(metaFor(key), { force: true });
113
+ },
114
+ exists: async (key) => {
115
+ // Validated outside the try: an unsafe key must raise, not be reported as
116
+ // simply absent, or a traversal attempt looks like an ordinary miss.
117
+ const target = fileFor(key);
118
+ try {
119
+ await stat(target);
120
+ return true;
121
+ }
122
+ catch {
123
+ return false;
124
+ }
125
+ },
126
+ signedUrl: async (key, expiresIn) => {
127
+ parseKey(key);
128
+ if (!Number.isFinite(expiresIn) || expiresIn <= 0) {
129
+ throw new CogentaError({
130
+ code: 'STORAGE_FAILED',
131
+ message: `A signed URL must expire in a positive number of seconds, received ${String(expiresIn)}.`,
132
+ hint: 'Pass the lifetime in seconds, for example 300 for five minutes.',
133
+ });
134
+ }
135
+ const expires = Math.floor(now() / 1000) + Math.floor(expiresIn);
136
+ const signature = signLocalUrl(signingKey, key, expires);
137
+ return `${baseUrl}/${key}?expires=${expires}&signature=${signature}`;
138
+ },
139
+ publicUrl: (key) => {
140
+ parseKey(key);
141
+ return `${baseUrl}/${key}`;
142
+ },
143
+ };
144
+ }
145
+ export function signLocalUrl(signingKey, key, expires) {
146
+ return createHmac('sha256', signingKey).update(`${key}:${expires}`).digest('hex');
147
+ }
148
+ /**
149
+ * Checks a URL produced by `signedUrl`. Comparison is constant-time: a plain
150
+ * `===` leaks how much of a forged signature was correct, one byte at a time.
151
+ */
152
+ export function verifyLocalSignedUrl(signingKey, key, expires, signature, nowSeconds = Math.floor(Date.now() / 1000)) {
153
+ if (!Number.isFinite(expires) || expires <= nowSeconds)
154
+ return false;
155
+ const expected = Buffer.from(signLocalUrl(signingKey, key, expires), 'utf8');
156
+ const received = Buffer.from(signature, 'utf8');
157
+ if (expected.length !== received.length)
158
+ return false;
159
+ return timingSafeEqual(expected, received);
160
+ }
161
+ export function localStorageDriver(options = {}) {
162
+ let path;
163
+ let generatedKey = false;
164
+ return {
165
+ name: 'local',
166
+ tier: 'degraded',
167
+ available: async (config) => {
168
+ const candidate = config.path ?? './.cogenta/media';
169
+ try {
170
+ await mkdir(candidate, { recursive: true });
171
+ const probe = join(candidate, `.probe-${process.pid}`);
172
+ await writeFile(probe, '', 'utf8');
173
+ await rm(probe, { force: true });
174
+ return true;
175
+ }
176
+ catch {
177
+ return false;
178
+ }
179
+ },
180
+ init: async (config) => {
181
+ path = config.path ?? './.cogenta/media';
182
+ const configuredKey = process.env['COGENTA_STORAGE_SIGNING_KEY'];
183
+ generatedKey = configuredKey === undefined || configuredKey === '';
184
+ const settings = {
185
+ ...options,
186
+ path,
187
+ ...(config.baseUrl === undefined ? {} : { baseUrl: config.baseUrl }),
188
+ };
189
+ return createLocalStorage(configuredKey === undefined || configuredKey === ''
190
+ ? settings
191
+ : { ...settings, signingKey: configuredKey });
192
+ },
193
+ dispose: async () => undefined,
194
+ health: async () => ({
195
+ status: 'degraded',
196
+ driver: 'local',
197
+ tier: 'degraded',
198
+ message: generatedKey
199
+ ? `Media on disk at ${path ?? 'an unopened path'}. Signed URLs use a per-process key, so they stop working after a restart — set COGENTA_STORAGE_SIGNING_KEY to fix that.`
200
+ : `Media on disk at ${path ?? 'an unopened path'}.`,
201
+ }),
202
+ };
203
+ }
204
+ //# sourceMappingURL=local.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local.js","sourceRoot":"","sources":["../../src/storage/local.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AACtE,OAAO,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAA;AAC1C,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AACvE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAEzC,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAA;AAE/C,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AACjD,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAA;AAsBnC,sEAAsE;AACtE,MAAM,oBAAoB,GAAG,0BAA0B,CAAA;AAOvD,SAAS,OAAO,CAAC,KAAc;IAC7B,OAAQ,KAA2C,EAAE,IAAI,KAAK,QAAQ,CAAA;AACxE,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,OAA4B;IAC7D,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,CAAA;IACnC,MAAM,OAAO,GAAG,CAAC,OAAO,CAAC,OAAO,IAAI,QAAQ,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAA;IAChE,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAA;IAExE,4EAA4E;IAC5E,qCAAqC;IACrC,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,SAAS,CAAC,CAAA;IAChD,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAA;IAC1C,MAAM,OAAO,GAAG,CAAC,GAAW,EAAU,EAAE,CAAC,IAAI,CAAC,UAAU,EAAE,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAA;IAC3E,8EAA8E;IAC9E,+EAA+E;IAC/E,8EAA8E;IAC9E,oCAAoC;IACpC,MAAM,OAAO,GAAG,CAAC,GAAW,EAAU,EAAE,CAAC,GAAG,IAAI,CAAC,OAAO,EAAE,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,CAAA;IAElF,KAAK,UAAU,YAAY,CAAC,GAAW;QACrC,IAAI,CAAC;YACH,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,CAAoB,CAAA;QAC5E,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,CAAA;QACX,CAAC;IACH,CAAC;IAED,OAAO;QACL,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,UAA8B,EAAiB,EAAE;YACtE,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAAA;YAC3B,MAAM,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;YAEjD,IAAI,CAAC;gBACH,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;oBAC1B,MAAM,SAAS,CAAC,MAAM,EAAE,IAAI,CAAC,CAAA;gBAC/B,CAAC;qBAAM,CAAC;oBACN,MAAM,EAAE,iBAAiB,EAAE,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC,CAAA;oBACrD,MAAM,QAAQ,CAAC,IAAI,EAAE,iBAAiB,CAAC,MAAM,CAAC,CAAC,CAAA;gBACjD,CAAC;YACH,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,IAAI,YAAY,CAAC;oBACrB,IAAI,EAAE,gBAAgB;oBACtB,OAAO,EAAE,qCAAqC,GAAG,IAAI;oBACrD,IAAI,EAAE,cAAc,OAAO,CAAC,IAAI,0BAA0B;oBAC1D,KAAK,EAAE,KAAK;iBACb,CAAC,CAAA;YACJ,CAAC;YAED,2EAA2E;YAC3E,8EAA8E;YAC9E,MAAM,QAAQ,GAAoB;gBAChC,GAAG,CAAC,UAAU,EAAE,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,UAAU,CAAC,WAAW,EAAE,CAAC;gBACzF,GAAG,CAAC,UAAU,EAAE,YAAY,KAAK,SAAS;oBACxC,CAAC,CAAC,EAAE;oBACJ,CAAC,CAAC,EAAE,YAAY,EAAE,UAAU,CAAC,YAAY,EAAE,CAAC;aAC/C,CAAA;YACD,IAAI,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACrC,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,CAAA;gBAC/B,MAAM,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;gBACrD,MAAM,SAAS,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,CAAA;YAC/D,CAAC;iBAAM,CAAC;gBACN,MAAM,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAA;YACzC,CAAC;QACH,CAAC;QAED,GAAG,EAAE,KAAK,EAAE,GAAG,EAAqB,EAAE;YACpC,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAAA;YAC3B,IAAI,CAAC;gBACH,MAAM,IAAI,CAAC,MAAM,CAAC,CAAA;YACpB,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,IAAI,YAAY,CAAC;oBACrB,IAAI,EAAE,gBAAgB;oBACtB,OAAO,EAAE,iCAAiC,GAAG,IAAI;oBACjD,IAAI,EAAE,4CAA4C;oBAClD,KAAK,EAAE,KAAK;oBACZ,OAAO,EAAE,EAAE,GAAG,EAAE;iBACjB,CAAC,CAAA;YACJ,CAAC;YACD,OAAO,gBAAgB,CAAC,MAAM,CAAC,CAAA;QACjC,CAAC;QAED,IAAI,EAAE,KAAK,EAAE,GAAG,EAAqC,EAAE;YACrD,IAAI,CAAC;gBACH,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAA;gBACtC,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,GAAG,CAAC,CAAA;gBACxC,OAAO;oBACL,GAAG;oBACH,IAAI,EAAE,KAAK,CAAC,IAAI;oBAChB,mEAAmE;oBACnE,oEAAoE;oBACpE,kEAAkE;oBAClE,gCAAgC;oBAChC,WAAW,EAAE,QAAQ,CAAC,WAAW,IAAI,oBAAoB;oBACzD,YAAY,EAAE,QAAQ,CAAC,YAAY;iBACpC,CAAA;YACH,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAI,OAAO,CAAC,KAAK,CAAC;oBAAE,OAAO,IAAI,CAAA;gBAC/B,MAAM,KAAK,CAAA;YACb,CAAC;QACH,CAAC;QAED,MAAM,EAAE,KAAK,EAAE,GAAG,EAAiB,EAAE;YACnC,MAAM,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAA;YACvC,MAAM,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAA;QACzC,CAAC;QAED,MAAM,EAAE,KAAK,EAAE,GAAG,EAAoB,EAAE;YACtC,0EAA0E;YAC1E,qEAAqE;YACrE,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAAA;YAC3B,IAAI,CAAC;gBACH,MAAM,IAAI,CAAC,MAAM,CAAC,CAAA;gBAClB,OAAO,IAAI,CAAA;YACb,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,KAAK,CAAA;YACd,CAAC;QACH,CAAC;QAED,SAAS,EAAE,KAAK,EAAE,GAAG,EAAE,SAAS,EAAmB,EAAE;YACnD,QAAQ,CAAC,GAAG,CAAC,CAAA;YACb,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,SAAS,IAAI,CAAC,EAAE,CAAC;gBAClD,MAAM,IAAI,YAAY,CAAC;oBACrB,IAAI,EAAE,gBAAgB;oBACtB,OAAO,EAAE,sEAAsE,MAAM,CAAC,SAAS,CAAC,GAAG;oBACnG,IAAI,EAAE,iEAAiE;iBACxE,CAAC,CAAA;YACJ,CAAC;YAED,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAA;YAChE,MAAM,SAAS,GAAG,YAAY,CAAC,UAAU,EAAE,GAAG,EAAE,OAAO,CAAC,CAAA;YACxD,OAAO,GAAG,OAAO,IAAI,GAAG,YAAY,OAAO,cAAc,SAAS,EAAE,CAAA;QACtE,CAAC;QAED,SAAS,EAAE,CAAC,GAAG,EAAU,EAAE;YACzB,QAAQ,CAAC,GAAG,CAAC,CAAA;YACb,OAAO,GAAG,OAAO,IAAI,GAAG,EAAE,CAAA;QAC5B,CAAC;KACF,CAAA;AACH,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,UAAkB,EAAE,GAAW,EAAE,OAAe;IAC3E,OAAO,UAAU,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC,MAAM,CAAC,GAAG,GAAG,IAAI,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;AACnF,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,oBAAoB,CAClC,UAAkB,EAClB,GAAW,EACX,OAAe,EACf,SAAiB,EACjB,UAAU,GAAW,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;IAElD,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,OAAO,IAAI,UAAU;QAAE,OAAO,KAAK,CAAA;IAEpE,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,UAAU,EAAE,GAAG,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,CAAA;IAC5E,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC,CAAA;IAC/C,IAAI,QAAQ,CAAC,MAAM,KAAK,QAAQ,CAAC,MAAM;QAAE,OAAO,KAAK,CAAA;IACrD,OAAO,eAAe,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAA;AAC5C,CAAC;AAED,MAAM,UAAU,kBAAkB,CAChC,OAAO,GAAyB,EAAE;IAElC,IAAI,IAAwB,CAAA;IAC5B,IAAI,YAAY,GAAG,KAAK,CAAA;IAExB,OAAO;QACL,IAAI,EAAE,OAAO;QACb,IAAI,EAAE,UAAU;QAEhB,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;YAC1B,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,IAAI,kBAAkB,CAAA;YACnD,IAAI,CAAC;gBACH,MAAM,KAAK,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;gBAC3C,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,EAAE,UAAU,OAAO,CAAC,GAAG,EAAE,CAAC,CAAA;gBACtD,MAAM,SAAS,CAAC,KAAK,EAAE,EAAE,EAAE,MAAM,CAAC,CAAA;gBAClC,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAA;gBAChC,OAAO,IAAI,CAAA;YACb,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,KAAK,CAAA;YACd,CAAC;QACH,CAAC;QAED,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;YACrB,IAAI,GAAG,MAAM,CAAC,IAAI,IAAI,kBAAkB,CAAA;YACxC,MAAM,aAAa,GAAG,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAA;YAChE,YAAY,GAAG,aAAa,KAAK,SAAS,IAAI,aAAa,KAAK,EAAE,CAAA;YAElE,MAAM,QAAQ,GAAwB;gBACpC,GAAG,OAAO;gBACV,IAAI;gBACJ,GAAG,CAAC,MAAM,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC;aACrE,CAAA;YACD,OAAO,kBAAkB,CACvB,aAAa,KAAK,SAAS,IAAI,aAAa,KAAK,EAAE;gBACjD,CAAC,CAAC,QAAQ;gBACV,CAAC,CAAC,EAAE,GAAG,QAAQ,EAAE,UAAU,EAAE,aAAa,EAAE,CAC/C,CAAA;QACH,CAAC;QAED,OAAO,EAAE,KAAK,IAAI,EAAE,CAAC,SAAS;QAE9B,MAAM,EAAE,KAAK,IAA2B,EAAE,CAAC,CAAC;YAC1C,MAAM,EAAE,UAAU;YAClB,MAAM,EAAE,OAAO;YACf,IAAI,EAAE,UAAU;YAChB,OAAO,EAAE,YAAY;gBACnB,CAAC,CAAC,oBAAoB,IAAI,IAAI,kBAAkB,0HAA0H;gBAC1K,CAAC,CAAC,oBAAoB,IAAI,IAAI,kBAAkB,GAAG;SACtD,CAAC;KACH,CAAA;AACH,CAAC"}
@@ -0,0 +1,54 @@
1
+ import type { Driver } from '../drivers/index.js';
2
+ import type { StorageConfig, StorageDriver, StorageDriverOptions } from './types.js';
3
+ /**
4
+ * Only the slice of the AWS SDK this driver uses, described structurally so the
5
+ * published types never reference an optional peer.
6
+ */
7
+ interface S3ClientLike {
8
+ send<TOutput>(command: object): Promise<TOutput>;
9
+ destroy(): void;
10
+ }
11
+ interface S3ModuleLike {
12
+ S3Client: new (config: Record<string, unknown>) => S3ClientLike;
13
+ PutObjectCommand: new (input: Record<string, unknown>) => object;
14
+ GetObjectCommand: new (input: Record<string, unknown>) => object;
15
+ HeadObjectCommand: new (input: Record<string, unknown>) => object;
16
+ DeleteObjectCommand: new (input: Record<string, unknown>) => object;
17
+ }
18
+ interface PresignerModuleLike {
19
+ getSignedUrl(client: S3ClientLike, command: object, options: {
20
+ expiresIn: number;
21
+ }): Promise<string>;
22
+ }
23
+ interface UploadModuleLike {
24
+ Upload: new (input: Record<string, unknown>) => {
25
+ done(): Promise<unknown>;
26
+ };
27
+ }
28
+ export interface S3Modules {
29
+ readonly s3: S3ModuleLike;
30
+ readonly presigner: PresignerModuleLike;
31
+ readonly upload: UploadModuleLike;
32
+ }
33
+ /**
34
+ * Loads the AWS SDK if the host application installed it.
35
+ *
36
+ * It is an optional peer, and a large one — which is exactly why it must not be
37
+ * a hard dependency. A site on local storage installs none of it.
38
+ */
39
+ export declare function loadS3Modules(): Promise<S3Modules | null>;
40
+ export interface S3StorageOptions extends StorageDriverOptions {
41
+ readonly modules: S3Modules;
42
+ readonly client: S3ClientLike;
43
+ readonly bucket: string;
44
+ /** Prefix for `publicUrl`. Without it, objects have no stable public address. */
45
+ readonly baseUrl?: string;
46
+ /** Key prefix inside the bucket, so one bucket can hold several sites. */
47
+ readonly prefix?: string;
48
+ }
49
+ export declare function createS3Storage(options: S3StorageOptions): StorageDriver;
50
+ export declare function s3StorageDriver(options?: StorageDriverOptions & {
51
+ prefix?: string;
52
+ }): Driver<StorageDriver, StorageConfig>;
53
+ export {};
54
+ //# sourceMappingURL=s3.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"s3.d.ts","sourceRoot":"","sources":["../../src/storage/s3.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAgB,MAAM,qBAAqB,CAAA;AAG/D,OAAO,KAAK,EACV,aAAa,EACb,aAAa,EACb,oBAAoB,EAGrB,MAAM,YAAY,CAAA;AAEnB;;;GAGG;AACH,UAAU,YAAY;IACpB,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;IAChD,OAAO,IAAI,IAAI,CAAA;CAChB;AAED,UAAU,YAAY;IACpB,QAAQ,EAAE,KAAK,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,YAAY,CAAA;IAC/D,gBAAgB,EAAE,KAAK,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,MAAM,CAAA;IAChE,gBAAgB,EAAE,KAAK,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,MAAM,CAAA;IAChE,iBAAiB,EAAE,KAAK,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,MAAM,CAAA;IACjE,mBAAmB,EAAE,KAAK,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,MAAM,CAAA;CACpE;AAED,UAAU,mBAAmB;IAC3B,YAAY,CACV,MAAM,EAAE,YAAY,EACpB,OAAO,EAAE,MAAM,EACf,OAAO,EAAE;QAAE,SAAS,EAAE,MAAM,CAAA;KAAE,GAC7B,OAAO,CAAC,MAAM,CAAC,CAAA;CACnB;AAED,UAAU,gBAAgB;IACxB,MAAM,EAAE,KAAK,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK;QAAE,IAAI,IAAI,OAAO,CAAC,OAAO,CAAC,CAAA;KAAE,CAAA;CAC7E;AAED,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,EAAE,EAAE,YAAY,CAAA;IACzB,QAAQ,CAAC,SAAS,EAAE,mBAAmB,CAAA;IACvC,QAAQ,CAAC,MAAM,EAAE,gBAAgB,CAAA;CAClC;AAED;;;;;GAKG;AACH,wBAAsB,aAAa,IAAI,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,CAW/D;AAQD,MAAM,WAAW,gBAAiB,SAAQ,oBAAoB;IAC5D,QAAQ,CAAC,OAAO,EAAE,SAAS,CAAA;IAC3B,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAA;IAC7B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,iFAAiF;IACjF,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAA;IACzB,0EAA0E;IAC1E,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CACzB;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,gBAAgB,GAAG,aAAa,CA8HxE;AAED,wBAAgB,eAAe,CAC7B,OAAO,GAAE,oBAAoB,GAAG;IAAE,MAAM,CAAC,EAAE,MAAM,CAAA;CAAO,GACvD,MAAM,CAAC,aAAa,EAAE,aAAa,CAAC,CA0GtC"}