@jpmorganchase/mosaic-core 0.1.0-beta.3 → 0.1.0-beta.31

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (97) hide show
  1. package/{src/PluginError.ts → dist/PluginError.d.ts} +1 -2
  2. package/dist/PluginError.js +3 -0
  3. package/dist/PluginError.js.map +1 -0
  4. package/dist/PullDocs.d.ts +19 -0
  5. package/dist/PullDocs.js +94 -0
  6. package/dist/PullDocs.js.map +1 -0
  7. package/dist/Source.d.ts +28 -0
  8. package/dist/Source.js +157 -0
  9. package/dist/Source.js.map +1 -0
  10. package/dist/SourceManager.d.ts +11 -0
  11. package/dist/SourceManager.js +137 -0
  12. package/dist/SourceManager.js.map +1 -0
  13. package/dist/WorkerSubscription.d.ts +16 -0
  14. package/dist/WorkerSubscription.js +69 -0
  15. package/dist/WorkerSubscription.js.map +1 -0
  16. package/dist/filesystems/FileAccess.d.ts +31 -0
  17. package/dist/filesystems/FileAccess.js +217 -0
  18. package/dist/filesystems/FileAccess.js.map +1 -0
  19. package/dist/filesystems/ImmutableVolume.d.ts +15 -0
  20. package/dist/filesystems/ImmutableVolume.js +26 -0
  21. package/dist/filesystems/ImmutableVolume.js.map +1 -0
  22. package/dist/filesystems/MutableVolume.d.ts +26 -0
  23. package/dist/filesystems/MutableVolume.js +43 -0
  24. package/dist/filesystems/MutableVolume.js.map +1 -0
  25. package/dist/filesystems/RestrictedVolume.d.ts +24 -0
  26. package/dist/filesystems/RestrictedVolume.js +38 -0
  27. package/dist/filesystems/RestrictedVolume.js.map +1 -0
  28. package/dist/filesystems/UnionFileAccess.d.ts +23 -0
  29. package/dist/filesystems/UnionFileAccess.js +55 -0
  30. package/dist/filesystems/UnionFileAccess.js.map +1 -0
  31. package/dist/filesystems/UnionVolume.d.ts +8 -0
  32. package/dist/filesystems/UnionVolume.js +21 -0
  33. package/dist/filesystems/UnionVolume.js.map +1 -0
  34. package/dist/helpers/createConfig.d.ts +2 -0
  35. package/dist/helpers/createConfig.js +54 -0
  36. package/dist/helpers/createConfig.js.map +1 -0
  37. package/dist/helpers/parsePluginModuleDefinitions.d.ts +13 -0
  38. package/dist/helpers/parsePluginModuleDefinitions.js +24 -0
  39. package/dist/helpers/parsePluginModuleDefinitions.js.map +1 -0
  40. package/dist/index.d.ts +2 -0
  41. package/dist/index.js +3 -0
  42. package/dist/index.js.map +1 -0
  43. package/dist/operators/ObservableWorker.d.ts +3 -0
  44. package/dist/operators/ObservableWorker.js +25 -0
  45. package/dist/operators/ObservableWorker.js.map +1 -0
  46. package/dist/plugin/createPluginAPI.d.ts +2 -0
  47. package/dist/plugin/createPluginAPI.js +76 -0
  48. package/dist/plugin/createPluginAPI.js.map +1 -0
  49. package/dist/plugin/index.d.ts +3 -0
  50. package/dist/plugin/index.js +82 -0
  51. package/dist/plugin/index.js.map +1 -0
  52. package/dist/plugin/loadDefinitionModules.d.ts +2 -0
  53. package/dist/plugin/loadDefinitionModules.js +45 -0
  54. package/dist/plugin/loadDefinitionModules.js.map +1 -0
  55. package/dist/plugin/pluginRunner.d.ts +5 -0
  56. package/dist/plugin/pluginRunner.js +43 -0
  57. package/dist/plugin/pluginRunner.js.map +1 -0
  58. package/dist/plugin/serialiserRunner.d.ts +5 -0
  59. package/dist/plugin/serialiserRunner.js +35 -0
  60. package/dist/plugin/serialiserRunner.js.map +1 -0
  61. package/dist/worker/Source.worker.d.ts +1 -0
  62. package/dist/worker/Source.worker.js +103 -0
  63. package/dist/worker/Source.worker.js.map +1 -0
  64. package/dist/worker/helpers/createSourceObservable.d.ts +3 -0
  65. package/dist/worker/helpers/createSourceObservable.js +49 -0
  66. package/dist/worker/helpers/createSourceObservable.js.map +1 -0
  67. package/package.json +24 -8
  68. package/.turbo/turbo-build.log +0 -2
  69. package/.turbo/turbo-clean.log +0 -2
  70. package/CHANGELOG.md +0 -34
  71. package/src/PullDocs.ts +0 -124
  72. package/src/Source.ts +0 -178
  73. package/src/SourceManager.ts +0 -196
  74. package/src/WorkerSubscription.ts +0 -80
  75. package/src/__mocks__/Source.ts +0 -29
  76. package/src/__tests__/PullDocs.test.ts +0 -96
  77. package/src/__tests__/Source.test.ts +0 -341
  78. package/src/__tests__/SourceManager.test.ts +0 -255
  79. package/src/__tests__/WorkerSubscription.test.ts +0 -308
  80. package/src/filesystems/FileAccess.ts +0 -256
  81. package/src/filesystems/ImmutableVolume.ts +0 -45
  82. package/src/filesystems/MutableVolume.ts +0 -51
  83. package/src/filesystems/RestrictedVolume.ts +0 -57
  84. package/src/filesystems/UnionFileAccess.ts +0 -77
  85. package/src/filesystems/UnionVolume.ts +0 -28
  86. package/src/helpers/createConfig.ts +0 -52
  87. package/src/index.ts +0 -1
  88. package/src/operators/ObservableWorker.ts +0 -24
  89. package/src/plugin/createPluginAPI.ts +0 -75
  90. package/src/plugin/index.ts +0 -41
  91. package/src/plugin/loadDefinitionModules.ts +0 -58
  92. package/src/plugin/pluginRunner.ts +0 -52
  93. package/src/plugin/serialiserRunner.ts +0 -36
  94. package/src/worker/Source.worker.ts +0 -124
  95. package/src/worker/helpers/createSourceObservable.ts +0 -84
  96. package/tsconfig.example.json +0 -6
  97. package/tsconfig.json +0 -22
@@ -1,3 +1,2 @@
1
1
  export default class PluginError extends Error {
2
-
3
- }
2
+ }
@@ -0,0 +1,3 @@
1
+ export default class PluginError extends Error {
2
+ }
3
+ //# sourceMappingURL=PluginError.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PluginError.js","sourceRoot":"","sources":["../src/PluginError.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,OAAO,OAAO,WAAY,SAAQ,KAAK;CAAG"}
@@ -0,0 +1,19 @@
1
+ import { MosaicConfig } from '@jpmorganchase/mosaic-types';
2
+ import UnionVolume from './filesystems/UnionVolume.js';
3
+ export default class PullDocs {
4
+ #private;
5
+ /**
6
+ *
7
+ * @param config.sources Sources are observables that emit pages
8
+ * @param config.plugins Plugins are modules with lifecycles methods for manipulating files and/or the virtual filesystem
9
+ * @param config.serialisers Serialisers are a form of plugin that tell PullDocs how to turn a file from/to a storable form for the filesystem - or back into a `Page` object
10
+ * @param config.ignorePages Page names to exclude from lazy loading / `$ref`s / `$tag`s / serialisers and also any plugins that expect pages as input. Example input would be "ignore-me.xml"
11
+ * @param config.pageExtensions Exts of files to treat as pages. Pages contain metadata and content, in any file format (as long as a serialiser exists to encode/decode them). They can be referenced via `$ref`s / `$tag`s and also support lazy loading
12
+ */
13
+ constructor(config: MosaicConfig);
14
+ get filesystem(): UnionVolume;
15
+ onSourceUpdate(callback: any): () => boolean;
16
+ start(): Promise<import("./Source.js").default[]>;
17
+ stop(): Promise<void>;
18
+ triggerWorkflow(name: string, filePath: string, data: any): Promise<unknown>;
19
+ }
@@ -0,0 +1,94 @@
1
+ import { createRequire } from 'node:module';
2
+ import { Union } from 'unionfs';
3
+ import { Volume } from 'memfs';
4
+ import { mosaicConfigSchema, validateMosaicSchema } from '@jpmorganchase/mosaic-schemas';
5
+ // TODO:
6
+ // Remove $ref /index resolution
7
+ import FileAccess from './filesystems/FileAccess.js';
8
+ import MutableVolume from './filesystems/MutableVolume.js';
9
+ import UnionFileAccess from './filesystems/UnionFileAccess.js';
10
+ import UnionVolume from './filesystems/UnionVolume.js';
11
+ import SourceManager from './SourceManager.js';
12
+ import parsePluginModuleDefinitions from './helpers/parsePluginModuleDefinitions.js';
13
+ const require = createRequire(import.meta.url);
14
+ export default class PullDocs {
15
+ #sourceDefinitions;
16
+ #sourceManager;
17
+ #ufs = new Union();
18
+ #vfs;
19
+ /**
20
+ *
21
+ * @param config.sources Sources are observables that emit pages
22
+ * @param config.plugins Plugins are modules with lifecycles methods for manipulating files and/or the virtual filesystem
23
+ * @param config.serialisers Serialisers are a form of plugin that tell PullDocs how to turn a file from/to a storable form for the filesystem - or back into a `Page` object
24
+ * @param config.ignorePages Page names to exclude from lazy loading / `$ref`s / `$tag`s / serialisers and also any plugins that expect pages as input. Example input would be "ignore-me.xml"
25
+ * @param config.pageExtensions Exts of files to treat as pages. Pages contain metadata and content, in any file format (as long as a serialiser exists to encode/decode them). They can be referenced via `$ref`s / `$tag`s and also support lazy loading
26
+ */
27
+ constructor(config) {
28
+ validateMosaicSchema(mosaicConfigSchema, config, true);
29
+ const sharedFilesystem = new MutableVolume(new FileAccess(new Volume()), '*');
30
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
31
+ this.#ufs.use(sharedFilesystem);
32
+ const { ignorePages = [], sources = [], plugins = [], serialisers = [], pageExtensions = ['.mdx'] } = config;
33
+ this.#sourceDefinitions = sources.filter((source) => !source.disabled);
34
+ this.#vfs = new UnionVolume(new UnionFileAccess(this.#ufs), '*');
35
+ this.#sourceManager = new SourceManager(this.#vfs, sharedFilesystem,
36
+ // Refs and aliases should be applied after all other plugins, so we add them manually with a negative priority
37
+ parsePluginModuleDefinitions(plugins)
38
+ .filter((plugin) => !plugin.disabled)
39
+ .concat({
40
+ modulePath: require.resolve('@jpmorganchase/mosaic-plugins/$TagPlugin'),
41
+ options: {}
42
+ }, {
43
+ modulePath: require.resolve('@jpmorganchase/mosaic-plugins/$CodeModPlugin'),
44
+ options: {},
45
+ // Make sure this happens as the very first plugin, so it can fix any page issues
46
+ priority: Number.POSITIVE_INFINITY
47
+ }, {
48
+ modulePath: require.resolve('@jpmorganchase/mosaic-plugins/$AliasPlugin'),
49
+ options: {},
50
+ priority: -1
51
+ }, {
52
+ modulePath: require.resolve('@jpmorganchase/mosaic-plugins/$RefPlugin'),
53
+ options: {},
54
+ priority: -1
55
+ })
56
+ .sort(({ priority: priorityA = 0 }, { priority: priorityB = 0 }) => priorityB - priorityA),
57
+ // Auto add JSON serialiser
58
+ serialisers.concat({
59
+ modulePath: require.resolve('@jpmorganchase/mosaic-serialisers/json'),
60
+ filter: /\.json$/
61
+ }), pageExtensions, ignorePages);
62
+ }
63
+ get filesystem() {
64
+ return this.#vfs;
65
+ }
66
+ onSourceUpdate(callback) {
67
+ return this.#sourceManager.onSourceUpdate(callback);
68
+ }
69
+ async start() {
70
+ return Promise.all(this.#sourceDefinitions.map(source => this.#addSource(source)));
71
+ }
72
+ async stop() {
73
+ return this.#sourceManager.destroyAll();
74
+ }
75
+ async triggerWorkflow(name, filePath, data) {
76
+ return this.#sourceManager.triggerWorkflow(name, filePath, data);
77
+ }
78
+ async #addSource(sourceDefinition) {
79
+ const source = await this.#sourceManager.addSource(sourceDefinition, {});
80
+ source.onError(error => {
81
+ console.error(new Error(`Source '${source.id.description}' threw an exception. See below:`));
82
+ console.error(error);
83
+ });
84
+ source.onExit(() => {
85
+ this.#ufs.fss.splice(this.#ufs.fss.indexOf(source.filesystem), 1);
86
+ if (this.#ufs.fss.length < 1) {
87
+ console.debug("[Mosaic] All of my source have been terminated. That's sad :-(");
88
+ }
89
+ });
90
+ this.#ufs.use(source.filesystem);
91
+ return source;
92
+ }
93
+ }
94
+ //# sourceMappingURL=PullDocs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PullDocs.js","sourceRoot":"","sources":["../src/PullDocs.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ /// <reference types="node" resolution-mode="require"/>
2
+ import EventEmitter from 'events';
3
+ import type { IUnionVolume, IVolumeImmutable, MutableData, PluginModuleDefinition, Serialiser, SerialiserModuleDefinition, SourceModuleDefinition, SourceWorkflow } from '@jpmorganchase/mosaic-types';
4
+ import MutableVolume from './filesystems/MutableVolume.js';
5
+ export default class Source {
6
+ #private;
7
+ config: MutableData<Record<string, unknown>>;
8
+ serialiser: Serialiser;
9
+ namespace: string;
10
+ id: symbol;
11
+ filesystem: MutableVolume;
12
+ constructor({ modulePath, namespace }: SourceModuleDefinition, mergedOptions: Record<string, unknown>, pageExtensions: string[], ignorePages: string[], globalFilesystem: IUnionVolume, workflows: SourceWorkflow[]);
13
+ onUpdate(callback: any): () => EventEmitter;
14
+ onError(callback: any): () => EventEmitter;
15
+ onStart(callback: any): () => EventEmitter;
16
+ onExit(callback: any): () => EventEmitter;
17
+ stop(): void;
18
+ /**
19
+ * Called when another source (not this one) has changed.
20
+ * This source can then ask its plugins if they also want to clear their cache in response to the other source's change.
21
+ */
22
+ requestCacheClear(updatedSourceFilesystem: IVolumeImmutable): Promise<void>;
23
+ use(plugins?: PluginModuleDefinition[], serialisers?: SerialiserModuleDefinition[]): Promise<void>;
24
+ invokeAfterUpdate(sharedFilesystem: any, globalConfig: any): Promise<void>;
25
+ start(): Promise<void>;
26
+ isOwner(filePath: string): Promise<any>;
27
+ triggerWorkflow(name: string, filePath: string, data: unknown): Promise<any>;
28
+ }
package/dist/Source.js ADDED
@@ -0,0 +1,157 @@
1
+ import EventEmitter from 'events';
2
+ import md5 from 'md5';
3
+ import { Volume } from 'memfs';
4
+ import path from 'path';
5
+ import util from 'util';
6
+ import FileAccess from './filesystems/FileAccess.js';
7
+ import MutableVolume from './filesystems/MutableVolume.js';
8
+ import createConfig from './helpers/createConfig.js';
9
+ import { bindPluginMethods, bindSerialiser } from './plugin/index.js';
10
+ import WorkerSubscription, { EVENT } from './WorkerSubscription.js';
11
+ export default class Source {
12
+ #emitter = new EventEmitter();
13
+ #modulePath;
14
+ #plugins = [];
15
+ #serialisers = [];
16
+ #worker;
17
+ #globalFilesystem;
18
+ #pluginApi;
19
+ #mergedOptions;
20
+ #pageExtensions;
21
+ #ignorePages;
22
+ #workflows = [];
23
+ config;
24
+ serialiser;
25
+ namespace;
26
+ id;
27
+ filesystem;
28
+ constructor({ modulePath, namespace }, mergedOptions, pageExtensions, ignorePages, globalFilesystem, workflows) {
29
+ this.#modulePath = modulePath;
30
+ this.#mergedOptions = mergedOptions;
31
+ this.#globalFilesystem = globalFilesystem;
32
+ this.#ignorePages = ignorePages;
33
+ this.#workflows = workflows;
34
+ this.namespace = namespace;
35
+ this.id = Symbol(`${path.basename(path.dirname(path.resolve(modulePath, '../')))}#${md5(util.inspect(this.#mergedOptions, { sorted: true })).substring(0, 8)}`);
36
+ this.filesystem = new MutableVolume(new FileAccess(new Volume()), this.namespace);
37
+ this.#pageExtensions = pageExtensions;
38
+ }
39
+ onUpdate(callback) {
40
+ this.#emitter.on(EVENT.UPDATE, callback);
41
+ return () => this.#emitter.off(EVENT.UPDATE, callback);
42
+ }
43
+ onError(callback) {
44
+ this.#emitter.once(EVENT.ERROR, callback);
45
+ return () => this.#emitter.off(EVENT.ERROR, callback);
46
+ }
47
+ onStart(callback) {
48
+ this.#emitter.once(EVENT.START, callback);
49
+ return () => this.#emitter.off(EVENT.START, callback);
50
+ }
51
+ onExit(callback) {
52
+ this.#emitter.once(EVENT.EXIT, callback);
53
+ return () => this.#emitter.off(EVENT.EXIT, callback);
54
+ }
55
+ stop() {
56
+ if (this.#worker && this.#worker.closed) {
57
+ throw new Error('Cannot stop source that has not started');
58
+ }
59
+ if (this.#worker) {
60
+ this.#worker.stop();
61
+ }
62
+ }
63
+ /**
64
+ * Called when another source (not this one) has changed.
65
+ * This source can then ask its plugins if they also want to clear their cache in response to the other source's change.
66
+ */
67
+ async requestCacheClear(updatedSourceFilesystem) {
68
+ const initTime = new Date().getTime();
69
+ const shouldInvokeAfterUpdate = await this.#pluginApi.shouldClearCache(updatedSourceFilesystem, {
70
+ globalFilesystem: this.#globalFilesystem,
71
+ pageExtensions: this.#pageExtensions,
72
+ ignorePages: this.#ignorePages,
73
+ serialiser: this.serialiser,
74
+ config: this.config.asReadOnly()
75
+ });
76
+ const timeTaken = new Date().getTime() - initTime;
77
+ if (timeTaken > 400) {
78
+ console.warn(`Lifecycle phase 'shouldClearCache' for source '${this.id.description}' took ${timeTaken}ms to complete. The method is async, so this may not be an accurate measurement of execution time, but consider optimising this method if it is performing intensive operations.`);
79
+ }
80
+ if (shouldInvokeAfterUpdate === true) {
81
+ this.filesystem.clearCache();
82
+ }
83
+ }
84
+ async use(plugins = [], serialisers = []) {
85
+ this.#plugins.push(...plugins);
86
+ this.#serialisers.push(...serialisers);
87
+ }
88
+ async invokeAfterUpdate(sharedFilesystem, globalConfig) {
89
+ const initTime = new Date().getTime();
90
+ await this.#pluginApi.afterUpdate(this.filesystem.asRestricted(), {
91
+ globalFilesystem: this.#globalFilesystem,
92
+ sharedFilesystem,
93
+ globalConfig,
94
+ pageExtensions: this.#pageExtensions,
95
+ ignorePages: this.#ignorePages,
96
+ serialiser: this.serialiser,
97
+ config: this.config.asReadOnly()
98
+ });
99
+ const timeTaken = new Date().getTime() - initTime;
100
+ if (timeTaken > 800) {
101
+ console.warn(`Lifecycle phase 'afterUpdate' for source '${this.id.description}' took ${timeTaken / 1000}s to complete. The method is async, so this may not be an accurate measurement of execution time, but consider optimising this method if it is performing intensive operations.`);
102
+ }
103
+ }
104
+ #createWorker() {
105
+ const worker = new WorkerSubscription({
106
+ modulePath: this.#modulePath,
107
+ name: this.id.description,
108
+ options: this.#mergedOptions,
109
+ namespace: this.namespace,
110
+ pageExtensions: this.#pageExtensions,
111
+ ignorePages: this.#ignorePages,
112
+ plugins: this.#plugins,
113
+ serialisers: this.#serialisers
114
+ });
115
+ worker.once(EVENT.ERROR, error => this.#emitter.emit(EVENT.ERROR, error));
116
+ worker.once(EVENT.EXIT, () => {
117
+ this.#emitter.emit(EVENT.EXIT);
118
+ this.#emitter.removeAllListeners();
119
+ // this.filesystem.reset();
120
+ this.filesystem = null;
121
+ });
122
+ worker.once(EVENT.START, () => this.#emitter.emit(EVENT.START));
123
+ return worker;
124
+ }
125
+ async start() {
126
+ this.serialiser = await bindSerialiser(this.#serialisers);
127
+ this.#pluginApi = await bindPluginMethods(this.#plugins);
128
+ this.#worker = this.#createWorker();
129
+ this.#worker.on(EVENT.UPDATE, async ({ data: { pages, symlinks, data } }) => {
130
+ this.config = createConfig(data);
131
+ this.#emitter.emit(EVENT.UPDATE, { pages, symlinks, data });
132
+ });
133
+ }
134
+ async isOwner(filePath) {
135
+ const isFileInSource = await this.filesystem.promises.exists(filePath);
136
+ return isFileInSource;
137
+ }
138
+ async triggerWorkflow(name, filePath, data) {
139
+ const foundWorkflows = this.#workflows?.filter(workflow => workflow.name === name);
140
+ if (foundWorkflows.length === 0) {
141
+ return {
142
+ error: `[Mosaic] Workflow ${name} not found for ${this.id.description.toString()}`
143
+ };
144
+ }
145
+ if (foundWorkflows.length > 1) {
146
+ return {
147
+ error: `[Mosaic] Multiple workflows with ${name} found for ${this.id.description.toString()}`
148
+ };
149
+ }
150
+ const triggeredWorkflow = foundWorkflows[0];
151
+ if (triggeredWorkflow) {
152
+ return triggeredWorkflow.action(this.#mergedOptions, triggeredWorkflow.options, filePath, data);
153
+ }
154
+ return false;
155
+ }
156
+ }
157
+ //# sourceMappingURL=Source.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Source.js","sourceRoot":"","sources":["../src/Source.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import type { SourceModuleDefinition } from '@jpmorganchase/mosaic-types';
2
+ import Source from './Source.js';
3
+ export default class SourceManager {
4
+ #private;
5
+ constructor(globalFilesystem: any, sharedFilesystem: any, plugins?: any[], serialisers?: any[], pageExtensions?: any[], ignorePages?: any[]);
6
+ onSourceUpdate(callback: any): () => boolean;
7
+ triggerWorkflow(name: string, filePath: string, data: unknown): Promise<unknown>;
8
+ getSource(id: symbol): Source;
9
+ destroyAll(): void;
10
+ addSource(sourceDefinition: SourceModuleDefinition, options: Record<string, unknown>): Promise<Source>;
11
+ }
@@ -0,0 +1,137 @@
1
+ import { merge } from 'lodash-es';
2
+ import Source from './Source.js';
3
+ import createConfig from './helpers/createConfig.js';
4
+ function logUpdateStatus(sourceId, initOrStartTime) {
5
+ if (initOrStartTime) {
6
+ console.debug(`[Mosaic] Source '${sourceId.description}' received first docs snapshot ${(new Date().getTime() - initOrStartTime) / 1000}s after starting.`);
7
+ }
8
+ else {
9
+ console.debug(`[Mosaic] Source '${sourceId.description}' received updated docs`);
10
+ }
11
+ }
12
+ export default class SourceManager {
13
+ #sources = new Map();
14
+ #plugins;
15
+ #serialisers;
16
+ #handlers = new Set();
17
+ #globalFilesystem;
18
+ #sharedFilesystem;
19
+ #pageExtensions;
20
+ #ignorePages;
21
+ #globalConfig = createConfig();
22
+ constructor(globalFilesystem, sharedFilesystem, plugins = [], serialisers = [], pageExtensions = [], ignorePages = []) {
23
+ this.#plugins = plugins;
24
+ this.#pageExtensions = pageExtensions;
25
+ this.#ignorePages = ignorePages;
26
+ this.#serialisers = serialisers;
27
+ this.#globalFilesystem = globalFilesystem;
28
+ this.#sharedFilesystem = sharedFilesystem;
29
+ }
30
+ onSourceUpdate(callback) {
31
+ const handler = (filesystem, source) => callback(filesystem, source);
32
+ this.#handlers.add(handler);
33
+ return () => this.#handlers.delete(handler);
34
+ }
35
+ async triggerWorkflow(name, filePath, data) {
36
+ for (const source of this.#sources.values()) {
37
+ // eslint-disable-next-line no-await-in-loop
38
+ if (await source.isOwner(filePath)) {
39
+ const result = await source.triggerWorkflow(name, filePath, data);
40
+ return result;
41
+ }
42
+ }
43
+ return 'Workflow not found';
44
+ }
45
+ getSource(id) {
46
+ return this.#sources.get(id);
47
+ }
48
+ destroyAll() {
49
+ this.#sources.forEach(source => source.stop());
50
+ }
51
+ addSource(sourceDefinition, options) {
52
+ // eslint-disable-next-line no-async-promise-executor
53
+ return new Promise(async (resolve, reject) => {
54
+ let sourceActive = false;
55
+ const source = new Source(sourceDefinition, {
56
+ ...sourceDefinition.options,
57
+ ...options
58
+ }, this.#pageExtensions, this.#ignorePages, this.#globalFilesystem, sourceDefinition.workflows);
59
+ const immutableSourceFilesystem = source.filesystem.asReadOnly();
60
+ let initOrStartTime = new Date().getTime();
61
+ this.#sources.set(source.id, source);
62
+ source.use(this.#plugins, this.#serialisers);
63
+ await source.start();
64
+ source.onUpdate(async ({ pages, symlinks }) => {
65
+ if (!sourceActive) {
66
+ reject(new Error(`Source '${source.id.description}' received a message before it was initialised.`));
67
+ }
68
+ else {
69
+ logUpdateStatus(source.id, initOrStartTime);
70
+ initOrStartTime = null;
71
+ //
72
+ try {
73
+ this.#globalConfig.setData(Array.from(this.#sources.values()).reduce((mergedConfig, { config }) => merge(mergedConfig, config?.data || {}), {}), true);
74
+ source.filesystem.reset();
75
+ source.filesystem.fromJSON(pages);
76
+ // We need to re-apply symlinks in the main thread
77
+ await source.filesystem.symlinksFromJSON(symlinks);
78
+ // After each async operation, we should check if anything has caused the Source to close
79
+ if (!sourceActive) {
80
+ return;
81
+ }
82
+ await source.invokeAfterUpdate(this.#sharedFilesystem, this.#globalConfig);
83
+ // After each async operation, we should check if anything has caused the Source to close
84
+ if (!sourceActive) {
85
+ return;
86
+ }
87
+ source.filesystem.freeze();
88
+ source.filesystem.clearCache();
89
+ await this.#updateSources(immutableSourceFilesystem, source);
90
+ this.#invokeUpdateCallbacks(immutableSourceFilesystem, source);
91
+ }
92
+ catch (e) {
93
+ console.warn(`[Mosaic] Exceptions during source update are currently set to terminate the parent source. Terminating '${String(source.id.description)}'. See error:`);
94
+ console.error(e);
95
+ source.stop();
96
+ }
97
+ //
98
+ }
99
+ });
100
+ source.onError(error => {
101
+ console.error(error);
102
+ if (!sourceActive) {
103
+ reject(error);
104
+ }
105
+ });
106
+ source.onExit(() => {
107
+ if (!sourceActive) {
108
+ reject(new Error(`Source '${source.id.description}' silently exited before initialising.`));
109
+ }
110
+ console.debug(`[Mosaic] Source '${source.id.description}' closed`);
111
+ this.#sources.delete(source.id);
112
+ sourceActive = false;
113
+ });
114
+ source.onStart(() => {
115
+ sourceActive = true;
116
+ console.debug(`[Mosaic] Source '${source.id.description}' started in ${new Date().getTime() - initOrStartTime}ms - awaiting first docs snapshot`);
117
+ initOrStartTime = new Date().getTime();
118
+ resolve(source);
119
+ });
120
+ });
121
+ }
122
+ #invokeUpdateCallbacks(filesystem, source) {
123
+ this.#handlers.forEach(callback => callback(filesystem, source));
124
+ }
125
+ #updateSources(immutableSourceFilesystem, source) {
126
+ // Notify other frozen sources that something has changed. If a source's filesystem hasn't been frozen yet - there's no point
127
+ // in notifying it of another source changing, as it hasn't initialised or called `afterUpdate` for the first time yet anyway.
128
+ // No need to do them sequentially - we can fire them all off at once and wait for them all to finish in their own time
129
+ return Promise.all(Array.from(this.#sources.values()).map(existingSource => {
130
+ if (existingSource !== source && existingSource.filesystem.frozen) {
131
+ return existingSource.requestCacheClear(immutableSourceFilesystem);
132
+ }
133
+ return existingSource;
134
+ }));
135
+ }
136
+ }
137
+ //# sourceMappingURL=SourceManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SourceManager.js","sourceRoot":"","sources":["../src/SourceManager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ /// <reference types="node" resolution-mode="require"/>
2
+ import EventEmitter from 'events';
3
+ export declare enum EVENT {
4
+ ERROR = "ERROR",
5
+ EXIT = "EXIT",
6
+ START = "START",
7
+ UPDATE = "UPDATE"
8
+ }
9
+ export default class WorkerSubscription {
10
+ #private;
11
+ constructor(workerData: any);
12
+ get closed(): boolean;
13
+ stop(): void;
14
+ once(type: EVENT, handler: any): () => EventEmitter;
15
+ on(type: EVENT, handler: any): () => EventEmitter;
16
+ }
@@ -0,0 +1,69 @@
1
+ import EventEmitter from 'events';
2
+ import from from './operators/ObservableWorker.js';
3
+ export var EVENT;
4
+ (function (EVENT) {
5
+ EVENT["ERROR"] = "ERROR";
6
+ EVENT["EXIT"] = "EXIT";
7
+ EVENT["START"] = "START";
8
+ EVENT["UPDATE"] = "UPDATE";
9
+ })(EVENT || (EVENT = {}));
10
+ const textDecoder = new TextDecoder('utf8');
11
+ export default class WorkerSubscription {
12
+ #worker$;
13
+ #emitter = new EventEmitter();
14
+ constructor(workerData) {
15
+ this.#worker$ = from(workerData).subscribe({
16
+ next: this.#onNext,
17
+ error: this.#onError,
18
+ complete: this.#onComplete
19
+ });
20
+ }
21
+ get closed() {
22
+ return this.#worker$?.closed;
23
+ }
24
+ stop() {
25
+ if (this.closed) {
26
+ throw new Error('Cannot stop source - subscription is already closed');
27
+ }
28
+ this.#worker$.unsubscribe();
29
+ this.#onComplete();
30
+ }
31
+ once(type, handler) {
32
+ const autoUnsubscribeHandler = (...args) => {
33
+ this.#emitter.off(type, autoUnsubscribeHandler);
34
+ handler(...args);
35
+ };
36
+ this.on(type, autoUnsubscribeHandler);
37
+ return () => this.#emitter.off(type, autoUnsubscribeHandler);
38
+ }
39
+ on(type, handler) {
40
+ this.#emitter.on(type, handler);
41
+ return () => this.#emitter.off(type, handler);
42
+ }
43
+ #onNext = ({ type, data }) => {
44
+ if (type === 'message') {
45
+ this.#emitter.emit(EVENT.UPDATE, { data: JSON.parse(textDecoder.decode(data)) });
46
+ }
47
+ else if (type === 'init') {
48
+ this.#emitter.emit(EVENT.START);
49
+ if (data) {
50
+ // We receive a file buffer for 'init', not an object
51
+ this.#emitter.emit(EVENT.UPDATE, { data: JSON.parse(textDecoder.decode(data)) });
52
+ }
53
+ }
54
+ else {
55
+ this.#onError(new Error(`Unsupported type '${type}' with value of '${data}' received from source worker.`));
56
+ this.#worker$.unsubscribe();
57
+ this.#worker$ = null;
58
+ }
59
+ };
60
+ #onError = e => {
61
+ this.#emitter.emit(EVENT.ERROR, e);
62
+ this.#onComplete();
63
+ };
64
+ #onComplete = () => {
65
+ this.#emitter.emit(EVENT.EXIT);
66
+ this.#emitter.removeAllListeners();
67
+ };
68
+ }
69
+ //# sourceMappingURL=WorkerSubscription.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WorkerSubscription.js","sourceRoot":"","sources":["../src/WorkerSubscription.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ import { DirectoryJSON, IRealpathOptions, _Volume, TDataOut } from 'memfs';
2
+ import type { IFileAccess } from '@jpmorganchase/mosaic-types';
3
+ export default class FileAccess implements IFileAccess {
4
+ #private;
5
+ constructor(filesystemAdapter: _Volume);
6
+ readFile(file: any): Promise<any>;
7
+ glob(pattern: any, options: any): Promise<any[]>;
8
+ $$addReadFileHook(hook: any): void;
9
+ readdir(dir: any, options: any): Promise<TDataOut[] | import("memfs").Dirent[]>;
10
+ stat(file: any, options: any): Promise<import("memfs").Stats<import("memfs").TStatNumber>>;
11
+ get $$frozen(): boolean;
12
+ realpath(target: any, options?: string | IRealpathOptions): Promise<TDataOut>;
13
+ $$symlinksFromJSON(symlinks: any): Promise<void>;
14
+ unlink(target: any): Promise<void>;
15
+ symlink(target: any, alias: any, type: any): Promise<void>;
16
+ writeFile(file: any, data: any): Promise<void>;
17
+ mkdir(dir: any, options: any): Promise<void>;
18
+ exists(file: any): Promise<boolean>;
19
+ toJSON(): DirectoryJSON;
20
+ symlinksToJSON(): {
21
+ [key: string]: {
22
+ target: string;
23
+ type: string;
24
+ }[];
25
+ };
26
+ $$freeze(): void;
27
+ $$unfreeze(): void;
28
+ $$clearCache(): void;
29
+ $$reset(): Promise<void>;
30
+ fromJSON(json: DirectoryJSON): void;
31
+ }