@stepflowjs/storage-memory 0.0.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.
@@ -0,0 +1,21 @@
1
+ import { StorageAdapter, QueueOperations, ExecutionOperations, EventOperations, LeaderOperations, RealtimeOperations } from '@stepflowjs/core/storage';
2
+
3
+ declare class MemoryStorageAdapter implements StorageAdapter {
4
+ private jobs;
5
+ private executions;
6
+ private stepResults;
7
+ private eventWaiters;
8
+ private leaders;
9
+ private emitter;
10
+ private connected;
11
+ connect(): Promise<void>;
12
+ disconnect(): Promise<void>;
13
+ healthCheck(): Promise<boolean>;
14
+ queue: QueueOperations;
15
+ execution: ExecutionOperations;
16
+ events: EventOperations;
17
+ leader: LeaderOperations;
18
+ realtime: RealtimeOperations;
19
+ }
20
+
21
+ export { MemoryStorageAdapter, MemoryStorageAdapter as default };
package/dist/index.js ADDED
@@ -0,0 +1,206 @@
1
+ // src/index.ts
2
+ import { EventEmitter } from "events";
3
+ var MemoryStorageAdapter = class {
4
+ jobs = /* @__PURE__ */ new Map();
5
+ executions = /* @__PURE__ */ new Map();
6
+ stepResults = /* @__PURE__ */ new Map();
7
+ eventWaiters = /* @__PURE__ */ new Map();
8
+ leaders = /* @__PURE__ */ new Map();
9
+ emitter = new EventEmitter();
10
+ connected = false;
11
+ async connect() {
12
+ this.connected = true;
13
+ }
14
+ async disconnect() {
15
+ this.jobs.clear();
16
+ this.executions.clear();
17
+ this.stepResults.clear();
18
+ this.eventWaiters.clear();
19
+ this.leaders.clear();
20
+ this.emitter.removeAllListeners();
21
+ this.connected = false;
22
+ }
23
+ async healthCheck() {
24
+ return this.connected;
25
+ }
26
+ // ============================================================================
27
+ // Queue Operations
28
+ // ============================================================================
29
+ queue = {
30
+ push: async (job) => {
31
+ this.jobs.set(job.id, { ...job });
32
+ this.emitter.emit("job:added", job);
33
+ return job.id;
34
+ },
35
+ pop: async (options) => {
36
+ const now = /* @__PURE__ */ new Date();
37
+ const sortedJobs = Array.from(this.jobs.values()).filter((job2) => !job2.scheduledFor || job2.scheduledFor <= now).sort((a, b) => {
38
+ if (a.priority !== b.priority) {
39
+ return b.priority - a.priority;
40
+ }
41
+ return a.createdAt.getTime() - b.createdAt.getTime();
42
+ });
43
+ if (sortedJobs.length === 0) {
44
+ return null;
45
+ }
46
+ const job = sortedJobs[0];
47
+ return { ...job };
48
+ },
49
+ ack: async (jobId) => {
50
+ this.jobs.delete(jobId);
51
+ },
52
+ nack: async (jobId, options) => {
53
+ const job = this.jobs.get(jobId);
54
+ if (job) {
55
+ job.attempts++;
56
+ if (options?.delay) {
57
+ job.scheduledFor = new Date(Date.now() + options.delay);
58
+ }
59
+ this.jobs.set(jobId, job);
60
+ }
61
+ },
62
+ schedule: async (job, executeAt) => {
63
+ job.scheduledFor = executeAt;
64
+ this.jobs.set(job.id, { ...job });
65
+ return job.id;
66
+ },
67
+ getDelayed: async () => {
68
+ const now = /* @__PURE__ */ new Date();
69
+ return Array.from(this.jobs.values()).filter(
70
+ (j) => j.scheduledFor && j.scheduledFor > now
71
+ );
72
+ }
73
+ };
74
+ // ============================================================================
75
+ // Execution Operations
76
+ // ============================================================================
77
+ execution = {
78
+ create: async (execution) => {
79
+ this.executions.set(execution.id, { ...execution });
80
+ this.emitter.emit(`execution:${execution.id}`, execution);
81
+ return execution.id;
82
+ },
83
+ get: async (executionId) => {
84
+ const execution = this.executions.get(executionId);
85
+ return execution ? { ...execution } : null;
86
+ },
87
+ getByIdempotencyKey: async (workflowId, idempotencyKey) => {
88
+ for (const execution of this.executions.values()) {
89
+ if (execution.workflowId === workflowId && execution.metadata.idempotencyKey === idempotencyKey) {
90
+ return { ...execution };
91
+ }
92
+ }
93
+ return null;
94
+ },
95
+ update: async (executionId, updates) => {
96
+ const execution = this.executions.get(executionId);
97
+ if (execution) {
98
+ Object.assign(execution, updates);
99
+ this.executions.set(executionId, execution);
100
+ this.emitter.emit(`execution:${executionId}`, execution);
101
+ }
102
+ },
103
+ list: async (options) => {
104
+ let results = Array.from(this.executions.values());
105
+ if (options.workflowId) {
106
+ results = results.filter((e) => e.workflowId === options.workflowId);
107
+ }
108
+ if (options.status) {
109
+ results = results.filter((e) => e.status === options.status);
110
+ }
111
+ if (options.runId) {
112
+ results = results.filter((e) => e.runId === options.runId);
113
+ }
114
+ results.sort((a, b) => b.startedAt.getTime() - a.startedAt.getTime());
115
+ const offset = options.offset ?? 0;
116
+ const limit = options.limit ?? 50;
117
+ return results.slice(offset, offset + limit);
118
+ },
119
+ getStepResult: async (executionId, stepName) => {
120
+ const steps = this.stepResults.get(executionId);
121
+ const result = steps?.get(stepName);
122
+ return result ? { ...result } : null;
123
+ },
124
+ saveStepResult: async (executionId, stepName, result) => {
125
+ if (!this.stepResults.has(executionId)) {
126
+ this.stepResults.set(executionId, /* @__PURE__ */ new Map());
127
+ }
128
+ this.stepResults.get(executionId).set(stepName, { ...result });
129
+ }
130
+ };
131
+ // ============================================================================
132
+ // Event Operations
133
+ // ============================================================================
134
+ events = {
135
+ publish: async (eventId, data) => {
136
+ const waiters = this.eventWaiters.get(eventId);
137
+ if (!waiters) return 0;
138
+ const count = waiters.size;
139
+ for (const [executionId] of waiters) {
140
+ this.emitter.emit(`event:${eventId}:${executionId}`, data);
141
+ }
142
+ this.eventWaiters.delete(eventId);
143
+ return count;
144
+ },
145
+ subscribe: async (eventId, executionId, timeout) => {
146
+ if (!this.eventWaiters.has(eventId)) {
147
+ this.eventWaiters.set(eventId, /* @__PURE__ */ new Map());
148
+ }
149
+ this.eventWaiters.get(eventId).set(executionId, {
150
+ executionId,
151
+ timeoutAt: timeout
152
+ });
153
+ },
154
+ getWaiters: async (eventId) => {
155
+ const waiters = this.eventWaiters.get(eventId);
156
+ return waiters ? Array.from(waiters.values()) : [];
157
+ }
158
+ };
159
+ // ============================================================================
160
+ // Leader Operations
161
+ // ============================================================================
162
+ leader = {
163
+ acquire: async (lockId, ttlSeconds) => {
164
+ const now = /* @__PURE__ */ new Date();
165
+ const existing = this.leaders.get(lockId);
166
+ if (existing && existing.expiresAt > now) {
167
+ return false;
168
+ }
169
+ const owner = `${process.pid}-${Date.now()}`;
170
+ this.leaders.set(lockId, {
171
+ owner,
172
+ expiresAt: new Date(Date.now() + ttlSeconds * 1e3)
173
+ });
174
+ return true;
175
+ },
176
+ release: async (lockId) => {
177
+ this.leaders.delete(lockId);
178
+ },
179
+ renew: async (lockId, ttlSeconds) => {
180
+ const existing = this.leaders.get(lockId);
181
+ if (!existing) return false;
182
+ existing.expiresAt = new Date(Date.now() + ttlSeconds * 1e3);
183
+ return true;
184
+ }
185
+ };
186
+ // ============================================================================
187
+ // Realtime Operations
188
+ // ============================================================================
189
+ realtime = {
190
+ subscribe: (channel, callback) => {
191
+ this.emitter.on(channel, callback);
192
+ return () => {
193
+ this.emitter.off(channel, callback);
194
+ };
195
+ },
196
+ publish: async (channel, data) => {
197
+ this.emitter.emit(channel, data);
198
+ }
199
+ };
200
+ };
201
+ var index_default = MemoryStorageAdapter;
202
+ export {
203
+ MemoryStorageAdapter,
204
+ index_default as default
205
+ };
206
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts"],"sourcesContent":["// ============================================================================\n// In-Memory Storage Adapter\n// For development and testing purposes\n// ============================================================================\n\nimport { EventEmitter } from \"events\";\nimport type {\n StorageAdapter,\n QueueOperations,\n ExecutionOperations,\n EventOperations,\n LeaderOperations,\n RealtimeOperations,\n} from \"@stepflowjs/core/storage\";\nimport type {\n QueueJob,\n Execution,\n StepResult,\n EventWaiter,\n ListOptions,\n PopOptions,\n NackOptions,\n Unsubscribe,\n} from \"@stepflowjs/core\";\n\n// ============================================================================\n// Memory Storage Adapter\n// ============================================================================\n\nexport class MemoryStorageAdapter implements StorageAdapter {\n private jobs: Map<string, QueueJob> = new Map();\n private executions: Map<string, Execution> = new Map();\n private stepResults: Map<string, Map<string, StepResult>> = new Map();\n private eventWaiters: Map<string, Map<string, EventWaiter>> = new Map();\n private leaders: Map<string, { owner: string; expiresAt: Date }> = new Map();\n private emitter = new EventEmitter();\n private connected = false;\n\n async connect(): Promise<void> {\n this.connected = true;\n }\n\n async disconnect(): Promise<void> {\n this.jobs.clear();\n this.executions.clear();\n this.stepResults.clear();\n this.eventWaiters.clear();\n this.leaders.clear();\n this.emitter.removeAllListeners();\n this.connected = false;\n }\n\n async healthCheck(): Promise<boolean> {\n return this.connected;\n }\n\n // ============================================================================\n // Queue Operations\n // ============================================================================\n\n queue: QueueOperations = {\n push: async (job: QueueJob): Promise<string> => {\n this.jobs.set(job.id, { ...job });\n this.emitter.emit(\"job:added\", job);\n return job.id;\n },\n\n pop: async (options?: PopOptions): Promise<QueueJob | null> => {\n const now = new Date();\n const sortedJobs = Array.from(this.jobs.values())\n .filter((job) => !job.scheduledFor || job.scheduledFor <= now)\n .sort((a, b) => {\n // Sort by priority (desc) then createdAt (asc)\n if (a.priority !== b.priority) {\n return b.priority - a.priority;\n }\n return a.createdAt.getTime() - b.createdAt.getTime();\n });\n\n if (sortedJobs.length === 0) {\n return null;\n }\n\n const job = sortedJobs[0];\n // Don't delete yet - let ack/nack handle it\n return { ...job };\n },\n\n ack: async (jobId: string): Promise<void> => {\n // Remove job from queue\n this.jobs.delete(jobId);\n },\n\n nack: async (jobId: string, options?: NackOptions): Promise<void> => {\n const job = this.jobs.get(jobId);\n if (job) {\n // Increment attempts and optionally delay\n job.attempts++;\n if (options?.delay) {\n job.scheduledFor = new Date(Date.now() + options.delay);\n }\n // Job stays in queue for retry\n this.jobs.set(jobId, job);\n }\n },\n\n schedule: async (job: QueueJob, executeAt: Date): Promise<string> => {\n job.scheduledFor = executeAt;\n this.jobs.set(job.id, { ...job });\n return job.id;\n },\n\n getDelayed: async (): Promise<QueueJob[]> => {\n const now = new Date();\n return Array.from(this.jobs.values()).filter(\n (j) => j.scheduledFor && j.scheduledFor > now,\n );\n },\n };\n\n // ============================================================================\n // Execution Operations\n // ============================================================================\n\n execution: ExecutionOperations = {\n create: async (execution: Execution): Promise<string> => {\n this.executions.set(execution.id, { ...execution });\n this.emitter.emit(`execution:${execution.id}`, execution);\n return execution.id;\n },\n\n get: async (executionId: string): Promise<Execution | null> => {\n const execution = this.executions.get(executionId);\n return execution ? { ...execution } : null;\n },\n\n getByIdempotencyKey: async (\n workflowId: string,\n idempotencyKey: string,\n ): Promise<Execution | null> => {\n for (const execution of this.executions.values()) {\n if (\n execution.workflowId === workflowId &&\n execution.metadata.idempotencyKey === idempotencyKey\n ) {\n return { ...execution };\n }\n }\n return null;\n },\n\n update: async (\n executionId: string,\n updates: Partial<Execution>,\n ): Promise<void> => {\n const execution = this.executions.get(executionId);\n if (execution) {\n Object.assign(execution, updates);\n this.executions.set(executionId, execution);\n this.emitter.emit(`execution:${executionId}`, execution);\n }\n },\n\n list: async (options: ListOptions): Promise<Execution[]> => {\n let results = Array.from(this.executions.values());\n\n if (options.workflowId) {\n results = results.filter((e) => e.workflowId === options.workflowId);\n }\n if (options.status) {\n results = results.filter((e) => e.status === options.status);\n }\n if (options.runId) {\n results = results.filter((e) => e.runId === options.runId);\n }\n\n // Sort by startedAt descending\n results.sort((a, b) => b.startedAt.getTime() - a.startedAt.getTime());\n\n const offset = options.offset ?? 0;\n const limit = options.limit ?? 50;\n return results.slice(offset, offset + limit);\n },\n\n getStepResult: async <T = unknown>(\n executionId: string,\n stepName: string,\n ): Promise<StepResult<T> | null> => {\n const steps = this.stepResults.get(executionId);\n const result = steps?.get(stepName);\n return result ? ({ ...result } as StepResult<T>) : null;\n },\n\n saveStepResult: async (\n executionId: string,\n stepName: string,\n result: StepResult,\n ): Promise<void> => {\n if (!this.stepResults.has(executionId)) {\n this.stepResults.set(executionId, new Map());\n }\n this.stepResults.get(executionId)!.set(stepName, { ...result });\n },\n };\n\n // ============================================================================\n // Event Operations\n // ============================================================================\n\n events: EventOperations = {\n publish: async (eventId: string, data: unknown): Promise<number> => {\n const waiters = this.eventWaiters.get(eventId);\n if (!waiters) return 0;\n\n const count = waiters.size;\n for (const [executionId] of waiters) {\n this.emitter.emit(`event:${eventId}:${executionId}`, data);\n }\n this.eventWaiters.delete(eventId);\n return count;\n },\n\n subscribe: async (\n eventId: string,\n executionId: string,\n timeout: Date,\n ): Promise<void> => {\n if (!this.eventWaiters.has(eventId)) {\n this.eventWaiters.set(eventId, new Map());\n }\n this.eventWaiters.get(eventId)!.set(executionId, {\n executionId,\n timeoutAt: timeout,\n });\n },\n\n getWaiters: async (eventId: string): Promise<EventWaiter[]> => {\n const waiters = this.eventWaiters.get(eventId);\n return waiters ? Array.from(waiters.values()) : [];\n },\n };\n\n // ============================================================================\n // Leader Operations\n // ============================================================================\n\n leader: LeaderOperations = {\n acquire: async (lockId: string, ttlSeconds: number): Promise<boolean> => {\n const now = new Date();\n const existing = this.leaders.get(lockId);\n\n if (existing && existing.expiresAt > now) {\n return false;\n }\n\n const owner = `${process.pid}-${Date.now()}`;\n this.leaders.set(lockId, {\n owner,\n expiresAt: new Date(Date.now() + ttlSeconds * 1000),\n });\n return true;\n },\n\n release: async (lockId: string): Promise<void> => {\n this.leaders.delete(lockId);\n },\n\n renew: async (lockId: string, ttlSeconds: number): Promise<boolean> => {\n const existing = this.leaders.get(lockId);\n if (!existing) return false;\n\n existing.expiresAt = new Date(Date.now() + ttlSeconds * 1000);\n return true;\n },\n };\n\n // ============================================================================\n // Realtime Operations\n // ============================================================================\n\n realtime: RealtimeOperations = {\n subscribe: (\n channel: string,\n callback: (data: unknown) => void,\n ): Unsubscribe => {\n this.emitter.on(channel, callback);\n return () => {\n this.emitter.off(channel, callback);\n };\n },\n\n publish: async (channel: string, data: unknown): Promise<void> => {\n this.emitter.emit(channel, data);\n },\n };\n}\n\n// Default export\nexport default MemoryStorageAdapter;\n"],"mappings":";AAKA,SAAS,oBAAoB;AAwBtB,IAAM,uBAAN,MAAqD;AAAA,EAClD,OAA8B,oBAAI,IAAI;AAAA,EACtC,aAAqC,oBAAI,IAAI;AAAA,EAC7C,cAAoD,oBAAI,IAAI;AAAA,EAC5D,eAAsD,oBAAI,IAAI;AAAA,EAC9D,UAA2D,oBAAI,IAAI;AAAA,EACnE,UAAU,IAAI,aAAa;AAAA,EAC3B,YAAY;AAAA,EAEpB,MAAM,UAAyB;AAC7B,SAAK,YAAY;AAAA,EACnB;AAAA,EAEA,MAAM,aAA4B;AAChC,SAAK,KAAK,MAAM;AAChB,SAAK,WAAW,MAAM;AACtB,SAAK,YAAY,MAAM;AACvB,SAAK,aAAa,MAAM;AACxB,SAAK,QAAQ,MAAM;AACnB,SAAK,QAAQ,mBAAmB;AAChC,SAAK,YAAY;AAAA,EACnB;AAAA,EAEA,MAAM,cAAgC;AACpC,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAMA,QAAyB;AAAA,IACvB,MAAM,OAAO,QAAmC;AAC9C,WAAK,KAAK,IAAI,IAAI,IAAI,EAAE,GAAG,IAAI,CAAC;AAChC,WAAK,QAAQ,KAAK,aAAa,GAAG;AAClC,aAAO,IAAI;AAAA,IACb;AAAA,IAEA,KAAK,OAAO,YAAmD;AAC7D,YAAM,MAAM,oBAAI,KAAK;AACrB,YAAM,aAAa,MAAM,KAAK,KAAK,KAAK,OAAO,CAAC,EAC7C,OAAO,CAACA,SAAQ,CAACA,KAAI,gBAAgBA,KAAI,gBAAgB,GAAG,EAC5D,KAAK,CAAC,GAAG,MAAM;AAEd,YAAI,EAAE,aAAa,EAAE,UAAU;AAC7B,iBAAO,EAAE,WAAW,EAAE;AAAA,QACxB;AACA,eAAO,EAAE,UAAU,QAAQ,IAAI,EAAE,UAAU,QAAQ;AAAA,MACrD,CAAC;AAEH,UAAI,WAAW,WAAW,GAAG;AAC3B,eAAO;AAAA,MACT;AAEA,YAAM,MAAM,WAAW,CAAC;AAExB,aAAO,EAAE,GAAG,IAAI;AAAA,IAClB;AAAA,IAEA,KAAK,OAAO,UAAiC;AAE3C,WAAK,KAAK,OAAO,KAAK;AAAA,IACxB;AAAA,IAEA,MAAM,OAAO,OAAe,YAAyC;AACnE,YAAM,MAAM,KAAK,KAAK,IAAI,KAAK;AAC/B,UAAI,KAAK;AAEP,YAAI;AACJ,YAAI,SAAS,OAAO;AAClB,cAAI,eAAe,IAAI,KAAK,KAAK,IAAI,IAAI,QAAQ,KAAK;AAAA,QACxD;AAEA,aAAK,KAAK,IAAI,OAAO,GAAG;AAAA,MAC1B;AAAA,IACF;AAAA,IAEA,UAAU,OAAO,KAAe,cAAqC;AACnE,UAAI,eAAe;AACnB,WAAK,KAAK,IAAI,IAAI,IAAI,EAAE,GAAG,IAAI,CAAC;AAChC,aAAO,IAAI;AAAA,IACb;AAAA,IAEA,YAAY,YAAiC;AAC3C,YAAM,MAAM,oBAAI,KAAK;AACrB,aAAO,MAAM,KAAK,KAAK,KAAK,OAAO,CAAC,EAAE;AAAA,QACpC,CAAC,MAAM,EAAE,gBAAgB,EAAE,eAAe;AAAA,MAC5C;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAMA,YAAiC;AAAA,IAC/B,QAAQ,OAAO,cAA0C;AACvD,WAAK,WAAW,IAAI,UAAU,IAAI,EAAE,GAAG,UAAU,CAAC;AAClD,WAAK,QAAQ,KAAK,aAAa,UAAU,EAAE,IAAI,SAAS;AACxD,aAAO,UAAU;AAAA,IACnB;AAAA,IAEA,KAAK,OAAO,gBAAmD;AAC7D,YAAM,YAAY,KAAK,WAAW,IAAI,WAAW;AACjD,aAAO,YAAY,EAAE,GAAG,UAAU,IAAI;AAAA,IACxC;AAAA,IAEA,qBAAqB,OACnB,YACA,mBAC8B;AAC9B,iBAAW,aAAa,KAAK,WAAW,OAAO,GAAG;AAChD,YACE,UAAU,eAAe,cACzB,UAAU,SAAS,mBAAmB,gBACtC;AACA,iBAAO,EAAE,GAAG,UAAU;AAAA,QACxB;AAAA,MACF;AACA,aAAO;AAAA,IACT;AAAA,IAEA,QAAQ,OACN,aACA,YACkB;AAClB,YAAM,YAAY,KAAK,WAAW,IAAI,WAAW;AACjD,UAAI,WAAW;AACb,eAAO,OAAO,WAAW,OAAO;AAChC,aAAK,WAAW,IAAI,aAAa,SAAS;AAC1C,aAAK,QAAQ,KAAK,aAAa,WAAW,IAAI,SAAS;AAAA,MACzD;AAAA,IACF;AAAA,IAEA,MAAM,OAAO,YAA+C;AAC1D,UAAI,UAAU,MAAM,KAAK,KAAK,WAAW,OAAO,CAAC;AAEjD,UAAI,QAAQ,YAAY;AACtB,kBAAU,QAAQ,OAAO,CAAC,MAAM,EAAE,eAAe,QAAQ,UAAU;AAAA,MACrE;AACA,UAAI,QAAQ,QAAQ;AAClB,kBAAU,QAAQ,OAAO,CAAC,MAAM,EAAE,WAAW,QAAQ,MAAM;AAAA,MAC7D;AACA,UAAI,QAAQ,OAAO;AACjB,kBAAU,QAAQ,OAAO,CAAC,MAAM,EAAE,UAAU,QAAQ,KAAK;AAAA,MAC3D;AAGA,cAAQ,KAAK,CAAC,GAAG,MAAM,EAAE,UAAU,QAAQ,IAAI,EAAE,UAAU,QAAQ,CAAC;AAEpE,YAAM,SAAS,QAAQ,UAAU;AACjC,YAAM,QAAQ,QAAQ,SAAS;AAC/B,aAAO,QAAQ,MAAM,QAAQ,SAAS,KAAK;AAAA,IAC7C;AAAA,IAEA,eAAe,OACb,aACA,aACkC;AAClC,YAAM,QAAQ,KAAK,YAAY,IAAI,WAAW;AAC9C,YAAM,SAAS,OAAO,IAAI,QAAQ;AAClC,aAAO,SAAU,EAAE,GAAG,OAAO,IAAsB;AAAA,IACrD;AAAA,IAEA,gBAAgB,OACd,aACA,UACA,WACkB;AAClB,UAAI,CAAC,KAAK,YAAY,IAAI,WAAW,GAAG;AACtC,aAAK,YAAY,IAAI,aAAa,oBAAI,IAAI,CAAC;AAAA,MAC7C;AACA,WAAK,YAAY,IAAI,WAAW,EAAG,IAAI,UAAU,EAAE,GAAG,OAAO,CAAC;AAAA,IAChE;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAMA,SAA0B;AAAA,IACxB,SAAS,OAAO,SAAiB,SAAmC;AAClE,YAAM,UAAU,KAAK,aAAa,IAAI,OAAO;AAC7C,UAAI,CAAC,QAAS,QAAO;AAErB,YAAM,QAAQ,QAAQ;AACtB,iBAAW,CAAC,WAAW,KAAK,SAAS;AACnC,aAAK,QAAQ,KAAK,SAAS,OAAO,IAAI,WAAW,IAAI,IAAI;AAAA,MAC3D;AACA,WAAK,aAAa,OAAO,OAAO;AAChC,aAAO;AAAA,IACT;AAAA,IAEA,WAAW,OACT,SACA,aACA,YACkB;AAClB,UAAI,CAAC,KAAK,aAAa,IAAI,OAAO,GAAG;AACnC,aAAK,aAAa,IAAI,SAAS,oBAAI,IAAI,CAAC;AAAA,MAC1C;AACA,WAAK,aAAa,IAAI,OAAO,EAAG,IAAI,aAAa;AAAA,QAC/C;AAAA,QACA,WAAW;AAAA,MACb,CAAC;AAAA,IACH;AAAA,IAEA,YAAY,OAAO,YAA4C;AAC7D,YAAM,UAAU,KAAK,aAAa,IAAI,OAAO;AAC7C,aAAO,UAAU,MAAM,KAAK,QAAQ,OAAO,CAAC,IAAI,CAAC;AAAA,IACnD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAMA,SAA2B;AAAA,IACzB,SAAS,OAAO,QAAgB,eAAyC;AACvE,YAAM,MAAM,oBAAI,KAAK;AACrB,YAAM,WAAW,KAAK,QAAQ,IAAI,MAAM;AAExC,UAAI,YAAY,SAAS,YAAY,KAAK;AACxC,eAAO;AAAA,MACT;AAEA,YAAM,QAAQ,GAAG,QAAQ,GAAG,IAAI,KAAK,IAAI,CAAC;AAC1C,WAAK,QAAQ,IAAI,QAAQ;AAAA,QACvB;AAAA,QACA,WAAW,IAAI,KAAK,KAAK,IAAI,IAAI,aAAa,GAAI;AAAA,MACpD,CAAC;AACD,aAAO;AAAA,IACT;AAAA,IAEA,SAAS,OAAO,WAAkC;AAChD,WAAK,QAAQ,OAAO,MAAM;AAAA,IAC5B;AAAA,IAEA,OAAO,OAAO,QAAgB,eAAyC;AACrE,YAAM,WAAW,KAAK,QAAQ,IAAI,MAAM;AACxC,UAAI,CAAC,SAAU,QAAO;AAEtB,eAAS,YAAY,IAAI,KAAK,KAAK,IAAI,IAAI,aAAa,GAAI;AAC5D,aAAO;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAMA,WAA+B;AAAA,IAC7B,WAAW,CACT,SACA,aACgB;AAChB,WAAK,QAAQ,GAAG,SAAS,QAAQ;AACjC,aAAO,MAAM;AACX,aAAK,QAAQ,IAAI,SAAS,QAAQ;AAAA,MACpC;AAAA,IACF;AAAA,IAEA,SAAS,OAAO,SAAiB,SAAiC;AAChE,WAAK,QAAQ,KAAK,SAAS,IAAI;AAAA,IACjC;AAAA,EACF;AACF;AAGA,IAAO,gBAAQ;","names":["job"]}
package/package.json ADDED
@@ -0,0 +1,57 @@
1
+ {
2
+ "name": "@stepflowjs/storage-memory",
3
+ "version": "0.0.1",
4
+ "description": "In-memory storage adapter for Stepflow (development/testing)",
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "module": "./dist/index.js",
8
+ "types": "./dist/index.d.ts",
9
+ "exports": {
10
+ ".": {
11
+ "import": "./dist/index.js",
12
+ "types": "./dist/index.d.ts"
13
+ }
14
+ },
15
+ "files": [
16
+ "dist"
17
+ ],
18
+ "dependencies": {
19
+ "@stepflowjs/core": "0.0.1"
20
+ },
21
+ "devDependencies": {
22
+ "tsup": "^8.5.1",
23
+ "vitest": "^4.0.17"
24
+ },
25
+ "peerDependencies": {
26
+ "typescript": "^5.0.0"
27
+ },
28
+ "license": "MIT",
29
+ "author": "Stepflow Contributors",
30
+ "repository": {
31
+ "type": "git",
32
+ "url": "https://stepflow-production.up.railway.app",
33
+ "directory": "packages/storage/memory"
34
+ },
35
+ "homepage": "https://stepflow-production.up.railway.app",
36
+ "bugs": {
37
+ "url": "https://stepflow-production.up.railway.app"
38
+ },
39
+ "keywords": [
40
+ "stepflow",
41
+ "storage",
42
+ "memory",
43
+ "adapter",
44
+ "workflow",
45
+ "orchestration"
46
+ ],
47
+ "publishConfig": {
48
+ "access": "public"
49
+ },
50
+ "scripts": {
51
+ "build": "tsup",
52
+ "dev": "tsup --watch",
53
+ "typecheck": "tsc --noEmit",
54
+ "test": "vitest",
55
+ "clean": "rm -rf dist"
56
+ }
57
+ }