@procedures/store 0.0.0-stage → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +9 -0
- package/LICENSE +21 -0
- package/README.md +65 -2
- package/dist/.tsbuildinfo +1 -0
- package/dist/errors.d.ts +16 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +18 -0
- package/dist/errors.js.map +1 -0
- package/dist/index.d.ts +19 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +19 -0
- package/dist/index.js.map +1 -0
- package/dist/module.d.ts +15 -0
- package/dist/module.d.ts.map +1 -0
- package/dist/module.js +16 -0
- package/dist/module.js.map +1 -0
- package/dist/procedures.d.ts +13 -0
- package/dist/procedures.d.ts.map +1 -0
- package/dist/procedures.js +14 -0
- package/dist/procedures.js.map +1 -0
- package/dist/program-store/attach.d.ts +20 -0
- package/dist/program-store/attach.d.ts.map +1 -0
- package/dist/program-store/attach.js +36 -0
- package/dist/program-store/attach.js.map +1 -0
- package/dist/program-store/collection.d.ts +19 -0
- package/dist/program-store/collection.d.ts.map +1 -0
- package/dist/program-store/collection.js +34 -0
- package/dist/program-store/collection.js.map +1 -0
- package/dist/program-store/file.d.ts +29 -0
- package/dist/program-store/file.d.ts.map +1 -0
- package/dist/program-store/file.js +156 -0
- package/dist/program-store/file.js.map +1 -0
- package/dist/program-store/index.d.ts +11 -0
- package/dist/program-store/index.d.ts.map +1 -0
- package/dist/program-store/index.js +10 -0
- package/dist/program-store/index.js.map +1 -0
- package/dist/program-store/memory.d.ts +15 -0
- package/dist/program-store/memory.d.ts.map +1 -0
- package/dist/program-store/memory.js +25 -0
- package/dist/program-store/memory.js.map +1 -0
- package/dist/program-store/procedures.d.ts +23 -0
- package/dist/program-store/procedures.d.ts.map +1 -0
- package/dist/program-store/procedures.js +221 -0
- package/dist/program-store/procedures.js.map +1 -0
- package/dist/program-store/types.d.ts +50 -0
- package/dist/program-store/types.d.ts.map +1 -0
- package/dist/program-store/types.js +41 -0
- package/dist/program-store/types.js.map +1 -0
- package/dist/register.d.ts +8 -0
- package/dist/register.d.ts.map +1 -0
- package/dist/register.js +15 -0
- package/dist/register.js.map +1 -0
- package/dist/storage/adapter.d.ts +148 -0
- package/dist/storage/adapter.d.ts.map +1 -0
- package/dist/storage/adapter.js +214 -0
- package/dist/storage/adapter.js.map +1 -0
- package/dist/storage/api.d.ts +125 -0
- package/dist/storage/api.d.ts.map +1 -0
- package/dist/storage/api.js +220 -0
- package/dist/storage/api.js.map +1 -0
- package/dist/storage/factory.d.ts +134 -0
- package/dist/storage/factory.d.ts.map +1 -0
- package/dist/storage/factory.js +166 -0
- package/dist/storage/factory.js.map +1 -0
- package/dist/storage/hybrid.d.ts +193 -0
- package/dist/storage/hybrid.d.ts.map +1 -0
- package/dist/storage/hybrid.js +519 -0
- package/dist/storage/hybrid.js.map +1 -0
- package/dist/storage/index.d.ts +21 -0
- package/dist/storage/index.d.ts.map +1 -0
- package/dist/storage/index.js +20 -0
- package/dist/storage/index.js.map +1 -0
- package/dist/storage/procedures.d.ts +14 -0
- package/dist/storage/procedures.d.ts.map +1 -0
- package/dist/storage/procedures.js +98 -0
- package/dist/storage/procedures.js.map +1 -0
- package/dist/storage/serialization.d.ts +123 -0
- package/dist/storage/serialization.d.ts.map +1 -0
- package/dist/storage/serialization.js +216 -0
- package/dist/storage/serialization.js.map +1 -0
- package/dist/storage/synced-registry.d.ts +246 -0
- package/dist/storage/synced-registry.d.ts.map +1 -0
- package/dist/storage/synced-registry.js +575 -0
- package/dist/storage/synced-registry.js.map +1 -0
- package/dist/storage/types.d.ts +130 -0
- package/dist/storage/types.d.ts.map +1 -0
- package/dist/storage/types.js +8 -0
- package/dist/storage/types.js.map +1 -0
- package/dist/types.d.ts +7 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +7 -0
- package/dist/types.js.map +1 -0
- package/package.json +79 -3
- package/src/errors.ts +20 -0
- package/src/index.ts +19 -0
- package/src/module.ts +18 -0
- package/src/procedures.ts +17 -0
- package/src/program-store/attach.ts +46 -0
- package/src/program-store/collection.ts +39 -0
- package/src/program-store/file.ts +157 -0
- package/src/program-store/index.ts +17 -0
- package/src/program-store/memory.ts +30 -0
- package/src/program-store/procedures.ts +344 -0
- package/src/program-store/types.ts +78 -0
- package/src/register.ts +18 -0
- package/src/storage/adapter.ts +273 -0
- package/src/storage/api.ts +335 -0
- package/src/storage/factory.ts +268 -0
- package/src/storage/hybrid.ts +676 -0
- package/src/storage/index.ts +61 -0
- package/src/storage/procedures.ts +146 -0
- package/src/storage/serialization.ts +283 -0
- package/src/storage/synced-registry.ts +698 -0
- package/src/storage/types.ts +180 -0
- package/src/types.ts +7 -0
|
@@ -0,0 +1,268 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Procedure Storage Factory
|
|
3
|
+
*
|
|
4
|
+
* Factory functions for creating storage-backed procedure registries.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import type { Client } from "@procedures/client";
|
|
8
|
+
import type { CollectionStorage } from "@procedures/collections";
|
|
9
|
+
import { InMemoryStorage } from "@procedures/collections";
|
|
10
|
+
import { ApiStorage } from "./api.js";
|
|
11
|
+
import { HybridStorage } from "./hybrid.js";
|
|
12
|
+
import type { HybridStorageOptions } from "./hybrid.js";
|
|
13
|
+
import { ProcedureRegistry, PROCEDURE_REGISTRY } from "@procedures/client";
|
|
14
|
+
import type { SerializedProcedure, SyncedRegistryOptions, HandlerLoader } from "./types.js";
|
|
15
|
+
import { SyncedProcedureRegistry } from "./synced-registry.js";
|
|
16
|
+
import { getSerializedKey } from "./serialization.js";
|
|
17
|
+
|
|
18
|
+
// =============================================================================
|
|
19
|
+
// Factory Configuration
|
|
20
|
+
// =============================================================================
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Configuration for creating a synced procedure registry.
|
|
24
|
+
*/
|
|
25
|
+
export interface CreateSyncedRegistryConfig {
|
|
26
|
+
/**
|
|
27
|
+
* Storage type to use.
|
|
28
|
+
* - "memory": In-memory only (fast, volatile)
|
|
29
|
+
* - "api": Remote storage via client procedures
|
|
30
|
+
* - "hybrid": Local cache + remote sync
|
|
31
|
+
*/
|
|
32
|
+
type: "memory" | "api" | "hybrid";
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Universal client instance (required for "api" and "hybrid" types).
|
|
36
|
+
*/
|
|
37
|
+
client?: Client | undefined;
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* The collection of the core collection procedures on the server: the calls go to
|
|
41
|
+
* `collections.<collection>.<operation>`.
|
|
42
|
+
* @default "procedures"
|
|
43
|
+
*/
|
|
44
|
+
collection?: string | undefined;
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* The service of the calls, for a server with other paths. The default is
|
|
48
|
+
* `collections.<collection>`.
|
|
49
|
+
*/
|
|
50
|
+
service?: string | undefined;
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* Additional options for hybrid storage.
|
|
54
|
+
*/
|
|
55
|
+
hybridOptions?: Partial<HybridStorageOptions> | undefined;
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* Options for the synced registry.
|
|
59
|
+
*/
|
|
60
|
+
registryOptions?: Partial<SyncedRegistryOptions> | undefined;
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* Base registry to wrap.
|
|
64
|
+
* @default PROCEDURE_REGISTRY (global singleton)
|
|
65
|
+
*/
|
|
66
|
+
baseRegistry?: ProcedureRegistry | undefined;
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* Custom handler loader.
|
|
70
|
+
* @default Dynamic import loader
|
|
71
|
+
*/
|
|
72
|
+
handlerLoader?: HandlerLoader | undefined;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
// =============================================================================
|
|
76
|
+
// Factory Function
|
|
77
|
+
// =============================================================================
|
|
78
|
+
|
|
79
|
+
/**
|
|
80
|
+
* Create a synced procedure registry with the specified storage backend.
|
|
81
|
+
*
|
|
82
|
+
* @param config - Configuration for the registry
|
|
83
|
+
* @returns SyncedProcedureRegistry instance
|
|
84
|
+
*
|
|
85
|
+
* @example
|
|
86
|
+
* ```typescript
|
|
87
|
+
* // In-memory only (for testing)
|
|
88
|
+
* const registry = createSyncedRegistry({ type: 'memory' });
|
|
89
|
+
*
|
|
90
|
+
* // API storage (remote persistence)
|
|
91
|
+
* const registry = createSyncedRegistry({
|
|
92
|
+
* type: 'api',
|
|
93
|
+
* client: myClient,
|
|
94
|
+
* service: 'procedures',
|
|
95
|
+
* });
|
|
96
|
+
*
|
|
97
|
+
* // Hybrid storage (offline-first)
|
|
98
|
+
* const registry = createSyncedRegistry({
|
|
99
|
+
* type: 'hybrid',
|
|
100
|
+
* client: myClient,
|
|
101
|
+
* service: 'procedures',
|
|
102
|
+
* hybridOptions: {
|
|
103
|
+
* writeStrategy: 'write-through',
|
|
104
|
+
* conflictResolution: 'remote',
|
|
105
|
+
* },
|
|
106
|
+
* });
|
|
107
|
+
* ```
|
|
108
|
+
*/
|
|
109
|
+
export function createSyncedRegistry(config: CreateSyncedRegistryConfig): SyncedProcedureRegistry {
|
|
110
|
+
const {
|
|
111
|
+
type,
|
|
112
|
+
client,
|
|
113
|
+
collection = "procedures",
|
|
114
|
+
service,
|
|
115
|
+
hybridOptions,
|
|
116
|
+
registryOptions = {},
|
|
117
|
+
baseRegistry = PROCEDURE_REGISTRY,
|
|
118
|
+
// No loader unless the caller gives one: stored records load as stubs. (Before, the default
|
|
119
|
+
// imported any module a stored record named: BUGS-2026-07 M11, deep dive CORE-7.)
|
|
120
|
+
handlerLoader,
|
|
121
|
+
} = config;
|
|
122
|
+
|
|
123
|
+
// Validate client is provided for api/hybrid
|
|
124
|
+
if ((type === "api" || type === "hybrid") && !client) {
|
|
125
|
+
throw new Error(`Client is required for storage type: ${type}`);
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
// Create the appropriate storage backend
|
|
129
|
+
let storage: CollectionStorage<SerializedProcedure>;
|
|
130
|
+
|
|
131
|
+
switch (type) {
|
|
132
|
+
case "memory":
|
|
133
|
+
storage = new InMemoryStorage<SerializedProcedure>();
|
|
134
|
+
break;
|
|
135
|
+
|
|
136
|
+
case "api":
|
|
137
|
+
storage = new ApiStorage<SerializedProcedure>(client!, {
|
|
138
|
+
collection,
|
|
139
|
+
...(service !== undefined && { service }),
|
|
140
|
+
});
|
|
141
|
+
break;
|
|
142
|
+
|
|
143
|
+
case "hybrid": {
|
|
144
|
+
const remoteStorage = new ApiStorage<SerializedProcedure>(client!, {
|
|
145
|
+
collection,
|
|
146
|
+
...(service !== undefined && { service }),
|
|
147
|
+
});
|
|
148
|
+
storage = new HybridStorage<SerializedProcedure>(
|
|
149
|
+
remoteStorage,
|
|
150
|
+
{
|
|
151
|
+
writeStrategy: hybridOptions?.writeStrategy ?? "write-through",
|
|
152
|
+
conflictResolution: hybridOptions?.conflictResolution ?? "local",
|
|
153
|
+
// A procedure record has no id: its key is its path (deep dive DATA-9)
|
|
154
|
+
keyOf: getSerializedKey,
|
|
155
|
+
...hybridOptions,
|
|
156
|
+
}
|
|
157
|
+
);
|
|
158
|
+
break;
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
default:
|
|
162
|
+
throw new Error(`Unknown storage type: ${type}`);
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
// Create and return the synced registry
|
|
166
|
+
return new SyncedProcedureRegistry(baseRegistry, storage, {
|
|
167
|
+
...registryOptions,
|
|
168
|
+
handlerLoader,
|
|
169
|
+
});
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
// =============================================================================
|
|
173
|
+
// Convenience Functions
|
|
174
|
+
// =============================================================================
|
|
175
|
+
|
|
176
|
+
/**
|
|
177
|
+
* Create an in-memory synced registry.
|
|
178
|
+
* Useful for testing or when persistence isn't needed.
|
|
179
|
+
*
|
|
180
|
+
* @param baseRegistry - Base registry to wrap
|
|
181
|
+
* @returns SyncedProcedureRegistry with in-memory storage
|
|
182
|
+
*/
|
|
183
|
+
export function createMemorySyncedRegistry(
|
|
184
|
+
baseRegistry: ProcedureRegistry = PROCEDURE_REGISTRY
|
|
185
|
+
): SyncedProcedureRegistry {
|
|
186
|
+
return createSyncedRegistry({
|
|
187
|
+
type: "memory",
|
|
188
|
+
baseRegistry,
|
|
189
|
+
});
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
/**
|
|
193
|
+
* Create an API-backed synced registry.
|
|
194
|
+
*
|
|
195
|
+
* @param client - Universal client instance
|
|
196
|
+
* @param collection - The collection of the core collection procedures on the server
|
|
197
|
+
* @param baseRegistry - Base registry to wrap
|
|
198
|
+
* @returns SyncedProcedureRegistry with API storage
|
|
199
|
+
*/
|
|
200
|
+
export function createApiSyncedRegistry(
|
|
201
|
+
client: Client,
|
|
202
|
+
collection = "procedures",
|
|
203
|
+
baseRegistry: ProcedureRegistry = PROCEDURE_REGISTRY
|
|
204
|
+
): SyncedProcedureRegistry {
|
|
205
|
+
return createSyncedRegistry({
|
|
206
|
+
type: "api",
|
|
207
|
+
client,
|
|
208
|
+
collection,
|
|
209
|
+
baseRegistry,
|
|
210
|
+
});
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
/**
|
|
214
|
+
* Create a hybrid synced registry (offline-first).
|
|
215
|
+
*
|
|
216
|
+
* @param client - Universal client instance
|
|
217
|
+
* @param collection - The collection of the core collection procedures on the server
|
|
218
|
+
* @param options - Hybrid storage options
|
|
219
|
+
* @param baseRegistry - Base registry to wrap
|
|
220
|
+
* @returns SyncedProcedureRegistry with hybrid storage
|
|
221
|
+
*/
|
|
222
|
+
export function createHybridSyncedRegistry(
|
|
223
|
+
client: Client,
|
|
224
|
+
collection = "procedures",
|
|
225
|
+
options?: Partial<HybridStorageOptions>,
|
|
226
|
+
baseRegistry: ProcedureRegistry = PROCEDURE_REGISTRY
|
|
227
|
+
): SyncedProcedureRegistry {
|
|
228
|
+
return createSyncedRegistry({
|
|
229
|
+
type: "hybrid",
|
|
230
|
+
client,
|
|
231
|
+
collection,
|
|
232
|
+
hybridOptions: options,
|
|
233
|
+
baseRegistry,
|
|
234
|
+
});
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
// =============================================================================
|
|
238
|
+
// Custom Storage Factory
|
|
239
|
+
// =============================================================================
|
|
240
|
+
|
|
241
|
+
/**
|
|
242
|
+
* Create a synced registry with a custom storage backend.
|
|
243
|
+
*
|
|
244
|
+
* @param storage - Custom CollectionStorage implementation
|
|
245
|
+
* @param options - Registry options
|
|
246
|
+
* @param baseRegistry - Base registry to wrap
|
|
247
|
+
* @returns SyncedProcedureRegistry with custom storage
|
|
248
|
+
*
|
|
249
|
+
* @example
|
|
250
|
+
* ```typescript
|
|
251
|
+
* // Use MongoDB storage
|
|
252
|
+
* const mongoStorage = new MongoCollectionStorage<SerializedProcedure>(
|
|
253
|
+
* mongoClient,
|
|
254
|
+
* 'procedures'
|
|
255
|
+
* );
|
|
256
|
+
* const registry = createCustomSyncedRegistry(mongoStorage);
|
|
257
|
+
* ```
|
|
258
|
+
*/
|
|
259
|
+
export function createCustomSyncedRegistry(
|
|
260
|
+
storage: CollectionStorage<SerializedProcedure>,
|
|
261
|
+
options?: Partial<SyncedRegistryOptions>,
|
|
262
|
+
baseRegistry: ProcedureRegistry = PROCEDURE_REGISTRY
|
|
263
|
+
): SyncedProcedureRegistry {
|
|
264
|
+
// No default loader: see createSyncedRegistry
|
|
265
|
+
return new SyncedProcedureRegistry(baseRegistry, storage, {
|
|
266
|
+
...options,
|
|
267
|
+
});
|
|
268
|
+
}
|