@neutron-build/data 0.1.0 → 0.1.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.
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cache/index.ts"],"names":[],"mappings":"AAYA,MAAM,OAAO,iBAAiB;IACpB,KAAK,GAAG,IAAI,GAAG,EAAuB,CAAC;IAE/C,KAAK,CAAC,GAAG,CAAC,GAAW;QACnB,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACnC,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO,IAAI,CAAC;QACd,CAAC;QAED,IAAI,MAAM,CAAC,SAAS,KAAK,IAAI,IAAI,MAAM,CAAC,SAAS,IAAI,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;YAChE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACvB,OAAO,IAAI,CAAC;QACd,CAAC;QAED,OAAO,MAAM,CAAC,KAAK,CAAC;IACtB,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,GAAW,EAAE,KAAa,EAAE,MAAe;QACnD,MAAM,SAAS,GACb,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;QAC/E,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;IAC5C,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,GAAW;QACnB,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IACzB,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,GAAW,EAAE,MAAe;QACrC,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACvC,MAAM,OAAO,GAAG,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACjE,MAAM,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACxD,MAAM,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,CAAC;QAC1C,OAAO,IAAI,CAAC;IACd,CAAC;CACF"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cache/index.ts"],"names":[],"mappings":"AAYA,MAAM,OAAO,iBAAiB;IACpB,KAAK,GAAG,IAAI,GAAG,EAAuB,CAAC;IAE/C,KAAK,CAAC,GAAG,CAAC,GAAW;QACnB,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACnC,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO,IAAI,CAAC;QACd,CAAC;QAED,IAAI,MAAM,CAAC,SAAS,KAAK,IAAI,IAAI,MAAM,CAAC,SAAS,IAAI,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;YAChE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACvB,OAAO,IAAI,CAAC;QACd,CAAC;QAED,OAAO,MAAM,CAAC,KAAK,CAAC;IACtB,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,GAAW,EAAE,KAAa,EAAE,MAAe;QACnD,MAAM,SAAS,GACb,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;QAC/E,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;IAC5C,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,GAAW;QACnB,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IACzB,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,GAAW,EAAE,MAAe;QACrC,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACvC,MAAM,OAAO,GAAG,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACjE,MAAM,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACxD,MAAM,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,CAAC;QAC1C,OAAO,IAAI,CAAC;IACd,CAAC;CACF","sourcesContent":["interface CacheRecord {\n value: string;\n expiresAt: number | null;\n}\n\nexport interface CacheClient {\n get(key: string): Promise<string | null>;\n set(key: string, value: string, ttlSec?: number): Promise<void>;\n del(key: string): Promise<void>;\n incr(key: string, ttlSec?: number): Promise<number>;\n}\n\nexport class MemoryCacheClient implements CacheClient {\n private store = new Map<string, CacheRecord>();\n\n async get(key: string): Promise<string | null> {\n const record = this.store.get(key);\n if (!record) {\n return null;\n }\n\n if (record.expiresAt !== null && record.expiresAt <= Date.now()) {\n this.store.delete(key);\n return null;\n }\n\n return record.value;\n }\n\n async set(key: string, value: string, ttlSec?: number): Promise<void> {\n const expiresAt =\n typeof ttlSec === \"number\" && ttlSec > 0 ? Date.now() + ttlSec * 1000 : null;\n this.store.set(key, { value, expiresAt });\n }\n\n async del(key: string): Promise<void> {\n this.store.delete(key);\n }\n\n async incr(key: string, ttlSec?: number): Promise<number> {\n const currentRaw = await this.get(key);\n const current = currentRaw ? Number.parseInt(currentRaw, 10) : 0;\n const next = Number.isFinite(current) ? current + 1 : 1;\n await this.set(key, String(next), ttlSec);\n return next;\n }\n}\n\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"nucleus.js","sourceRoot":"","sources":["../../src/cache/nucleus.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,yCAAyC;AACzC,8EAA8E;AAC9E,EAAE;AACF,4EAA4E;AAC5E,gFAAgF;AAChF,8EAA8E;AA0B9E;;;;;;GAMG;AACH,MAAM,OAAO,kBAAkB;IACZ,EAAE,CAAgB;IAClB,MAAM,CAAS;IAEhC,YAAY,OAAkC;QAC5C,IAAI,CAAC,EAAE,GAAG,OAAO,CAAC,EAAE,CAAC;QACrB,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,QAAQ,CAAC;IAC3C,CAAC;IAEO,GAAG,CAAC,CAAS;QACnB,OAAO,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;IAC9B,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,GAAW;QACnB,OAAO,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;IACpC,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,GAAW,EAAE,KAAa,EAAE,MAAe;QACnD,MAAM,IAAI,GAAG,MAAM,IAAI,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;QAChE,MAAM,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;IAChD,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,GAAW;QACnB,MAAM,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;IACtC,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,GAAW,EAAE,MAAe;QACrC,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACxB,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACnC,IAAI,MAAM,IAAI,MAAM,GAAG,CAAC,EAAE,CAAC;YACzB,MAAM,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;QAClC,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;CACF;AAED;;GAEG;AACH,MAAM,UAAU,wBAAwB,CAAC,OAAkC;IACzE,OAAO,IAAI,kBAAkB,CAAC,OAAO,CAAC,CAAC;AACzC,CAAC"}
1
+ {"version":3,"file":"nucleus.js","sourceRoot":"","sources":["../../src/cache/nucleus.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,yCAAyC;AACzC,8EAA8E;AAC9E,EAAE;AACF,4EAA4E;AAC5E,gFAAgF;AAChF,8EAA8E;AA0B9E;;;;;;GAMG;AACH,MAAM,OAAO,kBAAkB;IACZ,EAAE,CAAgB;IAClB,MAAM,CAAS;IAEhC,YAAY,OAAkC;QAC5C,IAAI,CAAC,EAAE,GAAG,OAAO,CAAC,EAAE,CAAC;QACrB,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,QAAQ,CAAC;IAC3C,CAAC;IAEO,GAAG,CAAC,CAAS;QACnB,OAAO,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;IAC9B,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,GAAW;QACnB,OAAO,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;IACpC,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,GAAW,EAAE,KAAa,EAAE,MAAe;QACnD,MAAM,IAAI,GAAG,MAAM,IAAI,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;QAChE,MAAM,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;IAChD,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,GAAW;QACnB,MAAM,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;IACtC,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,GAAW,EAAE,MAAe;QACrC,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACxB,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACnC,IAAI,MAAM,IAAI,MAAM,GAAG,CAAC,EAAE,CAAC;YACzB,MAAM,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;QAClC,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;CACF;AAED;;GAEG;AACH,MAAM,UAAU,wBAAwB,CAAC,OAAkC;IACzE,OAAO,IAAI,kBAAkB,CAAC,OAAO,CAAC,CAAC;AACzC,CAAC","sourcesContent":["// ---------------------------------------------------------------------------\r\n// CacheClient backed by Nucleus KV model\r\n// ---------------------------------------------------------------------------\r\n//\r\n// When the application connects to Nucleus (instead of Redis), this adapter\r\n// bridges neutron-data's CacheClient interface to the KV model's SQL functions.\r\n// ---------------------------------------------------------------------------\r\n\r\nimport type { CacheClient } from \"./index.js\";\r\n\r\n/**\r\n * A KV-like interface matching the subset of @neutron-build/nucleus KVModel\r\n * needed by NucleusCacheClient.\r\n *\r\n * We define this locally to avoid a hard dependency on @neutron-build/nucleus\r\n * from neutron-data (it's a peer dependency).\r\n */\r\nexport interface NucleusKVLike {\r\n get(key: string): Promise<string | null>;\r\n set(key: string, value: string, opts?: { ttl?: number; namespace?: string }): Promise<void>;\r\n delete(key: string): Promise<boolean>;\r\n incr(key: string, amount?: number): Promise<number>;\r\n expire(key: string, seconds: number): Promise<boolean>;\r\n}\r\n\r\nexport interface NucleusCacheClientOptions {\r\n /** A KV model instance (from `@neutron-build/nucleus`). */\r\n kv: NucleusKVLike;\r\n /** Key prefix for all cache entries (default `\"cache:\"`). */\r\n prefix?: string;\r\n}\r\n\r\n/**\r\n * CacheClient implementation backed by Nucleus KV.\r\n *\r\n * This is a drop-in replacement for `MemoryCacheClient` or `RedisCacheClient`\r\n * that stores data directly in Nucleus, avoiding the need for a separate\r\n * Redis instance.\r\n */\r\nexport class NucleusCacheClient implements CacheClient {\r\n private readonly kv: NucleusKVLike;\r\n private readonly prefix: string;\r\n\r\n constructor(options: NucleusCacheClientOptions) {\r\n this.kv = options.kv;\r\n this.prefix = options.prefix ?? \"cache:\";\r\n }\r\n\r\n private key(k: string): string {\r\n return `${this.prefix}${k}`;\r\n }\r\n\r\n async get(key: string): Promise<string | null> {\r\n return this.kv.get(this.key(key));\r\n }\r\n\r\n async set(key: string, value: string, ttlSec?: number): Promise<void> {\r\n const opts = ttlSec && ttlSec > 0 ? { ttl: ttlSec } : undefined;\r\n await this.kv.set(this.key(key), value, opts);\r\n }\r\n\r\n async del(key: string): Promise<void> {\r\n await this.kv.delete(this.key(key));\r\n }\r\n\r\n async incr(key: string, ttlSec?: number): Promise<number> {\r\n const k = this.key(key);\r\n const next = await this.kv.incr(k);\r\n if (ttlSec && ttlSec > 0) {\r\n await this.kv.expire(k, ttlSec);\r\n }\r\n return next;\r\n }\r\n}\r\n\r\n/**\r\n * Factory function matching the pattern of `createRedisCacheClient`.\r\n */\r\nexport function createNucleusCacheClient(options: NucleusCacheClientOptions): NucleusCacheClient {\r\n return new NucleusCacheClient(options);\r\n}\r\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"redis.js","sourceRoot":"","sources":["../../src/cache/redis.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAiBxD,MAAM,OAAO,gBAAgB;IAER;IACA;IAFnB,YACmB,MAAuB,EACvB,SAAiB;QADjB,WAAM,GAAN,MAAM,CAAiB;QACvB,cAAS,GAAT,SAAS,CAAQ;IACjC,CAAC;IAEJ,KAAK,CAAC,GAAG,CAAC,GAAW;QACnB,OAAO,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;IAC9C,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,GAAW,EAAE,KAAa,EAAE,MAAe;QACnD,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC9B,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,GAAG,CAAC,EAAE,CAAC;YAC7C,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;YACpD,OAAO;QACT,CAAC;QACD,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IACxC,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,GAAW;QACnB,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;IACvC,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,GAAW,EAAE,MAAe;QACrC,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC9B,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC9C,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,GAAG,CAAC,IAAI,KAAK,KAAK,CAAC,EAAE,CAAC;YAC5D,MAAM,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAC5C,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,KAAK,CAAC,KAAK;QACT,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;IAC3B,CAAC;IAEO,GAAG,CAAC,GAAW;QACrB,OAAO,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,SAAS,GAAG,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC;IAC1D,CAAC;CACF;AAED,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,UAAmC,EAAE;IAErC,MAAM,WAAW,GAAG,MAAM,UAAU,CAClC,SAAS,EACT,0DAA0D,CAC3D,CAAC;IAEF,MAAM,SAAS,GAAG,WAAW,CAAC,OAAO,CAAC;IACtC,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC;IAC/D,CAAC;IAED,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,OAAO,CAAC,GAAG,CAAC,SAAS,IAAI,wBAAwB,CAAC;IAC1G,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC,GAAG,EAAE;QAChC,WAAW,EAAE,KAAK;QAClB,oBAAoB,EAAE,CAAC;QACvB,cAAc,EAAE,OAAO,CAAC,gBAAgB,IAAI,KAAK;KAClD,CAAC,CAAC;IAEH,OAAO,IAAI,gBAAgB,CAAC,MAAM,EAAE,OAAO,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC;AAC/D,CAAC"}
1
+ {"version":3,"file":"redis.js","sourceRoot":"","sources":["../../src/cache/redis.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAiBxD,MAAM,OAAO,gBAAgB;IAER;IACA;IAFnB,YACmB,MAAuB,EACvB,SAAiB;QADjB,WAAM,GAAN,MAAM,CAAiB;QACvB,cAAS,GAAT,SAAS,CAAQ;IACjC,CAAC;IAEJ,KAAK,CAAC,GAAG,CAAC,GAAW;QACnB,OAAO,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;IAC9C,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,GAAW,EAAE,KAAa,EAAE,MAAe;QACnD,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC9B,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,GAAG,CAAC,EAAE,CAAC;YAC7C,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;YACpD,OAAO;QACT,CAAC;QACD,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IACxC,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,GAAW;QACnB,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;IACvC,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,GAAW,EAAE,MAAe;QACrC,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC9B,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC9C,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,GAAG,CAAC,IAAI,KAAK,KAAK,CAAC,EAAE,CAAC;YAC5D,MAAM,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAC5C,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,KAAK,CAAC,KAAK;QACT,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;IAC3B,CAAC;IAEO,GAAG,CAAC,GAAW;QACrB,OAAO,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,SAAS,GAAG,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC;IAC1D,CAAC;CACF;AAED,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,UAAmC,EAAE;IAErC,MAAM,WAAW,GAAG,MAAM,UAAU,CAClC,SAAS,EACT,0DAA0D,CAC3D,CAAC;IAEF,MAAM,SAAS,GAAG,WAAW,CAAC,OAAO,CAAC;IACtC,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC;IAC/D,CAAC;IAED,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,OAAO,CAAC,GAAG,CAAC,SAAS,IAAI,wBAAwB,CAAC;IAC1G,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC,GAAG,EAAE;QAChC,WAAW,EAAE,KAAK;QAClB,oBAAoB,EAAE,CAAC;QACvB,cAAc,EAAE,OAAO,CAAC,gBAAgB,IAAI,KAAK;KAClD,CAAC,CAAC;IAEH,OAAO,IAAI,gBAAgB,CAAC,MAAM,EAAE,OAAO,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC;AAC/D,CAAC","sourcesContent":["import type { CacheClient } from \"./index.js\";\nimport { lazyImport } from \"../internal/lazy-import.js\";\n\nexport interface RedisCacheClientOptions {\n url?: string;\n keyPrefix?: string;\n connectTimeoutMs?: number;\n}\n\ninterface RedisLikeClient {\n get(key: string): Promise<string | null>;\n set(key: string, value: string, mode?: \"EX\", ttlSec?: number): Promise<unknown>;\n del(key: string): Promise<unknown>;\n incr(key: string): Promise<number>;\n expire(key: string, ttlSec: number): Promise<unknown>;\n quit(): Promise<unknown>;\n}\n\nexport class RedisCacheClient implements CacheClient {\n constructor(\n private readonly client: RedisLikeClient,\n private readonly keyPrefix: string\n ) {}\n\n async get(key: string): Promise<string | null> {\n return await this.client.get(this.key(key));\n }\n\n async set(key: string, value: string, ttlSec?: number): Promise<void> {\n const fullKey = this.key(key);\n if (typeof ttlSec === \"number\" && ttlSec > 0) {\n await this.client.set(fullKey, value, \"EX\", ttlSec);\n return;\n }\n await this.client.set(fullKey, value);\n }\n\n async del(key: string): Promise<void> {\n await this.client.del(this.key(key));\n }\n\n async incr(key: string, ttlSec?: number): Promise<number> {\n const fullKey = this.key(key);\n const value = await this.client.incr(fullKey);\n if (typeof ttlSec === \"number\" && ttlSec > 0 && value === 1) {\n await this.client.expire(fullKey, ttlSec);\n }\n return value;\n }\n\n async close(): Promise<void> {\n await this.client.quit();\n }\n\n private key(key: string): string {\n return this.keyPrefix ? `${this.keyPrefix}${key}` : key;\n }\n}\n\nexport async function createRedisCacheClient(\n options: RedisCacheClientOptions = {}\n): Promise<RedisCacheClient> {\n const redisModule = await lazyImport<{ default?: new (...args: unknown[]) => RedisLikeClient }>(\n \"ioredis\",\n \"Install with `pnpm add ioredis` (or npm/yarn equivalent)\"\n );\n\n const RedisCtor = redisModule.default;\n if (!RedisCtor) {\n throw new Error(\"Failed to resolve ioredis default export.\");\n }\n\n const url = options.url || process.env.DRAGONFLY_URL || process.env.REDIS_URL || \"redis://127.0.0.1:6379\";\n const client = new RedisCtor(url, {\n lazyConnect: false,\n maxRetriesPerRequest: 3,\n connectTimeout: options.connectTimeoutMs ?? 10000,\n });\n\n return new RedisCacheClient(client, options.keyPrefix || \"\");\n}\n\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAsBA,MAAM,mBAAmB,GAAG,iBAAiB,CAAC;AAC9C,MAAM,wBAAwB,GAAG,cAAc,CAAC;AAChD,MAAM,uBAAuB,GAAG,aAAa,CAAC;AAE9C,MAAM,UAAU,iBAAiB,CAAC,QAAyB,EAAE;IAC3D,MAAM,cAAc,GAAG,KAAK,CAAC,cAAc,IAAI,wBAAwB,CAAC;IACxE,MAAM,UAAU,GAAG,KAAK,CAAC,UAAU,IAAI,mBAAmB,CAAC;IAC3D,MAAM,aAAa,GAAG,KAAK,CAAC,aAAa,IAAI,uBAAuB,CAAC;IAErE,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;QACnB,OAAO;YACL,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,UAAU;YACV,cAAc;YACd,aAAa;SACd,CAAC;IACJ,CAAC;IAED,wEAAwE;IACxE,MAAM,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC;IAC1D,MAAM,cAAc,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC;IAE5D,IAAI,QAA0B,CAAC;IAC/B,IAAI,aAAa,EAAE,CAAC;QAClB,QAAQ,GAAG,SAAS,CAAC;IACvB,CAAC;SAAM,IAAI,cAAc,EAAE,CAAC;QAC1B,QAAQ,GAAG,UAAU,CAAC;IACxB,CAAC;SAAM,CAAC;QACN,QAAQ,GAAG,QAAQ,CAAC;IACtB,CAAC;IAED,OAAO;QACL,QAAQ;QACR,UAAU;QACV,cAAc;QACd,aAAa;KACd,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAsBA,MAAM,mBAAmB,GAAG,iBAAiB,CAAC;AAC9C,MAAM,wBAAwB,GAAG,cAAc,CAAC;AAChD,MAAM,uBAAuB,GAAG,aAAa,CAAC;AAE9C,MAAM,UAAU,iBAAiB,CAAC,QAAyB,EAAE;IAC3D,MAAM,cAAc,GAAG,KAAK,CAAC,cAAc,IAAI,wBAAwB,CAAC;IACxE,MAAM,UAAU,GAAG,KAAK,CAAC,UAAU,IAAI,mBAAmB,CAAC;IAC3D,MAAM,aAAa,GAAG,KAAK,CAAC,aAAa,IAAI,uBAAuB,CAAC;IAErE,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;QACnB,OAAO;YACL,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,UAAU;YACV,cAAc;YACd,aAAa;SACd,CAAC;IACJ,CAAC;IAED,wEAAwE;IACxE,MAAM,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC;IAC1D,MAAM,cAAc,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC;IAE5D,IAAI,QAA0B,CAAC;IAC/B,IAAI,aAAa,EAAE,CAAC;QAClB,QAAQ,GAAG,SAAS,CAAC;IACvB,CAAC;SAAM,IAAI,cAAc,EAAE,CAAC;QAC1B,QAAQ,GAAG,UAAU,CAAC;IACxB,CAAC;SAAM,CAAC;QACN,QAAQ,GAAG,QAAQ,CAAC;IACtB,CAAC;IAED,OAAO;QACL,QAAQ;QACR,UAAU;QACV,cAAc;QACd,aAAa;KACd,CAAC;AACJ,CAAC","sourcesContent":["export type DatabaseProvider = \"sqlite\" | \"postgres\" | \"nucleus\";\n\nexport interface DataConfigInput {\n database?: DatabaseProvider;\n sqlitePath?: string;\n postgresUrlEnv?: string;\n /**\n * Environment variable holding the Nucleus server URL.\n * When `database` is `\"nucleus\"` (or auto-detected), this is used to\n * configure the `@neutron-build/nucleus` client transport.\n * Defaults to `\"NUCLEUS_URL\"`, falling back to the Postgres URL env var.\n */\n nucleusUrlEnv?: string;\n}\n\nexport interface ResolvedDataConfig {\n database: DatabaseProvider;\n sqlitePath: string;\n postgresUrlEnv: string;\n nucleusUrlEnv: string;\n}\n\nconst DEFAULT_SQLITE_PATH = \".neutron/dev.db\";\nconst DEFAULT_POSTGRES_URL_ENV = \"DATABASE_URL\";\nconst DEFAULT_NUCLEUS_URL_ENV = \"NUCLEUS_URL\";\n\nexport function resolveDataConfig(input: DataConfigInput = {}): ResolvedDataConfig {\n const postgresUrlEnv = input.postgresUrlEnv || DEFAULT_POSTGRES_URL_ENV;\n const sqlitePath = input.sqlitePath || DEFAULT_SQLITE_PATH;\n const nucleusUrlEnv = input.nucleusUrlEnv || DEFAULT_NUCLEUS_URL_ENV;\n\n if (input.database) {\n return {\n database: input.database,\n sqlitePath,\n postgresUrlEnv,\n nucleusUrlEnv,\n };\n }\n\n // Auto-detect: check for Nucleus URL first, then Postgres, then SQLite.\n const hasNucleusUrl = Boolean(process.env[nucleusUrlEnv]);\n const hasPostgresUrl = Boolean(process.env[postgresUrlEnv]);\n\n let database: DatabaseProvider;\n if (hasNucleusUrl) {\n database = \"nucleus\";\n } else if (hasPostgresUrl) {\n database = \"postgres\";\n } else {\n database = \"sqlite\";\n }\n\n return {\n database,\n sqlitePath,\n postgresUrlEnv,\n nucleusUrlEnv,\n };\n}\n\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"drizzle.js","sourceRoot":"","sources":["../../src/db/drizzle.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"drizzle.js","sourceRoot":"","sources":["../../src/db/drizzle.ts"],"names":[],"mappings":"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","sourcesContent":["import * as path from \"node:path\";\nimport type { DataConfigInput } from \"../config.js\";\nimport { resolveDatabaseProfile, type DatabaseProfile } from \"./index.js\";\nimport { lazyImport } from \"../internal/lazy-import.js\";\n\nexport interface DrizzleDatabaseOptions {\n profile?: DatabaseProfile;\n config?: DataConfigInput;\n schema?: Record<string, unknown>;\n}\n\nexport interface DrizzleDatabase {\n profile: DatabaseProfile;\n client: unknown;\n db: unknown;\n /**\n * When connected to Nucleus, this holds the `@neutron-build/nucleus` client\n * builder return value after `.connect()`. You can use it to access\n * non-relational models (KV, Vector, Graph, etc.).\n *\n * `null` when connected to plain Postgres or SQLite.\n */\n nucleus: unknown | null;\n close: () => Promise<void>;\n}\n\nexport async function createDrizzleDatabase(\n options: DrizzleDatabaseOptions = {}\n): Promise<DrizzleDatabase> {\n const profile = options.profile || resolveDatabaseProfile(options.config);\n\n if (profile.provider === \"nucleus\") {\n return await createNucleusDrizzle(profile, options.schema);\n }\n\n if (profile.provider === \"postgres\") {\n return await createPostgresDrizzle(profile, options.schema);\n }\n\n return await createSqliteDrizzle(profile, options.schema);\n}\n\n/**\n * Create a Drizzle database backed by Nucleus.\n *\n * Since Nucleus speaks the PostgreSQL wire protocol, we reuse the same\n * `postgres` driver for Drizzle ORM. In addition, we create a Nucleus\n * client to provide access to non-relational data models.\n */\nasync function createNucleusDrizzle(\n profile: DatabaseProfile,\n schema?: Record<string, unknown>\n): Promise<DrizzleDatabase> {\n // Use the same postgres driver — Nucleus speaks pgwire\n const postgresModule = await lazyImport<{ default?: (...args: unknown[]) => any }>(\n \"postgres\",\n \"Install with `pnpm add postgres drizzle-orm` (or npm/yarn equivalent)\"\n );\n const drizzleModule = await lazyImport<{ drizzle?: (...args: unknown[]) => unknown }>(\n \"drizzle-orm/postgres-js\",\n \"Install with `pnpm add drizzle-orm` (or npm/yarn equivalent)\"\n );\n\n if (!postgresModule.default || !drizzleModule.drizzle) {\n throw new Error(\"Failed to initialize Nucleus Drizzle client.\");\n }\n\n const sqlClient = postgresModule.default(profile.connectionString, {\n max: 10,\n idle_timeout: 20,\n connect_timeout: 10,\n });\n\n const db = schema\n ? drizzleModule.drizzle(sqlClient, { schema })\n : drizzleModule.drizzle(sqlClient);\n\n // Optionally create the Nucleus multi-model client.\n // This uses `@neutron-build/nucleus` which may not be installed in every project.\n let nucleus: unknown | null = null;\n try {\n const nucleusModule = await lazyImport<{\n createClient?: (config: { url: string }) => {\n use: (plugin: unknown) => unknown;\n connect: () => Promise<unknown>;\n };\n }>(\n \"@neutron-build/nucleus\",\n \"@neutron-build/nucleus is optional for multi-model features\"\n );\n\n if (nucleusModule.createClient) {\n nucleus = await nucleusModule.createClient({\n url: profile.connectionString,\n }).connect();\n }\n } catch {\n // @neutron-build/nucleus not installed — Drizzle-only mode is fine.\n nucleus = null;\n }\n\n return {\n profile,\n client: sqlClient,\n db,\n nucleus,\n close: async () => {\n if (nucleus && typeof (nucleus as { close?: () => Promise<void> }).close === \"function\") {\n await (nucleus as { close: () => Promise<void> }).close();\n }\n if (typeof sqlClient.end === \"function\") {\n await sqlClient.end();\n }\n },\n };\n}\n\nasync function createPostgresDrizzle(\n profile: DatabaseProfile,\n schema?: Record<string, unknown>\n): Promise<DrizzleDatabase> {\n const postgresModule = await lazyImport<{ default?: (...args: unknown[]) => any }>(\n \"postgres\",\n \"Install with `pnpm add postgres drizzle-orm` (or npm/yarn equivalent)\"\n );\n const drizzleModule = await lazyImport<{ drizzle?: (...args: unknown[]) => unknown }>(\n \"drizzle-orm/postgres-js\",\n \"Install with `pnpm add drizzle-orm` (or npm/yarn equivalent)\"\n );\n\n if (!postgresModule.default || !drizzleModule.drizzle) {\n throw new Error(\"Failed to initialize Postgres Drizzle client.\");\n }\n\n const sqlClient = postgresModule.default(profile.connectionString, {\n max: 10,\n idle_timeout: 20,\n connect_timeout: 10,\n });\n\n const db = schema\n ? drizzleModule.drizzle(sqlClient, { schema })\n : drizzleModule.drizzle(sqlClient);\n\n return {\n profile,\n client: sqlClient,\n db,\n nucleus: null,\n close: async () => {\n if (typeof sqlClient.end === \"function\") {\n await sqlClient.end();\n }\n },\n };\n}\n\nasync function createSqliteDrizzle(\n profile: DatabaseProfile,\n schema?: Record<string, unknown>\n): Promise<DrizzleDatabase> {\n const libsqlModule = await lazyImport<{ createClient?: (options: { url: string }) => unknown }>(\n \"@libsql/client\",\n \"Install with `pnpm add @libsql/client drizzle-orm` (or npm/yarn equivalent)\"\n );\n const drizzleModule = await lazyImport<{ drizzle?: (...args: unknown[]) => unknown }>(\n \"drizzle-orm/libsql\",\n \"Install with `pnpm add drizzle-orm` (or npm/yarn equivalent)\"\n );\n\n if (!libsqlModule.createClient || !drizzleModule.drizzle) {\n throw new Error(\"Failed to initialize SQLite Drizzle client.\");\n }\n\n const url = normalizeSqliteConnection(profile.connectionString);\n const client = libsqlModule.createClient({ url });\n const db = schema ? drizzleModule.drizzle(client, { schema }) : drizzleModule.drizzle(client);\n\n return {\n profile,\n client,\n db,\n nucleus: null,\n close: async () => {\n const maybeClose = (client as { close?: () => Promise<void> | void }).close;\n if (typeof maybeClose === \"function\") {\n await maybeClose.call(client);\n }\n },\n };\n}\n\nfunction normalizeSqliteConnection(connectionString: string): string {\n if (\n connectionString.startsWith(\"file:\") ||\n connectionString.startsWith(\"libsql:\") ||\n connectionString.startsWith(\"http://\") ||\n connectionString.startsWith(\"https://\")\n ) {\n return connectionString;\n }\n\n const absolute = path.resolve(connectionString);\n return `file:${absolute}`;\n}\n\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/db/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAA+C,MAAM,cAAc,CAAC;AAO9F,MAAM,UAAU,sBAAsB,CAAC,QAAyB,EAAE;IAChE,MAAM,QAAQ,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAC;IAE1C,IAAI,QAAQ,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;QACnC,OAAO;YACL,QAAQ,EAAE,QAAQ;YAClB,gBAAgB,EAAE,QAAQ,CAAC,UAAU;SACtC,CAAC;IACJ,CAAC;IAED,IAAI,QAAQ,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;QACpC,sEAAsE;QACtE,+DAA+D;QAC/D,MAAM,gBAAgB,GACpB,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,aAAa,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC;QAC9E,IAAI,CAAC,gBAAgB,EAAE,CAAC;YACtB,MAAM,IAAI,KAAK,CACb,wCAAwC,QAAQ,CAAC,aAAa,QAAQ,QAAQ,CAAC,cAAc,UAAU,CACxG,CAAC;QACJ,CAAC;QACD,OAAO;YACL,QAAQ,EAAE,SAAS;YACnB,gBAAgB;SACjB,CAAC;IACJ,CAAC;IAED,WAAW;IACX,MAAM,gBAAgB,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC;IAC9D,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACtB,MAAM,IAAI,KAAK,CACb,iCAAiC,QAAQ,CAAC,cAAc,cAAc,CACvE,CAAC;IACJ,CAAC;IAED,OAAO;QACL,QAAQ,EAAE,UAAU;QACpB,gBAAgB;KACjB,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/db/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAA+C,MAAM,cAAc,CAAC;AAO9F,MAAM,UAAU,sBAAsB,CAAC,QAAyB,EAAE;IAChE,MAAM,QAAQ,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAC;IAE1C,IAAI,QAAQ,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;QACnC,OAAO;YACL,QAAQ,EAAE,QAAQ;YAClB,gBAAgB,EAAE,QAAQ,CAAC,UAAU;SACtC,CAAC;IACJ,CAAC;IAED,IAAI,QAAQ,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;QACpC,sEAAsE;QACtE,+DAA+D;QAC/D,MAAM,gBAAgB,GACpB,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,aAAa,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC;QAC9E,IAAI,CAAC,gBAAgB,EAAE,CAAC;YACtB,MAAM,IAAI,KAAK,CACb,wCAAwC,QAAQ,CAAC,aAAa,QAAQ,QAAQ,CAAC,cAAc,UAAU,CACxG,CAAC;QACJ,CAAC;QACD,OAAO;YACL,QAAQ,EAAE,SAAS;YACnB,gBAAgB;SACjB,CAAC;IACJ,CAAC;IAED,WAAW;IACX,MAAM,gBAAgB,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC;IAC9D,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACtB,MAAM,IAAI,KAAK,CACb,iCAAiC,QAAQ,CAAC,cAAc,cAAc,CACvE,CAAC;IACJ,CAAC;IAED,OAAO;QACL,QAAQ,EAAE,UAAU;QACpB,gBAAgB;KACjB,CAAC;AACJ,CAAC","sourcesContent":["import { resolveDataConfig, type DataConfigInput, type DatabaseProvider } from \"../config.js\";\n\nexport interface DatabaseProfile {\n provider: DatabaseProvider;\n connectionString: string;\n}\n\nexport function resolveDatabaseProfile(input: DataConfigInput = {}): DatabaseProfile {\n const resolved = resolveDataConfig(input);\n\n if (resolved.database === \"sqlite\") {\n return {\n provider: \"sqlite\",\n connectionString: resolved.sqlitePath,\n };\n }\n\n if (resolved.database === \"nucleus\") {\n // Nucleus uses its own URL env var. Falls back to the Postgres URL if\n // the Nucleus-specific var is not set (Nucleus speaks pgwire).\n const connectionString =\n process.env[resolved.nucleusUrlEnv] ?? process.env[resolved.postgresUrlEnv];\n if (!connectionString) {\n throw new Error(\n `Nucleus profile selected but neither ${resolved.nucleusUrlEnv} nor ${resolved.postgresUrlEnv} is set.`\n );\n }\n return {\n provider: \"nucleus\",\n connectionString,\n };\n }\n\n // postgres\n const connectionString = process.env[resolved.postgresUrlEnv];\n if (!connectionString) {\n throw new Error(\n `Postgres profile selected but ${resolved.postgresUrlEnv} is not set.`\n );\n }\n\n return {\n provider: \"postgres\",\n connectionString,\n };\n}\n\n"]}
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iBAAiB,GAIlB,MAAM,aAAa,CAAC;AAErB,OAAO,EACL,sBAAsB,GAEvB,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,qBAAqB,GAGtB,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EACL,iBAAiB,GAElB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,gBAAgB,EAChB,sBAAsB,GAEvB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,kBAAkB,EAClB,wBAAwB,GAGzB,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EACL,kBAAkB,GAKnB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,uBAAuB,GAGxB,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EACL,oBAAoB,GAGrB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EACL,mBAAmB,GAIpB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,iBAAiB,EACjB,uBAAuB,GAExB,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EACL,UAAU,GAEX,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EACL,qBAAqB,GAGtB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,eAAe,EACf,qBAAqB,GAEtB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,oBAAoB,EACpB,0BAA0B,GAG3B,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EACL,mBAAmB,GAEpB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,gBAAgB,EAChB,sBAAsB,GAEvB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,kBAAkB,EAClB,wBAAwB,GAGzB,MAAM,uBAAuB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iBAAiB,GAIlB,MAAM,aAAa,CAAC;AAErB,OAAO,EACL,sBAAsB,GAEvB,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,qBAAqB,GAGtB,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EACL,iBAAiB,GAElB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,gBAAgB,EAChB,sBAAsB,GAEvB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,kBAAkB,EAClB,wBAAwB,GAGzB,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EACL,kBAAkB,GAKnB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,uBAAuB,GAGxB,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EACL,oBAAoB,GAGrB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EACL,mBAAmB,GAIpB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,iBAAiB,EACjB,uBAAuB,GAExB,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EACL,UAAU,GAEX,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EACL,qBAAqB,GAGtB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,eAAe,EACf,qBAAqB,GAEtB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,oBAAoB,EACpB,0BAA0B,GAG3B,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EACL,mBAAmB,GAEpB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,gBAAgB,EAChB,sBAAsB,GAEvB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,kBAAkB,EAClB,wBAAwB,GAGzB,MAAM,uBAAuB,CAAC","sourcesContent":["export {\n resolveDataConfig,\n type DataConfigInput,\n type ResolvedDataConfig,\n type DatabaseProvider,\n} from \"./config.js\";\n\nexport {\n resolveDatabaseProfile,\n type DatabaseProfile,\n} from \"./db/index.js\";\nexport {\n createDrizzleDatabase,\n type DrizzleDatabase,\n type DrizzleDatabaseOptions,\n} from \"./db/drizzle.js\";\n\nexport {\n MemoryCacheClient,\n type CacheClient,\n} from \"./cache/index.js\";\nexport {\n RedisCacheClient,\n createRedisCacheClient,\n type RedisCacheClientOptions,\n} from \"./cache/redis.js\";\nexport {\n NucleusCacheClient,\n createNucleusCacheClient,\n type NucleusCacheClientOptions,\n type NucleusKVLike,\n} from \"./cache/nucleus.js\";\n\nexport {\n createSessionStore,\n type SessionData,\n type SessionRecord,\n type SessionStore,\n type SessionStoreOptions,\n} from \"./session/index.js\";\nexport {\n createRedisSessionStore,\n type RedisSessionStore,\n type RedisSessionStoreOptions,\n} from \"./session/redis.js\";\n\nexport {\n enforceSlidingWindow,\n type SlidingWindowOptions,\n type SlidingWindowResult,\n} from \"./ratelimit/index.js\";\n\nexport {\n InMemoryQueueDriver,\n type QueueDriver,\n type Job,\n type JobHandler,\n} from \"./queue/index.js\";\nexport {\n BullMqQueueDriver,\n createBullMqQueueDriver,\n type BullMqQueueDriverOptions,\n} from \"./queue/bullmq.js\";\n\nexport {\n createJobs,\n type JobsOptions,\n} from \"./jobs/index.js\";\n\nexport {\n InMemoryStorageDriver,\n type StorageDriver,\n type StorageObject,\n} from \"./storage/index.js\";\nexport {\n S3StorageDriver,\n createS3StorageDriver,\n type S3StorageDriverOptions,\n} from \"./storage/s3.js\";\nexport {\n NucleusStorageDriver,\n createNucleusStorageDriver,\n type NucleusStorageDriverOptions,\n type NucleusBlobLike,\n} from \"./storage/nucleus.js\";\n\nexport {\n InMemoryRealtimeBus,\n type RealtimeBus,\n} from \"./realtime/index.js\";\nexport {\n RedisRealtimeBus,\n createRedisRealtimeBus,\n type RedisRealtimeBusOptions,\n} from \"./realtime/redis.js\";\nexport {\n NucleusRealtimeBus,\n createNucleusRealtimeBus,\n type NucleusRealtimeBusOptions,\n type NucleusPubSubLike,\n} from \"./realtime/nucleus.js\";\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"lazy-import.js","sourceRoot":"","sources":["../../src/internal/lazy-import.ts"],"names":[],"mappings":"AAEA,MAAM,aAAa,GAAG,IAAI,QAAQ,CAChC,WAAW,EACX,2BAA2B,CACT,CAAC;AAErB,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,SAAiB,EACjB,WAAmB;IAEnB,IAAI,CAAC;QACH,OAAO,CAAC,MAAM,aAAa,CAAC,SAAS,CAAC,CAAY,CAAC;IACrD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,MAAM,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACtE,MAAM,IAAI,KAAK,CACb,gCAAgC,SAAS,MAAM,WAAW,qBAAqB,MAAM,EAAE,CACxF,CAAC;IACJ,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"lazy-import.js","sourceRoot":"","sources":["../../src/internal/lazy-import.ts"],"names":[],"mappings":"AAEA,MAAM,aAAa,GAAG,IAAI,QAAQ,CAChC,WAAW,EACX,2BAA2B,CACT,CAAC;AAErB,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,SAAiB,EACjB,WAAmB;IAEnB,IAAI,CAAC;QACH,OAAO,CAAC,MAAM,aAAa,CAAC,SAAS,CAAC,CAAY,CAAC;IACrD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,MAAM,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACtE,MAAM,IAAI,KAAK,CACb,gCAAgC,SAAS,MAAM,WAAW,qBAAqB,MAAM,EAAE,CACxF,CAAC;IACJ,CAAC;AACH,CAAC","sourcesContent":["type DynamicImporter = (specifier: string) => Promise<unknown>;\n\nconst dynamicImport = new Function(\n \"specifier\",\n \"return import(specifier);\"\n) as DynamicImporter;\n\nexport async function lazyImport<TModule>(\n specifier: string,\n installHint: string\n): Promise<TModule> {\n try {\n return (await dynamicImport(specifier)) as TModule;\n } catch (error) {\n const reason = error instanceof Error ? error.message : String(error);\n throw new Error(\n `Missing optional dependency \"${specifier}\". ${installHint}. Original error: ${reason}`\n );\n }\n}\n\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/jobs/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAoB,MAAM,mBAAmB,CAAC;AAM1E,MAAM,UAAU,UAAU,CAAC,UAAuB,EAAE;IAClD,OAAO,OAAO,CAAC,MAAM,IAAI,IAAI,mBAAmB,EAAE,CAAC;AACrD,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/jobs/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAoB,MAAM,mBAAmB,CAAC;AAM1E,MAAM,UAAU,UAAU,CAAC,UAAuB,EAAE;IAClD,OAAO,OAAO,CAAC,MAAM,IAAI,IAAI,mBAAmB,EAAE,CAAC;AACrD,CAAC","sourcesContent":["import { InMemoryQueueDriver, type QueueDriver } from \"../queue/index.js\";\n\nexport interface JobsOptions {\n driver?: QueueDriver;\n}\n\nexport function createJobs(options: JobsOptions = {}): QueueDriver {\n return options.driver || new InMemoryQueueDriver();\n}\n\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"bullmq.js","sourceRoot":"","sources":["../../src/queue/bullmq.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"bullmq.js","sourceRoot":"","sources":["../../src/queue/bullmq.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Job, JobHandler, QueueDriver } from \"./index.js\";\nimport { lazyImport } from \"../internal/lazy-import.js\";\n\nexport interface BullMqQueueDriverOptions {\n url?: string;\n queueName?: string;\n prefix?: string;\n concurrency?: number;\n}\n\ninterface RedisLikeConnection {\n quit(): Promise<unknown>;\n}\n\ninterface BullMqQueueLike {\n add(name: string, payload: unknown): Promise<{ id: string | number | undefined }>;\n close(): Promise<void>;\n}\n\ninterface BullMqWorkerLike {\n close(): Promise<void>;\n}\n\ntype BullMqWorkerCtor = new (\n queueName: string,\n processor: (job: { id?: string | number; name: string; data: unknown; timestamp?: number }) => Promise<void>,\n options?: Record<string, unknown>\n) => BullMqWorkerLike;\n\ntype BullMqQueueCtor = new (\n queueName: string,\n options?: Record<string, unknown>\n) => BullMqQueueLike;\n\nexport class BullMqQueueDriver implements QueueDriver {\n private readonly handlers = new Map<string, JobHandler<unknown>>();\n private worker: BullMqWorkerLike | null = null;\n\n constructor(\n private readonly queue: BullMqQueueLike,\n private readonly WorkerCtor: BullMqWorkerCtor,\n private readonly workerOptions: Record<string, unknown>,\n private readonly queueName: string,\n private readonly connection: RedisLikeConnection\n ) {}\n\n async add<TPayload = unknown>(name: string, payload: TPayload): Promise<Job<TPayload>> {\n const result = await this.queue.add(name, payload);\n return {\n id: String(result.id ?? \"\"),\n name,\n payload,\n createdAt: Date.now(),\n };\n }\n\n async process<TPayload = unknown>(\n name: string,\n handler: JobHandler<TPayload>\n ): Promise<void> {\n this.handlers.set(name, handler as JobHandler<unknown>);\n await this.ensureWorker();\n }\n\n async close(): Promise<void> {\n if (this.worker) {\n await this.worker.close();\n this.worker = null;\n }\n await this.queue.close();\n await this.connection.quit();\n }\n\n private async ensureWorker(): Promise<void> {\n if (this.worker) {\n return;\n }\n\n this.worker = new this.WorkerCtor(\n this.queueName,\n async (job) => {\n const handler = this.handlers.get(job.name);\n if (!handler) {\n return;\n }\n await handler({\n id: String(job.id ?? \"\"),\n name: job.name,\n payload: job.data,\n createdAt: Number(job.timestamp || Date.now()),\n });\n },\n this.workerOptions\n );\n }\n}\n\nexport async function createBullMqQueueDriver(\n options: BullMqQueueDriverOptions = {}\n): Promise<BullMqQueueDriver> {\n const redisModule = await lazyImport<{ default?: new (...args: unknown[]) => RedisLikeConnection }>(\n \"ioredis\",\n \"Install with `pnpm add ioredis bullmq` (or npm/yarn equivalent)\"\n );\n const bullMqModule = await lazyImport<{\n Queue?: BullMqQueueCtor;\n Worker?: BullMqWorkerCtor;\n }>(\n \"bullmq\",\n \"Install with `pnpm add bullmq ioredis` (or npm/yarn equivalent)\"\n );\n\n if (!redisModule.default || !bullMqModule.Queue || !bullMqModule.Worker) {\n throw new Error(\"Failed to initialize BullMQ queue driver.\");\n }\n\n const url = options.url || process.env.DRAGONFLY_URL || process.env.REDIS_URL || \"redis://127.0.0.1:6379\";\n const queueName = options.queueName || \"neutron\";\n const prefix = options.prefix || \"neutron\";\n const concurrency = options.concurrency ?? 8;\n const connection = new redisModule.default(url, {\n lazyConnect: false,\n maxRetriesPerRequest: null,\n }) as RedisLikeConnection;\n\n const queue = new bullMqModule.Queue(queueName, {\n connection,\n prefix,\n });\n\n return new BullMqQueueDriver(\n queue,\n bullMqModule.Worker,\n {\n connection,\n prefix,\n concurrency,\n },\n queueName,\n connection\n );\n}\n\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/queue/index.ts"],"names":[],"mappings":"AAcA,MAAM,OAAO,mBAAmB;IACtB,SAAS,GAAG,CAAC,CAAC;IACd,QAAQ,GAAG,IAAI,GAAG,EAA2B,CAAC;IAC9C,IAAI,GAAe,EAAE,CAAC;IACtB,QAAQ,GAAG,KAAK,CAAC;IAEzB,KAAK,CAAC,GAAG,CAAqB,IAAY,EAAE,OAAiB;QAC3D,MAAM,GAAG,GAAkB;YACzB,EAAE,EAAE,MAAM,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC;YAC5B,IAAI;YACJ,OAAO;YACP,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;SACtB,CAAC;QACF,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACpB,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;QACnB,OAAO,GAAG,CAAC;IACb,CAAC;IAED,KAAK,CAAC,OAAO,CACX,IAAY,EACZ,OAA6B;QAE7B,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,OAA0B,CAAC,CAAC;QACpD,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;IACrB,CAAC;IAEO,KAAK,CAAC,KAAK;QACjB,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClB,OAAO;QACT,CAAC;QACD,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACrB,IAAI,CAAC;YACH,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,GAAI,CAAC;gBACvC,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBACzB,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;gBAC5C,IAAI,CAAC,OAAO,EAAE,CAAC;oBACb,CAAC,IAAI,CAAC,CAAC;oBACP,SAAS;gBACX,CAAC;gBACD,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;gBACvB,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC;YACrB,CAAC;QACH,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;QACxB,CAAC;IACH,CAAC;CACF"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/queue/index.ts"],"names":[],"mappings":"AAcA,MAAM,OAAO,mBAAmB;IACtB,SAAS,GAAG,CAAC,CAAC;IACd,QAAQ,GAAG,IAAI,GAAG,EAA2B,CAAC;IAC9C,IAAI,GAAe,EAAE,CAAC;IACtB,QAAQ,GAAG,KAAK,CAAC;IAEzB,KAAK,CAAC,GAAG,CAAqB,IAAY,EAAE,OAAiB;QAC3D,MAAM,GAAG,GAAkB;YACzB,EAAE,EAAE,MAAM,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC;YAC5B,IAAI;YACJ,OAAO;YACP,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;SACtB,CAAC;QACF,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACpB,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;QACnB,OAAO,GAAG,CAAC;IACb,CAAC;IAED,KAAK,CAAC,OAAO,CACX,IAAY,EACZ,OAA6B;QAE7B,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,OAA0B,CAAC,CAAC;QACpD,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;IACrB,CAAC;IAEO,KAAK,CAAC,KAAK;QACjB,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClB,OAAO;QACT,CAAC;QACD,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACrB,IAAI,CAAC;YACH,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,GAAI,CAAC;gBACvC,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBACzB,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;gBAC5C,IAAI,CAAC,OAAO,EAAE,CAAC;oBACb,CAAC,IAAI,CAAC,CAAC;oBACP,SAAS;gBACX,CAAC;gBACD,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;gBACvB,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC;YACrB,CAAC;QACH,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;QACxB,CAAC;IACH,CAAC;CACF","sourcesContent":["export interface Job<TPayload = unknown> {\n id: string;\n name: string;\n payload: TPayload;\n createdAt: number;\n}\n\nexport type JobHandler<TPayload = unknown> = (job: Job<TPayload>) => Promise<void> | void;\n\nexport interface QueueDriver {\n add<TPayload = unknown>(name: string, payload: TPayload): Promise<Job<TPayload>>;\n process<TPayload = unknown>(name: string, handler: JobHandler<TPayload>): Promise<void>;\n}\n\nexport class InMemoryQueueDriver implements QueueDriver {\n private idCounter = 0;\n private handlers = new Map<string, JobHandler<any>>();\n private jobs: Job<any>[] = [];\n private draining = false;\n\n async add<TPayload = unknown>(name: string, payload: TPayload): Promise<Job<TPayload>> {\n const job: Job<TPayload> = {\n id: String(++this.idCounter),\n name,\n payload,\n createdAt: Date.now(),\n };\n this.jobs.push(job);\n await this.drain();\n return job;\n }\n\n async process<TPayload = unknown>(\n name: string,\n handler: JobHandler<TPayload>\n ): Promise<void> {\n this.handlers.set(name, handler as JobHandler<any>);\n await this.drain();\n }\n\n private async drain(): Promise<void> {\n if (this.draining) {\n return;\n }\n this.draining = true;\n try {\n for (let i = 0; i < this.jobs.length; ) {\n const job = this.jobs[i];\n const handler = this.handlers.get(job.name);\n if (!handler) {\n i += 1;\n continue;\n }\n this.jobs.splice(i, 1);\n await handler(job);\n }\n } finally {\n this.draining = false;\n }\n }\n}\n\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/ratelimit/index.ts"],"names":[],"mappings":"AAaA,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,KAAkB,EAClB,GAAW,EACX,OAA6B;IAE7B,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;IACrD,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC;IAC7D,MAAM,QAAQ,GAAG,SAAS,GAAG,IAAI,CAAC;IAClC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACvB,MAAM,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,QAAQ,CAAC,CAAC;IACjD,MAAM,cAAc,GAAG,aAAa,GAAG,CAAC,CAAC;IACzC,MAAM,UAAU,GAAG,MAAM,GAAG,IAAI,aAAa,EAAE,CAAC;IAChD,MAAM,WAAW,GAAG,MAAM,GAAG,IAAI,cAAc,EAAE,CAAC;IAElD,6EAA6E;IAC7E,qDAAqD;IACrD,MAAM,YAAY,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,UAAU,EAAE,SAAS,GAAG,CAAC,CAAC,CAAC;IACjE,MAAM,WAAW,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IACjD,MAAM,cAAc,GAAG,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1E,MAAM,aAAa,GAAG,MAAM,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC;IAE3E,MAAM,sBAAsB,GAAG,aAAa,GAAG,QAAQ,CAAC;IACxD,MAAM,eAAe,GAAG,GAAG,GAAG,sBAAsB,CAAC;IACrD,MAAM,oBAAoB,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,QAAQ,GAAG,eAAe,CAAC,GAAG,QAAQ,CAAC,CAAC;IAClF,MAAM,IAAI,GAAG,YAAY,GAAG,aAAa,GAAG,oBAAoB,CAAC;IACjE,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC;IACxD,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,QAAQ,GAAG,eAAe,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;IAElF,OAAO;QACL,OAAO,EAAE,IAAI,IAAI,KAAK;QACtB,SAAS;QACT,aAAa;KACd,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/ratelimit/index.ts"],"names":[],"mappings":"AAaA,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,KAAkB,EAClB,GAAW,EACX,OAA6B;IAE7B,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;IACrD,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC;IAC7D,MAAM,QAAQ,GAAG,SAAS,GAAG,IAAI,CAAC;IAClC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACvB,MAAM,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,QAAQ,CAAC,CAAC;IACjD,MAAM,cAAc,GAAG,aAAa,GAAG,CAAC,CAAC;IACzC,MAAM,UAAU,GAAG,MAAM,GAAG,IAAI,aAAa,EAAE,CAAC;IAChD,MAAM,WAAW,GAAG,MAAM,GAAG,IAAI,cAAc,EAAE,CAAC;IAElD,6EAA6E;IAC7E,qDAAqD;IACrD,MAAM,YAAY,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,UAAU,EAAE,SAAS,GAAG,CAAC,CAAC,CAAC;IACjE,MAAM,WAAW,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IACjD,MAAM,cAAc,GAAG,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1E,MAAM,aAAa,GAAG,MAAM,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC;IAE3E,MAAM,sBAAsB,GAAG,aAAa,GAAG,QAAQ,CAAC;IACxD,MAAM,eAAe,GAAG,GAAG,GAAG,sBAAsB,CAAC;IACrD,MAAM,oBAAoB,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,QAAQ,GAAG,eAAe,CAAC,GAAG,QAAQ,CAAC,CAAC;IAClF,MAAM,IAAI,GAAG,YAAY,GAAG,aAAa,GAAG,oBAAoB,CAAC;IACjE,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC;IACxD,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,QAAQ,GAAG,eAAe,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;IAElF,OAAO;QACL,OAAO,EAAE,IAAI,IAAI,KAAK;QACtB,SAAS;QACT,aAAa;KACd,CAAC;AACJ,CAAC","sourcesContent":["import type { CacheClient } from \"../cache/index.js\";\n\nexport interface SlidingWindowOptions {\n limit: number;\n windowSec: number;\n}\n\nexport interface SlidingWindowResult {\n allowed: boolean;\n remaining: number;\n retryAfterSec: number;\n}\n\nexport async function enforceSlidingWindow(\n cache: CacheClient,\n key: string,\n options: SlidingWindowOptions\n): Promise<SlidingWindowResult> {\n const limit = Math.max(1, Math.floor(options.limit));\n const windowSec = Math.max(1, Math.floor(options.windowSec));\n const windowMs = windowSec * 1000;\n const now = Date.now();\n const currentWindow = Math.floor(now / windowMs);\n const previousWindow = currentWindow - 1;\n const currentKey = `rl:${key}:${currentWindow}`;\n const previousKey = `rl:${key}:${previousWindow}`;\n\n // Use atomic increments where available (Redis-backed clients), then compute\n // weighted usage using current and previous windows.\n const currentCount = await cache.incr(currentKey, windowSec * 2);\n const previousRaw = await cache.get(previousKey);\n const previousParsed = previousRaw ? Number.parseInt(previousRaw, 10) : 0;\n const previousCount = Number.isFinite(previousParsed) ? previousParsed : 0;\n\n const currentWindowStartedAt = currentWindow * windowMs;\n const elapsedInWindow = now - currentWindowStartedAt;\n const previousWindowWeight = Math.max(0, (windowMs - elapsedInWindow) / windowMs);\n const used = currentCount + previousCount * previousWindowWeight;\n const remaining = Math.max(0, Math.floor(limit - used));\n const retryAfterSec = Math.max(1, Math.ceil((windowMs - elapsedInWindow) / 1000));\n\n return {\n allowed: used <= limit,\n remaining,\n retryAfterSec,\n };\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/realtime/index.ts"],"names":[],"mappings":"AAOA,MAAM,OAAO,mBAAmB;IACtB,QAAQ,GAAG,IAAI,GAAG,EAA2B,CAAC;IAEtD,KAAK,CAAC,OAAO,CAAC,OAAe,EAAE,OAAgB;QAC7C,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACxC,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAO;QACT,CAAC;QACD,KAAK,MAAM,UAAU,IAAI,IAAI,EAAE,CAAC;YAC9B,UAAU,CAAC,OAAO,CAAC,CAAC;QACtB,CAAC;IACH,CAAC;IAED,SAAS,CAAC,OAAe,EAAE,UAAsB;QAC/C,IAAI,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACtC,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,IAAI,GAAG,IAAI,GAAG,EAAc,CAAC;YAC7B,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QACnC,CAAC;QACD,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAErB,OAAO,GAAG,EAAE;YACV,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YAC5C,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACd,OAAO;YACT,CAAC;YACD,QAAQ,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;YAC5B,IAAI,QAAQ,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;gBACxB,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YAChC,CAAC;QACH,CAAC,CAAC;IACJ,CAAC;CACF"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/realtime/index.ts"],"names":[],"mappings":"AAOA,MAAM,OAAO,mBAAmB;IACtB,QAAQ,GAAG,IAAI,GAAG,EAA2B,CAAC;IAEtD,KAAK,CAAC,OAAO,CAAC,OAAe,EAAE,OAAgB;QAC7C,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACxC,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAO;QACT,CAAC;QACD,KAAK,MAAM,UAAU,IAAI,IAAI,EAAE,CAAC;YAC9B,UAAU,CAAC,OAAO,CAAC,CAAC;QACtB,CAAC;IACH,CAAC;IAED,SAAS,CAAC,OAAe,EAAE,UAAsB;QAC/C,IAAI,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACtC,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,IAAI,GAAG,IAAI,GAAG,EAAc,CAAC;YAC7B,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QACnC,CAAC;QACD,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAErB,OAAO,GAAG,EAAE;YACV,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YAC5C,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACd,OAAO;YACT,CAAC;YACD,QAAQ,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;YAC5B,IAAI,QAAQ,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;gBACxB,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YAChC,CAAC;QACH,CAAC,CAAC;IACJ,CAAC;CACF","sourcesContent":["type Subscriber = (payload: unknown) => void;\n\nexport interface RealtimeBus {\n publish(channel: string, payload: unknown): Promise<void>;\n subscribe(channel: string, subscriber: Subscriber): () => void;\n}\n\nexport class InMemoryRealtimeBus implements RealtimeBus {\n private channels = new Map<string, Set<Subscriber>>();\n\n async publish(channel: string, payload: unknown): Promise<void> {\n const subs = this.channels.get(channel);\n if (!subs) {\n return;\n }\n for (const subscriber of subs) {\n subscriber(payload);\n }\n }\n\n subscribe(channel: string, subscriber: Subscriber): () => void {\n let subs = this.channels.get(channel);\n if (!subs) {\n subs = new Set<Subscriber>();\n this.channels.set(channel, subs);\n }\n subs.add(subscriber);\n\n return () => {\n const existing = this.channels.get(channel);\n if (!existing) {\n return;\n }\n existing.delete(subscriber);\n if (existing.size === 0) {\n this.channels.delete(channel);\n }\n };\n }\n}\n\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"nucleus.js","sourceRoot":"","sources":["../../src/realtime/nucleus.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,6CAA6C;AAC7C,8EAA8E;AAC9E,EAAE;AACF,iEAAiE;AACjE,4EAA4E;AAC5E,EAAE;AACF,2EAA2E;AAC3E,wEAAwE;AACxE,0EAA0E;AAC1E,8EAA8E;AAC9E,8EAA8E;AAkB9E;;;;;;;GAOG;AACH,MAAM,OAAO,kBAAkB;IACZ,MAAM,CAAoB;IAC1B,QAAQ,GAAG,IAAI,GAAG,EAA2B,CAAC;IAE/D,YAAY,OAAkC;QAC5C,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAC/B,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,OAAe,EAAE,OAAgB;QAC7C,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QACxC,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAE5C,+CAA+C;QAC/C,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACxC,IAAI,IAAI,EAAE,CAAC;YACT,KAAK,MAAM,UAAU,IAAI,IAAI,EAAE,CAAC;gBAC9B,UAAU,CAAC,OAAO,CAAC,CAAC;YACtB,CAAC;QACH,CAAC;IACH,CAAC;IAED,SAAS,CAAC,OAAe,EAAE,UAAsB;QAC/C,IAAI,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACtC,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,IAAI,GAAG,IAAI,GAAG,EAAc,CAAC;YAC7B,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QACnC,CAAC;QACD,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAErB,OAAO,GAAG,EAAE;YACV,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YAC5C,IAAI,CAAC,QAAQ;gBAAE,OAAO;YACtB,QAAQ,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;YAC5B,IAAI,QAAQ,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;gBACxB,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YAChC,CAAC;QACH,CAAC,CAAC;IACJ,CAAC;CACF;AAED;;GAEG;AACH,MAAM,UAAU,wBAAwB,CAAC,OAAkC;IACzE,OAAO,IAAI,kBAAkB,CAAC,OAAO,CAAC,CAAC;AACzC,CAAC"}
1
+ {"version":3,"file":"nucleus.js","sourceRoot":"","sources":["../../src/realtime/nucleus.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,6CAA6C;AAC7C,8EAA8E;AAC9E,EAAE;AACF,iEAAiE;AACjE,4EAA4E;AAC5E,EAAE;AACF,2EAA2E;AAC3E,wEAAwE;AACxE,0EAA0E;AAC1E,8EAA8E;AAC9E,8EAA8E;AAkB9E;;;;;;;GAOG;AACH,MAAM,OAAO,kBAAkB;IACZ,MAAM,CAAoB;IAC1B,QAAQ,GAAG,IAAI,GAAG,EAA2B,CAAC;IAE/D,YAAY,OAAkC;QAC5C,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAC/B,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,OAAe,EAAE,OAAgB;QAC7C,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QACxC,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAE5C,+CAA+C;QAC/C,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACxC,IAAI,IAAI,EAAE,CAAC;YACT,KAAK,MAAM,UAAU,IAAI,IAAI,EAAE,CAAC;gBAC9B,UAAU,CAAC,OAAO,CAAC,CAAC;YACtB,CAAC;QACH,CAAC;IACH,CAAC;IAED,SAAS,CAAC,OAAe,EAAE,UAAsB;QAC/C,IAAI,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACtC,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,IAAI,GAAG,IAAI,GAAG,EAAc,CAAC;YAC7B,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QACnC,CAAC;QACD,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAErB,OAAO,GAAG,EAAE;YACV,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YAC5C,IAAI,CAAC,QAAQ;gBAAE,OAAO;YACtB,QAAQ,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;YAC5B,IAAI,QAAQ,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;gBACxB,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YAChC,CAAC;QACH,CAAC,CAAC;IACJ,CAAC;CACF;AAED;;GAEG;AACH,MAAM,UAAU,wBAAwB,CAAC,OAAkC;IACzE,OAAO,IAAI,kBAAkB,CAAC,OAAO,CAAC,CAAC;AACzC,CAAC","sourcesContent":["// ---------------------------------------------------------------------------\r\n// RealtimeBus backed by Nucleus PubSub model\r\n// ---------------------------------------------------------------------------\r\n//\r\n// When the application connects to Nucleus, this adapter bridges\r\n// neutron-data's RealtimeBus interface to the PubSub model's SQL functions.\r\n//\r\n// Note: Nucleus PubSub.publish() is fire-and-forget over SQL. Subscription\r\n// on the server side requires a persistent connection (LISTEN/NOTIFY or\r\n// Nucleus's native streaming). This adapter uses polling for subscribe().\r\n// For production use, prefer the Redis bus or Nucleus's native streaming API.\r\n// ---------------------------------------------------------------------------\r\n\r\nimport type { RealtimeBus } from \"./index.js\";\r\n\r\n/**\r\n * PubSub-like interface matching the subset of @neutron-build/nucleus PubSubModel.\r\n */\r\nexport interface NucleusPubSubLike {\r\n publish(channel: string, message: string): Promise<number>;\r\n}\r\n\r\nexport interface NucleusRealtimeBusOptions {\r\n /** A PubSub model instance (from `@neutron-build/nucleus`). */\r\n pubsub: NucleusPubSubLike;\r\n}\r\n\r\ntype Subscriber = (payload: unknown) => void;\r\n\r\n/**\r\n * RealtimeBus implementation backed by Nucleus PubSub.\r\n *\r\n * Publish calls are delegated to Nucleus. Subscribe is handled in-process\r\n * (the PubSub SQL interface does not support server-push subscriptions).\r\n * Messages published from this process are delivered to local subscribers\r\n * immediately.\r\n */\r\nexport class NucleusRealtimeBus implements RealtimeBus {\r\n private readonly pubsub: NucleusPubSubLike;\r\n private readonly channels = new Map<string, Set<Subscriber>>();\r\n\r\n constructor(options: NucleusRealtimeBusOptions) {\r\n this.pubsub = options.pubsub;\r\n }\r\n\r\n async publish(channel: string, payload: unknown): Promise<void> {\r\n const message = JSON.stringify(payload);\r\n await this.pubsub.publish(channel, message);\r\n\r\n // Also deliver to local in-process subscribers\r\n const subs = this.channels.get(channel);\r\n if (subs) {\r\n for (const subscriber of subs) {\r\n subscriber(payload);\r\n }\r\n }\r\n }\r\n\r\n subscribe(channel: string, subscriber: Subscriber): () => void {\r\n let subs = this.channels.get(channel);\r\n if (!subs) {\r\n subs = new Set<Subscriber>();\r\n this.channels.set(channel, subs);\r\n }\r\n subs.add(subscriber);\r\n\r\n return () => {\r\n const existing = this.channels.get(channel);\r\n if (!existing) return;\r\n existing.delete(subscriber);\r\n if (existing.size === 0) {\r\n this.channels.delete(channel);\r\n }\r\n };\r\n }\r\n}\r\n\r\n/**\r\n * Factory function matching the pattern of `createRedisRealtimeBus`.\r\n */\r\nexport function createNucleusRealtimeBus(options: NucleusRealtimeBusOptions): NucleusRealtimeBus {\r\n return new NucleusRealtimeBus(options);\r\n}\r\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"redis.js","sourceRoot":"","sources":["../../src/realtime/redis.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAsCxD,MAAM,OAAO,gBAAgB;IACV,SAAS,CAAqB;IACvC,UAAU,GAA+B,IAAI,CAAC;IACrC,QAAQ,GAAG,IAAI,GAAG,EAA2B,CAAC;IAC9C,aAAa,CAAS;IAC/B,MAAM,GAAG,KAAK,CAAC;IAEvB,YACE,SAA6B,EAC7B,aAAa,GAAG,EAAE;QAElB,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;IACrC,CAAC;IAED,wEAAwE;IACxE,KAAK,CAAC,OAAO,CAAC,OAAe,EAAE,OAAgB;QAC7C,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;QACjD,CAAC;QACD,MAAM,IAAI,CAAC,SAAS,CAAC,OAAO,CAC1B,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,EACtB,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CACxB,CAAC;IACJ,CAAC;IAED,wEAAwE;IACxE,SAAS,CAAC,OAAe,EAAE,UAAsB;QAC/C,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;QACjD,CAAC;QAED,MAAM,eAAe,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QAC/C,IAAI,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;QAC9C,MAAM,KAAK,GAAG,CAAC,IAAI,CAAC;QAEpB,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,IAAI,GAAG,IAAI,GAAG,EAAc,CAAC;YAC7B,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,eAAe,EAAE,IAAI,CAAC,CAAC;QAC3C,CAAC;QACD,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAErB,+DAA+D;QAC/D,IAAI,KAAK,EAAE,CAAC;YACV,MAAM,GAAG,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC;YACpC,mEAAmE;YACnE,GAAG,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC,KAAK,CAAC,CAAC,GAAY,EAAE,EAAE;gBACpD,8DAA8D;gBAC9D,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC;gBACtC,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;gBAC7D,OAAO,CAAC,KAAK,CACX,4DAA4D,eAAe,MAAM,GAAG,EAAE,CACvF,CAAC;YACJ,CAAC,CAAC,CAAC;QACL,CAAC;QAED,gEAAgE;QAChE,OAAO,GAAG,EAAE;YACV,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;YACpD,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACd,OAAO;YACT,CAAC;YACD,QAAQ,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;YAC5B,IAAI,QAAQ,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;gBACxB,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC;gBACtC,wDAAwD;gBACxD,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;oBACpB,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,eAAe,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE;wBACtD,cAAc;oBAChB,CAAC,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;QACH,CAAC,CAAC;IACJ,CAAC;IAED,wEAAwE;IACxE,KAAK,CAAC,KAAK;QACT,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,OAAO;QACT,CAAC;QACD,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QACnB,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;QAEtB,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACpB,IAAI,CAAC,UAAU,CAAC,kBAAkB,CAAC,SAAS,CAAC,CAAC;YAC9C,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;YAC7C,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;QACzB,CAAC;QACD,MAAM,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IAC9C,CAAC;IAED,wEAAwE;IAExE;;;;OAIG;IACK,gBAAgB;QACtB,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACpB,OAAO,IAAI,CAAC,UAAU,CAAC;QACzB,CAAC;QAED,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE,CAAC;QACvC,GAAG,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,UAAmB,EAAE,UAAmB,EAAE,EAAE;YAC7D,MAAM,EAAE,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC;YAC9B,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACvC,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;gBACrC,OAAO;YACT,CAAC;YAED,IAAI,MAAe,CAAC;YACpB,IAAI,CAAC;gBACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC;YAC1C,CAAC;YAAC,MAAM,CAAC;gBACP,MAAM,GAAG,UAAU,CAAC;YACtB,CAAC;YAED,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;gBAC/B,IAAI,CAAC;oBACH,OAAO,CAAC,MAAM,CAAC,CAAC;gBAClB,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACb,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;oBAC7D,OAAO,CAAC,KAAK,CACX,sDAAsD,EAAE,MAAM,GAAG,EAAE,CACpE,CAAC;gBACJ,CAAC;YACH,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,UAAU,GAAG,GAAG,CAAC;QACtB,OAAO,GAAG,CAAC;IACb,CAAC;IAEO,QAAQ,CAAC,OAAe;QAC9B,OAAO,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,aAAa,GAAG,OAAO,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;IAC1E,CAAC;CACF;AAED,4EAA4E;AAE5E,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,UAAmC,EAAE;IAErC,gEAAgE;IAChE,IAAI,OAAO,CAAC,eAAe,EAAE,CAAC;QAC5B,OAAO,IAAI,gBAAgB,CACzB,OAAO,CAAC,eAAe,EACvB,OAAO,CAAC,aAAa,IAAI,EAAE,CAC5B,CAAC;IACJ,CAAC;IAED,+DAA+D;IAC/D,MAAM,WAAW,GAAG,MAAM,UAAU,CAGlC,SAAS,EACT,0DAA0D,CAC3D,CAAC;IAEF,MAAM,SAAS,GAAG,WAAW,CAAC,OAAO,CAAC;IACtC,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC;IAC/D,CAAC;IAED,MAAM,GAAG,GACP,OAAO,CAAC,GAAG;QACX,OAAO,CAAC,GAAG,CAAC,aAAa;QACzB,OAAO,CAAC,GAAG,CAAC,SAAS;QACrB,wBAAwB,CAAC;IAE3B,MAAM,SAAS,GAAG,IAAI,SAAS,CAAC,GAAG,EAAE;QACnC,WAAW,EAAE,KAAK;QAClB,oBAAoB,EAAE,CAAC;KACxB,CAAC,CAAC;IAEH,OAAO,IAAI,gBAAgB,CAAC,SAAS,EAAE,OAAO,CAAC,aAAa,IAAI,EAAE,CAAC,CAAC;AACtE,CAAC"}
1
+ {"version":3,"file":"redis.js","sourceRoot":"","sources":["../../src/realtime/redis.ts"],"names":[],"mappings":"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","sourcesContent":["import type { RealtimeBus } from \"./index.js\";\r\nimport { lazyImport } from \"../internal/lazy-import.js\";\r\n\r\ntype Subscriber = (payload: unknown) => void;\r\n\r\n/**\r\n * Minimal interface for the ioredis publisher connection.\r\n * Only the methods we actually call are declared.\r\n */\r\ninterface RedisPublisherLike {\r\n publish(channel: string, message: string): Promise<number>;\r\n duplicate(): RedisSubscriberLike;\r\n quit(): Promise<unknown>;\r\n status: string;\r\n}\r\n\r\n/**\r\n * Minimal interface for the ioredis subscriber connection.\r\n * In ioredis, once `subscribe()` is called the connection enters\r\n * subscriber mode and can only issue (p)subscribe/(p)unsubscribe.\r\n */\r\ninterface RedisSubscriberLike {\r\n subscribe(...channels: string[]): Promise<unknown>;\r\n unsubscribe(...channels: string[]): Promise<unknown>;\r\n on(event: string, listener: (...args: unknown[]) => void): this;\r\n removeAllListeners(event?: string): this;\r\n quit(): Promise<unknown>;\r\n status: string;\r\n}\r\n\r\nexport interface RedisRealtimeBusOptions {\r\n /** Redis connection URL. Falls back to DRAGONFLY_URL / REDIS_URL / localhost. */\r\n url?: string;\r\n /** Supply your own ioredis client to use as the publisher connection. */\r\n publisherClient?: RedisPublisherLike;\r\n /** Optional channel prefix, e.g. \"neutron:\" → publish to \"neutron:my-channel\". */\r\n channelPrefix?: string;\r\n}\r\n\r\nexport class RedisRealtimeBus implements RealtimeBus {\r\n private readonly publisher: RedisPublisherLike;\r\n private subscriber: RedisSubscriberLike | null = null;\r\n private readonly channels = new Map<string, Set<Subscriber>>();\r\n private readonly channelPrefix: string;\r\n private closed = false;\r\n\r\n constructor(\r\n publisher: RedisPublisherLike,\r\n channelPrefix = \"\"\r\n ) {\r\n this.publisher = publisher;\r\n this.channelPrefix = channelPrefix;\r\n }\r\n\r\n // ── publish ──────────────────────────────────────────────────────────\r\n async publish(channel: string, payload: unknown): Promise<void> {\r\n if (this.closed) {\r\n throw new Error(\"RedisRealtimeBus is closed.\");\r\n }\r\n await this.publisher.publish(\r\n this.prefixed(channel),\r\n JSON.stringify(payload)\r\n );\r\n }\r\n\r\n // ── subscribe ────────────────────────────────────────────────────────\r\n subscribe(channel: string, subscriber: Subscriber): () => void {\r\n if (this.closed) {\r\n throw new Error(\"RedisRealtimeBus is closed.\");\r\n }\r\n\r\n const prefixedChannel = this.prefixed(channel);\r\n let subs = this.channels.get(prefixedChannel);\r\n const isNew = !subs;\r\n\r\n if (!subs) {\r\n subs = new Set<Subscriber>();\r\n this.channels.set(prefixedChannel, subs);\r\n }\r\n subs.add(subscriber);\r\n\r\n // If this is the first subscriber on this channel, tell Redis.\r\n if (isNew) {\r\n const sub = this.ensureSubscriber();\r\n // Fire-and-forget; the subscriber will buffer messages once acked.\r\n sub.subscribe(prefixedChannel).catch((err: unknown) => {\r\n // If subscribing fails, clean up to avoid a dangling channel.\r\n this.channels.delete(prefixedChannel);\r\n const msg = err instanceof Error ? err.message : String(err);\r\n console.error(\r\n `[neutron-data] RedisRealtimeBus: failed to subscribe to \"${prefixedChannel}\": ${msg}`\r\n );\r\n });\r\n }\r\n\r\n // Return an unsubscribe function (mirrors InMemoryRealtimeBus).\r\n return () => {\r\n const existing = this.channels.get(prefixedChannel);\r\n if (!existing) {\r\n return;\r\n }\r\n existing.delete(subscriber);\r\n if (existing.size === 0) {\r\n this.channels.delete(prefixedChannel);\r\n // Unsubscribe from Redis when no local handlers remain.\r\n if (this.subscriber) {\r\n this.subscriber.unsubscribe(prefixedChannel).catch(() => {\r\n // best-effort\r\n });\r\n }\r\n }\r\n };\r\n }\r\n\r\n // ── close ────────────────────────────────────────────────────────────\r\n async close(): Promise<void> {\r\n if (this.closed) {\r\n return;\r\n }\r\n this.closed = true;\r\n this.channels.clear();\r\n\r\n if (this.subscriber) {\r\n this.subscriber.removeAllListeners(\"message\");\r\n await this.subscriber.quit().catch(() => {});\r\n this.subscriber = null;\r\n }\r\n await this.publisher.quit().catch(() => {});\r\n }\r\n\r\n // ── internals ────────────────────────────────────────────────────────\r\n\r\n /**\r\n * Lazily create the subscriber connection by duplicating the publisher.\r\n * ioredis's `duplicate()` creates a new connection with the same options,\r\n * which is exactly what we need for subscriber-mode isolation.\r\n */\r\n private ensureSubscriber(): RedisSubscriberLike {\r\n if (this.subscriber) {\r\n return this.subscriber;\r\n }\r\n\r\n const sub = this.publisher.duplicate();\r\n sub.on(\"message\", (rawChannel: unknown, rawMessage: unknown) => {\r\n const ch = String(rawChannel);\r\n const handlers = this.channels.get(ch);\r\n if (!handlers || handlers.size === 0) {\r\n return;\r\n }\r\n\r\n let parsed: unknown;\r\n try {\r\n parsed = JSON.parse(String(rawMessage));\r\n } catch {\r\n parsed = rawMessage;\r\n }\r\n\r\n for (const handler of handlers) {\r\n try {\r\n handler(parsed);\r\n } catch (err) {\r\n const msg = err instanceof Error ? err.message : String(err);\r\n console.error(\r\n `[neutron-data] RedisRealtimeBus: handler error on \"${ch}\": ${msg}`\r\n );\r\n }\r\n }\r\n });\r\n\r\n this.subscriber = sub;\r\n return sub;\r\n }\r\n\r\n private prefixed(channel: string): string {\r\n return this.channelPrefix ? `${this.channelPrefix}${channel}` : channel;\r\n }\r\n}\r\n\r\n// ── Factory ──────────────────────────────────────────────────────────────\r\n\r\nexport async function createRedisRealtimeBus(\r\n options: RedisRealtimeBusOptions = {}\r\n): Promise<RedisRealtimeBus> {\r\n // If the caller already has an ioredis client, use it directly.\r\n if (options.publisherClient) {\r\n return new RedisRealtimeBus(\r\n options.publisherClient,\r\n options.channelPrefix ?? \"\"\r\n );\r\n }\r\n\r\n // Otherwise, lazy-require ioredis (it's an optional peer dep).\r\n const redisModule = await lazyImport<{\r\n default?: new (...args: unknown[]) => RedisPublisherLike;\r\n }>(\r\n \"ioredis\",\r\n \"Install with `pnpm add ioredis` (or npm/yarn equivalent)\"\r\n );\r\n\r\n const RedisCtor = redisModule.default;\r\n if (!RedisCtor) {\r\n throw new Error(\"Failed to resolve ioredis default export.\");\r\n }\r\n\r\n const url =\r\n options.url ||\r\n process.env.DRAGONFLY_URL ||\r\n process.env.REDIS_URL ||\r\n \"redis://127.0.0.1:6379\";\r\n\r\n const publisher = new RedisCtor(url, {\r\n lazyConnect: false,\r\n maxRetriesPerRequest: 3,\r\n });\r\n\r\n return new RedisRealtimeBus(publisher, options.channelPrefix ?? \"\");\r\n}\r\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/session/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAuBzC,MAAM,UAAU,kBAAkB,CAAC,OAA4B;IAC7D,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,UAAU,CAAC;IAC5C,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;IAElD,MAAM,QAAQ,GAAG,CAAC,EAAU,EAAE,EAAE,CAAC,GAAG,MAAM,GAAG,EAAE,EAAE,CAAC;IAElD,OAAO;QACL,KAAK,CAAC,MAAM,CAAsC,IAAQ;YACxD,MAAM,EAAE,GAAG,UAAU,EAAE,CAAC;YACxB,MAAM,OAAO,GAAG,CAAC,IAAI,IAAK,EAAQ,CAAM,CAAC;YACzC,MAAM,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,CAAC;YACvE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;QAC/B,CAAC;QACD,KAAK,CAAC,GAAG,CAAsC,EAAU;YACvD,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC;YAClD,IAAI,CAAC,GAAG,EAAE,CAAC;gBACT,OAAO,IAAI,CAAC;YACd,CAAC;YACD,OAAO;gBACL,EAAE;gBACF,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAM;aAC3B,CAAC;QACJ,CAAC;QACD,KAAK,CAAC,GAAG,CAAsC,EAAU,EAAE,IAAO;YAChE,MAAM,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,CAAC;QACtE,CAAC;QACD,KAAK,CAAC,OAAO,CAAC,EAAU;YACtB,MAAM,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC;QACxC,CAAC;KACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/session/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAuBzC,MAAM,UAAU,kBAAkB,CAAC,OAA4B;IAC7D,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,UAAU,CAAC;IAC5C,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;IAElD,MAAM,QAAQ,GAAG,CAAC,EAAU,EAAE,EAAE,CAAC,GAAG,MAAM,GAAG,EAAE,EAAE,CAAC;IAElD,OAAO;QACL,KAAK,CAAC,MAAM,CAAsC,IAAQ;YACxD,MAAM,EAAE,GAAG,UAAU,EAAE,CAAC;YACxB,MAAM,OAAO,GAAG,CAAC,IAAI,IAAK,EAAQ,CAAM,CAAC;YACzC,MAAM,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,CAAC;YACvE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;QAC/B,CAAC;QACD,KAAK,CAAC,GAAG,CAAsC,EAAU;YACvD,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC;YAClD,IAAI,CAAC,GAAG,EAAE,CAAC;gBACT,OAAO,IAAI,CAAC;YACd,CAAC;YACD,OAAO;gBACL,EAAE;gBACF,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAM;aAC3B,CAAC;QACJ,CAAC;QACD,KAAK,CAAC,GAAG,CAAsC,EAAU,EAAE,IAAO;YAChE,MAAM,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,CAAC;QACtE,CAAC;QACD,KAAK,CAAC,OAAO,CAAC,EAAU;YACtB,MAAM,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC;QACxC,CAAC;KACF,CAAC;AACJ,CAAC","sourcesContent":["import { randomUUID } from \"node:crypto\";\nimport type { CacheClient } from \"../cache/index.js\";\n\nexport type SessionData = Record<string, unknown>;\n\nexport interface SessionRecord<T extends SessionData = SessionData> {\n id: string;\n data: T;\n}\n\nexport interface SessionStore {\n create<T extends SessionData = SessionData>(data?: T): Promise<SessionRecord<T>>;\n get<T extends SessionData = SessionData>(id: string): Promise<SessionRecord<T> | null>;\n set<T extends SessionData = SessionData>(id: string, data: T): Promise<void>;\n destroy(id: string): Promise<void>;\n}\n\nexport interface SessionStoreOptions {\n cache: CacheClient;\n prefix?: string;\n ttlSec?: number;\n}\n\nexport function createSessionStore(options: SessionStoreOptions): SessionStore {\n const prefix = options.prefix || \"session:\";\n const ttlSec = options.ttlSec ?? 60 * 60 * 24 * 7;\n\n const cacheKey = (id: string) => `${prefix}${id}`;\n\n return {\n async create<T extends SessionData = SessionData>(data?: T): Promise<SessionRecord<T>> {\n const id = randomUUID();\n const payload = (data || ({} as T)) as T;\n await options.cache.set(cacheKey(id), JSON.stringify(payload), ttlSec);\n return { id, data: payload };\n },\n async get<T extends SessionData = SessionData>(id: string): Promise<SessionRecord<T> | null> {\n const raw = await options.cache.get(cacheKey(id));\n if (!raw) {\n return null;\n }\n return {\n id,\n data: JSON.parse(raw) as T,\n };\n },\n async set<T extends SessionData = SessionData>(id: string, data: T): Promise<void> {\n await options.cache.set(cacheKey(id), JSON.stringify(data), ttlSec);\n },\n async destroy(id: string): Promise<void> {\n await options.cache.del(cacheKey(id));\n },\n };\n}\n\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"redis.js","sourceRoot":"","sources":["../../src/session/redis.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,sBAAsB,GAGvB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,kBAAkB,GAEnB,MAAM,YAAY,CAAC;AAYpB,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAC3C,UAAoC,EAAE;IAEtC,MAAM,KAAK,GAAG,MAAM,sBAAsB,CAAC;QACzC,GAAG,EAAE,OAAO,CAAC,GAAG;QAChB,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,gBAAgB,EAAE,OAAO,CAAC,gBAAgB;KAC3C,CAAC,CAAC;IAEH,MAAM,KAAK,GAAG,kBAAkB,CAAC;QAC/B,KAAK;QACL,MAAM,EAAE,OAAO,CAAC,aAAa;QAC7B,MAAM,EAAE,OAAO,CAAC,aAAa;KAC9B,CAAC,CAAC;IAEH,OAAO;QACL,GAAG,KAAK;QACR,KAAK;QACL,KAAK,EAAE,KAAK,IAAI,EAAE;YAChB,MAAM,KAAK,CAAC,KAAK,EAAE,CAAC;QACtB,CAAC;KACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"redis.js","sourceRoot":"","sources":["../../src/session/redis.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,sBAAsB,GAGvB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,kBAAkB,GAEnB,MAAM,YAAY,CAAC;AAYpB,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAC3C,UAAoC,EAAE;IAEtC,MAAM,KAAK,GAAG,MAAM,sBAAsB,CAAC;QACzC,GAAG,EAAE,OAAO,CAAC,GAAG;QAChB,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,gBAAgB,EAAE,OAAO,CAAC,gBAAgB;KAC3C,CAAC,CAAC;IAEH,MAAM,KAAK,GAAG,kBAAkB,CAAC;QAC/B,KAAK;QACL,MAAM,EAAE,OAAO,CAAC,aAAa;QAC7B,MAAM,EAAE,OAAO,CAAC,aAAa;KAC9B,CAAC,CAAC;IAEH,OAAO;QACL,GAAG,KAAK;QACR,KAAK;QACL,KAAK,EAAE,KAAK,IAAI,EAAE;YAChB,MAAM,KAAK,CAAC,KAAK,EAAE,CAAC;QACtB,CAAC;KACF,CAAC;AACJ,CAAC","sourcesContent":["import {\n createRedisCacheClient,\n type RedisCacheClient,\n type RedisCacheClientOptions,\n} from \"../cache/redis.js\";\nimport {\n createSessionStore,\n type SessionStore,\n} from \"./index.js\";\n\nexport interface RedisSessionStoreOptions extends RedisCacheClientOptions {\n sessionPrefix?: string;\n sessionTtlSec?: number;\n}\n\nexport type RedisSessionStore = SessionStore & {\n cache: RedisCacheClient;\n close: () => Promise<void>;\n};\n\nexport async function createRedisSessionStore(\n options: RedisSessionStoreOptions = {}\n): Promise<RedisSessionStore> {\n const cache = await createRedisCacheClient({\n url: options.url,\n keyPrefix: options.keyPrefix,\n connectTimeoutMs: options.connectTimeoutMs,\n });\n\n const store = createSessionStore({\n cache,\n prefix: options.sessionPrefix,\n ttlSec: options.sessionTtlSec,\n });\n\n return {\n ...store,\n cache,\n close: async () => {\n await cache.close();\n },\n };\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/storage/index.ts"],"names":[],"mappings":"AAYA,MAAM,OAAO,qBAAqB;IACxB,KAAK,GAAG,IAAI,GAAG,EAAyB,CAAC;IAEjD,KAAK,CAAC,GAAG,CAAC,MAAqB;QAC7B,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IACrC,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,GAAW;QACnB,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC;IACrC,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,GAAW;QACnB,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IACzB,CAAC;CACF"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/storage/index.ts"],"names":[],"mappings":"AAYA,MAAM,OAAO,qBAAqB;IACxB,KAAK,GAAG,IAAI,GAAG,EAAyB,CAAC;IAEjD,KAAK,CAAC,GAAG,CAAC,MAAqB;QAC7B,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IACrC,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,GAAW;QACnB,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC;IACrC,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,GAAW;QACnB,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IACzB,CAAC;CACF","sourcesContent":["export interface StorageObject {\n key: string;\n body: Uint8Array;\n contentType?: string;\n}\n\nexport interface StorageDriver {\n put(object: StorageObject): Promise<void>;\n get(key: string): Promise<StorageObject | null>;\n del(key: string): Promise<void>;\n}\n\nexport class InMemoryStorageDriver implements StorageDriver {\n private store = new Map<string, StorageObject>();\n\n async put(object: StorageObject): Promise<void> {\n this.store.set(object.key, object);\n }\n\n async get(key: string): Promise<StorageObject | null> {\n return this.store.get(key) || null;\n }\n\n async del(key: string): Promise<void> {\n this.store.delete(key);\n }\n}\n\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"nucleus.js","sourceRoot":"","sources":["../../src/storage/nucleus.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,6CAA6C;AAC7C,8EAA8E;AAC9E,EAAE;AACF,iEAAiE;AACjE,4EAA4E;AAC5E,8EAA8E;AAqB9E;;;;;GAKG;AACH,MAAM,OAAO,oBAAoB;IACd,IAAI,CAAkB;IACtB,MAAM,CAAS;IAEhC,YAAY,OAAoC;QAC9C,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;QACzB,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,SAAS,CAAC;IAC5C,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,MAAqB;QAC7B,MAAM,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,IAAI,EAAE;YACxD,WAAW,EAAE,MAAM,CAAC,WAAW;SAChC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,GAAW;QACnB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QACrD,IAAI,CAAC,MAAM;YAAE,OAAO,IAAI,CAAC;QACzB,OAAO;YACL,GAAG;YACH,IAAI,EAAE,MAAM,CAAC,IAAI;SAClB,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,GAAW;QACnB,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC3C,CAAC;CACF;AAED;;GAEG;AACH,MAAM,UAAU,0BAA0B,CAAC,OAAoC;IAC7E,OAAO,IAAI,oBAAoB,CAAC,OAAO,CAAC,CAAC;AAC3C,CAAC"}
1
+ {"version":3,"file":"nucleus.js","sourceRoot":"","sources":["../../src/storage/nucleus.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,6CAA6C;AAC7C,8EAA8E;AAC9E,EAAE;AACF,iEAAiE;AACjE,4EAA4E;AAC5E,8EAA8E;AAqB9E;;;;;GAKG;AACH,MAAM,OAAO,oBAAoB;IACd,IAAI,CAAkB;IACtB,MAAM,CAAS;IAEhC,YAAY,OAAoC;QAC9C,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;QACzB,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,SAAS,CAAC;IAC5C,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,MAAqB;QAC7B,MAAM,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,IAAI,EAAE;YACxD,WAAW,EAAE,MAAM,CAAC,WAAW;SAChC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,GAAW;QACnB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QACrD,IAAI,CAAC,MAAM;YAAE,OAAO,IAAI,CAAC;QACzB,OAAO;YACL,GAAG;YACH,IAAI,EAAE,MAAM,CAAC,IAAI;SAClB,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,GAAW;QACnB,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC3C,CAAC;CACF;AAED;;GAEG;AACH,MAAM,UAAU,0BAA0B,CAAC,OAAoC;IAC7E,OAAO,IAAI,oBAAoB,CAAC,OAAO,CAAC,CAAC;AAC3C,CAAC","sourcesContent":["// ---------------------------------------------------------------------------\r\n// StorageDriver backed by Nucleus Blob model\r\n// ---------------------------------------------------------------------------\r\n//\r\n// When the application connects to Nucleus, this adapter bridges\r\n// neutron-data's StorageDriver interface to the Blob model's SQL functions.\r\n// ---------------------------------------------------------------------------\r\n\r\nimport type { StorageDriver, StorageObject } from \"./index.js\";\r\n\r\n/**\r\n * Blob-like interface matching the subset of @neutron-build/nucleus BlobModel\r\n * needed by NucleusStorageDriver.\r\n */\r\nexport interface NucleusBlobLike {\r\n put(bucket: string, key: string, data: Uint8Array | string, opts?: { contentType?: string }): Promise<void>;\r\n get(bucket: string, key: string): Promise<{ data: Uint8Array; meta: unknown } | null>;\r\n delete(bucket: string, key: string): Promise<boolean>;\r\n}\r\n\r\nexport interface NucleusStorageDriverOptions {\r\n /** A Blob model instance (from `@neutron-build/nucleus`). */\r\n blob: NucleusBlobLike;\r\n /** Bucket name for all stored objects (default `\"default\"`). */\r\n bucket?: string;\r\n}\r\n\r\n/**\r\n * StorageDriver implementation backed by Nucleus Blob.\r\n *\r\n * Drop-in replacement for `InMemoryStorageDriver` or `S3StorageDriver`\r\n * that stores binary data directly in Nucleus.\r\n */\r\nexport class NucleusStorageDriver implements StorageDriver {\r\n private readonly blob: NucleusBlobLike;\r\n private readonly bucket: string;\r\n\r\n constructor(options: NucleusStorageDriverOptions) {\r\n this.blob = options.blob;\r\n this.bucket = options.bucket ?? \"default\";\r\n }\r\n\r\n async put(object: StorageObject): Promise<void> {\r\n await this.blob.put(this.bucket, object.key, object.body, {\r\n contentType: object.contentType,\r\n });\r\n }\r\n\r\n async get(key: string): Promise<StorageObject | null> {\r\n const result = await this.blob.get(this.bucket, key);\r\n if (!result) return null;\r\n return {\r\n key,\r\n body: result.data,\r\n };\r\n }\r\n\r\n async del(key: string): Promise<void> {\r\n await this.blob.delete(this.bucket, key);\r\n }\r\n}\r\n\r\n/**\r\n * Factory function matching the pattern of `createS3StorageDriver`.\r\n */\r\nexport function createNucleusStorageDriver(options: NucleusStorageDriverOptions): NucleusStorageDriver {\r\n return new NucleusStorageDriver(options);\r\n}\r\n"]}
@@ -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":"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","sourcesContent":["import type { StorageDriver, StorageObject } from \"./index.js\";\nimport { lazyImport } from \"../internal/lazy-import.js\";\n\nexport interface S3StorageDriverOptions {\n bucket: string;\n region?: string;\n endpoint?: string;\n forcePathStyle?: boolean;\n accessKeyId?: string;\n secretAccessKey?: string;\n}\n\ninterface S3LikeClient {\n send(command: unknown): Promise<unknown>;\n}\n\ninterface S3CommandsModule {\n S3Client?: new (options: Record<string, unknown>) => S3LikeClient;\n PutObjectCommand?: new (input: Record<string, unknown>) => unknown;\n GetObjectCommand?: new (input: Record<string, unknown>) => unknown;\n DeleteObjectCommand?: new (input: Record<string, unknown>) => unknown;\n}\n\nexport class S3StorageDriver implements StorageDriver {\n constructor(\n private readonly client: S3LikeClient,\n private readonly bucket: string,\n private readonly commands: Required<\n Pick<S3CommandsModule, \"PutObjectCommand\" | \"GetObjectCommand\" | \"DeleteObjectCommand\">\n >\n ) {}\n\n async put(object: StorageObject): Promise<void> {\n const command = new this.commands.PutObjectCommand({\n Bucket: this.bucket,\n Key: object.key,\n Body: object.body,\n ContentType: object.contentType,\n });\n await this.client.send(command);\n }\n\n async get(key: string): Promise<StorageObject | null> {\n const command = new this.commands.GetObjectCommand({\n Bucket: this.bucket,\n Key: key,\n });\n\n try {\n const result = (await this.client.send(command)) as {\n Body?: unknown;\n ContentType?: string;\n };\n if (!result.Body) {\n return null;\n }\n const body = await toUint8Array(result.Body);\n return {\n key,\n body,\n contentType: result.ContentType,\n };\n } catch (error) {\n const statusCode = (error as { $metadata?: { httpStatusCode?: number } }).$metadata?.httpStatusCode;\n if (statusCode === 404) {\n return null;\n }\n throw error;\n }\n }\n\n async del(key: string): Promise<void> {\n const command = new this.commands.DeleteObjectCommand({\n Bucket: this.bucket,\n Key: key,\n });\n await this.client.send(command);\n }\n}\n\nexport async function createS3StorageDriver(\n options: S3StorageDriverOptions\n): Promise<S3StorageDriver> {\n const module = await lazyImport<S3CommandsModule>(\n \"@aws-sdk/client-s3\",\n \"Install with `pnpm add @aws-sdk/client-s3` (or npm/yarn equivalent)\"\n );\n\n if (\n !module.S3Client ||\n !module.PutObjectCommand ||\n !module.GetObjectCommand ||\n !module.DeleteObjectCommand\n ) {\n throw new Error(\"Failed to initialize S3 driver.\");\n }\n\n const region = options.region || process.env.AWS_REGION || \"auto\";\n const accessKeyId = options.accessKeyId || process.env.AWS_ACCESS_KEY_ID;\n const secretAccessKey = options.secretAccessKey || process.env.AWS_SECRET_ACCESS_KEY;\n\n const client = new module.S3Client({\n region,\n endpoint: options.endpoint,\n forcePathStyle: options.forcePathStyle,\n ...(accessKeyId && secretAccessKey\n ? {\n credentials: {\n accessKeyId,\n secretAccessKey,\n },\n }\n : {}),\n });\n\n return new S3StorageDriver(client, options.bucket, {\n PutObjectCommand: module.PutObjectCommand,\n GetObjectCommand: module.GetObjectCommand,\n DeleteObjectCommand: module.DeleteObjectCommand,\n });\n}\n\nasync function toUint8Array(body: unknown): Promise<Uint8Array> {\n if (body instanceof Uint8Array) {\n return body;\n }\n\n if (\n typeof body === \"object\" &&\n body !== null &&\n \"transformToByteArray\" in body &&\n typeof (body as { transformToByteArray?: unknown }).transformToByteArray === \"function\"\n ) {\n const bytes = await (body as { transformToByteArray: () => Promise<Uint8Array> }).transformToByteArray();\n return bytes;\n }\n\n if (\n typeof body === \"object\" &&\n body !== null &&\n Symbol.asyncIterator in body\n ) {\n const chunks: Uint8Array[] = [];\n for await (const chunk of body as AsyncIterable<Uint8Array | Buffer | string>) {\n if (chunk instanceof Uint8Array) {\n chunks.push(chunk);\n } else if (typeof chunk === \"string\") {\n chunks.push(new TextEncoder().encode(chunk));\n } else {\n chunks.push(new Uint8Array(chunk));\n }\n }\n return concatChunks(chunks);\n }\n\n throw new Error(\"Unsupported S3 body type.\");\n}\n\nfunction concatChunks(chunks: Uint8Array[]): Uint8Array {\n const total = chunks.reduce((sum, chunk) => sum + chunk.length, 0);\n const out = new Uint8Array(total);\n let offset = 0;\n for (const chunk of chunks) {\n out.set(chunk, offset);\n offset += chunk.length;\n }\n return out;\n}\n\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@neutron-build/data",
3
- "version": "0.1.0",
3
+ "version": "0.1.1",
4
4
  "description": "Data layer for Neutron. Database (Drizzle), cache, sessions, queues, storage, and rate limiting.",
5
5
  "author": "Tyler",
6
6
  "license": "MIT",
@@ -37,7 +37,7 @@
37
37
  "drizzle-orm": "^0.44.5",
38
38
  "ioredis": "^5.8.1",
39
39
  "postgres": "^3.4.7",
40
- "@neutron-build/nucleus": "0.1.0"
40
+ "@neutron-build/nucleus": "^0.1.1"
41
41
  },
42
42
  "peerDependenciesMeta": {
43
43
  "@aws-sdk/client-s3": {