@actdim/msgmesh 1.0.2 → 1.0.3
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/dist/msgBusCore.d.ts +5 -5
- package/dist/msgBusCore.d.ts.map +1 -1
- package/dist/msgBusCore.es.js.map +1 -1
- package/dist/msgBusFactory.d.ts +2 -2
- package/dist/msgBusFactory.d.ts.map +1 -1
- package/dist/msgBusFactory.es.js +118 -115
- package/dist/msgBusFactory.es.js.map +1 -1
- package/package.json +1 -1
package/dist/msgBusCore.d.ts
CHANGED
|
@@ -21,14 +21,14 @@ export type SystemChannelGroup = `${keyof InParam | keyof OutParam | keyof OutPa
|
|
|
21
21
|
export type MsgChannelStruct = Partial<{
|
|
22
22
|
[group: string]: any;
|
|
23
23
|
} & InParam & OutParam & ErrorParam>;
|
|
24
|
-
export type MsgBusStruct = {
|
|
25
|
-
[channel: string]: MsgChannelStruct;
|
|
26
|
-
};
|
|
27
24
|
export type MsgBusStructBase = {
|
|
28
|
-
[$C_ERROR]
|
|
25
|
+
[$C_ERROR]?: {
|
|
29
26
|
[$CG_IN]: ErrorPayload;
|
|
30
27
|
};
|
|
31
28
|
};
|
|
29
|
+
export type MsgBusStruct = {
|
|
30
|
+
[channel: string]: MsgChannelStruct;
|
|
31
|
+
} & MsgBusStructBase;
|
|
32
32
|
export type MsgBusStructFactory<TStruct extends TStructBase, TStructBase extends MsgBusStruct = MsgBusStruct> = {
|
|
33
33
|
[C in keyof TStruct]: TStruct[C] & ErrorParam;
|
|
34
34
|
};
|
|
@@ -51,6 +51,7 @@ export type MsgChannelConfig<TChannel> = {
|
|
|
51
51
|
export type MsgDispatchConfig = {
|
|
52
52
|
priority?: number;
|
|
53
53
|
fetchCount?: number;
|
|
54
|
+
abortSignal?: AbortSignal;
|
|
54
55
|
};
|
|
55
56
|
export type MsgBusConfig<TStruct extends MsgBusStruct> = {
|
|
56
57
|
[TChannel in keyof TStruct]?: MsgChannelConfig<TStruct[TChannel]>;
|
|
@@ -76,7 +77,6 @@ export type MsgBusSubscriberParams<TStruct extends MsgBusStruct = MsgBusStruct,
|
|
|
76
77
|
callback?: (msg: Msg<TStruct, TChannel, TGroup>) => void;
|
|
77
78
|
config?: MsgDispatchConfig;
|
|
78
79
|
filter?: (msg: Msg<TStruct, TChannel, TGroup>) => boolean;
|
|
79
|
-
signal?: AbortSignal;
|
|
80
80
|
};
|
|
81
81
|
export type MsgBusSubscriber<TStruct extends MsgBusStruct> = <TChannel extends keyof TStruct, TGroup extends keyof TStruct[TChannel] = typeof $CG_IN>(params: MsgBusSubscriberParams<TStruct, TChannel, TGroup>) => void;
|
|
82
82
|
export type MsgBusStreamer<TStruct extends MsgBusStruct> = <TChannel extends keyof TStruct, TGroup extends keyof TStruct[TChannel] = typeof $CG_IN>(params: MsgBusSubscriberParams<TStruct, TChannel, TGroup>) => AsyncIterableIterator<Msg<TStruct, TChannel, TGroup>>;
|
package/dist/msgBusCore.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"msgBusCore.d.ts","sourceRoot":"","sources":["../src/msgBusCore.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,wBAAwB,CAAC;AAEhF,eAAO,MAAM,MAAM,OAAO,CAAC;AAE3B,eAAO,MAAM,OAAO,QAAQ,CAAC;AAE7B,eAAO,MAAM,SAAS,UAAU,CAAC;AAEjC,eAAO,MAAM,QAAQ,UAAU,CAAC;AAEhC,MAAM,MAAM,OAAO,GAAG;IAElB,CAAC,MAAM,CAAC,EAAE,GAAG,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,QAAQ,GAAG;IAEnB,CAAC,OAAO,CAAC,EAAE,GAAG,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG;IACvB,KAAK,EAAE,GAAG,CAAC;IACX,MAAM,CAAC,EAAE,GAAG,CAAC;IACb,OAAO,CAAC,EAAE,OAAO,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,UAAU,CAAC,CAAC,SAAS,YAAY,GAAG,YAAY,IAAI;IAE5D,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;CAClB,CAAC;AAGF,MAAM,MAAM,kBAAkB,GAAG,GAAG,MAAM,OAAO,GAAG,MAAM,QAAQ,GAAG,MAAM,QAAQ,EAAE,CAAC;AAetF,MAAM,MAAM,gBAAgB,GAAG,OAAO,CAAC;IAAE,CAAC,KAAK,EAAE,MAAM,GAAG,GAAG,CAAA;CAAE,GAAG,OAAO,GAAG,QAAQ,GAAG,UAAU,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"msgBusCore.d.ts","sourceRoot":"","sources":["../src/msgBusCore.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"msgBusCore.es.js","sources":["D:/Src/my/actdim/public/msgmesh/src/msgBusCore.ts"],"sourcesContent":["//##############################################################################\r\n//# Copyright (c) Pavel Borodaev 2022 #\r\n//##############################################################################\r\n// SafeBus\r\nimport { IsTuple, MaybePromise, Overwrite, Skip } from \"@actdim/utico/typeCore\";\r\n\r\nexport const $CG_IN = \"in\";\r\n\r\nexport const $CG_OUT = \"out\";\r\n\r\nexport const $CG_ERROR = \"error\";\r\n\r\nexport const $C_ERROR = \"error\";\r\n\r\nexport type InParam = {\r\n // [key in typeof $CG_IN]: any;\r\n [$CG_IN]: any;\r\n};\r\n\r\nexport type OutParam = {\r\n // [key in typeof $CG_OUT]: any;\r\n [$CG_OUT]: any;\r\n};\r\n\r\nexport type ErrorPayload = {\r\n error: any; // reason\r\n source?: any;\r\n handled?: boolean;\r\n};\r\n\r\nexport type ErrorParam<T extends ErrorPayload = ErrorPayload> = {\r\n // [key in typeof $CG_ERROR]: any;\r\n [$CG_ERROR]: T;\r\n};\r\n\r\n// ReservedChannelGroup\r\nexport type SystemChannelGroup = `${keyof InParam | keyof OutParam | keyof OutParam}`;\r\n\r\n// TODO:\r\n// Point-to-Point (P2P): direct messaging with targeted, address delivery (exactly one recipient)\r\n// Broadcast\r\n// Queue group: Load Balancing, Round-Robin, Fan-out, Fan-in\r\n// QoS\r\n// Message Filtering\r\n// Cross-tab message delivery:\r\n// https://www.sitepen.com/blog/cross-tab-synchronization-with-the-web-locks-api\r\n// https://developer.mozilla.org/en-US/docs/Web/API/Broadcast_Channel_API\r\n// LocalStorage\r\n// https://github.com/GoogleChromeLabs/comlink\r\n\r\n// MsgBusChannelStruct\r\nexport type MsgChannelStruct = Partial<{ [group: string]: any } & InParam & OutParam & ErrorParam>;\r\n\r\n// type MsgChannelStruct = { [group: string]: any } & (\r\n// | InParam\r\n// | OutParam\r\n// | (InParam & OutParam)\r\n// );\r\n\r\nexport type MsgBusStruct = {\r\n [channel: string]: MsgChannelStruct;\r\n};\r\n\r\n// SystemMsgBusStruct\r\nexport type MsgBusStructBase = {\r\n [$C_ERROR]: {\r\n [$CG_IN]: ErrorPayload;\r\n };\r\n // \"*\": {\r\n // [$CG_IN]: any;\r\n // };\r\n};\r\n\r\n// MsgBusStructBuilder\r\nexport type MsgBusStructFactory<\r\n TStruct extends TStructBase,\r\n TStructBase extends MsgBusStruct = MsgBusStruct // & MsgBusStructBase\r\n> = {\r\n [C in keyof TStruct]: TStruct[C] & ErrorParam;\r\n};\r\n\r\n// export type MsgBusStruct = Record<string, MsgChannelStruct>;\r\n\r\nexport type InStruct<TStruct extends MsgBusStruct, TChannel extends keyof TStruct> = TStruct[TChannel] extends InParam\r\n ? TStruct[TChannel][\"in\"] // keyof InParam or typeof $CG_IN\r\n : undefined; // never\r\n\r\n// export type InStruct<\r\n// TStruct extends MsgBusStruct,\r\n// TChannel extends keyof TStruct\r\n// > = TStruct[TChannel] extends InParam ? TStruct[TChannel][\"in\"] : never;\r\n\r\nexport type OutStruct<TStruct extends MsgBusStruct, TChannel extends keyof TStruct> = TStruct[TChannel] extends OutParam\r\n ? TStruct[TChannel][keyof OutParam]\r\n : undefined;\r\n\r\n// export type OutStruct<\r\n// TStruct extends MsgBusStruct,\r\n// TChannel extends keyof TStruct\r\n// > = TStruct[TChannel] extends OutParam ? TStruct[TChannel][\"out\"] : never;\r\n\r\n// Options/Settings\r\nexport type MsgChannelConfig<TChannel> = {\r\n // (channel) message queue distribution and processing strategy\r\n replayCount?: number;\r\n initialValues?: { [TGroup in keyof TChannel]: TChannel[TGroup] };\r\n persistent?: boolean; // durable? (for durable queue)\r\n secure?: boolean; // encrypted\r\n federated?: boolean; // broadcasting\r\n autoDeleteTimeout?: number;\r\n noAck?: boolean; // noAutoAck\r\n // manualAck?: boolean;\r\n // prefetchCount?: number; // for manual acknowledgment\r\n // this can be used for some consumer or for all consumers of the channel\r\n maxConcurrentConsumers?: number; // Parallel? Processes? Handlers?\r\n replayBufferSize?: number;\r\n replayWindowTime?: number;\r\n};\r\n\r\nexport type MsgDispatchConfig = {\r\n // MsgConfig\r\n priority?: number;\r\n fetchCount?: number;\r\n};\r\n\r\nexport type MsgBusConfig<TStruct extends MsgBusStruct> = {\r\n [TChannel in keyof TStruct]?: MsgChannelConfig<TStruct[TChannel]>;\r\n}; // Record<string, MsgChannelConfig>\r\n\r\nexport type MsgAddress<\r\n TStruct extends MsgBusStruct = MsgBusStruct,\r\n TChannel extends keyof TStruct = keyof TStruct,\r\n TGroup extends keyof TStruct[TChannel] = keyof TStruct[TChannel] // typeof $CG_IN\r\n> = {\r\n channel: TChannel;\r\n group?: TGroup; // typeGroup\r\n // supports wildcard matching (https://docs.nats.io/nats-concepts/subjects#wildcards)\r\n topic?: string; \r\n version?: string;\r\n};\r\n\r\n// MsgEnvelope\r\nexport type Msg<\r\n TStruct extends MsgBusStruct = MsgBusStruct,\r\n TChannel extends keyof TStruct = keyof TStruct,\r\n TGroup extends keyof TStruct[TChannel] = keyof TStruct[TChannel]\r\n> = {\r\n address: MsgAddress<TStruct, TChannel, TGroup>;\r\n payload?: TGroup extends undefined ? InStruct<TStruct, TChannel> : TStruct[TChannel][TGroup];\r\n // status: MsgStatus;\r\n // inResponseToId\r\n requestId?: string;\r\n // correlationId\r\n traceId?: string;\r\n id?: string;\r\n timestamp: number; // Date\r\n priority?: number;\r\n persistent?: boolean; // durable? (for durable queue)\r\n};\r\n\r\n// TODO: support un(subscribing) via Deferred<bool>\r\n\r\nexport type MsgBusSubscriberParams<\r\n TStruct extends MsgBusStruct = MsgBusStruct,\r\n TChannel extends keyof TStruct = keyof TStruct,\r\n TGroup extends keyof TStruct[TChannel] = keyof TStruct[TChannel] // typeof $CG_IN\r\n> = MsgAddress<TStruct, TChannel, TGroup> & {\r\n channelSelector?: string | ((channel: string) => boolean);\r\n // topicSelector?: string | ((channel: string) => boolean);\r\n callback?: (msg: Msg<TStruct, TChannel, TGroup>) => void;\r\n config?: MsgDispatchConfig;\r\n filter?: (msg: Msg<TStruct, TChannel, TGroup>) => boolean;\r\n signal?: AbortSignal;\r\n};\r\n\r\n// MsgBusSubscriberFn\r\nexport type MsgBusSubscriber<TStruct extends MsgBusStruct> = <\r\n TChannel extends keyof TStruct,\r\n TGroup extends keyof TStruct[TChannel] = typeof $CG_IN\r\n>(\r\n params: MsgBusSubscriberParams<TStruct, TChannel, TGroup>\r\n) => void;\r\n\r\n// MsgBusAsyncSubIterator(Fn)\r\nexport type MsgBusStreamer<TStruct extends MsgBusStruct> = <\r\n TChannel extends keyof TStruct,\r\n TGroup extends keyof TStruct[TChannel] = typeof $CG_IN\r\n>(\r\n params: MsgBusSubscriberParams<TStruct, TChannel, TGroup>\r\n) => AsyncIterableIterator<Msg<TStruct, TChannel, TGroup>>; // TGroup extends undefined ? typeof $CG_IN : TGroup\r\n\r\nexport type MsgBusAsyncSubscriberParams<\r\n TStruct extends MsgBusStruct = MsgBusStruct,\r\n TChannel extends keyof TStruct = keyof TStruct,\r\n TGroup extends keyof TStruct[TChannel] = keyof TStruct[TChannel] // typeof $CG_IN\r\n> = Skip<MsgBusSubscriberParams<TStruct, TChannel, TGroup>, \"callback\" | \"filter\">;\r\n\r\n// MsgBusAsyncSubscriberFn\r\nexport type MsgBusAsyncSubscriber<TStruct extends MsgBusStruct> = <\r\n TChannel extends keyof TStruct,\r\n TGroup extends keyof TStruct[TChannel] = typeof $CG_IN\r\n>(\r\n params: MsgBusAsyncSubscriberParams<TStruct, TChannel, TGroup>\r\n) => Promise<Msg<TStruct, TChannel, TGroup>>; // TGroup extends undefined ? typeof $CG_IN : TGroup\r\n\r\nexport type MsgBusProviderParams<\r\n TStruct extends MsgBusStruct = MsgBusStruct,\r\n TChannel extends keyof TStruct = keyof TStruct,\r\n TGroup extends keyof TStruct[TChannel] = keyof TStruct[TChannel] // typeof $CG_IN\r\n> = Overwrite<\r\n MsgBusSubscriberParams<TStruct, TChannel, TGroup>,\r\n {\r\n // resolve\r\n callback?: (msg: Msg<TStruct, TChannel, TGroup>) => MaybePromise<OutStruct<TStruct, TChannel>>;\r\n }\r\n>;\r\n\r\n// MsgBusProviderFn\r\nexport type MsgBusProvider<TStruct extends MsgBusStruct> = <\r\n TChannel extends keyof TStruct,\r\n TGroup extends keyof TStruct[TChannel] = typeof $CG_IN\r\n>(\r\n params: MsgBusProviderParams<TStruct, TChannel, TGroup>\r\n) => void;\r\n\r\n// MsgBusBinderFn\r\nexport type MsgBusBinder<TStruct extends MsgBusStruct> = <\r\n TSourceChannel extends keyof TStruct,\r\n TTargetChannel extends keyof TStruct,\r\n TSourceGroup extends keyof TStruct[TSourceChannel] = typeof $CG_IN,\r\n TTargetGroup extends keyof TStruct[TTargetChannel] = typeof $CG_IN\r\n>(\r\n source: MsgBusSubscriberParams<TStruct, TSourceChannel, TSourceGroup>,\r\n target: MsgAddress<TStruct, TTargetChannel, TTargetGroup>\r\n) => void;\r\n\r\nexport type MsgBusDispatcherParams<\r\n TStruct extends MsgBusStruct = MsgBusStruct,\r\n TChannel extends keyof TStruct = keyof TStruct,\r\n TGroup extends keyof TStruct[TChannel] = keyof TStruct[TChannel] // typeof $CG_IN\r\n> = Overwrite<\r\n MsgBusSubscriberParams<TStruct, TChannel, TGroup>,\r\n {\r\n payload?: TGroup extends undefined ? InStruct<TStruct, TChannel> : TStruct[TChannel][TGroup];\r\n payloadFn?: IsTuple<TGroup extends undefined ? InStruct<TStruct, TChannel> : TStruct[TChannel][TGroup]> extends true\r\n ? (fn: (...args: TGroup extends undefined ? InStruct<TStruct, TChannel> : TStruct[TChannel][TGroup]) => void) => void\r\n : never;\r\n traceId?: string;\r\n priority?: number;\r\n persistent?: boolean;\r\n callback?: (msg: Msg<TStruct, TChannel, typeof $CG_OUT>) => void;\r\n }\r\n>;\r\n\r\nexport type MsgBusAsyncDispatcherParams<\r\n TStruct extends MsgBusStruct = MsgBusStruct,\r\n TChannel extends keyof TStruct = keyof TStruct,\r\n TGroup extends keyof TStruct[TChannel] = keyof TStruct[TChannel] // typeof $CG_IN\r\n> = Skip<MsgBusDispatcherParams<TStruct, TChannel, TGroup>, \"callback\">;\r\n\r\n// MsgBusDispatcherFn\r\nexport type MsgBusDispatcher<TStruct extends MsgBusStruct> = <\r\n TChannel extends keyof TStruct,\r\n TGroup extends keyof TStruct[TChannel] = typeof $CG_IN\r\n>(\r\n params: MsgBusDispatcherParams<TStruct, TChannel, TGroup>\r\n) => void;\r\n\r\n// MsgBusAsyncDispatcherFn\r\nexport type MsgBusAsyncDispatcher<TStruct extends MsgBusStruct> = <\r\n TChannel extends keyof TStruct,\r\n TGroup extends keyof TStruct[TChannel] = typeof $CG_IN\r\n>(\r\n params: MsgBusAsyncDispatcherParams<TStruct, TChannel, TGroup>\r\n) => Promise<Msg<TStruct, TChannel, typeof $CG_OUT>>;\r\n\r\nexport type MsgChannelStructNormalized<TStruct extends MsgChannelStruct> = {\r\n [G in keyof TStruct]: Awaited<TStruct[G]>;\r\n};\r\n\r\nexport type MsgBusStructNormalized<TStruct extends MsgBusStruct> = {\r\n [C in keyof TStruct]: MsgChannelStructNormalized<TStruct[C]>;\r\n};\r\n\r\n// export interface\r\nexport type MsgBus<TStruct extends MsgBusStruct> = {\r\n readonly config: MsgBusConfig<MsgBusStructNormalized<TStruct>>;\r\n // subscribe, listen\r\n readonly on: MsgBusSubscriber<MsgBusStructNormalized<TStruct>>;\r\n readonly onceAsync: MsgBusAsyncSubscriber<MsgBusStructNormalized<TStruct>>;\r\n // listenStream, consume, receive\r\n readonly stream: MsgBusStreamer<MsgBusStructNormalized<TStruct>>;\r\n // handle, resolve\r\n readonly provide: MsgBusProvider<MsgBusStructNormalized<TStruct>>;\r\n // link, connect\r\n // dispatch (emit/publish + subscribe)\r\n readonly dispatch: MsgBusDispatcher<MsgBusStructNormalized<TStruct>>;\r\n readonly dispatchAsync: MsgBusAsyncDispatcher<MsgBusStructNormalized<TStruct>>;\r\n};\r\n"],"names":["$CG_IN","$CG_OUT","$CG_ERROR","$C_ERROR"],"mappings":"AAMO,MAAMA,IAAS,MAETC,IAAU,OAEVC,IAAY,SAEZC,IAAW;"}
|
|
1
|
+
{"version":3,"file":"msgBusCore.es.js","sources":["../src/msgBusCore.ts"],"sourcesContent":["//##############################################################################\r\n//# Copyright (c) Pavel Borodaev 2022 #\r\n//##############################################################################\r\n// SafeBus\r\nimport { IsTuple, MaybePromise, Overwrite, Skip } from \"@actdim/utico/typeCore\";\r\n\r\nexport const $CG_IN = \"in\";\r\n\r\nexport const $CG_OUT = \"out\";\r\n\r\nexport const $CG_ERROR = \"error\";\r\n\r\nexport const $C_ERROR = \"error\";\r\n\r\nexport type InParam = {\r\n // [key in typeof $CG_IN]: any;\r\n [$CG_IN]: any;\r\n};\r\n\r\nexport type OutParam = {\r\n // [key in typeof $CG_OUT]: any;\r\n [$CG_OUT]: any;\r\n};\r\n\r\nexport type ErrorPayload = {\r\n error: any; // reason\r\n source?: any;\r\n handled?: boolean;\r\n};\r\n\r\nexport type ErrorParam<T extends ErrorPayload = ErrorPayload> = {\r\n // [key in typeof $CG_ERROR]: any;\r\n [$CG_ERROR]: T;\r\n};\r\n\r\n// ReservedChannelGroup\r\nexport type SystemChannelGroup = `${keyof InParam | keyof OutParam | keyof OutParam}`;\r\n\r\n// TODO:\r\n// Point-to-Point (P2P): direct messaging with targeted, address delivery (exactly one recipient)\r\n// Broadcast\r\n// Queue group: Load Balancing, Round-Robin, Fan-out, Fan-in\r\n// QoS\r\n// Message Filtering\r\n// Cross-tab message delivery:\r\n// https://www.sitepen.com/blog/cross-tab-synchronization-with-the-web-locks-api\r\n// https://developer.mozilla.org/en-US/docs/Web/API/Broadcast_Channel_API\r\n// LocalStorage\r\n// https://github.com/GoogleChromeLabs/comlink\r\n\r\n// MsgBusChannelStruct\r\nexport type MsgChannelStruct = Partial<{ [group: string]: any } & InParam & OutParam & ErrorParam>;\r\n\r\n// type MsgChannelStruct = { [group: string]: any } & (\r\n// | InParam\r\n// | OutParam\r\n// | (InParam & OutParam)\r\n// );\r\n\r\n// SystemMsgBusStruct\r\nexport type MsgBusStructBase = {\r\n [$C_ERROR]?: {\r\n [$CG_IN]: ErrorPayload;\r\n };\r\n // \"*\": {\r\n // [$CG_IN]: any;\r\n // };\r\n};\r\n\r\nexport type MsgBusStruct = {\r\n [channel: string]: MsgChannelStruct;\r\n} & MsgBusStructBase;\r\n\r\n// MsgBusStructBuilder\r\nexport type MsgBusStructFactory<\r\n TStruct extends TStructBase,\r\n TStructBase extends MsgBusStruct = MsgBusStruct\r\n> = {\r\n [C in keyof TStruct]: TStruct[C] & ErrorParam;\r\n };\r\n\r\n// export type MsgBusStruct = Record<string, MsgChannelStruct>;\r\n\r\nexport type InStruct<TStruct extends MsgBusStruct, TChannel extends keyof TStruct> = TStruct[TChannel] extends InParam\r\n ? TStruct[TChannel][\"in\"] // keyof InParam or typeof $CG_IN\r\n : undefined; // never\r\n\r\n// export type InStruct<\r\n// TStruct extends MsgBusStruct,\r\n// TChannel extends keyof TStruct\r\n// > = TStruct[TChannel] extends InParam ? TStruct[TChannel][\"in\"] : never;\r\n\r\nexport type OutStruct<TStruct extends MsgBusStruct, TChannel extends keyof TStruct> = TStruct[TChannel] extends OutParam\r\n ? TStruct[TChannel][keyof OutParam]\r\n : undefined;\r\n\r\n// export type OutStruct<\r\n// TStruct extends MsgBusStruct,\r\n// TChannel extends keyof TStruct\r\n// > = TStruct[TChannel] extends OutParam ? TStruct[TChannel][\"out\"] : never;\r\n\r\n// Options/Settings\r\nexport type MsgChannelConfig<TChannel> = {\r\n // (channel) message queue distribution and processing strategy\r\n replayCount?: number;\r\n initialValues?: { [TGroup in keyof TChannel]: TChannel[TGroup] };\r\n persistent?: boolean; // durable? (for durable queue)\r\n secure?: boolean; // encrypted\r\n federated?: boolean; // broadcasting\r\n autoDeleteTimeout?: number;\r\n noAck?: boolean; // noAutoAck\r\n // manualAck?: boolean;\r\n // prefetchCount?: number; // for manual acknowledgment\r\n // this can be used for some consumer or for all consumers of the channel\r\n maxConcurrentConsumers?: number; // Parallel? Processes? Handlers?\r\n replayBufferSize?: number;\r\n replayWindowTime?: number;\r\n};\r\n\r\nexport type MsgDispatchConfig = {\r\n // MsgConfig\r\n priority?: number;\r\n fetchCount?: number;\r\n abortSignal?: AbortSignal;\r\n};\r\n\r\nexport type MsgBusConfig<TStruct extends MsgBusStruct> = {\r\n [TChannel in keyof TStruct]?: MsgChannelConfig<TStruct[TChannel]>;\r\n}; // Record<string, MsgChannelConfig>\r\n\r\nexport type MsgAddress<\r\n TStruct extends MsgBusStruct = MsgBusStruct,\r\n TChannel extends keyof TStruct = keyof TStruct,\r\n TGroup extends keyof TStruct[TChannel] = keyof TStruct[TChannel] // typeof $CG_IN\r\n> = {\r\n channel: TChannel;\r\n group?: TGroup; // typeGroup\r\n // supports wildcard matching (https://docs.nats.io/nats-concepts/subjects#wildcards)\r\n topic?: string;\r\n version?: string;\r\n};\r\n\r\n// MsgEnvelope\r\nexport type Msg<\r\n TStruct extends MsgBusStruct = MsgBusStruct,\r\n TChannel extends keyof TStruct = keyof TStruct,\r\n TGroup extends keyof TStruct[TChannel] = keyof TStruct[TChannel]\r\n> = {\r\n address: MsgAddress<TStruct, TChannel, TGroup>;\r\n payload?: TGroup extends undefined ? InStruct<TStruct, TChannel> : TStruct[TChannel][TGroup];\r\n // status: MsgStatus;\r\n // inResponseToId\r\n requestId?: string;\r\n // correlationId\r\n traceId?: string;\r\n id?: string;\r\n timestamp: number; // Date\r\n priority?: number;\r\n persistent?: boolean; // durable? (for durable queue)\r\n};\r\n\r\n// TODO: support un(subscribing) via Deferred<bool>\r\n\r\nexport type MsgBusSubscriberParams<\r\n TStruct extends MsgBusStruct = MsgBusStruct,\r\n TChannel extends keyof TStruct = keyof TStruct,\r\n TGroup extends keyof TStruct[TChannel] = keyof TStruct[TChannel] // typeof $CG_IN\r\n> = MsgAddress<TStruct, TChannel, TGroup> & {\r\n channelSelector?: string | ((channel: string) => boolean);\r\n // topicSelector?: string | ((channel: string) => boolean);\r\n callback?: (msg: Msg<TStruct, TChannel, TGroup>) => void;\r\n config?: MsgDispatchConfig;\r\n filter?: (msg: Msg<TStruct, TChannel, TGroup>) => boolean; \r\n};\r\n\r\n// MsgBusSubscriberFn\r\nexport type MsgBusSubscriber<TStruct extends MsgBusStruct> = <\r\n TChannel extends keyof TStruct,\r\n TGroup extends keyof TStruct[TChannel] = typeof $CG_IN\r\n>(\r\n params: MsgBusSubscriberParams<TStruct, TChannel, TGroup>\r\n) => void;\r\n\r\n// MsgBusAsyncSubIterator(Fn)\r\nexport type MsgBusStreamer<TStruct extends MsgBusStruct> = <\r\n TChannel extends keyof TStruct,\r\n TGroup extends keyof TStruct[TChannel] = typeof $CG_IN\r\n>(\r\n params: MsgBusSubscriberParams<TStruct, TChannel, TGroup>\r\n) => AsyncIterableIterator<Msg<TStruct, TChannel, TGroup>>; // TGroup extends undefined ? typeof $CG_IN : TGroup\r\n\r\nexport type MsgBusAsyncSubscriberParams<\r\n TStruct extends MsgBusStruct = MsgBusStruct,\r\n TChannel extends keyof TStruct = keyof TStruct,\r\n TGroup extends keyof TStruct[TChannel] = keyof TStruct[TChannel] // typeof $CG_IN\r\n> = Skip<MsgBusSubscriberParams<TStruct, TChannel, TGroup>, \"callback\" | \"filter\">;\r\n\r\n// MsgBusAsyncSubscriberFn\r\nexport type MsgBusAsyncSubscriber<TStruct extends MsgBusStruct> = <\r\n TChannel extends keyof TStruct,\r\n TGroup extends keyof TStruct[TChannel] = typeof $CG_IN\r\n>(\r\n params: MsgBusAsyncSubscriberParams<TStruct, TChannel, TGroup>\r\n) => Promise<Msg<TStruct, TChannel, TGroup>>; // TGroup extends undefined ? typeof $CG_IN : TGroup\r\n\r\nexport type MsgBusProviderParams<\r\n TStruct extends MsgBusStruct = MsgBusStruct,\r\n TChannel extends keyof TStruct = keyof TStruct,\r\n TGroup extends keyof TStruct[TChannel] = keyof TStruct[TChannel] // typeof $CG_IN\r\n> = Overwrite<\r\n MsgBusSubscriberParams<TStruct, TChannel, TGroup>,\r\n {\r\n // resolve\r\n callback?: (msg: Msg<TStruct, TChannel, TGroup>) => MaybePromise<OutStruct<TStruct, TChannel>>;\r\n }\r\n>;\r\n\r\n// MsgBusProviderFn\r\nexport type MsgBusProvider<TStruct extends MsgBusStruct> = <\r\n TChannel extends keyof TStruct,\r\n TGroup extends keyof TStruct[TChannel] = typeof $CG_IN\r\n>(\r\n params: MsgBusProviderParams<TStruct, TChannel, TGroup>\r\n) => void;\r\n\r\n// MsgBusBinderFn\r\nexport type MsgBusBinder<TStruct extends MsgBusStruct> = <\r\n TSourceChannel extends keyof TStruct,\r\n TTargetChannel extends keyof TStruct,\r\n TSourceGroup extends keyof TStruct[TSourceChannel] = typeof $CG_IN,\r\n TTargetGroup extends keyof TStruct[TTargetChannel] = typeof $CG_IN\r\n>(\r\n source: MsgBusSubscriberParams<TStruct, TSourceChannel, TSourceGroup>,\r\n target: MsgAddress<TStruct, TTargetChannel, TTargetGroup>\r\n) => void;\r\n\r\nexport type MsgBusDispatcherParams<\r\n TStruct extends MsgBusStruct = MsgBusStruct,\r\n TChannel extends keyof TStruct = keyof TStruct,\r\n TGroup extends keyof TStruct[TChannel] = keyof TStruct[TChannel] // typeof $CG_IN\r\n> = Overwrite<\r\n MsgBusSubscriberParams<TStruct, TChannel, TGroup>,\r\n {\r\n payload?: TGroup extends undefined ? InStruct<TStruct, TChannel> : TStruct[TChannel][TGroup];\r\n payloadFn?: IsTuple<TGroup extends undefined ? InStruct<TStruct, TChannel> : TStruct[TChannel][TGroup]> extends true\r\n ? (fn: (...args: TGroup extends undefined ? InStruct<TStruct, TChannel> : TStruct[TChannel][TGroup]) => void) => void\r\n : never;\r\n traceId?: string;\r\n priority?: number;\r\n persistent?: boolean;\r\n callback?: (msg: Msg<TStruct, TChannel, typeof $CG_OUT>) => void;\r\n }\r\n>;\r\n\r\nexport type MsgBusAsyncDispatcherParams<\r\n TStruct extends MsgBusStruct = MsgBusStruct,\r\n TChannel extends keyof TStruct = keyof TStruct,\r\n TGroup extends keyof TStruct[TChannel] = keyof TStruct[TChannel] // typeof $CG_IN\r\n> = Skip<MsgBusDispatcherParams<TStruct, TChannel, TGroup>, \"callback\">;\r\n\r\n// MsgBusDispatcherFn\r\nexport type MsgBusDispatcher<TStruct extends MsgBusStruct> = <\r\n TChannel extends keyof TStruct,\r\n TGroup extends keyof TStruct[TChannel] = typeof $CG_IN\r\n>(\r\n params: MsgBusDispatcherParams<TStruct, TChannel, TGroup>\r\n) => void;\r\n\r\n// MsgBusAsyncDispatcherFn\r\nexport type MsgBusAsyncDispatcher<TStruct extends MsgBusStruct> = <\r\n TChannel extends keyof TStruct,\r\n TGroup extends keyof TStruct[TChannel] = typeof $CG_IN\r\n>(\r\n params: MsgBusAsyncDispatcherParams<TStruct, TChannel, TGroup>\r\n) => Promise<Msg<TStruct, TChannel, typeof $CG_OUT>>;\r\n\r\nexport type MsgChannelStructNormalized<TStruct extends MsgChannelStruct> = {\r\n [G in keyof TStruct]: Awaited<TStruct[G]>;\r\n};\r\n\r\nexport type MsgBusStructNormalized<TStruct extends MsgBusStruct> = {\r\n [C in keyof TStruct]: MsgChannelStructNormalized<TStruct[C]>;\r\n};\r\n\r\n// export interface\r\nexport type MsgBus<TStruct extends MsgBusStruct> = {\r\n readonly config: MsgBusConfig<MsgBusStructNormalized<TStruct>>;\r\n // subscribe, listen\r\n readonly on: MsgBusSubscriber<MsgBusStructNormalized<TStruct>>;\r\n readonly onceAsync: MsgBusAsyncSubscriber<MsgBusStructNormalized<TStruct>>;\r\n // listenStream, consume, receive\r\n readonly stream: MsgBusStreamer<MsgBusStructNormalized<TStruct>>;\r\n // handle, resolve\r\n readonly provide: MsgBusProvider<MsgBusStructNormalized<TStruct>>;\r\n // link, connect\r\n // dispatch (emit/publish + subscribe)\r\n readonly dispatch: MsgBusDispatcher<MsgBusStructNormalized<TStruct>>;\r\n readonly dispatchAsync: MsgBusAsyncDispatcher<MsgBusStructNormalized<TStruct>>;\r\n};\r\n"],"names":["$CG_IN","$CG_OUT","$CG_ERROR","$C_ERROR"],"mappings":"AAMO,MAAMA,IAAS,MAETC,IAAU,OAEVC,IAAY,SAEZC,IAAW;"}
|
package/dist/msgBusFactory.d.ts
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import { MsgBus, MsgBusStruct, MsgBusConfig, MsgBusStructNormalized
|
|
2
|
-
export declare function createMsgBus<TStruct extends MsgBusStruct
|
|
1
|
+
import { MsgBus, MsgBusStruct, MsgBusConfig, MsgBusStructNormalized } from './msgBusCore';
|
|
2
|
+
export declare function createMsgBus<TStruct extends MsgBusStruct>(config?: MsgBusConfig<MsgBusStructNormalized<TStruct>>): MsgBus<TStruct>;
|
|
3
3
|
//# sourceMappingURL=msgBusFactory.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"msgBusFactory.d.ts","sourceRoot":"","sources":["../src/msgBusFactory.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,MAAM,EACN,YAAY,EAIZ,YAAY,EAMZ,sBAAsB,
|
|
1
|
+
{"version":3,"file":"msgBusFactory.d.ts","sourceRoot":"","sources":["../src/msgBusFactory.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,MAAM,EACN,YAAY,EAIZ,YAAY,EAMZ,sBAAsB,EAGzB,MAAM,cAAc,CAAC;AAyBtB,wBAAgB,YAAY,CAAC,OAAO,SAAS,YAAY,EAAE,MAAM,CAAC,EAAE,YAAY,CAAC,sBAAsB,CAAC,OAAO,CAAC,CAAC,mBAuThH"}
|
package/dist/msgBusFactory.es.js
CHANGED
|
@@ -1,20 +1,20 @@
|
|
|
1
|
-
import { $CG_IN as
|
|
2
|
-
import { v4 as
|
|
3
|
-
import { ReplaySubject as
|
|
4
|
-
import { filter as
|
|
5
|
-
const
|
|
1
|
+
import { $CG_IN as g, $CG_ERROR as T, $C_ERROR as B, $CG_OUT as C } from "./msgBusCore.es.js";
|
|
2
|
+
import { v4 as h } from "uuid";
|
|
3
|
+
import { ReplaySubject as O, Subject as W } from "rxjs";
|
|
4
|
+
import { filter as q, take as A } from "rxjs/operators";
|
|
5
|
+
const L = (c) => {
|
|
6
6
|
if (c == null)
|
|
7
|
-
return (
|
|
7
|
+
return (i) => i == c;
|
|
8
8
|
if (c.startsWith("/") && c.endsWith("/")) {
|
|
9
9
|
c = c.substring(1, c.length - 1);
|
|
10
|
-
const
|
|
11
|
-
return (
|
|
10
|
+
const i = new RegExp(c);
|
|
11
|
+
return (u) => i.test(u);
|
|
12
12
|
} else
|
|
13
|
-
return (
|
|
14
|
-
},
|
|
15
|
-
function
|
|
16
|
-
const
|
|
17
|
-
function
|
|
13
|
+
return (i) => c === i;
|
|
14
|
+
}, M = ":";
|
|
15
|
+
function K(c) {
|
|
16
|
+
const i = "msgbus";
|
|
17
|
+
function u() {
|
|
18
18
|
return Date.now();
|
|
19
19
|
}
|
|
20
20
|
function $(e) {
|
|
@@ -28,150 +28,152 @@ function F(c) {
|
|
|
28
28
|
persistent: e.persistent
|
|
29
29
|
};
|
|
30
30
|
}
|
|
31
|
-
function
|
|
32
|
-
const
|
|
31
|
+
function b(e, o) {
|
|
32
|
+
const n = {
|
|
33
33
|
error: o,
|
|
34
34
|
source: $(e)
|
|
35
35
|
};
|
|
36
|
-
let
|
|
37
|
-
|
|
36
|
+
let t;
|
|
37
|
+
t = {
|
|
38
38
|
address: {
|
|
39
39
|
channel: e.address.channel,
|
|
40
|
-
group:
|
|
41
|
-
topic:
|
|
40
|
+
group: T,
|
|
41
|
+
topic: i
|
|
42
42
|
},
|
|
43
|
-
payload:
|
|
44
|
-
},
|
|
43
|
+
payload: n
|
|
44
|
+
}, p(t), t = {
|
|
45
45
|
address: {
|
|
46
|
-
channel:
|
|
47
|
-
group:
|
|
48
|
-
topic:
|
|
46
|
+
channel: B,
|
|
47
|
+
group: g,
|
|
48
|
+
topic: i
|
|
49
49
|
},
|
|
50
|
-
payload:
|
|
51
|
-
},
|
|
50
|
+
payload: n
|
|
51
|
+
}, p(t);
|
|
52
52
|
}
|
|
53
|
-
const
|
|
53
|
+
const a = /* @__PURE__ */ new Map();
|
|
54
54
|
function E(e, o) {
|
|
55
|
-
return `${e}${
|
|
55
|
+
return `${e}${M}${o}`;
|
|
56
56
|
}
|
|
57
|
-
function
|
|
58
|
-
const
|
|
59
|
-
if (!
|
|
60
|
-
let
|
|
61
|
-
const
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
57
|
+
function y(e, o) {
|
|
58
|
+
const n = E(e, o);
|
|
59
|
+
if (!a.has(n)) {
|
|
60
|
+
let t = null;
|
|
61
|
+
const r = c[e];
|
|
62
|
+
r && (r.replayBufferSize != null || r.replayWindowTime != null) && (t = new O(r.replayBufferSize == null ? 1 / 0 : r.replayBufferSize, r.replayWindowTime == null ? 1 / 0 : r.replayWindowTime)), t || (t = new W()), a.set(
|
|
63
|
+
n,
|
|
64
|
+
t
|
|
65
65
|
);
|
|
66
66
|
}
|
|
67
|
-
return
|
|
67
|
+
return a.get(n);
|
|
68
68
|
}
|
|
69
|
-
function
|
|
70
|
-
const o = String(e.channel),
|
|
71
|
-
(
|
|
69
|
+
function f(e) {
|
|
70
|
+
const o = String(e.channel), n = e.group == null ? g : String(e.group), t = y(o, n), r = L(e.topic), s = q(
|
|
71
|
+
(d) => (
|
|
72
72
|
// msg.address.channel === channel &&
|
|
73
73
|
// msg.address.group === group &&
|
|
74
|
-
|
|
74
|
+
r(d.address.topic) && (!e.filter || e.filter(d))
|
|
75
75
|
)
|
|
76
76
|
);
|
|
77
|
-
let
|
|
78
|
-
e.config?.fetchCount ?
|
|
79
|
-
const
|
|
80
|
-
next: (
|
|
77
|
+
let l;
|
|
78
|
+
e.config?.fetchCount ? l = t.pipe(s, A(e.config.fetchCount)) : l = t.pipe(s);
|
|
79
|
+
const j = l.subscribe({
|
|
80
|
+
next: (d) => {
|
|
81
81
|
try {
|
|
82
|
-
return e.callback(
|
|
83
|
-
} catch (
|
|
84
|
-
|
|
82
|
+
return e.callback(d);
|
|
83
|
+
} catch (x) {
|
|
84
|
+
b(d, x);
|
|
85
85
|
}
|
|
86
86
|
},
|
|
87
|
-
error: (
|
|
88
|
-
|
|
87
|
+
error: (d) => {
|
|
88
|
+
b(
|
|
89
89
|
{
|
|
90
90
|
address: {
|
|
91
91
|
channel: o,
|
|
92
|
-
group:
|
|
92
|
+
group: n,
|
|
93
93
|
topic: e.topic
|
|
94
94
|
},
|
|
95
95
|
id: void 0,
|
|
96
96
|
// not a real message
|
|
97
|
-
timestamp:
|
|
97
|
+
timestamp: u()
|
|
98
98
|
},
|
|
99
|
-
|
|
99
|
+
d
|
|
100
100
|
);
|
|
101
101
|
},
|
|
102
102
|
complete: () => {
|
|
103
103
|
}
|
|
104
|
-
});
|
|
105
|
-
|
|
104
|
+
}), S = e.config?.abortSignal;
|
|
105
|
+
S?.addEventListener("abort", (d) => {
|
|
106
106
|
console.log(
|
|
107
|
-
`Listening aborted for channel: ${o}, group: ${
|
|
108
|
-
|
|
107
|
+
`Listening aborted for channel: ${o}, group: ${n}, topic: ${e.topic}. Reason: ${S.reason}`
|
|
108
|
+
// e.target
|
|
109
|
+
), j.unsubscribe();
|
|
109
110
|
});
|
|
110
111
|
}
|
|
111
|
-
function
|
|
112
|
+
function p(e) {
|
|
112
113
|
const o = {
|
|
113
114
|
...e,
|
|
114
|
-
timestamp:
|
|
115
|
+
timestamp: u()
|
|
115
116
|
};
|
|
116
|
-
o.id == null && (o.id =
|
|
117
|
-
const
|
|
118
|
-
o.address.group == null && (o.address.group =
|
|
119
|
-
const
|
|
120
|
-
return
|
|
117
|
+
o.id == null && (o.id = h()), o.traceId == null && (o.traceId = h());
|
|
118
|
+
const n = String(o.address.channel);
|
|
119
|
+
o.address.group == null && (o.address.group = g);
|
|
120
|
+
const t = String(o.address.group);
|
|
121
|
+
return y(n, t).next(o), o;
|
|
121
122
|
}
|
|
122
123
|
function I(e) {
|
|
123
|
-
|
|
124
|
+
f(e);
|
|
124
125
|
}
|
|
125
126
|
function R(e) {
|
|
126
|
-
return new Promise((o,
|
|
127
|
+
return new Promise((o, n) => {
|
|
127
128
|
try {
|
|
128
|
-
e.
|
|
129
|
-
|
|
129
|
+
const t = e.config?.abortSignal;
|
|
130
|
+
t?.addEventListener("abort", (s) => {
|
|
131
|
+
n(new Error("Cancelled", { cause: t.reason }));
|
|
130
132
|
});
|
|
131
|
-
const
|
|
133
|
+
const r = {
|
|
132
134
|
...e,
|
|
133
135
|
config: {
|
|
134
136
|
...e.config,
|
|
135
137
|
fetchCount: 1
|
|
136
138
|
},
|
|
137
|
-
callback: (
|
|
138
|
-
o(
|
|
139
|
+
callback: (s) => {
|
|
140
|
+
o(s);
|
|
139
141
|
}
|
|
140
142
|
};
|
|
141
|
-
|
|
142
|
-
} catch (
|
|
143
|
-
t
|
|
143
|
+
f(r);
|
|
144
|
+
} catch (t) {
|
|
145
|
+
n(t);
|
|
144
146
|
}
|
|
145
147
|
});
|
|
146
148
|
}
|
|
147
|
-
function
|
|
149
|
+
function k(e) {
|
|
148
150
|
const o = {
|
|
149
151
|
...e,
|
|
150
|
-
callback: async (
|
|
152
|
+
callback: async (n) => {
|
|
151
153
|
try {
|
|
152
|
-
const
|
|
154
|
+
const t = {
|
|
153
155
|
address: {
|
|
154
|
-
channel:
|
|
156
|
+
channel: n.address.channel,
|
|
155
157
|
group: C,
|
|
156
|
-
topic:
|
|
158
|
+
topic: n.address.topic
|
|
157
159
|
},
|
|
158
|
-
traceId:
|
|
159
|
-
requestId:
|
|
160
|
-
persistent:
|
|
161
|
-
priority:
|
|
162
|
-
},
|
|
163
|
-
|
|
164
|
-
} catch (
|
|
165
|
-
|
|
160
|
+
traceId: n.traceId,
|
|
161
|
+
requestId: n.id,
|
|
162
|
+
persistent: n.persistent,
|
|
163
|
+
priority: n.priority
|
|
164
|
+
}, r = await Promise.resolve(e.callback(n));
|
|
165
|
+
t.payload = r, p(t);
|
|
166
|
+
} catch (t) {
|
|
167
|
+
b(n, t);
|
|
166
168
|
}
|
|
167
169
|
}
|
|
168
170
|
};
|
|
169
|
-
|
|
171
|
+
f(o);
|
|
170
172
|
}
|
|
171
173
|
function v(e) {
|
|
172
|
-
const o =
|
|
174
|
+
const o = h();
|
|
173
175
|
if (e.callback) {
|
|
174
|
-
const
|
|
176
|
+
const t = {
|
|
175
177
|
channel: e.channel,
|
|
176
178
|
group: C,
|
|
177
179
|
topic: e.topic,
|
|
@@ -179,48 +181,49 @@ function F(c) {
|
|
|
179
181
|
...e.config,
|
|
180
182
|
fetchCount: 1
|
|
181
183
|
},
|
|
182
|
-
callback: (
|
|
183
|
-
e.callback(
|
|
184
|
+
callback: (r) => {
|
|
185
|
+
e.callback(r);
|
|
184
186
|
},
|
|
185
|
-
filter: (
|
|
187
|
+
filter: (r) => r.requestId === o && (!e.filter || e.filter(r))
|
|
186
188
|
};
|
|
187
|
-
|
|
189
|
+
f(t);
|
|
188
190
|
}
|
|
189
|
-
let
|
|
190
|
-
e.payloadFn ? e.payloadFn((
|
|
191
|
-
|
|
192
|
-
}) :
|
|
191
|
+
let n;
|
|
192
|
+
e.payloadFn ? e.payloadFn((t) => {
|
|
193
|
+
n = t;
|
|
194
|
+
}) : n = e.payload, p({
|
|
193
195
|
address: {
|
|
194
196
|
channel: e.channel,
|
|
195
197
|
group: e.group,
|
|
196
198
|
topic: e.topic
|
|
197
199
|
},
|
|
198
|
-
payload:
|
|
200
|
+
payload: n,
|
|
199
201
|
traceId: e.traceId,
|
|
200
202
|
persistent: e.persistent,
|
|
201
203
|
priority: e.priority,
|
|
202
204
|
id: o
|
|
203
205
|
});
|
|
204
206
|
}
|
|
205
|
-
async function
|
|
206
|
-
return new Promise((o,
|
|
207
|
+
async function P(e) {
|
|
208
|
+
return new Promise((o, n) => {
|
|
207
209
|
try {
|
|
208
|
-
e.
|
|
209
|
-
|
|
210
|
+
const t = e.config?.abortSignal;
|
|
211
|
+
t?.addEventListener("abort", (s) => {
|
|
212
|
+
n(new Error("Cancelled", { cause: t.reason }));
|
|
210
213
|
});
|
|
211
|
-
const
|
|
214
|
+
const r = {
|
|
212
215
|
...e,
|
|
213
|
-
callback: (
|
|
216
|
+
callback: (s) => {
|
|
214
217
|
try {
|
|
215
|
-
o(
|
|
216
|
-
} catch (
|
|
217
|
-
|
|
218
|
+
o(s);
|
|
219
|
+
} catch (l) {
|
|
220
|
+
n(l);
|
|
218
221
|
}
|
|
219
222
|
}
|
|
220
223
|
};
|
|
221
|
-
v(
|
|
222
|
-
} catch (
|
|
223
|
-
t
|
|
224
|
+
v(r);
|
|
225
|
+
} catch (t) {
|
|
226
|
+
n(t);
|
|
224
227
|
}
|
|
225
228
|
});
|
|
226
229
|
}
|
|
@@ -231,13 +234,13 @@ function F(c) {
|
|
|
231
234
|
stream: (e) => {
|
|
232
235
|
throw new Error("Not implemented");
|
|
233
236
|
},
|
|
234
|
-
provide: (e) =>
|
|
237
|
+
provide: (e) => k(e),
|
|
235
238
|
dispatch: (e) => v(e),
|
|
236
|
-
dispatchAsync: (e) =>
|
|
239
|
+
dispatchAsync: (e) => P(e)
|
|
237
240
|
};
|
|
238
|
-
return w["#subjects"] =
|
|
241
|
+
return w["#subjects"] = a, w;
|
|
239
242
|
}
|
|
240
243
|
export {
|
|
241
|
-
|
|
244
|
+
K as createMsgBus
|
|
242
245
|
};
|
|
243
246
|
//# sourceMappingURL=msgBusFactory.es.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"msgBusFactory.es.js","sources":["D:/Src/my/actdim/public/msgmesh/src/msgBusFactory.ts"],"sourcesContent":["import {\r\n MsgBus,\r\n MsgBusStruct,\r\n Msg,\r\n $CG_IN,\r\n $CG_OUT,\r\n MsgBusConfig,\r\n MsgBusSubscriberParams,\r\n MsgBusAsyncSubscriberParams,\r\n MsgBusProviderParams,\r\n MsgBusDispatcherParams,\r\n MsgBusAsyncDispatcherParams,\r\n MsgBusStructNormalized,\r\n $CG_ERROR,\r\n MsgBusStructBase,\r\n $C_ERROR\r\n} from \"./msgBusCore\";\r\nimport { v4 as uuid } from \"uuid\";\r\nimport { MonoTypeOperatorFunction, Observable, Subject, ReplaySubject } from \"rxjs\";\r\nimport { filter, filter as filterOp, take as takeOp } from \"rxjs/operators\";\r\nimport { Skip } from \"@actdim/utico/typeCore\";\r\n\r\nconst getMatchTest = (pattern: string) => {\r\n if (pattern == undefined) {\r\n // return (value: string) => true;\r\n return (value: string) => value == pattern;\r\n }\r\n if (pattern.startsWith(\"/\") && pattern.endsWith(\"/\")) {\r\n pattern = pattern.substring(1, pattern.length - 1);\r\n const regexp = new RegExp(pattern);\r\n return (value: string) => regexp.test(value);\r\n } else {\r\n return (value: string) => pattern === value;\r\n }\r\n};\r\n\r\n// see also https://www.npmjs.com/package/p-queue\r\n// https://github.com/postaljs/postal.js\r\n\r\n// createServiceBus\r\nconst groupPrefix = \":\"; // \"/\", \":\", \"::\"\r\nexport function createMsgBus<TStruct extends MsgBusStruct & MsgBusStructBase>(config?: MsgBusConfig<MsgBusStructNormalized<TStruct>>) {\r\n type TStructN = MsgBusStructNormalized<TStruct>;\r\n type MsgSrcData = Skip<Msg<TStructN>, \"timestamp\">;\r\n type MsgInfo = Skip<Msg<TStructN>, \"payload\">;\r\n const errTopic = \"msgbus\";\r\n\r\n function now() {\r\n return Date.now(); // new Date().getTime() or +new Date()\r\n }\r\n\r\n function getMsgInfo(msg: Msg<TStructN>) {\r\n return {\r\n address: msg.address,\r\n requestId: msg.requestId,\r\n traceId: msg.traceId,\r\n id: msg.id,\r\n timestamp: msg.timestamp,\r\n priority: msg.priority,\r\n persistent: msg.persistent\r\n } as MsgInfo;\r\n }\r\n\r\n function handleError(srcMsg: Msg<TStructN>, err: any) {\r\n const errPayload = {\r\n error: err,\r\n source: getMsgInfo(srcMsg)\r\n } as MsgSrcData[\"payload\"];\r\n let errMsg: MsgSrcData;\r\n errMsg = {\r\n address: {\r\n channel: srcMsg.address.channel,\r\n group: $CG_ERROR,\r\n topic: errTopic\r\n },\r\n payload: errPayload\r\n };\r\n publish(errMsg);\r\n errMsg = {\r\n address: {\r\n channel: $C_ERROR,\r\n group: $CG_IN,\r\n topic: errTopic\r\n },\r\n payload: errPayload\r\n };\r\n publish(errMsg);\r\n }\r\n // observables\r\n const subjects: Map<string, Subject<Msg<TStructN>>> = new Map();\r\n\r\n function createRoutingKey(channel: string, group: string) {\r\n return `${channel}${groupPrefix}${group}`;\r\n }\r\n\r\n function getOrCreateSubject(channel: string, group: string): Subject<Msg<TStructN>> {\r\n const routingKey = createRoutingKey(channel, group);\r\n // TODO: support BehaviorSubject\r\n if (!subjects.has(routingKey)) {\r\n let subject: Subject<Msg<TStructN>> = null;\r\n const channelConfig = config[channel];\r\n if (channelConfig) { \r\n if (channelConfig.replayBufferSize != undefined || channelConfig.replayWindowTime != undefined) {\r\n subject = new ReplaySubject<Msg<TStructN>>(channelConfig.replayBufferSize == undefined ? Infinity : channelConfig.replayBufferSize, channelConfig.replayWindowTime == undefined ? Infinity : channelConfig.replayWindowTime);\r\n }\r\n }\r\n if (!subject) {\r\n subject = new Subject<Msg<TStructN>>();\r\n }\r\n subjects.set(routingKey,\r\n subject\r\n );\r\n }\r\n return subjects.get(routingKey);\r\n }\r\n\r\n function subscribe(params: MsgBusSubscriberParams<TStructN>) {\r\n // TODO: use [channel, group] as key?\r\n\r\n const channel = String(params.channel);\r\n\r\n const group = params.group == undefined ? $CG_IN : String(params.group);\r\n\r\n const subject = getOrCreateSubject(channel, group);\r\n\r\n const match = getMatchTest(params.topic);\r\n\r\n const fOp: MonoTypeOperatorFunction<Msg<TStructN>> = filterOp(\r\n (msg) =>\r\n // msg.address.channel === channel &&\r\n // msg.address.group === group &&\r\n match(msg.address.topic) && (!params.filter || params.filter(msg))\r\n );\r\n\r\n let observable: Observable<Msg<TStructN>>;\r\n // groupBy?\r\n // mergeMap?\r\n // timeout, takeUntil, time?\r\n if (params.config?.fetchCount) {\r\n observable = subject.pipe(fOp, takeOp(params.config.fetchCount));\r\n } else {\r\n observable = subject.pipe(fOp);\r\n }\r\n\r\n const sub = observable.subscribe({\r\n next: (msg: Msg<TStructN>) => {\r\n try {\r\n return params.callback(msg);\r\n } catch (err) {\r\n handleError(msg, err);\r\n // throw err;\r\n }\r\n },\r\n error: (err) => {\r\n handleError(\r\n {\r\n address: {\r\n channel: channel,\r\n group: group,\r\n topic: params.topic\r\n },\r\n id: undefined, // not a real message\r\n timestamp: now()\r\n },\r\n err\r\n );\r\n },\r\n complete: () => {\r\n // cleanup\r\n }\r\n });\r\n\r\n params.signal?.addEventListener(\"abort\", () => {\r\n // TODO: publish debug (internal) message\r\n console.log(\r\n `Listening aborted for channel: ${channel}, group: ${group}, topic: ${params.topic}. Reason: ${params.signal.reason}`\r\n );\r\n sub.unsubscribe();\r\n });\r\n }\r\n\r\n function publish(msgData: MsgSrcData) {\r\n const msg: Msg<TStructN, any, any> = {\r\n ...msgData,\r\n timestamp: now()\r\n };\r\n if (msg.id == undefined) {\r\n msg.id = uuid();\r\n }\r\n // !msg.traceId\r\n if (msg.traceId == undefined) {\r\n msg.traceId = uuid();\r\n }\r\n const channel = String(msg.address.channel);\r\n if (msg.address.group == undefined) {\r\n msg.address.group = $CG_IN;\r\n }\r\n const group = String(msg.address.group);\r\n const subject = getOrCreateSubject(channel, group);\r\n subject.next(msg);\r\n return msg;\r\n }\r\n\r\n function on(params: MsgBusSubscriberParams<TStructN>) {\r\n subscribe(params);\r\n }\r\n\r\n function onceAsync(params: MsgBusAsyncSubscriberParams<TStructN>) {\r\n return new Promise<any>((res, rej) => {\r\n try {\r\n params.signal?.addEventListener(\"abort\", () => {\r\n rej(new Error(\"Cancelled\", { cause: params.signal.reason }));\r\n });\r\n const subParams: MsgBusSubscriberParams<TStructN> = {\r\n ...params,\r\n ...{\r\n config: {\r\n ...params.config,\r\n ...{\r\n fetchCount: 1\r\n }\r\n },\r\n callback: (msg) => {\r\n // sub.unsubscribe();\r\n res(msg);\r\n }\r\n }\r\n };\r\n subscribe(subParams);\r\n } catch (e) {\r\n rej(e);\r\n }\r\n });\r\n }\r\n\r\n function provide(params: MsgBusProviderParams<TStructN>) {\r\n const subParams: MsgBusSubscriberParams<TStructN> = {\r\n ...params,\r\n ...{\r\n callback: async (msgIn) => {\r\n try {\r\n const msgOut: MsgSrcData = {\r\n address: {\r\n channel: msgIn.address.channel,\r\n group: $CG_OUT,\r\n topic: msgIn.address.topic\r\n },\r\n traceId: msgIn.traceId,\r\n requestId: msgIn.id,\r\n persistent: msgIn.persistent,\r\n priority: msgIn.priority\r\n };\r\n const payload = (await Promise.resolve(params.callback(msgIn))) as MsgSrcData[\"payload\"];\r\n msgOut.payload = payload;\r\n publish(msgOut);\r\n } catch (err) {\r\n handleError(msgIn, err);\r\n // throw err;\r\n }\r\n }\r\n }\r\n };\r\n subscribe(subParams);\r\n }\r\n\r\n function dispatch(params: MsgBusDispatcherParams<TStructN>) {\r\n let msgIn: Msg<TStructN>;\r\n const msgId = uuid();\r\n if (params.callback) {\r\n const subParams: MsgBusSubscriberParams<TStructN, keyof TStructN, typeof $CG_OUT> = {\r\n channel: params.channel,\r\n group: $CG_OUT,\r\n topic: params.topic,\r\n config: {\r\n ...params.config,\r\n ...{\r\n fetchCount: 1\r\n }\r\n },\r\n callback: (msgOut) => {\r\n // sub.unsubscribe();\r\n params.callback(msgOut);\r\n },\r\n filter: (msgOut) => {\r\n return msgOut.requestId === msgId && (!params.filter || params.filter(msgOut)) // TODO: match topic?\r\n }\r\n };\r\n subscribe(subParams);\r\n }\r\n let payload: any;\r\n if (params.payloadFn) {\r\n params.payloadFn((args) => {\r\n payload = args;\r\n });\r\n } else {\r\n payload = params.payload;\r\n }\r\n msgIn = publish({\r\n address: {\r\n channel: params.channel,\r\n group: params.group,\r\n topic: params.topic\r\n },\r\n payload: payload,\r\n traceId: params.traceId,\r\n persistent: params.persistent,\r\n priority: params.priority,\r\n id: msgId\r\n });\r\n }\r\n\r\n async function dispatchAsync(params: MsgBusAsyncDispatcherParams<TStructN>): Promise<any> {\r\n return new Promise((res, rej) => {\r\n try {\r\n params.signal?.addEventListener(\"abort\", () => {\r\n rej(new Error(\"Cancelled\", { cause: params.signal.reason }));\r\n });\r\n const dispatchParams: MsgBusDispatcherParams<TStructN> = {\r\n ...params,\r\n callback: (msg) => {\r\n try {\r\n res(msg);\r\n } catch (err) {\r\n rej(err);\r\n }\r\n }\r\n };\r\n dispatch(dispatchParams);\r\n } catch (err) {\r\n rej(err);\r\n }\r\n });\r\n }\r\n\r\n const msgBus: MsgBus<TStruct> = {\r\n config: config,\r\n on: (params) => on(params as MsgBusSubscriberParams<TStructN>),\r\n onceAsync: (params) => onceAsync(params as MsgBusAsyncSubscriberParams<TStructN>),\r\n stream: (params) => {\r\n throw new Error(\"Not implemented\");\r\n },\r\n provide: (params) => provide(params as MsgBusProviderParams<TStructN>),\r\n dispatch: (params) => dispatch(params as MsgBusDispatcherParams<TStructN>),\r\n dispatchAsync: (params) => dispatchAsync(params as MsgBusAsyncDispatcherParams<TStructN>),\r\n };\r\n\r\n msgBus[\"#subjects\"] = subjects;\r\n\r\n return msgBus;\r\n}\r\n\r\n// class MessageBus<TStruct extends MsgBusStruct>\r\n// implements IMsgBus<TStruct>\r\n// {\r\n// constructor() {}\r\n// // ...\r\n// }\r\n"],"names":["getMatchTest","pattern","value","regexp","groupPrefix","createMsgBus","config","errTopic","now","getMsgInfo","msg","handleError","srcMsg","err","errPayload","errMsg","$CG_ERROR","publish","$C_ERROR","$CG_IN","subjects","createRoutingKey","channel","group","getOrCreateSubject","routingKey","subject","channelConfig","ReplaySubject","Subject","subscribe","params","match","fOp","filterOp","observable","takeOp","sub","msgData","uuid","on","onceAsync","res","rej","subParams","e","provide","msgIn","msgOut","$CG_OUT","payload","dispatch","msgId","args","dispatchAsync","dispatchParams","msgBus"],"mappings":";;;;AAsBA,MAAMA,IAAe,CAACC,MAAoB;AACtC,MAAIA,KAAW;AAEX,WAAO,CAACC,MAAkBA,KAASD;AAEvC,MAAIA,EAAQ,WAAW,GAAG,KAAKA,EAAQ,SAAS,GAAG,GAAG;AAClD,IAAAA,IAAUA,EAAQ,UAAU,GAAGA,EAAQ,SAAS,CAAC;AACjD,UAAME,IAAS,IAAI,OAAOF,CAAO;AACjC,WAAO,CAACC,MAAkBC,EAAO,KAAKD,CAAK;AAAA,EAC/C;AACI,WAAO,CAACA,MAAkBD,MAAYC;AAE9C,GAMME,IAAc;AACb,SAASC,EAA8DC,GAAwD;AAIlI,QAAMC,IAAW;AAEjB,WAASC,IAAM;AACX,WAAO,KAAK,IAAA;AAAA,EAChB;AAEA,WAASC,EAAWC,GAAoB;AACpC,WAAO;AAAA,MACH,SAASA,EAAI;AAAA,MACb,WAAWA,EAAI;AAAA,MACf,SAASA,EAAI;AAAA,MACb,IAAIA,EAAI;AAAA,MACR,WAAWA,EAAI;AAAA,MACf,UAAUA,EAAI;AAAA,MACd,YAAYA,EAAI;AAAA,IAAA;AAAA,EAExB;AAEA,WAASC,EAAYC,GAAuBC,GAAU;AAClD,UAAMC,IAAa;AAAA,MACf,OAAOD;AAAA,MACP,QAAQJ,EAAWG,CAAM;AAAA,IAAA;AAE7B,QAAIG;AACJ,IAAAA,IAAS;AAAA,MACL,SAAS;AAAA,QACL,SAASH,EAAO,QAAQ;AAAA,QACxB,OAAOI;AAAA,QACP,OAAOT;AAAA,MAAA;AAAA,MAEX,SAASO;AAAA,IAAA,GAEbG,EAAQF,CAAM,GACdA,IAAS;AAAA,MACL,SAAS;AAAA,QACL,SAASG;AAAA,QACT,OAAOC;AAAA,QACP,OAAOZ;AAAA,MAAA;AAAA,MAEX,SAASO;AAAA,IAAA,GAEbG,EAAQF,CAAM;AAAA,EAClB;AAEA,QAAMK,wBAAoD,IAAA;AAE1D,WAASC,EAAiBC,GAAiBC,GAAe;AACtD,WAAO,GAAGD,CAAO,GAAGlB,CAAW,GAAGmB,CAAK;AAAA,EAC3C;AAEA,WAASC,EAAmBF,GAAiBC,GAAuC;AAChF,UAAME,IAAaJ,EAAiBC,GAASC,CAAK;AAElD,QAAI,CAACH,EAAS,IAAIK,CAAU,GAAG;AAC3B,UAAIC,IAAkC;AACtC,YAAMC,IAAgBrB,EAAOgB,CAAO;AACpC,MAAIK,MACIA,EAAc,oBAAoB,QAAaA,EAAc,oBAAoB,UACjFD,IAAU,IAAIE,EAA6BD,EAAc,oBAAoB,OAAY,QAAWA,EAAc,kBAAkBA,EAAc,oBAAoB,OAAY,QAAWA,EAAc,gBAAgB,IAG9ND,MACDA,IAAU,IAAIG,EAAA,IAElBT,EAAS;AAAA,QAAIK;AAAA,QACTC;AAAA,MAAA;AAAA,IAER;AACA,WAAON,EAAS,IAAIK,CAAU;AAAA,EAClC;AAEA,WAASK,EAAUC,GAA0C;AAGzD,UAAMT,IAAU,OAAOS,EAAO,OAAO,GAE/BR,IAAQQ,EAAO,SAAS,OAAYZ,IAAS,OAAOY,EAAO,KAAK,GAEhEL,IAAUF,EAAmBF,GAASC,CAAK,GAE3CS,IAAQhC,EAAa+B,EAAO,KAAK,GAEjCE,IAA+CC;AAAAA,MACjD,CAACxB;AAAA;AAAA;AAAA,QAGGsB,EAAMtB,EAAI,QAAQ,KAAK,MAAM,CAACqB,EAAO,UAAUA,EAAO,OAAOrB,CAAG;AAAA;AAAA,IAAA;AAGxE,QAAIyB;AAIJ,IAAIJ,EAAO,QAAQ,aACfI,IAAaT,EAAQ,KAAKO,GAAKG,EAAOL,EAAO,OAAO,UAAU,CAAC,IAE/DI,IAAaT,EAAQ,KAAKO,CAAG;AAGjC,UAAMI,IAAMF,EAAW,UAAU;AAAA,MAC7B,MAAM,CAACzB,MAAuB;AAC1B,YAAI;AACA,iBAAOqB,EAAO,SAASrB,CAAG;AAAA,QAC9B,SAASG,GAAK;AACV,UAAAF,EAAYD,GAAKG,CAAG;AAAA,QAExB;AAAA,MACJ;AAAA,MACA,OAAO,CAACA,MAAQ;AACZ,QAAAF;AAAA,UACI;AAAA,YACI,SAAS;AAAA,cACL,SAAAW;AAAA,cACA,OAAAC;AAAA,cACA,OAAOQ,EAAO;AAAA,YAAA;AAAA,YAElB,IAAI;AAAA;AAAA,YACJ,WAAWvB,EAAA;AAAA,UAAI;AAAA,UAEnBK;AAAA,QAAA;AAAA,MAER;AAAA,MACA,UAAU,MAAM;AAAA,MAEhB;AAAA,IAAA,CACH;AAED,IAAAkB,EAAO,QAAQ,iBAAiB,SAAS,MAAM;AAE3C,cAAQ;AAAA,QACJ,kCAAkCT,CAAO,YAAYC,CAAK,YAAYQ,EAAO,KAAK,aAAaA,EAAO,OAAO,MAAM;AAAA,MAAA,GAEvHM,EAAI,YAAA;AAAA,IACR,CAAC;AAAA,EACL;AAEA,WAASpB,EAAQqB,GAAqB;AAClC,UAAM5B,IAA+B;AAAA,MACjC,GAAG4B;AAAA,MACH,WAAW9B,EAAA;AAAA,IAAI;AAEnB,IAAIE,EAAI,MAAM,SACVA,EAAI,KAAK6B,EAAA,IAGT7B,EAAI,WAAW,SACfA,EAAI,UAAU6B,EAAA;AAElB,UAAMjB,IAAU,OAAOZ,EAAI,QAAQ,OAAO;AAC1C,IAAIA,EAAI,QAAQ,SAAS,SACrBA,EAAI,QAAQ,QAAQS;AAExB,UAAMI,IAAQ,OAAOb,EAAI,QAAQ,KAAK;AAEtC,WADgBc,EAAmBF,GAASC,CAAK,EACzC,KAAKb,CAAG,GACTA;AAAA,EACX;AAEA,WAAS8B,EAAGT,GAA0C;AAClD,IAAAD,EAAUC,CAAM;AAAA,EACpB;AAEA,WAASU,EAAUV,GAA+C;AAC9D,WAAO,IAAI,QAAa,CAACW,GAAKC,MAAQ;AAClC,UAAI;AACA,QAAAZ,EAAO,QAAQ,iBAAiB,SAAS,MAAM;AAC3C,UAAAY,EAAI,IAAI,MAAM,aAAa,EAAE,OAAOZ,EAAO,OAAO,OAAA,CAAQ,CAAC;AAAA,QAC/D,CAAC;AACD,cAAMa,IAA8C;AAAA,UAChD,GAAGb;AAAA,UAEC,QAAQ;AAAA,YACJ,GAAGA,EAAO;AAAA,YAEN,YAAY;AAAA,UAChB;AAAA,UAEJ,UAAU,CAACrB,MAAQ;AAEf,YAAAgC,EAAIhC,CAAG;AAAA,UACX;AAAA,QACJ;AAEJ,QAAAoB,EAAUc,CAAS;AAAA,MACvB,SAASC,GAAG;AACR,QAAAF,EAAIE,CAAC;AAAA,MACT;AAAA,IACJ,CAAC;AAAA,EACL;AAEA,WAASC,EAAQf,GAAwC;AACrD,UAAMa,IAA8C;AAAA,MAChD,GAAGb;AAAA,MAEC,UAAU,OAAOgB,MAAU;AACvB,YAAI;AACA,gBAAMC,IAAqB;AAAA,YACvB,SAAS;AAAA,cACL,SAASD,EAAM,QAAQ;AAAA,cACvB,OAAOE;AAAA,cACP,OAAOF,EAAM,QAAQ;AAAA,YAAA;AAAA,YAEzB,SAASA,EAAM;AAAA,YACf,WAAWA,EAAM;AAAA,YACjB,YAAYA,EAAM;AAAA,YAClB,UAAUA,EAAM;AAAA,UAAA,GAEdG,IAAW,MAAM,QAAQ,QAAQnB,EAAO,SAASgB,CAAK,CAAC;AAC7D,UAAAC,EAAO,UAAUE,GACjBjC,EAAQ+B,CAAM;AAAA,QAClB,SAASnC,GAAK;AACV,UAAAF,EAAYoC,GAAOlC,CAAG;AAAA,QAE1B;AAAA,MACJ;AAAA,IACJ;AAEJ,IAAAiB,EAAUc,CAAS;AAAA,EACvB;AAEA,WAASO,EAASpB,GAA0C;AAExD,UAAMqB,IAAQb,EAAA;AACd,QAAIR,EAAO,UAAU;AACjB,YAAMa,IAA8E;AAAA,QAChF,SAASb,EAAO;AAAA,QAChB,OAAOkB;AAAA,QACP,OAAOlB,EAAO;AAAA,QACd,QAAQ;AAAA,UACJ,GAAGA,EAAO;AAAA,UAEN,YAAY;AAAA,QAChB;AAAA,QAEJ,UAAU,CAACiB,MAAW;AAElB,UAAAjB,EAAO,SAASiB,CAAM;AAAA,QAC1B;AAAA,QACA,QAAQ,CAACA,MACEA,EAAO,cAAcI,MAAU,CAACrB,EAAO,UAAUA,EAAO,OAAOiB,CAAM;AAAA,MAChF;AAEJ,MAAAlB,EAAUc,CAAS;AAAA,IACvB;AACA,QAAIM;AACJ,IAAInB,EAAO,YACPA,EAAO,UAAU,CAACsB,MAAS;AACvB,MAAAH,IAAUG;AAAA,IACd,CAAC,IAEDH,IAAUnB,EAAO,SAEbd,EAAQ;AAAA,MACZ,SAAS;AAAA,QACL,SAASc,EAAO;AAAA,QAChB,OAAOA,EAAO;AAAA,QACd,OAAOA,EAAO;AAAA,MAAA;AAAA,MAElB,SAAAmB;AAAA,MACA,SAASnB,EAAO;AAAA,MAChB,YAAYA,EAAO;AAAA,MACnB,UAAUA,EAAO;AAAA,MACjB,IAAIqB;AAAA,IAAA,CACP;AAAA,EACL;AAEA,iBAAeE,EAAcvB,GAA6D;AACtF,WAAO,IAAI,QAAQ,CAACW,GAAKC,MAAQ;AAC7B,UAAI;AACA,QAAAZ,EAAO,QAAQ,iBAAiB,SAAS,MAAM;AAC3C,UAAAY,EAAI,IAAI,MAAM,aAAa,EAAE,OAAOZ,EAAO,OAAO,OAAA,CAAQ,CAAC;AAAA,QAC/D,CAAC;AACD,cAAMwB,IAAmD;AAAA,UACrD,GAAGxB;AAAA,UACH,UAAU,CAACrB,MAAQ;AACf,gBAAI;AACA,cAAAgC,EAAIhC,CAAG;AAAA,YACX,SAASG,GAAK;AACV,cAAA8B,EAAI9B,CAAG;AAAA,YACX;AAAA,UACJ;AAAA,QAAA;AAEJ,QAAAsC,EAASI,CAAc;AAAA,MAC3B,SAAS1C,GAAK;AACV,QAAA8B,EAAI9B,CAAG;AAAA,MACX;AAAA,IACJ,CAAC;AAAA,EACL;AAEA,QAAM2C,IAA0B;AAAA,IAC5B,QAAAlD;AAAA,IACA,IAAI,CAACyB,MAAWS,EAAGT,CAA0C;AAAA,IAC7D,WAAW,CAACA,MAAWU,EAAUV,CAA+C;AAAA,IAChF,QAAQ,CAACA,MAAW;AAChB,YAAM,IAAI,MAAM,iBAAiB;AAAA,IACrC;AAAA,IACA,SAAS,CAACA,MAAWe,EAAQf,CAAwC;AAAA,IACrE,UAAU,CAACA,MAAWoB,EAASpB,CAA0C;AAAA,IACzE,eAAe,CAACA,MAAWuB,EAAcvB,CAA+C;AAAA,EAAA;AAG5F,SAAAyB,EAAO,WAAW,IAAIpC,GAEfoC;AACX;"}
|
|
1
|
+
{"version":3,"file":"msgBusFactory.es.js","sources":["../src/msgBusFactory.ts"],"sourcesContent":["import {\r\n MsgBus,\r\n MsgBusStruct,\r\n Msg,\r\n $CG_IN,\r\n $CG_OUT,\r\n MsgBusConfig,\r\n MsgBusSubscriberParams,\r\n MsgBusAsyncSubscriberParams,\r\n MsgBusProviderParams,\r\n MsgBusDispatcherParams,\r\n MsgBusAsyncDispatcherParams,\r\n MsgBusStructNormalized,\r\n $CG_ERROR,\r\n $C_ERROR\r\n} from \"./msgBusCore\";\r\nimport { v4 as uuid } from \"uuid\";\r\nimport { MonoTypeOperatorFunction, Observable, Subject, ReplaySubject } from \"rxjs\";\r\nimport { filter, filter as filterOp, take as takeOp } from \"rxjs/operators\";\r\nimport { Skip } from \"@actdim/utico/typeCore\";\r\n\r\nconst getMatchTest = (pattern: string) => {\r\n if (pattern == undefined) {\r\n // return (value: string) => true;\r\n return (value: string) => value == pattern;\r\n }\r\n if (pattern.startsWith(\"/\") && pattern.endsWith(\"/\")) {\r\n pattern = pattern.substring(1, pattern.length - 1);\r\n const regexp = new RegExp(pattern);\r\n return (value: string) => regexp.test(value);\r\n } else {\r\n return (value: string) => pattern === value;\r\n }\r\n};\r\n\r\n// see also https://www.npmjs.com/package/p-queue\r\n// https://github.com/postaljs/postal.js\r\n\r\n// createServiceBus\r\nconst groupPrefix = \":\"; // \"/\", \":\", \"::\"\r\nexport function createMsgBus<TStruct extends MsgBusStruct>(config?: MsgBusConfig<MsgBusStructNormalized<TStruct>>) {\r\n type TStructN = MsgBusStructNormalized<TStruct>;\r\n type MsgSrcData = Skip<Msg<TStructN>, \"timestamp\">;\r\n type MsgInfo = Skip<Msg<TStructN>, \"payload\">;\r\n const errTopic = \"msgbus\";\r\n\r\n function now() {\r\n return Date.now(); // new Date().getTime() or +new Date()\r\n }\r\n\r\n function getMsgInfo(msg: Msg<TStructN>) {\r\n return {\r\n address: msg.address,\r\n requestId: msg.requestId,\r\n traceId: msg.traceId,\r\n id: msg.id,\r\n timestamp: msg.timestamp,\r\n priority: msg.priority,\r\n persistent: msg.persistent\r\n } as MsgInfo;\r\n }\r\n\r\n function handleError(srcMsg: Msg<TStructN>, err: any) {\r\n const errPayload = {\r\n error: err,\r\n source: getMsgInfo(srcMsg)\r\n } as MsgSrcData[\"payload\"];\r\n let errMsg: MsgSrcData;\r\n errMsg = {\r\n address: {\r\n channel: srcMsg.address.channel,\r\n group: $CG_ERROR,\r\n topic: errTopic\r\n },\r\n payload: errPayload\r\n };\r\n publish(errMsg);\r\n errMsg = {\r\n address: {\r\n channel: $C_ERROR,\r\n group: $CG_IN,\r\n topic: errTopic\r\n },\r\n payload: errPayload\r\n };\r\n publish(errMsg);\r\n }\r\n // observables\r\n const subjects: Map<string, Subject<Msg<TStructN>>> = new Map();\r\n\r\n function createRoutingKey(channel: string, group: string) {\r\n return `${channel}${groupPrefix}${group}`;\r\n }\r\n\r\n function getOrCreateSubject(channel: string, group: string): Subject<Msg<TStructN>> {\r\n const routingKey = createRoutingKey(channel, group);\r\n // TODO: support BehaviorSubject\r\n if (!subjects.has(routingKey)) {\r\n let subject: Subject<Msg<TStructN>> = null;\r\n const channelConfig = config[channel];\r\n if (channelConfig) {\r\n if (channelConfig.replayBufferSize != undefined || channelConfig.replayWindowTime != undefined) {\r\n subject = new ReplaySubject<Msg<TStructN>>(channelConfig.replayBufferSize == undefined ? Infinity : channelConfig.replayBufferSize, channelConfig.replayWindowTime == undefined ? Infinity : channelConfig.replayWindowTime);\r\n }\r\n }\r\n if (!subject) {\r\n subject = new Subject<Msg<TStructN>>();\r\n }\r\n subjects.set(routingKey,\r\n subject\r\n );\r\n }\r\n return subjects.get(routingKey);\r\n }\r\n\r\n function subscribe(params: MsgBusSubscriberParams<TStructN>) {\r\n // TODO: use [channel, group] as key?\r\n\r\n const channel = String(params.channel);\r\n\r\n const group = params.group == undefined ? $CG_IN : String(params.group);\r\n\r\n const subject = getOrCreateSubject(channel, group);\r\n\r\n const match = getMatchTest(params.topic);\r\n\r\n const fOp: MonoTypeOperatorFunction<Msg<TStructN>> = filterOp(\r\n (msg) =>\r\n // msg.address.channel === channel &&\r\n // msg.address.group === group &&\r\n match(msg.address.topic) && (!params.filter || params.filter(msg))\r\n );\r\n\r\n let observable: Observable<Msg<TStructN>>;\r\n // groupBy?\r\n // mergeMap?\r\n // timeout, takeUntil, time?\r\n if (params.config?.fetchCount) {\r\n observable = subject.pipe(fOp, takeOp(params.config.fetchCount));\r\n } else {\r\n observable = subject.pipe(fOp);\r\n }\r\n\r\n const sub = observable.subscribe({\r\n next: (msg: Msg<TStructN>) => {\r\n try {\r\n return params.callback(msg);\r\n } catch (err) {\r\n handleError(msg, err);\r\n // throw err;\r\n }\r\n },\r\n error: (err) => {\r\n handleError(\r\n {\r\n address: {\r\n channel: channel,\r\n group: group,\r\n topic: params.topic\r\n },\r\n id: undefined, // not a real message\r\n timestamp: now()\r\n },\r\n err\r\n );\r\n },\r\n complete: () => {\r\n // cleanup\r\n }\r\n });\r\n\r\n const abortSignal = params.config?.abortSignal;\r\n abortSignal?.addEventListener(\"abort\", (e) => {\r\n // TODO: publish debug (internal) message\r\n console.log(\r\n `Listening aborted for channel: ${channel}, group: ${group}, topic: ${params.topic}. Reason: ${abortSignal.reason}` // e.target\r\n );\r\n sub.unsubscribe();\r\n });\r\n }\r\n\r\n function publish(msgData: MsgSrcData) {\r\n const msg: Msg<TStructN, any, any> = {\r\n ...msgData,\r\n timestamp: now()\r\n };\r\n if (msg.id == undefined) {\r\n msg.id = uuid();\r\n }\r\n // !msg.traceId\r\n if (msg.traceId == undefined) {\r\n msg.traceId = uuid();\r\n }\r\n const channel = String(msg.address.channel);\r\n if (msg.address.group == undefined) {\r\n msg.address.group = $CG_IN;\r\n }\r\n const group = String(msg.address.group);\r\n const subject = getOrCreateSubject(channel, group);\r\n subject.next(msg);\r\n return msg;\r\n }\r\n\r\n function on(params: MsgBusSubscriberParams<TStructN>) {\r\n subscribe(params);\r\n }\r\n\r\n function onceAsync(params: MsgBusAsyncSubscriberParams<TStructN>) {\r\n return new Promise<any>((res, rej) => {\r\n try {\r\n const abortSignal = params.config?.abortSignal;\r\n abortSignal?.addEventListener(\"abort\", (e) => {\r\n rej(new Error(\"Cancelled\", { cause: abortSignal.reason })); // e.target\r\n });\r\n const subParams: MsgBusSubscriberParams<TStructN> = {\r\n ...params,\r\n ...{\r\n config: {\r\n ...params.config,\r\n ...{\r\n fetchCount: 1\r\n }\r\n },\r\n callback: (msg) => {\r\n // sub.unsubscribe();\r\n res(msg);\r\n }\r\n }\r\n };\r\n subscribe(subParams);\r\n } catch (e) {\r\n rej(e);\r\n }\r\n });\r\n }\r\n\r\n function provide(params: MsgBusProviderParams<TStructN>) {\r\n const subParams: MsgBusSubscriberParams<TStructN> = {\r\n ...params,\r\n ...{\r\n callback: async (msgIn) => {\r\n try {\r\n const msgOut: MsgSrcData = {\r\n address: {\r\n channel: msgIn.address.channel,\r\n group: $CG_OUT,\r\n topic: msgIn.address.topic\r\n },\r\n traceId: msgIn.traceId,\r\n requestId: msgIn.id,\r\n persistent: msgIn.persistent,\r\n priority: msgIn.priority\r\n };\r\n const payload = (await Promise.resolve(params.callback(msgIn))) as MsgSrcData[\"payload\"];\r\n msgOut.payload = payload;\r\n publish(msgOut);\r\n } catch (err) {\r\n handleError(msgIn, err);\r\n // throw err;\r\n }\r\n }\r\n }\r\n };\r\n subscribe(subParams);\r\n }\r\n\r\n function dispatch(params: MsgBusDispatcherParams<TStructN>) {\r\n let msgIn: Msg<TStructN>;\r\n const msgId = uuid();\r\n if (params.callback) {\r\n const subParams: MsgBusSubscriberParams<TStructN, keyof TStructN, typeof $CG_OUT> = {\r\n channel: params.channel,\r\n group: $CG_OUT,\r\n topic: params.topic,\r\n config: {\r\n ...params.config,\r\n ...{\r\n fetchCount: 1\r\n }\r\n },\r\n callback: (msgOut) => {\r\n // sub.unsubscribe();\r\n params.callback(msgOut);\r\n },\r\n filter: (msgOut) => {\r\n return msgOut.requestId === msgId && (!params.filter || params.filter(msgOut)) // TODO: match topic?\r\n }\r\n };\r\n subscribe(subParams);\r\n }\r\n let payload: any;\r\n if (params.payloadFn) {\r\n params.payloadFn((args) => {\r\n payload = args;\r\n });\r\n } else {\r\n payload = params.payload;\r\n }\r\n msgIn = publish({\r\n address: {\r\n channel: params.channel,\r\n group: params.group,\r\n topic: params.topic\r\n },\r\n payload: payload,\r\n traceId: params.traceId,\r\n persistent: params.persistent,\r\n priority: params.priority,\r\n id: msgId\r\n });\r\n }\r\n\r\n async function dispatchAsync(params: MsgBusAsyncDispatcherParams<TStructN>): Promise<any> {\r\n return new Promise((res, rej) => {\r\n try {\r\n const abortSignal = params.config?.abortSignal;\r\n abortSignal?.addEventListener(\"abort\", (e) => {\r\n rej(new Error(\"Cancelled\", { cause: abortSignal.reason })); // e.target\r\n });\r\n const dispatchParams: MsgBusDispatcherParams<TStructN> = {\r\n ...params,\r\n callback: (msg) => {\r\n try {\r\n res(msg);\r\n } catch (err) {\r\n rej(err);\r\n }\r\n }\r\n };\r\n dispatch(dispatchParams);\r\n } catch (err) {\r\n rej(err);\r\n }\r\n });\r\n }\r\n\r\n const msgBus: MsgBus<TStruct> = {\r\n config: config,\r\n on: (params) => on(params as MsgBusSubscriberParams<TStructN>),\r\n onceAsync: (params) => onceAsync(params as MsgBusAsyncSubscriberParams<TStructN>),\r\n stream: (params) => {\r\n throw new Error(\"Not implemented\");\r\n },\r\n provide: (params) => provide(params as MsgBusProviderParams<TStructN>),\r\n dispatch: (params) => dispatch(params as MsgBusDispatcherParams<TStructN>),\r\n dispatchAsync: (params) => dispatchAsync(params as MsgBusAsyncDispatcherParams<TStructN>),\r\n };\r\n\r\n msgBus[\"#subjects\"] = subjects;\r\n\r\n return msgBus;\r\n}\r\n\r\n// class MessageBus<TStruct extends MsgBusStruct>\r\n// implements IMsgBus<TStruct>\r\n// {\r\n// constructor() {}\r\n// // ...\r\n// }\r\n"],"names":["getMatchTest","pattern","value","regexp","groupPrefix","createMsgBus","config","errTopic","now","getMsgInfo","msg","handleError","srcMsg","err","errPayload","errMsg","$CG_ERROR","publish","$C_ERROR","$CG_IN","subjects","createRoutingKey","channel","group","getOrCreateSubject","routingKey","subject","channelConfig","ReplaySubject","Subject","subscribe","params","match","fOp","filterOp","observable","takeOp","sub","abortSignal","e","msgData","uuid","on","onceAsync","res","rej","subParams","provide","msgIn","msgOut","$CG_OUT","payload","dispatch","msgId","args","dispatchAsync","dispatchParams","msgBus"],"mappings":"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"}
|