@actdim/msgmesh 1.0.4 → 1.0.6
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 +28 -24
- package/dist/msgBusCore.d.ts.map +1 -1
- package/dist/msgBusCore.es.js.map +1 -1
- package/dist/msgBusFactory.d.ts +1 -1
- package/dist/msgBusFactory.d.ts.map +1 -1
- package/dist/msgBusFactory.es.js +114 -115
- package/dist/msgBusFactory.es.js.map +1 -1
- package/package.json +1 -3
package/dist/msgBusCore.d.ts
CHANGED
|
@@ -62,55 +62,59 @@ export type MsgAddress<TStruct extends MsgBusStruct = MsgBusStruct, TChannel ext
|
|
|
62
62
|
topic?: string;
|
|
63
63
|
version?: string;
|
|
64
64
|
};
|
|
65
|
-
export type Msg<TStruct extends MsgBusStruct = MsgBusStruct, TChannel extends keyof TStruct = keyof TStruct, TGroup extends keyof TStruct[TChannel] = keyof TStruct[TChannel]> = {
|
|
65
|
+
export type Msg<TStruct extends MsgBusStruct = MsgBusStruct, TChannel extends keyof TStruct = keyof TStruct, TGroup extends keyof TStruct[TChannel] = keyof TStruct[TChannel], THeaders = any> = {
|
|
66
66
|
address: MsgAddress<TStruct, TChannel, TGroup>;
|
|
67
67
|
payload?: TGroup extends undefined ? InStruct<TStruct, TChannel> : TStruct[TChannel][TGroup];
|
|
68
68
|
requestId?: string;
|
|
69
69
|
traceId?: string;
|
|
70
70
|
id?: string;
|
|
71
|
-
timestamp
|
|
71
|
+
timestamp?: number;
|
|
72
72
|
priority?: number;
|
|
73
73
|
persistent?: boolean;
|
|
74
|
+
version?: string;
|
|
75
|
+
tags?: string[];
|
|
76
|
+
headers?: THeaders;
|
|
74
77
|
};
|
|
75
|
-
export type MsgBusSubscriberParams<TStruct extends MsgBusStruct = MsgBusStruct, TChannel extends keyof TStruct = keyof TStruct, TGroup extends keyof TStruct[TChannel] = keyof TStruct[TChannel]> = MsgAddress<TStruct, TChannel, TGroup> & {
|
|
78
|
+
export type MsgBusSubscriberParams<TStruct extends MsgBusStruct = MsgBusStruct, TChannel extends keyof TStruct = keyof TStruct, TGroup extends keyof TStruct[TChannel] = keyof TStruct[TChannel], THeaders = any> = MsgAddress<TStruct, TChannel, TGroup> & {
|
|
76
79
|
channelSelector?: string | ((channel: string) => boolean);
|
|
77
|
-
callback?: (msg: Msg<TStruct, TChannel, TGroup>) => void;
|
|
80
|
+
callback?: (msg: Msg<TStruct, TChannel, TGroup, THeaders>) => void;
|
|
78
81
|
config?: MsgDispatchConfig;
|
|
79
|
-
filter?: (msg: Msg<TStruct, TChannel, TGroup>) => boolean;
|
|
82
|
+
filter?: (msg: Msg<TStruct, TChannel, TGroup, THeaders>) => boolean;
|
|
80
83
|
};
|
|
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
|
-
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>>;
|
|
83
|
-
export type MsgBusAsyncSubscriberParams<TStruct extends MsgBusStruct = MsgBusStruct, TChannel extends keyof TStruct = keyof TStruct, TGroup extends keyof TStruct[TChannel] = keyof TStruct[TChannel]> = Skip<MsgBusSubscriberParams<TStruct, TChannel, TGroup>, "callback" | "filter">;
|
|
84
|
-
export type MsgBusAsyncSubscriber<TStruct extends MsgBusStruct> = <TChannel extends keyof TStruct, TGroup extends keyof TStruct[TChannel] = typeof $CG_IN>(params: MsgBusAsyncSubscriberParams<TStruct, TChannel, TGroup>) => Promise<Msg<TStruct, TChannel, TGroup>>;
|
|
85
|
-
export type MsgBusProviderParams<TStruct extends MsgBusStruct = MsgBusStruct, TChannel extends keyof TStruct = keyof TStruct, TGroup extends keyof TStruct[TChannel] = keyof TStruct[TChannel]> = Overwrite<MsgBusSubscriberParams<TStruct, TChannel, TGroup>, {
|
|
86
|
-
callback?: (
|
|
84
|
+
export type MsgBusSubscriber<TStruct extends MsgBusStruct, THeaders = any> = <TChannel extends keyof TStruct, TGroup extends keyof TStruct[TChannel] = typeof $CG_IN>(params: MsgBusSubscriberParams<TStruct, TChannel, TGroup, THeaders>) => void;
|
|
85
|
+
export type MsgBusStreamer<TStruct extends MsgBusStruct, THeaders = any> = <TChannel extends keyof TStruct, TGroup extends keyof TStruct[TChannel] = typeof $CG_IN>(params: MsgBusSubscriberParams<TStruct, TChannel, TGroup>) => AsyncIterableIterator<Msg<TStruct, TChannel, TGroup, THeaders>>;
|
|
86
|
+
export type MsgBusAsyncSubscriberParams<TStruct extends MsgBusStruct = MsgBusStruct, TChannel extends keyof TStruct = keyof TStruct, TGroup extends keyof TStruct[TChannel] = keyof TStruct[TChannel], THeaders = any> = Skip<MsgBusSubscriberParams<TStruct, TChannel, TGroup, THeaders>, "callback" | "filter">;
|
|
87
|
+
export type MsgBusAsyncSubscriber<TStruct extends MsgBusStruct, THeaders = any> = <TChannel extends keyof TStruct, TGroup extends keyof TStruct[TChannel] = typeof $CG_IN>(params: MsgBusAsyncSubscriberParams<TStruct, TChannel, TGroup>) => Promise<Msg<TStruct, TChannel, TGroup, THeaders>>;
|
|
88
|
+
export type MsgBusProviderParams<TStruct extends MsgBusStruct = MsgBusStruct, TChannel extends keyof TStruct = keyof TStruct, TGroup extends keyof TStruct[TChannel] = keyof TStruct[TChannel], THeaders = any> = Overwrite<MsgBusSubscriberParams<TStruct, TChannel, TGroup, THeaders>, {
|
|
89
|
+
callback?: (msgIn: Msg<TStruct, TChannel, TGroup, THeaders>, msgOut: Msg<TStruct, TChannel, typeof $CG_OUT, THeaders>) => MaybePromise<OutStruct<TStruct, TChannel>>;
|
|
87
90
|
}>;
|
|
88
|
-
export type MsgBusProvider<TStruct extends MsgBusStruct> = <TChannel extends keyof TStruct, TGroup extends keyof TStruct[TChannel] = typeof $CG_IN>(params: MsgBusProviderParams<TStruct, TChannel, TGroup>) => void;
|
|
91
|
+
export type MsgBusProvider<TStruct extends MsgBusStruct, THeaders = any> = <TChannel extends keyof TStruct, TGroup extends keyof TStruct[TChannel] = typeof $CG_IN>(params: MsgBusProviderParams<TStruct, TChannel, TGroup, THeaders>) => void;
|
|
89
92
|
export type MsgBusBinder<TStruct extends MsgBusStruct> = <TSourceChannel extends keyof TStruct, TTargetChannel extends keyof TStruct, TSourceGroup extends keyof TStruct[TSourceChannel] = typeof $CG_IN, TTargetGroup extends keyof TStruct[TTargetChannel] = typeof $CG_IN>(source: MsgBusSubscriberParams<TStruct, TSourceChannel, TSourceGroup>, target: MsgAddress<TStruct, TTargetChannel, TTargetGroup>) => void;
|
|
90
|
-
export type MsgBusDispatcherParams<TStruct extends MsgBusStruct = MsgBusStruct, TChannel extends keyof TStruct = keyof TStruct, TGroup extends keyof TStruct[TChannel] = keyof TStruct[TChannel]> = Overwrite<MsgBusSubscriberParams<TStruct, TChannel, TGroup>, {
|
|
93
|
+
export type MsgBusDispatcherParams<TStruct extends MsgBusStruct = MsgBusStruct, TChannel extends keyof TStruct = keyof TStruct, TGroup extends keyof TStruct[TChannel] = keyof TStruct[TChannel], THeaders = any> = Overwrite<MsgBusSubscriberParams<TStruct, TChannel, TGroup>, {
|
|
91
94
|
payload?: TGroup extends undefined ? InStruct<TStruct, TChannel> : TStruct[TChannel][TGroup];
|
|
92
95
|
payloadFn?: IsTuple<TGroup extends undefined ? InStruct<TStruct, TChannel> : TStruct[TChannel][TGroup]> extends true ? (fn: (...args: TGroup extends undefined ? InStruct<TStruct, TChannel> : TStruct[TChannel][TGroup]) => void) => void : never;
|
|
93
96
|
traceId?: string;
|
|
94
97
|
priority?: number;
|
|
95
98
|
persistent?: boolean;
|
|
96
|
-
callback?: (msg: Msg<TStruct, TChannel, typeof $CG_OUT>) => void;
|
|
99
|
+
callback?: (msg: Msg<TStruct, TChannel, typeof $CG_OUT, THeaders>) => void;
|
|
100
|
+
ext?: THeaders;
|
|
97
101
|
}>;
|
|
98
|
-
export type MsgBusAsyncDispatcherParams<TStruct extends MsgBusStruct = MsgBusStruct, TChannel extends keyof TStruct = keyof TStruct, TGroup extends keyof TStruct[TChannel] = keyof TStruct[TChannel]> = Skip<MsgBusDispatcherParams<TStruct, TChannel, TGroup>, "callback">;
|
|
99
|
-
export type MsgBusDispatcher<TStruct extends MsgBusStruct> = <TChannel extends keyof TStruct, TGroup extends keyof TStruct[TChannel] = typeof $CG_IN>(params: MsgBusDispatcherParams<TStruct, TChannel, TGroup>) => void;
|
|
100
|
-
export type MsgBusAsyncDispatcher<TStruct extends MsgBusStruct> = <TChannel extends keyof TStruct, TGroup extends keyof TStruct[TChannel] = typeof $CG_IN>(params: MsgBusAsyncDispatcherParams<TStruct, TChannel, TGroup>) => Promise<Msg<TStruct, TChannel, typeof $CG_OUT>>;
|
|
102
|
+
export type MsgBusAsyncDispatcherParams<TStruct extends MsgBusStruct = MsgBusStruct, TChannel extends keyof TStruct = keyof TStruct, TGroup extends keyof TStruct[TChannel] = keyof TStruct[TChannel], THeaders = any> = Skip<MsgBusDispatcherParams<TStruct, TChannel, TGroup, THeaders>, "callback">;
|
|
103
|
+
export type MsgBusDispatcher<TStruct extends MsgBusStruct, THeaders = any> = <TChannel extends keyof TStruct, TGroup extends keyof TStruct[TChannel] = typeof $CG_IN>(params: MsgBusDispatcherParams<TStruct, TChannel, TGroup, THeaders>) => void;
|
|
104
|
+
export type MsgBusAsyncDispatcher<TStruct extends MsgBusStruct, THeaders = any> = <TChannel extends keyof TStruct, TGroup extends keyof TStruct[TChannel] = typeof $CG_IN>(params: MsgBusAsyncDispatcherParams<TStruct, TChannel, TGroup, THeaders>) => Promise<Msg<TStruct, TChannel, typeof $CG_OUT>>;
|
|
101
105
|
export type MsgChannelStructNormalized<TStruct extends MsgChannelStruct> = {
|
|
102
106
|
[G in keyof TStruct]: Awaited<TStruct[G]>;
|
|
103
107
|
};
|
|
104
108
|
export type MsgBusStructNormalized<TStruct extends MsgBusStruct> = {
|
|
105
109
|
[C in keyof TStruct]: MsgChannelStructNormalized<TStruct[C]>;
|
|
106
110
|
};
|
|
107
|
-
export type MsgBus<TStruct extends MsgBusStruct> = {
|
|
111
|
+
export type MsgBus<TStruct extends MsgBusStruct, THeaders = any> = {
|
|
108
112
|
readonly config: MsgBusConfig<MsgBusStructNormalized<TStruct>>;
|
|
109
|
-
readonly on: MsgBusSubscriber<MsgBusStructNormalized<TStruct
|
|
110
|
-
readonly onceAsync: MsgBusAsyncSubscriber<MsgBusStructNormalized<TStruct
|
|
111
|
-
readonly stream: MsgBusStreamer<MsgBusStructNormalized<TStruct
|
|
112
|
-
readonly provide: MsgBusProvider<MsgBusStructNormalized<TStruct
|
|
113
|
-
readonly dispatch: MsgBusDispatcher<MsgBusStructNormalized<TStruct
|
|
114
|
-
readonly dispatchAsync: MsgBusAsyncDispatcher<MsgBusStructNormalized<TStruct
|
|
113
|
+
readonly on: MsgBusSubscriber<MsgBusStructNormalized<TStruct>, THeaders>;
|
|
114
|
+
readonly onceAsync: MsgBusAsyncSubscriber<MsgBusStructNormalized<TStruct>, THeaders>;
|
|
115
|
+
readonly stream: MsgBusStreamer<MsgBusStructNormalized<TStruct>, THeaders>;
|
|
116
|
+
readonly provide: MsgBusProvider<MsgBusStructNormalized<TStruct>, THeaders>;
|
|
117
|
+
readonly dispatch: MsgBusDispatcher<MsgBusStructNormalized<TStruct>, THeaders>;
|
|
118
|
+
readonly dispatchAsync: MsgBusAsyncDispatcher<MsgBusStructNormalized<TStruct>, THeaders>;
|
|
115
119
|
};
|
|
116
120
|
//# sourceMappingURL=msgBusCore.d.ts.map
|
package/dist/msgBusCore.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"msgBusCore.d.ts","sourceRoot":"","sources":["../src/msgBusCore.ts"],"names":[],"mappings":"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
|
|
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":["../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;"}
|
|
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 THeaders = any // Record<string, string>\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 version?: string; // schemaVersion\r\n tags?: string[];\r\n headers?: THeaders;\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 THeaders = any\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, THeaders>) => void;\r\n config?: MsgDispatchConfig;\r\n filter?: (msg: Msg<TStruct, TChannel, TGroup, THeaders>) => boolean;\r\n};\r\n\r\n// MsgBusSubscriberFn\r\nexport type MsgBusSubscriber<TStruct extends MsgBusStruct, THeaders = any> = <\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, THeaders>\r\n) => void;\r\n\r\n// MsgBusAsyncSubIterator(Fn)\r\nexport type MsgBusStreamer<TStruct extends MsgBusStruct, THeaders = any> = <\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, THeaders>>; // 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 THeaders = any\r\n> = Skip<MsgBusSubscriberParams<TStruct, TChannel, TGroup, THeaders>, \"callback\" | \"filter\">;\r\n\r\n// MsgBusAsyncSubscriberFn\r\nexport type MsgBusAsyncSubscriber<TStruct extends MsgBusStruct, THeaders = any> = <\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, THeaders>>; // 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 THeaders = any\r\n> = Overwrite<\r\n MsgBusSubscriberParams<TStruct, TChannel, TGroup, THeaders>,\r\n {\r\n // resolve\r\n callback?: (msgIn: Msg<TStruct, TChannel, TGroup, THeaders>, msgOut: Msg<TStruct, TChannel, typeof $CG_OUT, THeaders>) => MaybePromise<OutStruct<TStruct, TChannel>>;\r\n }\r\n>;\r\n\r\n// MsgBusProviderFn\r\nexport type MsgBusProvider<TStruct extends MsgBusStruct, THeaders = any> = <\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, THeaders>\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 THeaders = any\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, THeaders>) => void;\r\n ext?: THeaders;\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 THeaders = any\r\n> = Skip<MsgBusDispatcherParams<TStruct, TChannel, TGroup, THeaders>, \"callback\">;\r\n\r\n// MsgBusDispatcherFn\r\nexport type MsgBusDispatcher<TStruct extends MsgBusStruct, THeaders = any> = <\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, THeaders>\r\n) => void;\r\n\r\n// MsgBusAsyncDispatcherFn\r\nexport type MsgBusAsyncDispatcher<TStruct extends MsgBusStruct, THeaders = any> = <\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, THeaders>\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, THeaders = any> = {\r\n readonly config: MsgBusConfig<MsgBusStructNormalized<TStruct>>;\r\n // subscribe, listen\r\n readonly on: MsgBusSubscriber<MsgBusStructNormalized<TStruct>, THeaders>;\r\n readonly onceAsync: MsgBusAsyncSubscriber<MsgBusStructNormalized<TStruct>, THeaders>;\r\n // listenStream, consume, receive\r\n readonly stream: MsgBusStreamer<MsgBusStructNormalized<TStruct>, THeaders>;\r\n // handle, resolve\r\n readonly provide: MsgBusProvider<MsgBusStructNormalized<TStruct>, THeaders>;\r\n // link, connect\r\n // dispatch (emit/publish + subscribe)\r\n readonly dispatch: MsgBusDispatcher<MsgBusStructNormalized<TStruct>, THeaders>;\r\n readonly dispatchAsync: MsgBusAsyncDispatcher<MsgBusStructNormalized<TStruct>, THeaders>;\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
1
|
import { MsgBus, MsgBusStruct, MsgBusConfig, MsgBusStructNormalized } from './msgBusCore';
|
|
2
|
-
export declare function createMsgBus<TStruct extends MsgBusStruct>(config?: MsgBusConfig<MsgBusStructNormalized<TStruct>>): MsgBus<TStruct>;
|
|
2
|
+
export declare function createMsgBus<TStruct extends MsgBusStruct, THeaders = any>(config?: MsgBusConfig<MsgBusStructNormalized<TStruct>>): MsgBus<TStruct, THeaders>;
|
|
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,EAGzB,MAAM,cAAc,CAAC;AAyBtB,wBAAgB,YAAY,CAAC,OAAO,SAAS,YAAY,EAAE,MAAM,CAAC,EAAE,YAAY,CAAC,sBAAsB,CAAC,OAAO,CAAC,CAAC,
|
|
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,QAAQ,GAAG,GAAG,EAAE,MAAM,CAAC,EAAE,YAAY,CAAC,sBAAsB,CAAC,OAAO,CAAC,CAAC,6BAsThI"}
|
package/dist/msgBusFactory.es.js
CHANGED
|
@@ -1,20 +1,20 @@
|
|
|
1
|
-
import { $CG_IN as
|
|
2
|
-
import { v4 as
|
|
1
|
+
import { $CG_IN as h, $CG_ERROR as T, $C_ERROR as B, $CG_OUT as C } from "./msgBusCore.es.js";
|
|
2
|
+
import { v4 as y } from "uuid";
|
|
3
3
|
import { ReplaySubject as O, Subject as W } from "rxjs";
|
|
4
4
|
import { filter as q, take as A } from "rxjs/operators";
|
|
5
|
-
const L = (
|
|
6
|
-
if (
|
|
7
|
-
return (
|
|
8
|
-
if (
|
|
9
|
-
|
|
10
|
-
const
|
|
11
|
-
return (
|
|
5
|
+
const L = (i) => {
|
|
6
|
+
if (i == null)
|
|
7
|
+
return (c) => c == i;
|
|
8
|
+
if (i.startsWith("/") && i.endsWith("/")) {
|
|
9
|
+
i = i.substring(1, i.length - 1);
|
|
10
|
+
const c = new RegExp(i);
|
|
11
|
+
return (l) => c.test(l);
|
|
12
12
|
} else
|
|
13
|
-
return (
|
|
13
|
+
return (c) => i === c;
|
|
14
14
|
}, M = ":";
|
|
15
|
-
function K(
|
|
16
|
-
const
|
|
17
|
-
function
|
|
15
|
+
function K(i) {
|
|
16
|
+
const c = "msgbus";
|
|
17
|
+
function l() {
|
|
18
18
|
return Date.now();
|
|
19
19
|
}
|
|
20
20
|
function $(e) {
|
|
@@ -25,110 +25,107 @@ function K(c) {
|
|
|
25
25
|
id: e.id,
|
|
26
26
|
timestamp: e.timestamp,
|
|
27
27
|
priority: e.priority,
|
|
28
|
-
persistent: e.persistent
|
|
28
|
+
persistent: e.persistent,
|
|
29
|
+
headers: e.headers
|
|
29
30
|
};
|
|
30
31
|
}
|
|
31
|
-
function b(e,
|
|
32
|
-
const
|
|
33
|
-
error:
|
|
32
|
+
function b(e, n) {
|
|
33
|
+
const t = {
|
|
34
|
+
error: n,
|
|
34
35
|
source: $(e)
|
|
35
36
|
};
|
|
36
|
-
let
|
|
37
|
-
|
|
37
|
+
let o;
|
|
38
|
+
o = {
|
|
38
39
|
address: {
|
|
39
40
|
channel: e.address.channel,
|
|
40
41
|
group: T,
|
|
41
|
-
topic:
|
|
42
|
+
topic: c
|
|
42
43
|
},
|
|
43
|
-
payload:
|
|
44
|
-
}, p(
|
|
44
|
+
payload: t
|
|
45
|
+
}, p(o), o = {
|
|
45
46
|
address: {
|
|
46
47
|
channel: B,
|
|
47
|
-
group:
|
|
48
|
-
topic:
|
|
48
|
+
group: h,
|
|
49
|
+
topic: c
|
|
49
50
|
},
|
|
50
|
-
payload:
|
|
51
|
-
}, p(
|
|
51
|
+
payload: t
|
|
52
|
+
}, p(o);
|
|
52
53
|
}
|
|
53
|
-
const
|
|
54
|
-
function E(e,
|
|
55
|
-
return `${e}${M}${
|
|
54
|
+
const u = /* @__PURE__ */ new Map();
|
|
55
|
+
function E(e, n) {
|
|
56
|
+
return `${e}${M}${n}`;
|
|
56
57
|
}
|
|
57
|
-
function
|
|
58
|
-
const
|
|
59
|
-
if (!
|
|
60
|
-
let
|
|
61
|
-
const r =
|
|
62
|
-
r && (r.replayBufferSize != null || r.replayWindowTime != null) && (
|
|
63
|
-
|
|
64
|
-
|
|
58
|
+
function g(e, n) {
|
|
59
|
+
const t = E(e, n);
|
|
60
|
+
if (!u.has(t)) {
|
|
61
|
+
let o = null;
|
|
62
|
+
const r = i[e];
|
|
63
|
+
r && (r.replayBufferSize != null || r.replayWindowTime != null) && (o = new O(r.replayBufferSize == null ? 1 / 0 : r.replayBufferSize, r.replayWindowTime == null ? 1 / 0 : r.replayWindowTime)), o || (o = new W()), u.set(
|
|
64
|
+
t,
|
|
65
|
+
o
|
|
65
66
|
);
|
|
66
67
|
}
|
|
67
|
-
return
|
|
68
|
+
return u.get(t);
|
|
68
69
|
}
|
|
69
70
|
function f(e) {
|
|
70
|
-
const
|
|
71
|
-
(
|
|
71
|
+
const n = String(e.channel), t = e.group == null ? h : String(e.group), o = g(n, t), r = L(e.topic), d = q(
|
|
72
|
+
(s) => (
|
|
72
73
|
// msg.address.channel === channel &&
|
|
73
74
|
// msg.address.group === group &&
|
|
74
|
-
r(
|
|
75
|
+
r(s.address.topic) && (!e.filter || e.filter(s))
|
|
75
76
|
)
|
|
76
77
|
);
|
|
77
|
-
let
|
|
78
|
-
e.config?.fetchCount ?
|
|
79
|
-
const
|
|
80
|
-
next: (
|
|
78
|
+
let a;
|
|
79
|
+
e.config?.fetchCount ? a = o.pipe(d, A(e.config.fetchCount)) : a = o.pipe(d);
|
|
80
|
+
const x = a.subscribe({
|
|
81
|
+
next: (s) => {
|
|
81
82
|
try {
|
|
82
|
-
return e.callback(
|
|
83
|
-
} catch (
|
|
84
|
-
b(
|
|
83
|
+
return e.callback(s);
|
|
84
|
+
} catch (j) {
|
|
85
|
+
b(s, j);
|
|
85
86
|
}
|
|
86
87
|
},
|
|
87
|
-
error: (
|
|
88
|
+
error: (s) => {
|
|
88
89
|
b(
|
|
89
90
|
{
|
|
90
91
|
address: {
|
|
91
|
-
channel:
|
|
92
|
-
group:
|
|
92
|
+
channel: n,
|
|
93
|
+
group: t,
|
|
93
94
|
topic: e.topic
|
|
94
95
|
},
|
|
95
96
|
id: void 0,
|
|
96
97
|
// not a real message
|
|
97
|
-
timestamp:
|
|
98
|
+
timestamp: l()
|
|
98
99
|
},
|
|
99
|
-
|
|
100
|
+
s
|
|
100
101
|
);
|
|
101
102
|
},
|
|
102
103
|
complete: () => {
|
|
103
104
|
}
|
|
104
105
|
}), S = e.config?.abortSignal;
|
|
105
|
-
S?.addEventListener("abort", (
|
|
106
|
+
S?.addEventListener("abort", (s) => {
|
|
106
107
|
console.log(
|
|
107
|
-
`Listening aborted for channel: ${
|
|
108
|
+
`Listening aborted for channel: ${n}, group: ${t}, topic: ${e.topic}. Reason: ${S.reason}`
|
|
108
109
|
// e.target
|
|
109
|
-
),
|
|
110
|
+
), x.unsubscribe();
|
|
110
111
|
});
|
|
111
112
|
}
|
|
112
113
|
function p(e) {
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
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;
|
|
114
|
+
e.timestamp == null && (e.timestamp = l()), e.id == null && (e.id = y()), e.traceId == null && (e.traceId = y());
|
|
115
|
+
const n = String(e.address.channel);
|
|
116
|
+
e.address.group == null && (e.address.group = h);
|
|
117
|
+
const t = String(e.address.group);
|
|
118
|
+
return g(n, t).next(e), e;
|
|
122
119
|
}
|
|
123
|
-
function
|
|
120
|
+
function R(e) {
|
|
124
121
|
f(e);
|
|
125
122
|
}
|
|
126
|
-
function
|
|
127
|
-
return new Promise((
|
|
123
|
+
function k(e) {
|
|
124
|
+
return new Promise((n, t) => {
|
|
128
125
|
try {
|
|
129
|
-
const
|
|
130
|
-
|
|
131
|
-
|
|
126
|
+
const o = e.config?.abortSignal;
|
|
127
|
+
o?.addEventListener("abort", (d) => {
|
|
128
|
+
t(new Error("Cancelled", { cause: o.reason }));
|
|
132
129
|
});
|
|
133
130
|
const r = {
|
|
134
131
|
...e,
|
|
@@ -136,44 +133,45 @@ function K(c) {
|
|
|
136
133
|
...e.config,
|
|
137
134
|
fetchCount: 1
|
|
138
135
|
},
|
|
139
|
-
callback: (
|
|
140
|
-
|
|
136
|
+
callback: (d) => {
|
|
137
|
+
n(d);
|
|
141
138
|
}
|
|
142
139
|
};
|
|
143
140
|
f(r);
|
|
144
|
-
} catch (
|
|
145
|
-
|
|
141
|
+
} catch (o) {
|
|
142
|
+
t(o);
|
|
146
143
|
}
|
|
147
144
|
});
|
|
148
145
|
}
|
|
149
|
-
function
|
|
150
|
-
const
|
|
146
|
+
function I(e) {
|
|
147
|
+
const n = {
|
|
151
148
|
...e,
|
|
152
|
-
callback: async (
|
|
149
|
+
callback: async (t) => {
|
|
153
150
|
try {
|
|
154
|
-
const
|
|
151
|
+
const o = {
|
|
155
152
|
address: {
|
|
156
|
-
channel:
|
|
153
|
+
channel: t.address.channel,
|
|
157
154
|
group: C,
|
|
158
|
-
topic:
|
|
155
|
+
topic: t.address.topic
|
|
159
156
|
},
|
|
160
|
-
traceId:
|
|
161
|
-
requestId:
|
|
162
|
-
persistent:
|
|
163
|
-
priority:
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
157
|
+
traceId: t.traceId,
|
|
158
|
+
requestId: t.id,
|
|
159
|
+
persistent: t.persistent,
|
|
160
|
+
priority: t.priority,
|
|
161
|
+
headers: t.headers
|
|
162
|
+
}, r = await Promise.resolve(e.callback(t, o));
|
|
163
|
+
o.payload = r, p(o);
|
|
164
|
+
} catch (o) {
|
|
165
|
+
b(t, o);
|
|
168
166
|
}
|
|
169
167
|
}
|
|
170
168
|
};
|
|
171
|
-
f(
|
|
169
|
+
f(n);
|
|
172
170
|
}
|
|
173
171
|
function v(e) {
|
|
174
|
-
const
|
|
172
|
+
const n = y();
|
|
175
173
|
if (e.callback) {
|
|
176
|
-
const
|
|
174
|
+
const o = {
|
|
177
175
|
channel: e.channel,
|
|
178
176
|
group: C,
|
|
179
177
|
topic: e.topic,
|
|
@@ -184,61 +182,62 @@ function K(c) {
|
|
|
184
182
|
callback: (r) => {
|
|
185
183
|
e.callback(r);
|
|
186
184
|
},
|
|
187
|
-
filter: (r) => r.requestId ===
|
|
185
|
+
filter: (r) => r.requestId === n && (!e.filter || e.filter(r))
|
|
188
186
|
};
|
|
189
|
-
f(
|
|
187
|
+
f(o);
|
|
190
188
|
}
|
|
191
|
-
let
|
|
192
|
-
e.payloadFn ? e.payloadFn((
|
|
193
|
-
|
|
194
|
-
}) :
|
|
189
|
+
let t;
|
|
190
|
+
e.payloadFn ? e.payloadFn((o) => {
|
|
191
|
+
t = o;
|
|
192
|
+
}) : t = e.payload, p({
|
|
195
193
|
address: {
|
|
196
194
|
channel: e.channel,
|
|
197
195
|
group: e.group,
|
|
198
196
|
topic: e.topic
|
|
199
197
|
},
|
|
200
|
-
payload:
|
|
198
|
+
payload: t,
|
|
201
199
|
traceId: e.traceId,
|
|
202
200
|
persistent: e.persistent,
|
|
203
201
|
priority: e.priority,
|
|
204
|
-
id:
|
|
202
|
+
id: n,
|
|
203
|
+
headers: e.ext
|
|
205
204
|
});
|
|
206
205
|
}
|
|
207
206
|
async function P(e) {
|
|
208
|
-
return new Promise((
|
|
207
|
+
return new Promise((n, t) => {
|
|
209
208
|
try {
|
|
210
|
-
const
|
|
211
|
-
|
|
212
|
-
|
|
209
|
+
const o = e.config?.abortSignal;
|
|
210
|
+
o?.addEventListener("abort", (d) => {
|
|
211
|
+
t(new Error("Cancelled", { cause: o.reason }));
|
|
213
212
|
});
|
|
214
213
|
const r = {
|
|
215
214
|
...e,
|
|
216
|
-
callback: (
|
|
215
|
+
callback: (d) => {
|
|
217
216
|
try {
|
|
218
|
-
|
|
219
|
-
} catch (
|
|
220
|
-
|
|
217
|
+
n(d);
|
|
218
|
+
} catch (a) {
|
|
219
|
+
t(a);
|
|
221
220
|
}
|
|
222
221
|
}
|
|
223
222
|
};
|
|
224
223
|
v(r);
|
|
225
|
-
} catch (
|
|
226
|
-
|
|
224
|
+
} catch (o) {
|
|
225
|
+
t(o);
|
|
227
226
|
}
|
|
228
227
|
});
|
|
229
228
|
}
|
|
230
229
|
const w = {
|
|
231
|
-
config:
|
|
232
|
-
on: (e) =>
|
|
233
|
-
onceAsync: (e) =>
|
|
230
|
+
config: i,
|
|
231
|
+
on: (e) => R(e),
|
|
232
|
+
onceAsync: (e) => k(e),
|
|
234
233
|
stream: (e) => {
|
|
235
234
|
throw new Error("Not implemented");
|
|
236
235
|
},
|
|
237
|
-
provide: (e) =>
|
|
236
|
+
provide: (e) => I(e),
|
|
238
237
|
dispatch: (e) => v(e),
|
|
239
238
|
dispatchAsync: (e) => P(e)
|
|
240
239
|
};
|
|
241
|
-
return w["#subjects"] =
|
|
240
|
+
return w["#subjects"] = u, w;
|
|
242
241
|
}
|
|
243
242
|
export {
|
|
244
243
|
K as createMsgBus
|
|
@@ -1 +1 @@
|
|
|
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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"}
|
|
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, THeaders = any>(config?: MsgBusConfig<MsgBusStructNormalized<TStruct>>) {\r\n type TStructN = MsgBusStructNormalized<TStruct>;\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 headers: msg.headers\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 Msg<TStructN>[\"payload\"];\r\n let errMsg: Msg<TStructN>;\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(msg: Msg<TStructN>) {\r\n if (msg.timestamp == undefined) {\r\n msg.timestamp = now()\r\n }\r\n if (msg.id == undefined) {\r\n msg.id = uuid();\r\n }\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: Msg<TStructN, keyof TStructN, typeof $CG_OUT> = {\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 headers: msgIn.headers\r\n };\r\n const payload = (await Promise.resolve(params.callback(msgIn, msgOut)));\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 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 const 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 headers: params.ext\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, THeaders> = {\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","uuid","on","onceAsync","res","rej","subParams","provide","msgIn","msgOut","$CG_OUT","payload","dispatch","msgId","args","dispatchAsync","dispatchParams","msgBus"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@actdim/msgmesh",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.6",
|
|
4
4
|
"description": "A type-safe, modular message mesh for scalable async communication in TypeScript",
|
|
5
5
|
"author": "Pavel Borodaev",
|
|
6
6
|
"license": "Proprietary",
|
|
@@ -69,8 +69,6 @@
|
|
|
69
69
|
"peerDependencies": {
|
|
70
70
|
"@actdim/utico": "^1.0.2",
|
|
71
71
|
"rxjs": "^7.8.2",
|
|
72
|
-
"dexie": "^4.2.0",
|
|
73
|
-
"moment": "^2.30.1",
|
|
74
72
|
"uuid": "^13.0.0"
|
|
75
73
|
},
|
|
76
74
|
"devDependencies": {
|