@outburn/fume-mapping-provider 0.2.0 → 1.0.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/README.md CHANGED
@@ -9,6 +9,7 @@ A TypeScript module for managing pre-defined, named FUME expressions (mappings)
9
9
  - 🌐 **Server mappings**: Load from FHIR servers with automatic pagination
10
10
  - 📦 **Package mappings**: Load from FHIR packages via `fhir-package-explorer`
11
11
  - 🔄 **Smart collision handling**: File mappings override server mappings
12
+ - 🛰️ **Automatic change tracking**: Poll files and FHIR server resources with incremental updates
12
13
  - 🔍 **Flexible search**: Find package mappings by URL, ID, or name
13
14
  - 📝 **Structured logging**: Optional logger interface support
14
15
  - ✅ **FUME validation**: Filters StructureMaps by FUME-specific extensions
@@ -21,7 +22,7 @@ The provider separates mappings into two categories:
21
22
  - **Fast access**: Loaded once, cached in memory
22
23
  - **Key-based lookup**: Use unique keys for instant retrieval
23
24
  - **Collision resolution**: File mappings override server mappings with warnings
24
- - **Refresh by key**: Update individual mappings without full reload
25
+ - **Focused refresh by key**: Re-fetch a single mapping from its real source
25
26
 
26
27
  ### Package Mappings
27
28
  - **Always fresh**: Queried from FPE on demand (FPE handles caching)
@@ -58,7 +59,11 @@ const provider = new FumeMappingProvider({
58
59
  fileExtension: '.fume', // Optional, default is '.fume'
59
60
  fhirClient: fhirClient,
60
61
  packageExplorer: packageExplorer,
62
+ aliasConceptMapId: 'my-aliases-cm-id', // Optional, skips alias ConceptMap search
61
63
  canonicalBaseUrl: 'http://example.com', // Optional, default is 'http://example.com'
64
+ filePollingIntervalMs: 5000, // Optional, default 5000 (set <= 0 to disable)
65
+ serverPollingIntervalMs: 30000, // Optional, default 30000 (set <= 0 to disable)
66
+ forcedResyncIntervalMs: 3600000, // Optional, default 1 hour (set <= 0 to disable)
62
67
  logger: console // Optional
63
68
  });
64
69
 
@@ -79,21 +84,17 @@ await provider.reloadUserMappings();
79
84
 
80
85
  // Refresh specific mapping by key (fetches from source)
81
86
  await provider.refreshUserMapping('my-mapping-key');
82
-
83
- // Optimistic update - provide mapping directly to avoid roundtrip
84
- // Useful after successfully updating the FHIR server
85
- const updatedMapping = {
86
- key: 'my-mapping-key',
87
- expression: '$output = { updated: true }',
88
- source: 'server',
89
- sourceServer: 'http://my-server.com'
90
- };
91
- await provider.refreshUserMapping('my-mapping-key', updatedMapping);
92
-
93
- // Optimistic delete - pass null to remove from cache
94
- await provider.refreshUserMapping('deleted-key', null);
95
87
  ```
96
88
 
89
+ ### JSON Mapping Files (*.json)
90
+
91
+ If `mappingsFolder` is configured, the provider also loads `*.json` files from that folder as **JSON-valued mappings**.
92
+
93
+ - The mapping key is the filename without `.json`
94
+ - The mapping value is the parsed JSON value (object/array/string/number/boolean/null)
95
+ - The reserved filename `aliases.json` is **never** treated as a mapping
96
+ - If both `myMap.json` and `myMap.fume` exist, the JSON mapping overrides the text mapping (a warning is logged if a logger is provided)
97
+
97
98
  ### Get User Mappings (Lightning Fast ⚡)
98
99
 
99
100
  ```typescript
@@ -114,15 +115,26 @@ const mapping = provider.getUserMapping('my-key');
114
115
  // Returns: UserMapping | undefined
115
116
  ```
116
117
 
118
+ ## Automatic Change Tracking
119
+
120
+ On `initialize()`, the provider automatically starts polling sources to keep the in-memory cache aligned with files and server resources.
121
+
122
+ - **File polling** (default: 5s): detects changes in mapping files and `aliases.json` incrementally.
123
+ - **Server polling** (default: 30s):
124
+ - Aliases: conditional read of the alias ConceptMap (ETag/Last-Modified).
125
+ - Mappings: StructureMap search with `_lastUpdated`.
126
+ - **Forced resync** (default: 1h): full refresh of aliases + mappings, applied incrementally.
127
+
128
+ Disable any polling loop by setting its interval to `<= 0`.
129
+
117
130
  ### UserMapping Structure
118
131
 
119
132
  ```typescript
120
133
  interface UserMapping {
121
134
  key: string; // Unique identifier
122
- expression: string; // FUME expression
123
- source: 'file' | 'server'; // Origin
124
- filename?: string; // For file mappings
125
- sourceServer?: string; // For server mappings
135
+ expression: unknown; // FUME expression (string) or JSON value for *.json
136
+ sourceType: 'file' | 'server'; // Origin
137
+ source: string; // Absolute file path or full server URL
126
138
  name?: string; // StructureMap.name
127
139
  url?: string; // StructureMap.url
128
140
  }
@@ -150,9 +162,13 @@ const metadata = await provider.getPackageMappingsMetadata();
150
162
  ### Overview
151
163
 
152
164
  Aliases are simple key-value string mappings stored in a special ConceptMap resource on the FHIR server. Unlike mappings, aliases are:
153
- - **Server-only**: Not loaded from files or packages
165
+ - **Server + File**: Loaded from the FHIR server and/or an optional `aliases.json` file in `mappingsFolder`
154
166
  - **Consolidated**: Always served as a single object
155
- - **Cached**: Loaded once during initialization for fast access
167
+ - **Cached**: Kept fresh via automatic change tracking
168
+
169
+ When both server and file sources are configured:
170
+ - **File aliases override server aliases** on key collision (a warning is logged if a logger is provided)
171
+ - **Server aliases override built-in aliases**
156
172
 
157
173
  ### Alias Resource Structure
158
174
 
@@ -182,6 +198,15 @@ The server is queried with: `GET [baseUrl]/ConceptMap?context=http://codes.fume.
182
198
  const aliases = provider.getAliases();
183
199
  // Returns: { [key: string]: string }
184
200
 
201
+ // Get all aliases with per-alias metadata (source + sourceType)
202
+ const aliasesWithMeta = provider.getAliasesWithMetadata();
203
+ // Returns: { [key: string]: { value: string; sourceType: 'file'|'server'|'builtIn'; source: string } }
204
+
205
+ // Get the ConceptMap id used for server aliases (if loaded)
206
+ // Downstream consumers can use this id when updating the alias ConceptMap
207
+ const aliasResourceId = provider.getAliasResourceId();
208
+ // Returns: string | undefined
209
+
185
210
  // Example:
186
211
  // {
187
212
  // "patientSystemUrl": "http://example.com/patients",
@@ -190,21 +215,35 @@ const aliases = provider.getAliases();
190
215
  // }
191
216
  ```
192
217
 
193
- ### Reload Aliases
218
+ ### File Aliases (`aliases.json`)
194
219
 
195
- ```typescript
196
- // Reload from server (updates cache)
197
- await provider.reloadAliases();
220
+ If `mappingsFolder` is configured, the provider will look for a special `aliases.json` file inside it.
221
+
222
+ Rules:
223
+ - If `mappingsFolder` is not set, file aliases are not supported.
224
+ - If `aliases.json` is missing, no file aliases are loaded.
225
+ - If `aliases.json` exists but is invalid, a warning is logged and the file is ignored.
226
+
227
+ Example `aliases.json`:
228
+
229
+ ```json
230
+ {
231
+ "patientSystemUrl": "http://example.com/patients",
232
+ "defaultLanguage": "en-US",
233
+ "apiVersion": "v1"
234
+ }
198
235
  ```
199
236
 
200
- ### Optimistic Updates
237
+ Validation:
238
+ - Must be a JSON object
239
+ - Keys must match `^[A-Za-z0-9_]+$` (no whitespace or operators like `-` or `.`)
240
+ - Values must be strings
201
241
 
202
- ```typescript
203
- // Register or update a single alias (no server roundtrip)
204
- provider.registerAlias('newKey', 'newValue');
242
+ ### Reload Aliases
205
243
 
206
- // Delete an alias from cache
207
- provider.deleteAlias('oldKey');
244
+ ```typescript
245
+ // Reload from configured sources (server and/or mappingsFolder)
246
+ await provider.reloadAliases();
208
247
  ```
209
248
 
210
249
  ### Transforming Alias Resources
@@ -265,7 +304,7 @@ When a file mapping has the same key as a server mapping:
265
304
 
266
305
  // After initialize():
267
306
  const mapping = provider.getUserMapping('my-mapping');
268
- // mapping.source === 'file'
307
+ // mapping.sourceType === 'file'
269
308
  // mapping.expression === 'InstanceOf: Patient'
270
309
  // Warning logged: "File mapping 'my-mapping' overrides server mapping"
271
310
  ```
@@ -285,7 +324,7 @@ const keys = provider.getUserMappingKeys();
285
324
  // ['mapping1', 'mapping2', 'mapping3']
286
325
 
287
326
  const mapping = provider.getUserMapping('mapping1');
288
- // { key: 'mapping1', expression: '...', source: 'file' }
327
+ // { key: 'mapping1', expression: '...', sourceType: 'file', source: '/abs/path/mapping1.fume' }
289
328
  ```
290
329
 
291
330
  ### Server-Only Setup
@@ -349,9 +388,11 @@ new FumeMappingProvider(config: FumeMappingProviderConfig)
349
388
  #### Methods
350
389
 
351
390
  **Initialization:**
352
- - `initialize(): Promise<void>` - Load user mappings into cache
391
+ - `initialize(): Promise<void>` - Load caches and start automatic change tracking
353
392
  - `reloadUserMappings(): Promise<void>` - Reload all user mappings
354
393
  - `refreshUserMapping(key: string): Promise<UserMapping | null>` - Refresh specific user mapping
394
+ - `startAutomaticChangeTracking(): void` - Start polling + forced resync
395
+ - `stopAutomaticChangeTracking(): void` - Stop polling + forced resync
355
396
 
356
397
  **User Mappings (Cached, Fast):**
357
398
  - `getUserMappings(): UserMapping[]` - Get all user mappings
@@ -366,9 +407,9 @@ new FumeMappingProvider(config: FumeMappingProviderConfig)
366
407
 
367
408
  **Aliases (Cached, Fast):**
368
409
  - `reloadAliases(): Promise<void>` - Reload all aliases from server
369
- - `registerAlias(name: string, value: string): void` - Register/update a single alias (optimistic cache update)
370
- - `deleteAlias(name: string): void` - Delete a specific alias from cache
371
410
  - `getAliases(): AliasObject` - Get all cached aliases as single object
411
+ - `getAliasesWithMetadata(): AliasObjectWithMetadata` - Get all cached aliases with metadata
412
+ - `getAliasResourceId(): string | undefined` - Get ConceptMap id for server aliases (if loaded)
372
413
 
373
414
  **Converters:**
374
415
  - `getCanonicalBaseUrl(): string` - Get canonical base URL used for generated resources
@@ -382,11 +423,15 @@ new FumeMappingProvider(config: FumeMappingProviderConfig)
382
423
  ```typescript
383
424
  interface FumeMappingProviderConfig {
384
425
  mappingsFolder?: string; // Path to .fume files
385
- fileExtension?: string; // Default: '.fume'
426
+ fileExtension?: string; // Default: '.fume' ('.json' is reserved for aliases.json)
386
427
  fhirClient?: any; // FHIR client instance
387
428
  packageExplorer?: any; // FPE instance
388
429
  logger?: Logger; // Optional logger
430
+ aliasConceptMapId?: string; // Optional ConceptMap id for aliases (skips search)
389
431
  canonicalBaseUrl?: string; // Default: 'http://example.com'
432
+ filePollingIntervalMs?: number; // Default: 5000 (set <= 0 to disable)
433
+ serverPollingIntervalMs?: number; // Default: 30000 (set <= 0 to disable)
434
+ forcedResyncIntervalMs?: number; // Default: 3600000 (set <= 0 to disable)
390
435
  }
391
436
  ```
392
437
 
@@ -1,4 +1,4 @@
1
- import { FumeMappingProviderConfig, UserMapping, UserMappingMetadata, PackageMapping, PackageMappingMetadata, GetPackageMappingOptions, AliasObject, ConceptMap, StructureMap } from './types';
1
+ import { FumeMappingProviderConfig, UserMapping, UserMappingMetadata, PackageMapping, PackageMappingMetadata, GetPackageMappingOptions, AliasObject, AliasObjectWithMetadata, ConceptMap, StructureMap } from './types';
2
2
  /**
3
3
  * Main orchestrator for FUME mappings from multiple sources
4
4
  * Separates user mappings (file + server) from package mappings
@@ -11,9 +11,28 @@ export declare class FumeMappingProvider {
11
11
  private aliasProvider?;
12
12
  private userMappingsCache;
13
13
  private serverAliases;
14
- private userRegisteredAliases;
14
+ private fileAliases;
15
+ private aliasResourceId?;
16
+ private aliasResourceMeta?;
17
+ private serverMappingsMeta;
18
+ private jsonMappingRawCache;
19
+ private filePollingState;
20
+ private filePollingTimer?;
21
+ private serverPollingTimer?;
22
+ private forcedResyncTimer?;
23
+ private filePollInProgress;
24
+ private serverPollInProgress;
25
+ private resyncInProgress;
26
+ private lastServerPollAt?;
27
+ private aliasesCacheWithMetadata;
15
28
  private static readonly DEFAULT_CANONICAL_BASE_URL;
29
+ private static readonly ALIASES_FILENAME;
30
+ private static readonly DEFAULT_FILE_POLLING_INTERVAL_MS;
31
+ private static readonly DEFAULT_SERVER_POLLING_INTERVAL_MS;
32
+ private static readonly DEFAULT_FORCED_RESYNC_INTERVAL_MS;
33
+ private static readonly ALIAS_KEY_REGEX;
16
34
  constructor(config: FumeMappingProviderConfig);
35
+ private validateConfig;
17
36
  /**
18
37
  * Initialize providers based on configuration
19
38
  */
@@ -29,10 +48,9 @@ export declare class FumeMappingProvider {
29
48
  /**
30
49
  * Refresh a specific user mapping by key
31
50
  * @param key - The mapping key to refresh
32
- * @param mapping - Optional mapping to use directly (avoids server roundtrip)
33
51
  * @returns The refreshed mapping or null if not found
34
52
  */
35
- refreshUserMapping(key: string, mapping?: UserMapping | null): Promise<UserMapping | null>;
53
+ refreshUserMapping(key: string): Promise<UserMapping | null>;
36
54
  /**
37
55
  * Get all user mappings (lightning-fast - from cache)
38
56
  */
@@ -67,21 +85,47 @@ export declare class FumeMappingProvider {
67
85
  */
68
86
  reloadAliases(): Promise<void>;
69
87
  /**
70
- * Register or update a single alias (optimistic cache update without server roundtrip)
71
- * @param name - The alias name/key
72
- * @param value - The alias value
88
+ * Start automatic change tracking (polling + forced resync).
73
89
  */
74
- registerAlias(name: string, value: string): void;
90
+ startAutomaticChangeTracking(): void;
75
91
  /**
76
- * Delete a specific alias from the cache
77
- * @param name - The alias name/key to delete
92
+ * Stop automatic change tracking.
78
93
  */
79
- deleteAlias(name: string): void;
94
+ stopAutomaticChangeTracking(): void;
95
+ private resolveInterval;
96
+ private refreshUserMappingsFromSources;
97
+ private refreshAliasesFromSources;
98
+ private rebuildAliasesCacheIfChanged;
99
+ private areAliasCachesEqual;
100
+ private isJsonFileMapping;
101
+ private mappingsEquivalent;
102
+ private applySingleMappingUpdate;
103
+ private applyMappingsIncrementally;
104
+ private readJsonRawForMappings;
105
+ private primeFilePollingState;
106
+ private pollFileMappings;
107
+ private pollServerResources;
108
+ private forcedResync;
109
+ /**
110
+ * Get the ConceptMap resource id used for server aliases (if loaded).
111
+ * Downstream consumers can use this id to update the alias ConceptMap.
112
+ */
113
+ getAliasResourceId(): string | undefined;
80
114
  /**
81
115
  * Get all cached aliases as a single object (lightning-fast - from cache)
82
116
  * @returns The alias object with all key-value mappings
83
117
  */
84
118
  getAliases(): AliasObject;
119
+ /**
120
+ * Get all cached aliases with per-alias metadata (lightning-fast - from cache)
121
+ */
122
+ getAliasesWithMetadata(): AliasObjectWithMetadata;
123
+ private getServerAliasSourceString;
124
+ private loadFileAliases;
125
+ private filterInvalidAliases;
126
+ private getFileAliasSourceString;
127
+ private rebuildAliasesCache;
128
+ private buildAliasesCache;
85
129
  /**
86
130
  * Get the canonical base URL used for generating FHIR resources.
87
131
  * Defaults to 'http://example.com' if not provided.
@@ -1 +1 @@
1
- {"version":3,"file":"FumeMappingProvider.d.ts","sourceRoot":"","sources":["../src/FumeMappingProvider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,yBAAyB,EAAE,WAAW,EAAE,mBAAmB,EAAE,cAAc,EAAE,sBAAsB,EAAE,wBAAwB,EAAE,WAAW,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAM/L;;;GAGG;AACH,qBAAa,mBAAmB;IAWlB,OAAO,CAAC,MAAM;IAV1B,OAAO,CAAC,MAAM,CAAC,CAAS;IACxB,OAAO,CAAC,YAAY,CAAC,CAAsB;IAC3C,OAAO,CAAC,eAAe,CAAC,CAAyB;IACjD,OAAO,CAAC,aAAa,CAAC,CAAgB;IACtC,OAAO,CAAC,iBAAiB,CAAuC;IAChE,OAAO,CAAC,aAAa,CAAmB;IACxC,OAAO,CAAC,qBAAqB,CAAmB;IAEhD,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,0BAA0B,CAAwB;gBAEtD,MAAM,EAAE,yBAAyB;IAKrD;;OAEG;IACH,OAAO,CAAC,mBAAmB;IA+B3B;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAgBjC;;OAEG;IACG,kBAAkB,IAAI,OAAO,CAAC,IAAI,CAAC;IAWzC;;;;;OAKG;IACG,kBAAkB,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,IAAI,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;IAiChG;;OAEG;IACH,eAAe,IAAI,WAAW,EAAE;IAIhC;;OAEG;IACH,kBAAkB,IAAI,MAAM,EAAE;IAI9B;;OAEG;IACH,uBAAuB,IAAI,mBAAmB,EAAE;IAWhD;;OAEG;IACH,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS;IAMpD;;;OAGG;IACG,kBAAkB,CAAC,OAAO,CAAC,EAAE,wBAAwB,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IAQvF;;OAEG;IACG,0BAA0B,CAAC,OAAO,CAAC,EAAE,wBAAwB,GAAG,OAAO,CAAC,sBAAsB,EAAE,CAAC;IAYvG;;OAEG;IACG,iBAAiB,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,wBAAwB,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC;IAW/G;;OAEG;IACG,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;IAWpC;;;;OAIG;IACH,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAKhD;;;OAGG;IACH,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAM/B;;;OAGG;IACH,UAAU,IAAI,WAAW;IAQzB;;;OAGG;IACH,mBAAmB,IAAI,MAAM;IAM7B;;;;OAIG;IACH,uBAAuB,CAAC,UAAU,EAAE,UAAU,GAAG,WAAW;IAI5D;;;;;OAKG;IACH,uBAAuB,CACrB,OAAO,EAAE,WAAW,EACpB,kBAAkB,CAAC,EAAE,UAAU,GAC9B,UAAU;IAIb;;;;OAIG;IACH,wBAAwB,CAAC,YAAY,EAAE,YAAY,GAAG,MAAM,GAAG,IAAI;IAInE;;;;;OAKG;IACH,wBAAwB,CACtB,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,GACjB,YAAY;CAGhB"}
1
+ {"version":3,"file":"FumeMappingProvider.d.ts","sourceRoot":"","sources":["../src/FumeMappingProvider.ts"],"names":[],"mappings":"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"}