@med1802/repository-manager 3.1.2 → 3.2.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.
Files changed (63) hide show
  1. package/README.md +138 -197
  2. package/dist/core/createSignalBroadcaster.d.ts +8 -0
  3. package/dist/core/createSignalBroadcaster.d.ts.map +1 -0
  4. package/dist/core/{messenger.js → createSignalBroadcaster.js} +5 -9
  5. package/dist/core/index.d.ts +8 -1
  6. package/dist/core/index.d.ts.map +1 -1
  7. package/dist/core/index.js +58 -1
  8. package/dist/infrastructure/logger.d.ts +1 -1
  9. package/dist/infrastructure/logger.d.ts.map +1 -1
  10. package/dist/manager.d.ts +1 -1
  11. package/dist/manager.d.ts.map +1 -1
  12. package/dist/manager.js +8 -5
  13. package/dist/types/observer.types.d.ts +5 -5
  14. package/dist/types/observer.types.d.ts.map +1 -1
  15. package/dist/types/repository.types.d.ts +3 -2
  16. package/dist/types/repository.types.d.ts.map +1 -1
  17. package/dist/types/workspace.types.d.ts +3 -1
  18. package/dist/types/workspace.types.d.ts.map +1 -1
  19. package/dist/workspace/{mount.d.ts → createWorkspace.d.ts} +10 -12
  20. package/dist/workspace/createWorkspace.d.ts.map +1 -0
  21. package/dist/workspace/createWorkspace.js +19 -0
  22. package/dist/workspace/{client.d.ts → createWorkspaceClient.d.ts} +1 -1
  23. package/dist/workspace/createWorkspaceClient.d.ts.map +1 -0
  24. package/dist/workspace/{client.js → createWorkspaceClient.js} +1 -1
  25. package/dist/workspace/index.d.ts +3 -3
  26. package/dist/workspace/index.d.ts.map +1 -1
  27. package/dist/workspace/index.js +3 -3
  28. package/dist/workspace/{context.d.ts → providers/client.d.ts} +4 -4
  29. package/dist/workspace/providers/client.d.ts.map +1 -0
  30. package/dist/workspace/{context.js → providers/client.js} +1 -1
  31. package/dist/workspace/providers/index.d.ts +3 -0
  32. package/dist/workspace/providers/index.d.ts.map +1 -0
  33. package/dist/workspace/providers/index.js +2 -0
  34. package/dist/workspace/providers/setup.d.ts +19 -0
  35. package/dist/workspace/providers/setup.d.ts.map +1 -0
  36. package/dist/workspace/providers/setup.js +42 -0
  37. package/package.json +1 -1
  38. package/src/core/{messenger.ts → createSignalBroadcaster.ts} +7 -12
  39. package/src/core/index.ts +65 -1
  40. package/src/infrastructure/logger.ts +1 -1
  41. package/src/manager.ts +15 -6
  42. package/src/types/observer.types.ts +6 -6
  43. package/src/types/repository.types.ts +3 -2
  44. package/src/types/workspace.types.ts +3 -1
  45. package/src/workspace/createWorkspace.ts +23 -0
  46. package/src/workspace/{client.ts → createWorkspaceClient.ts} +1 -1
  47. package/src/workspace/index.ts +3 -3
  48. package/src/workspace/providers/client.ts +39 -0
  49. package/src/workspace/providers/index.ts +2 -0
  50. package/src/workspace/providers/setup.ts +59 -0
  51. package/tsconfig.tsbuildinfo +1 -1
  52. package/dist/core/messenger.d.ts +0 -9
  53. package/dist/core/messenger.d.ts.map +0 -1
  54. package/dist/core/repository.d.ts +0 -10
  55. package/dist/core/repository.d.ts.map +0 -1
  56. package/dist/core/repository.js +0 -51
  57. package/dist/workspace/client.d.ts.map +0 -1
  58. package/dist/workspace/context.d.ts.map +0 -1
  59. package/dist/workspace/mount.d.ts.map +0 -1
  60. package/dist/workspace/mount.js +0 -33
  61. package/src/core/repository.ts +0 -58
  62. package/src/workspace/context.ts +0 -43
  63. package/src/workspace/mount.ts +0 -38
@@ -1 +1,58 @@
1
- export * from "./repository";
1
+ import { useWorkspaceSetup } from "../workspace";
2
+ import { createSignalBroadcaster } from "./createSignalBroadcaster";
3
+ import { applyMiddleware } from "./middleware";
4
+ function createRepository(repositoryConfig) {
5
+ const { dependencies, observer } = useWorkspaceSetup();
6
+ const { install, middlewares, onConnect, onDisconnect } = repositoryConfig;
7
+ let repository = undefined;
8
+ let connections = 0;
9
+ let unsubscribe = () => { };
10
+ const { signal, subscribe } = createSignalBroadcaster({
11
+ observer,
12
+ repositoryConfig,
13
+ });
14
+ return {
15
+ get repository() {
16
+ return repository;
17
+ },
18
+ get connections() {
19
+ return connections;
20
+ },
21
+ connect() {
22
+ if (connections === 0) {
23
+ const rawRepository = install({
24
+ instance: {
25
+ dependencies,
26
+ signal,
27
+ },
28
+ });
29
+ repository = middlewares
30
+ ? applyMiddleware(rawRepository, middlewares)
31
+ : rawRepository;
32
+ if (onConnect) {
33
+ onConnect();
34
+ }
35
+ if (repositoryConfig.onSignal) {
36
+ unsubscribe = subscribe((payload) => {
37
+ repositoryConfig.onSignal(payload, repository);
38
+ });
39
+ }
40
+ }
41
+ connections += 1;
42
+ },
43
+ disconnect() {
44
+ if (connections === 0)
45
+ return;
46
+ connections -= 1;
47
+ if (connections === 0) {
48
+ repository = undefined;
49
+ unsubscribe();
50
+ unsubscribe = () => { };
51
+ if (onDisconnect) {
52
+ onDisconnect();
53
+ }
54
+ }
55
+ },
56
+ };
57
+ }
58
+ export { createRepository };
@@ -1,5 +1,5 @@
1
1
  import type { IWorkspaceConfig } from "../types";
2
- declare const createLogger: (config: Omit<IWorkspaceConfig, "dependencies" | "repositories">) => {
2
+ declare const createLogger: (config: Omit<IWorkspaceConfig, "dependencies" | "onSetup">) => {
3
3
  log: (callback: () => void, { type, scope, metadata, }: {
4
4
  type: string;
5
5
  scope: string;
@@ -1 +1 @@
1
- {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/infrastructure/logger.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAEjD,QAAA,MAAM,YAAY,GAChB,QAAQ,IAAI,CAAC,gBAAgB,EAAE,cAAc,GAAG,cAAc,CAAC;oBAKjD,MAAM,IAAI,8BAKjB;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,GAAG,CAAA;KAAE;CAgC5D,CAAC;AAEF,OAAO,EAAE,YAAY,EAAE,CAAC"}
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/infrastructure/logger.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAEjD,QAAA,MAAM,YAAY,GAChB,QAAQ,IAAI,CAAC,gBAAgB,EAAE,cAAc,GAAG,SAAS,CAAC;oBAK5C,MAAM,IAAI,8BAKjB;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,GAAG,CAAA;KAAE;CAgC5D,CAAC;AAEF,OAAO,EAAE,YAAY,EAAE,CAAC"}
package/dist/manager.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  import type { IWorkspaceConfig } from "./types";
2
2
  declare const repositoryManager: () => {
3
- createWorkspace<I>(config: IWorkspaceConfig<I>): {
3
+ workspaceClient<D>(config: IWorkspaceConfig<D>): {
4
4
  queryRepository: <R = any>(id: string) => {
5
5
  repository: R;
6
6
  disconnect(): void;
@@ -1 +1 @@
1
- {"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../src/manager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAGhD,QAAA,MAAM,iBAAiB;oBAEH,CAAC,UAAU,gBAAgB,CAAC,CAAC,CAAC;;;;;;CAQjD,CAAC;AAEF,OAAO,EAAE,iBAAiB,EAAE,CAAC"}
1
+ {"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../src/manager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAIhD,QAAA,MAAM,iBAAiB;oBAEH,CAAC,UAAU,gBAAgB,CAAC,CAAC,CAAC;;;;;;CAgBjD,CAAC;AAEF,OAAO,EAAE,iBAAiB,EAAE,CAAC"}
package/dist/manager.js CHANGED
@@ -1,10 +1,13 @@
1
- import { workspaceProvider, mountWorkspace, createWorkspaceClient } from "./workspace";
1
+ import { createWorkspace, createWorkspaceClient, setupWorkspaceProvider, workspaceProvider } from "./workspace";
2
2
  const repositoryManager = () => {
3
3
  return {
4
- createWorkspace(config) {
5
- let client = undefined;
6
- workspaceProvider(mountWorkspace(config), () => {
7
- client = createWorkspaceClient();
4
+ workspaceClient(config) {
5
+ let client;
6
+ setupWorkspaceProvider(config, () => {
7
+ let workspace = createWorkspace();
8
+ workspaceProvider(workspace, () => {
9
+ client = createWorkspaceClient();
10
+ });
8
11
  });
9
12
  return client;
10
13
  },
@@ -1,15 +1,15 @@
1
- export type IMessengerDispatch<P = any> = {
1
+ export type ISignalPayload<P = any> = {
2
2
  type: string;
3
3
  repositoryId: string;
4
4
  message?: P;
5
5
  };
6
- export type IMessengerSubscribePayload<P = any> = {
6
+ export type ISignalSubscribePayload<P = any> = {
7
7
  type: string;
8
8
  source: string;
9
9
  message: P;
10
10
  };
11
- export type IMessenger = {
12
- dispatch<P = any>(payload: IMessengerDispatch<P>): void;
13
- subscribe<P = any>(callback: (payload: IMessengerSubscribePayload<P>) => void): void;
11
+ export type ISignalBroadcaster = {
12
+ signal<P = any>(payload: ISignalPayload<P>): void;
13
+ subscribe<P = any>(callback: (payload: ISignalSubscribePayload<P>) => void): (() => void);
14
14
  };
15
15
  //# sourceMappingURL=observer.types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"observer.types.d.ts","sourceRoot":"","sources":["../../src/types/observer.types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,kBAAkB,CAAC,CAAC,GAAG,GAAG,IAAI;IACxC,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,CAAC,CAAC;CACb,CAAC;AAEF,MAAM,MAAM,0BAA0B,CAAC,CAAC,GAAG,GAAG,IAAI;IAChD,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,CAAC,CAAC;CACZ,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG;IACvB,QAAQ,CAAC,CAAC,GAAG,GAAG,EAAE,OAAO,EAAE,kBAAkB,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;IACxD,SAAS,CAAC,CAAC,GAAG,GAAG,EACf,QAAQ,EAAE,CAAC,OAAO,EAAE,0BAA0B,CAAC,CAAC,CAAC,KAAK,IAAI,GACzD,IAAI,CAAC;CACT,CAAC"}
1
+ {"version":3,"file":"observer.types.d.ts","sourceRoot":"","sources":["../../src/types/observer.types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,cAAc,CAAC,CAAC,GAAG,GAAG,IAAI;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,CAAC,CAAC;CACb,CAAC;AAEF,MAAM,MAAM,uBAAuB,CAAC,CAAC,GAAG,GAAG,IAAI;IAC7C,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,CAAC,CAAC;CACZ,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,MAAM,CAAC,CAAC,GAAG,GAAG,EAAE,OAAO,EAAE,cAAc,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;IAClD,SAAS,CAAC,CAAC,GAAG,GAAG,EACf,QAAQ,EAAE,CAAC,OAAO,EAAE,uBAAuB,CAAC,CAAC,CAAC,KAAK,IAAI,GACtD,CAAC,MAAM,IAAI,CAAC,CAAC;CACjB,CAAC"}
@@ -1,15 +1,16 @@
1
- import type { IMessenger } from "./observer.types";
1
+ import type { ISignalPayload, ISignalSubscribePayload } from "./observer.types";
2
2
  export interface IRepositoryConfig<D = any, R = any> {
3
3
  id: string;
4
4
  install: repositoryType<D, R>;
5
5
  middlewares?: Middleware[];
6
6
  onConnect?: () => void;
7
7
  onDisconnect?: () => void;
8
+ onSignal?: (event: ISignalSubscribePayload, repo: R) => void;
8
9
  }
9
10
  export type repositoryType<D = any, R = any> = (obj: {
10
11
  instance: {
11
12
  dependencies: D;
12
- messenger: IMessenger;
13
+ signal<S = any>(payload: ISignalPayload<S>): void;
13
14
  };
14
15
  }) => R;
15
16
  export interface IRepositoryInstance<R = any> {
@@ -1 +1 @@
1
- {"version":3,"file":"repository.types.d.ts","sourceRoot":"","sources":["../../src/types/repository.types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAEnD,MAAM,WAAW,iBAAiB,CAAC,CAAC,GAAG,GAAG,EAAE,CAAC,GAAG,GAAG;IACjD,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,cAAc,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC9B,WAAW,CAAC,EAAE,UAAU,EAAE,CAAC;IAC3B,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC;IACvB,YAAY,CAAC,EAAE,MAAM,IAAI,CAAC;CAC3B;AAED,MAAM,MAAM,cAAc,CAAC,CAAC,GAAG,GAAG,EAAE,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE;IACnD,QAAQ,EAAE;QACR,YAAY,EAAE,CAAC,CAAC;QAChB,SAAS,EAAE,UAAU,CAAC;KACvB,CAAC;CACH,KAAK,CAAC,CAAC;AAER,MAAM,WAAW,mBAAmB,CAAC,CAAC,GAAG,GAAG;IAC1C,OAAO,IAAI,IAAI,CAAC;IAChB,UAAU,IAAI,IAAI,CAAC;IACnB,UAAU,EAAE,UAAU,CAAC,cAAc,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC;IAC3D,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,MAAM,UAAU,GAAG,CACvB,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,GAAG,EAAE,EACX,IAAI,EAAE,CAAC,GAAG,QAAQ,EAAE,GAAG,EAAE,KAAK,GAAG,KAC9B,GAAG,CAAC"}
1
+ {"version":3,"file":"repository.types.d.ts","sourceRoot":"","sources":["../../src/types/repository.types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,uBAAuB,EAAE,MAAM,kBAAkB,CAAC;AAEhF,MAAM,WAAW,iBAAiB,CAAC,CAAC,GAAG,GAAG,EAAE,CAAC,GAAG,GAAG;IACjD,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,cAAc,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC9B,WAAW,CAAC,EAAE,UAAU,EAAE,CAAC;IAC3B,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC;IACvB,YAAY,CAAC,EAAE,MAAM,IAAI,CAAC;IAC1B,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,uBAAuB,EAAE,IAAI,EAAE,CAAC,KAAM,IAAI,CAAC;CAC/D;AAED,MAAM,MAAM,cAAc,CAAC,CAAC,GAAG,GAAG,EAAE,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE;IACnD,QAAQ,EAAE;QACR,YAAY,EAAE,CAAC,CAAC;QAChB,MAAM,CAAC,CAAC,GAAG,GAAG,EAAE,OAAO,EAAE,cAAc,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;KACnD,CAAC;CACH,KAAK,CAAC,CAAC;AAER,MAAM,WAAW,mBAAmB,CAAC,CAAC,GAAG,GAAG;IAC1C,OAAO,IAAI,IAAI,CAAC;IAChB,UAAU,IAAI,IAAI,CAAC;IACnB,UAAU,EAAE,UAAU,CAAC,cAAc,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC;IAC3D,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,MAAM,UAAU,GAAG,CACvB,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,GAAG,EAAE,EACX,IAAI,EAAE,CAAC,GAAG,QAAQ,EAAE,GAAG,EAAE,KAAK,GAAG,KAC9B,GAAG,CAAC"}
@@ -3,6 +3,8 @@ export interface IWorkspaceConfig<D = any> {
3
3
  id: string;
4
4
  logging?: boolean;
5
5
  dependencies: D;
6
- repositories: () => IRepositoryConfig<D, any>[];
6
+ onSetup(obj: {
7
+ useRepository<R>(repository: IRepositoryConfig<D, R>): void;
8
+ }): void;
7
9
  }
8
10
  //# sourceMappingURL=workspace.types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"workspace.types.d.ts","sourceRoot":"","sources":["../../src/types/workspace.types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAE5D,MAAM,WAAW,gBAAgB,CAAC,CAAC,GAAG,GAAG;IACvC,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,YAAY,EAAE,CAAC,CAAC;IAChB,YAAY,EAAE,MAAM,iBAAiB,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC;CACjD"}
1
+ {"version":3,"file":"workspace.types.d.ts","sourceRoot":"","sources":["../../src/types/workspace.types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAE5D,MAAM,WAAW,gBAAgB,CAAC,CAAC,GAAG,GAAG;IACvC,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,YAAY,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,EAAE;QACX,aAAa,CAAC,CAAC,EAAE,UAAU,EAAE,iBAAiB,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,IAAI,CAAA;KAC5D,GAAG,IAAI,CAAC;CACV"}
@@ -1,12 +1,4 @@
1
- import type { IRepositoryInstance, IWorkspaceConfig } from "../types";
2
- declare function mountWorkspace<D = any>(config: IWorkspaceConfig<D>): {
3
- store: {
4
- setState(id: string, item: IRepositoryInstance<any>): void;
5
- getState(id: string): IRepositoryInstance<any> | undefined;
6
- hasState(id: string): boolean;
7
- deleteState(id: string): void;
8
- getEntries(): MapIterator<[string, IRepositoryInstance<any>]>;
9
- };
1
+ declare function createWorkspace<D = any>(): {
10
2
  logger: {
11
3
  log: (callback: () => void, { type, scope, metadata, }: {
12
4
  type: string;
@@ -14,6 +6,13 @@ declare function mountWorkspace<D = any>(config: IWorkspaceConfig<D>): {
14
6
  metadata: () => any;
15
7
  }) => void;
16
8
  };
9
+ store: {
10
+ setState(id: string, item: import("../types").IRepositoryInstance<any>): void;
11
+ getState(id: string): import("../types").IRepositoryInstance<any> | undefined;
12
+ hasState(id: string): boolean;
13
+ deleteState(id: string): void;
14
+ getEntries(): MapIterator<[string, import("../types").IRepositoryInstance<any>]>;
15
+ };
17
16
  observer: {
18
17
  dispatch: ({ scope, eventName, payload, }: {
19
18
  scope?: string;
@@ -30,8 +29,7 @@ declare function mountWorkspace<D = any>(config: IWorkspaceConfig<D>): {
30
29
  repository: string;
31
30
  connections: number;
32
31
  }[];
33
- repositories: () => import("../types").IRepositoryConfig<D, any>[];
34
32
  dependencies: D;
35
33
  };
36
- export { mountWorkspace };
37
- //# sourceMappingURL=mount.d.ts.map
34
+ export { createWorkspace };
35
+ //# sourceMappingURL=createWorkspace.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createWorkspace.d.ts","sourceRoot":"","sources":["../../src/workspace/createWorkspace.ts"],"names":[],"mappings":"AAKA,iBAAS,eAAe,CAAC,CAAC,GAAG,GAAG;;;;;;;;;;;;;;;;;iBAiB8jB,CAAC;;mBAAgD,CAAC;;;iBAAyO,CAAC;;;;;;;;;;EAFz3B;AAED,OAAO,EAAE,eAAe,EAAE,CAAC"}
@@ -0,0 +1,19 @@
1
+ import { createRepository } from "../core";
2
+ import { useWorkspaceSetup } from "./providers";
3
+ function createWorkspace() {
4
+ const { repositories, store, logger, observer, allRepositories, dependencies } = useWorkspaceSetup();
5
+ repositories.forEach((repository) => {
6
+ const { id } = repository;
7
+ if (store.hasState(id))
8
+ return;
9
+ store.setState(id, createRepository(repository));
10
+ });
11
+ return {
12
+ logger: logger,
13
+ store: store,
14
+ observer: observer,
15
+ allRepositories: allRepositories,
16
+ dependencies: dependencies,
17
+ };
18
+ }
19
+ export { createWorkspace };
@@ -6,4 +6,4 @@ declare function createWorkspaceClient<I>(): {
6
6
  };
7
7
  };
8
8
  export { createWorkspaceClient };
9
- //# sourceMappingURL=client.d.ts.map
9
+ //# sourceMappingURL=createWorkspaceClient.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createWorkspaceClient.d.ts","sourceRoot":"","sources":["../../src/workspace/createWorkspaceClient.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAG/C,iBAAS,qBAAqB,CAAC,CAAC;sBAGL,CAAC,YAAY,MAAM;oBAgBd,UAAU,CAAC,cAAc,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;;;EAS/D;AAED,OAAO,EAAE,qBAAqB,EAAE,CAAC"}
@@ -1,4 +1,4 @@
1
- import { workspace } from "../workspace";
1
+ import { workspace } from ".";
2
2
  function createWorkspaceClient() {
3
3
  const { store, allRepositories, logger } = workspace();
4
4
  function queryRepository(id) {
@@ -1,4 +1,4 @@
1
- export * from "./context";
2
- export * from "./mount";
3
- export * from "./client";
1
+ export * from "./providers";
2
+ export * from "./createWorkspace";
3
+ export * from "./createWorkspaceClient";
4
4
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/workspace/index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAC;AAC1B,cAAc,SAAS,CAAC;AACxB,cAAc,UAAU,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/workspace/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,mBAAmB,CAAC;AAClC,cAAc,yBAAyB,CAAC"}
@@ -1,3 +1,3 @@
1
- export * from "./context";
2
- export * from "./mount";
3
- export * from "./client";
1
+ export * from "./providers";
2
+ export * from "./createWorkspace";
3
+ export * from "./createWorkspaceClient";
@@ -1,6 +1,6 @@
1
- import { createLogger, createScopedObserver, createStore } from "../infrastructure";
2
- import type { IRepositoryInstance } from "../types";
3
- interface IWorkspaceContext<D = any> {
1
+ import { createStore, createLogger, createScopedObserver } from "../../infrastructure";
2
+ import type { IRepositoryInstance } from "../../types";
3
+ export interface IWorkspaceContext<D = any> {
4
4
  store: ReturnType<typeof createStore<IRepositoryInstance<any>>>;
5
5
  logger: ReturnType<typeof createLogger>;
6
6
  observer: ReturnType<typeof createScopedObserver>;
@@ -13,4 +13,4 @@ interface IWorkspaceContext<D = any> {
13
13
  declare function workspaceProvider<D = any>(value: IWorkspaceContext<D>, child: () => void): void;
14
14
  declare function workspace<I>(): IWorkspaceContext<I>;
15
15
  export { workspaceProvider, workspace };
16
- //# sourceMappingURL=context.d.ts.map
16
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../src/workspace/providers/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,oBAAoB,EAAyB,MAAM,sBAAsB,CAAC;AAC9G,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAGrD,MAAM,WAAW,iBAAiB,CAAC,CAAC,GAAG,GAAG;IACxC,KAAK,EAAE,UAAU,CAAC,OAAO,WAAW,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IAChE,MAAM,EAAE,UAAU,CAAC,OAAO,YAAY,CAAC,CAAC;IACxC,QAAQ,EAAE,UAAU,CAAC,OAAO,oBAAoB,CAAC,CAAC;IAClD,YAAY,EAAE,CAAC,CAAC;IAChB,eAAe,EAAE,MAAM;QACrB,UAAU,EAAE,MAAM,CAAC;QACnB,WAAW,EAAE,MAAM,CAAC;KACrB,EAAE,CAAC;CACL;AAMD,iBAAS,iBAAiB,CAAC,CAAC,GAAG,GAAG,EAChC,KAAK,EAAE,iBAAiB,CAAC,CAAC,CAAC,EAC3B,KAAK,EAAE,MAAM,IAAI,QASlB;AAED,iBAAS,SAAS,CAAC,CAAC,0BAGnB;AAED,OAAO,EAAE,iBAAiB,EAAE,SAAS,EAAE,CAAC"}
@@ -1,4 +1,4 @@
1
- import { createScope, useScope } from "../infrastructure";
1
+ import { createScope, useScope } from "../../infrastructure";
2
2
  const workspaceScope = createScope(undefined);
3
3
  function workspaceProvider(value, child) {
4
4
  workspaceScope.provider(value, () => {
@@ -0,0 +1,3 @@
1
+ export * from "./client";
2
+ export * from "./setup";
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/workspace/providers/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC;AACzB,cAAc,SAAS,CAAC"}
@@ -0,0 +1,2 @@
1
+ export * from "./client";
2
+ export * from "./setup";
@@ -0,0 +1,19 @@
1
+ import { createLogger, createScopedObserver, createStore, type ScopeNode } from "../../infrastructure";
2
+ import type { IRepositoryConfig, IRepositoryInstance, IWorkspaceConfig } from "../../types";
3
+ interface IWorkspaceSetupContext<D = any> {
4
+ id: string;
5
+ dependencies: D;
6
+ repositories: IRepositoryConfig<D, any>[];
7
+ scopes: ScopeNode[];
8
+ logger: ReturnType<typeof createLogger>;
9
+ store: ReturnType<typeof createStore<IRepositoryInstance<any>>>;
10
+ observer: ReturnType<typeof createScopedObserver>;
11
+ allRepositories: () => {
12
+ repository: string;
13
+ connections: number;
14
+ }[];
15
+ }
16
+ declare function setupWorkspaceProvider<D = any>(config: IWorkspaceConfig<D>, child: () => void): void;
17
+ declare function useWorkspaceSetup<D = any>(): IWorkspaceSetupContext<D>;
18
+ export { setupWorkspaceProvider, useWorkspaceSetup };
19
+ //# sourceMappingURL=setup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../../../src/workspace/providers/setup.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,oBAAoB,EAAe,WAAW,EAAY,KAAK,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAC9H,OAAO,KAAK,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAG5F,UAAU,sBAAsB,CAAC,CAAC,GAAG,GAAG;IACpC,EAAE,EAAE,MAAM,CAAC;IACX,YAAY,EAAE,CAAC,CAAC;IAChB,YAAY,EAAE,iBAAiB,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC;IAC1C,MAAM,EAAE,SAAS,EAAE,CAAC;IACpB,MAAM,EAAE,UAAU,CAAC,OAAO,YAAY,CAAC,CAAC;IACxC,KAAK,EAAE,UAAU,CAAC,OAAO,WAAW,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IAChE,QAAQ,EAAE,UAAU,CAAC,OAAO,oBAAoB,CAAC,CAAC;IAClD,eAAe,EAAE,MAAM;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CACxE;AAGD,iBAAS,sBAAsB,CAAC,CAAC,GAAG,GAAG,EAAE,MAAM,EAAE,gBAAgB,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,IAAI,QAmCtF;AAED,iBAAS,iBAAiB,CAAC,CAAC,GAAG,GAAG,+BAGjC;AAED,OAAO,EAAE,sBAAsB,EAAE,iBAAiB,EAAE,CAAC"}
@@ -0,0 +1,42 @@
1
+ import { createLogger, createScopedObserver, createScope, createStore, useScope } from "../../infrastructure";
2
+ const setupScope = createScope(undefined);
3
+ function setupWorkspaceProvider(config, child) {
4
+ var _a;
5
+ let repositories = [];
6
+ let scopes = [];
7
+ config.onSetup({
8
+ useRepository(repository) {
9
+ repositories.push(repository);
10
+ }
11
+ });
12
+ scopes = repositories.map((repository) => ({ scope: repository.id }));
13
+ const defaultConfig = {
14
+ id: config.id,
15
+ logging: (_a = config.logging) !== null && _a !== void 0 ? _a : false,
16
+ };
17
+ const logger = createLogger(defaultConfig);
18
+ const store = createStore();
19
+ const observer = createScopedObserver(scopes !== null && scopes !== void 0 ? scopes : []);
20
+ setupScope.provider({
21
+ id: config.id,
22
+ dependencies: config.dependencies,
23
+ repositories,
24
+ scopes,
25
+ logger,
26
+ store,
27
+ observer,
28
+ allRepositories: () => {
29
+ return Array.from(store.getEntries()).map(([id, repository]) => ({
30
+ repository: id,
31
+ connections: repository.connections,
32
+ }));
33
+ },
34
+ }, () => {
35
+ child();
36
+ });
37
+ }
38
+ function useWorkspaceSetup() {
39
+ const context = useScope(setupScope);
40
+ return context;
41
+ }
42
+ export { setupWorkspaceProvider, useWorkspaceSetup };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@med1802/repository-manager",
3
- "version": "3.1.2",
3
+ "version": "3.2.0",
4
4
  "main": "dist/index.js",
5
5
  "types": "dist/index.d.ts",
6
6
  "repository": {
@@ -1,14 +1,13 @@
1
1
  import type { scopedObserverType } from "../infrastructure";
2
- import type { IMessenger, IRepositoryConfig } from "../types";
2
+ import type { ISignalBroadcaster, IRepositoryConfig } from "../types";
3
3
 
4
- function createMessenger (config: {
4
+ function createSignalBroadcaster (config: {
5
5
  observer: scopedObserverType;
6
- subscriptions: (() => void)[];
7
6
  repositoryConfig: IRepositoryConfig;
8
- }): IMessenger {
9
- const { observer, subscriptions, repositoryConfig } = config;
7
+ }): ISignalBroadcaster {
8
+ const { observer, repositoryConfig } = config;
10
9
  return {
11
- dispatch({ repositoryId, type, message }){
10
+ signal({ repositoryId, type, message }){
12
11
  if (repositoryId === repositoryConfig.id) {
13
12
  console.warn("WARNING: DISPATCHING TO SELF");
14
13
  return;
@@ -24,10 +23,6 @@ function createMessenger (config: {
24
23
  });
25
24
  },
26
25
  subscribe(handler) {
27
- if (subscriptions.length > 0) {
28
- console.warn("WARNING: SUBSCRIBED ALREADY");
29
- return;
30
- }
31
26
  const unsubscribe = observer.subscribe({
32
27
  scope: repositoryConfig.id,
33
28
  eventName: "dispatch",
@@ -40,9 +35,9 @@ function createMessenger (config: {
40
35
  });
41
36
  },
42
37
  });
43
- subscriptions.push(unsubscribe);
38
+ return unsubscribe;
44
39
  },
45
40
  };
46
41
  }
47
42
 
48
- export { createMessenger };
43
+ export { createSignalBroadcaster };
package/src/core/index.ts CHANGED
@@ -1 +1,65 @@
1
- export * from "./repository";
1
+ import type { IRepositoryConfig } from "../types";
2
+ import { useWorkspaceSetup } from "../workspace";
3
+
4
+ import { createSignalBroadcaster } from "./createSignalBroadcaster";
5
+ import { applyMiddleware } from "./middleware";
6
+
7
+ function createRepository<D>(
8
+ repositoryConfig: IRepositoryConfig<D, any>,
9
+ ) {
10
+
11
+ const { dependencies, observer } = useWorkspaceSetup<D>()
12
+ const { install, middlewares, onConnect, onDisconnect } = repositoryConfig;
13
+ let repository = undefined as unknown;
14
+ let connections = 0;
15
+ let unsubscribe = () => {};
16
+ const { signal, subscribe } = createSignalBroadcaster({
17
+ observer,
18
+ repositoryConfig,
19
+ });
20
+
21
+ return {
22
+ get repository() {
23
+ return repository;
24
+ },
25
+ get connections() {
26
+ return connections;
27
+ },
28
+ connect() {
29
+ if (connections === 0) {
30
+ const rawRepository = install({
31
+ instance: {
32
+ dependencies,
33
+ signal,
34
+ },
35
+ });
36
+ repository = middlewares
37
+ ? applyMiddleware(rawRepository, middlewares)
38
+ : rawRepository;
39
+ if (onConnect) {
40
+ onConnect();
41
+ }
42
+ if(repositoryConfig.onSignal) {
43
+ unsubscribe = subscribe((payload) => {
44
+ repositoryConfig.onSignal!(payload, repository);
45
+ });
46
+ }
47
+ }
48
+ connections += 1;
49
+ },
50
+ disconnect() {
51
+ if (connections === 0) return;
52
+ connections -= 1;
53
+ if (connections === 0) {
54
+ repository = undefined;
55
+ unsubscribe();
56
+ unsubscribe = () => {};
57
+ if (onDisconnect) {
58
+ onDisconnect();
59
+ }
60
+ }
61
+ },
62
+ };
63
+ }
64
+
65
+ export { createRepository };
@@ -1,7 +1,7 @@
1
1
  import type { IWorkspaceConfig } from "../types";
2
2
 
3
3
  const createLogger = (
4
- config: Omit<IWorkspaceConfig, "dependencies" | "repositories">
4
+ config: Omit<IWorkspaceConfig, "dependencies" | "onSetup">
5
5
  ) => {
6
6
  const { logging } = config;
7
7
  return {
package/src/manager.ts CHANGED
@@ -1,14 +1,23 @@
1
1
  import type { IWorkspaceConfig } from "./types";
2
- import { workspaceProvider, mountWorkspace, createWorkspaceClient } from "./workspace";
2
+ import { createWorkspace, createWorkspaceClient, setupWorkspaceProvider, workspaceProvider } from "./workspace";
3
+
3
4
 
4
5
  const repositoryManager = () => {
5
6
  return {
6
- createWorkspace<I>(config: IWorkspaceConfig<I>) {
7
- let client: ReturnType<typeof createWorkspaceClient<I>> = undefined!;
8
- workspaceProvider<I>(mountWorkspace<any>(config), () => {
9
- client = createWorkspaceClient<I>();
7
+ workspaceClient<D>(config: IWorkspaceConfig<D>) {
8
+ let client: ReturnType<typeof createWorkspaceClient<D>>;
9
+
10
+ setupWorkspaceProvider(config, () => {
11
+
12
+ let workspace = createWorkspace();
13
+
14
+ workspaceProvider<D>(workspace, () => {
15
+ client = createWorkspaceClient<D>();
16
+ });
17
+
10
18
  });
11
- return client;
19
+
20
+ return client!;
12
21
  },
13
22
  };
14
23
  };
@@ -1,18 +1,18 @@
1
- export type IMessengerDispatch<P = any> = {
1
+ export type ISignalPayload<P = any> = {
2
2
  type: string;
3
3
  repositoryId: string;
4
4
  message?: P;
5
5
  };
6
6
 
7
- export type IMessengerSubscribePayload<P = any> = {
7
+ export type ISignalSubscribePayload<P = any> = {
8
8
  type: string;
9
9
  source: string;
10
10
  message: P;
11
11
  };
12
12
 
13
- export type IMessenger = {
14
- dispatch<P = any>(payload: IMessengerDispatch<P>): void;
13
+ export type ISignalBroadcaster = {
14
+ signal<P = any>(payload: ISignalPayload<P>): void;
15
15
  subscribe<P = any>(
16
- callback: (payload: IMessengerSubscribePayload<P>) => void
17
- ): void;
16
+ callback: (payload: ISignalSubscribePayload<P>) => void
17
+ ): (() => void);
18
18
  };
@@ -1,4 +1,4 @@
1
- import type { IMessenger } from "./observer.types";
1
+ import type { ISignalPayload, ISignalSubscribePayload } from "./observer.types";
2
2
 
3
3
  export interface IRepositoryConfig<D = any, R = any> {
4
4
  id: string;
@@ -6,12 +6,13 @@ export interface IRepositoryConfig<D = any, R = any> {
6
6
  middlewares?: Middleware[];
7
7
  onConnect?: () => void;
8
8
  onDisconnect?: () => void;
9
+ onSignal?: (event: ISignalSubscribePayload, repo: R ) => void;
9
10
  }
10
11
 
11
12
  export type repositoryType<D = any, R = any> = (obj: {
12
13
  instance: {
13
14
  dependencies: D;
14
- messenger: IMessenger;
15
+ signal<S = any>(payload: ISignalPayload<S>): void;
15
16
  };
16
17
  }) => R;
17
18
 
@@ -4,5 +4,7 @@ export interface IWorkspaceConfig<D = any> {
4
4
  id: string;
5
5
  logging?: boolean;
6
6
  dependencies: D;
7
- repositories: () => IRepositoryConfig<D, any>[];
7
+ onSetup(obj: {
8
+ useRepository<R>(repository: IRepositoryConfig<D, R>): void
9
+ }): void;
8
10
  }
@@ -0,0 +1,23 @@
1
+ import { createRepository } from "../core";
2
+ import type { IRepositoryConfig } from "../types";
3
+ import { useWorkspaceSetup } from "./providers";
4
+
5
+
6
+ function createWorkspace<D = any>(){
7
+ const { repositories, store, logger, observer, allRepositories, dependencies } = useWorkspaceSetup<D>();
8
+ repositories.forEach((repository: IRepositoryConfig<D, any>) => {
9
+ const { id } = repository;
10
+ if (store.hasState(id)) return;
11
+ store.setState(id, createRepository(repository))
12
+ });
13
+ return {
14
+ logger: logger,
15
+ store: store,
16
+ observer: observer,
17
+ allRepositories: allRepositories,
18
+ dependencies: dependencies,
19
+ }
20
+
21
+ }
22
+
23
+ export { createWorkspace };