@nmshd/app-runtime 2.0.0-alpha.5 → 2.0.0-alpha.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.
@@ -8,11 +8,11 @@ const crypto_1 = require("@nmshd/crypto");
8
8
  const runtime_1 = require("@nmshd/runtime");
9
9
  const transport_1 = require("@nmshd/transport");
10
10
  exports.buildInformation = {
11
- version: "2.0.0-alpha.5",
12
- build: "16",
13
- date: "2022-07-11T11:59:52+00:00",
14
- commit: "7c2976509bc9518385664f993cbf3b87173b17c2",
15
- dependencies: {"@js-soft/docdb-access-loki":"^1.0.3","@js-soft/native-abstractions":"^1.1.0","@nmshd/runtime":"2.0.0-alpha.30","lodash":"^4.17.21"},
11
+ version: "2.0.0-alpha.6",
12
+ build: "17",
13
+ date: "2022-07-19T13:27:53+00:00",
14
+ commit: "6fac45e109bc1f82f4cb7010552b612291f3c297",
15
+ dependencies: {"@js-soft/docdb-access-loki":"^1.0.3","@js-soft/native-abstractions":"^1.2.0","@nmshd/runtime":"2.0.0-alpha.37","lodash":"^4.17.21"},
16
16
  libraries: {
17
17
  serval: ts_serval_1.buildInformation,
18
18
  crypto: crypto_1.buildInformation,
@@ -8,7 +8,7 @@ export interface IAppRuntimeModuleConstructor {
8
8
  export interface AppRuntimeModuleConfiguration extends ModuleConfiguration {
9
9
  }
10
10
  export declare abstract class AppRuntimeModule<TConfig extends AppRuntimeModuleConfiguration = AppRuntimeModuleConfiguration> extends RuntimeModule<TConfig, AppRuntime> {
11
- private readonly registeredNativeEventSubscriptions;
11
+ private readonly nativeEventSubscriptionIds;
12
12
  protected subscribeToNativeEvent<TEvent>(event: Event, handler: EventHandler<TEvent>): void;
13
13
  protected unsubscribeFromAllEvents(): void;
14
14
  }
@@ -5,7 +5,7 @@ const runtime_1 = require("@nmshd/runtime");
5
5
  class AppRuntimeModule extends runtime_1.RuntimeModule {
6
6
  constructor() {
7
7
  super(...arguments);
8
- this.registeredNativeEventSubscriptions = [];
8
+ this.nativeEventSubscriptionIds = [];
9
9
  }
10
10
  subscribeToNativeEvent(event, handler) {
11
11
  const subscriptionResult = this.runtime.nativeEnvironment.eventBus.subscribe(event, handler);
@@ -13,14 +13,12 @@ class AppRuntimeModule extends runtime_1.RuntimeModule {
13
13
  this.logger.error(subscriptionResult.error);
14
14
  throw subscriptionResult.error;
15
15
  }
16
- this.registeredNativeEventSubscriptions.push({ id: subscriptionResult.value, target: event });
16
+ this.nativeEventSubscriptionIds.push(subscriptionResult.value);
17
17
  }
18
18
  unsubscribeFromAllEvents() {
19
19
  super.unsubscribeFromAllEvents();
20
- for (const subscription of this.registeredNativeEventSubscriptions) {
21
- this.runtime.nativeEnvironment.eventBus.unsubscribe(subscription.target, subscription.id);
22
- }
23
- this.registeredNativeEventSubscriptions.splice(0);
20
+ this.nativeEventSubscriptionIds.forEach((id) => this.runtime.nativeEnvironment.eventBus.unsubscribe(id));
21
+ this.nativeEventSubscriptionIds.splice(0);
24
22
  }
25
23
  }
26
24
  exports.AppRuntimeModule = AppRuntimeModule;
@@ -1 +1 @@
1
- {"version":3,"file":"AppRuntimeModule.js","sourceRoot":"","sources":["../../src/modules/AppRuntimeModule.ts"],"names":[],"mappings":";;;AAEA,4CAAmE;AASnE,MAAsB,gBAEpB,SAAQ,uBAAkC;IAF5C;;QAGqB,uCAAkC,GAAoC,EAAE,CAAA;IAqB7F,CAAC;IAnBa,sBAAsB,CAAS,KAAY,EAAE,OAA6B;QAChF,MAAM,kBAAkB,GAAG,IAAI,CAAC,OAAO,CAAC,iBAAiB,CAAC,QAAQ,CAAC,SAAS,CAAC,KAAK,EAAE,OAAO,CAAC,CAAA;QAC5F,IAAI,kBAAkB,CAAC,OAAO,EAAE;YAC5B,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAA;YAC3C,MAAM,kBAAkB,CAAC,KAAK,CAAA;SACjC;QAED,IAAI,CAAC,kCAAkC,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAA;IACjG,CAAC;IAEkB,wBAAwB;QACvC,KAAK,CAAC,wBAAwB,EAAE,CAAA;QAEhC,KAAK,MAAM,YAAY,IAAI,IAAI,CAAC,kCAAkC,EAAE;YAChE,IAAI,CAAC,OAAO,CAAC,iBAAiB,CAAC,QAAQ,CAAC,WAAW,CAAC,YAAY,CAAC,MAAM,EAAE,YAAY,CAAC,EAAE,CAAC,CAAA;SAC5F;QAED,IAAI,CAAC,kCAAkC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAA;IACrD,CAAC;CACJ;AAxBD,4CAwBC"}
1
+ {"version":3,"file":"AppRuntimeModule.js","sourceRoot":"","sources":["../../src/modules/AppRuntimeModule.ts"],"names":[],"mappings":";;;AAEA,4CAAmE;AASnE,MAAsB,gBAEpB,SAAQ,uBAAkC;IAF5C;;QAGqB,+BAA0B,GAAa,EAAE,CAAA;IAkB9D,CAAC;IAhBa,sBAAsB,CAAS,KAAY,EAAE,OAA6B;QAChF,MAAM,kBAAkB,GAAG,IAAI,CAAC,OAAO,CAAC,iBAAiB,CAAC,QAAQ,CAAC,SAAS,CAAC,KAAK,EAAE,OAAO,CAAC,CAAA;QAC5F,IAAI,kBAAkB,CAAC,OAAO,EAAE;YAC5B,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAA;YAC3C,MAAM,kBAAkB,CAAC,KAAK,CAAA;SACjC;QAED,IAAI,CAAC,0BAA0B,CAAC,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAA;IAClE,CAAC;IAEkB,wBAAwB;QACvC,KAAK,CAAC,wBAAwB,EAAE,CAAA;QAEhC,IAAI,CAAC,0BAA0B,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,iBAAiB,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAA;QACxG,IAAI,CAAC,0BAA0B,CAAC,MAAM,CAAC,CAAC,CAAC,CAAA;IAC7C,CAAC;CACJ;AArBD,4CAqBC"}
@@ -558,11 +558,11 @@ const crypto_1 = __webpack_require__(/*! @nmshd/crypto */ "@nmshd/crypto");
558
558
  const runtime_1 = __webpack_require__(/*! @nmshd/runtime */ "@nmshd/runtime");
559
559
  const transport_1 = __webpack_require__(/*! @nmshd/transport */ "@nmshd/transport");
560
560
  exports.buildInformation = {
561
- version: "2.0.0-alpha.5",
562
- build: "16",
563
- date: "2022-07-11T11:59:52+00:00",
564
- commit: "7c2976509bc9518385664f993cbf3b87173b17c2",
565
- dependencies: {"@js-soft/docdb-access-loki":"^1.0.3","@js-soft/native-abstractions":"^1.1.0","@nmshd/runtime":"2.0.0-alpha.30","lodash":"^4.17.21"},
561
+ version: "2.0.0-alpha.6",
562
+ build: "17",
563
+ date: "2022-07-19T13:27:53+00:00",
564
+ commit: "6fac45e109bc1f82f4cb7010552b612291f3c297",
565
+ dependencies: {"@js-soft/docdb-access-loki":"^1.0.3","@js-soft/native-abstractions":"^1.2.0","@nmshd/runtime":"2.0.0-alpha.37","lodash":"^4.17.21"},
566
566
  libraries: {
567
567
  serval: ts_serval_1.buildInformation,
568
568
  crypto: crypto_1.buildInformation,
@@ -1143,7 +1143,7 @@ const runtime_1 = __webpack_require__(/*! @nmshd/runtime */ "@nmshd/runtime");
1143
1143
  class AppRuntimeModule extends runtime_1.RuntimeModule {
1144
1144
  constructor() {
1145
1145
  super(...arguments);
1146
- this.registeredNativeEventSubscriptions = [];
1146
+ this.nativeEventSubscriptionIds = [];
1147
1147
  }
1148
1148
  subscribeToNativeEvent(event, handler) {
1149
1149
  const subscriptionResult = this.runtime.nativeEnvironment.eventBus.subscribe(event, handler);
@@ -1151,14 +1151,12 @@ class AppRuntimeModule extends runtime_1.RuntimeModule {
1151
1151
  this.logger.error(subscriptionResult.error);
1152
1152
  throw subscriptionResult.error;
1153
1153
  }
1154
- this.registeredNativeEventSubscriptions.push({ id: subscriptionResult.value, target: event });
1154
+ this.nativeEventSubscriptionIds.push(subscriptionResult.value);
1155
1155
  }
1156
1156
  unsubscribeFromAllEvents() {
1157
1157
  super.unsubscribeFromAllEvents();
1158
- for (const subscription of this.registeredNativeEventSubscriptions) {
1159
- this.runtime.nativeEnvironment.eventBus.unsubscribe(subscription.target, subscription.id);
1160
- }
1161
- this.registeredNativeEventSubscriptions.splice(0);
1158
+ this.nativeEventSubscriptionIds.forEach((id) => this.runtime.nativeEnvironment.eventBus.unsubscribe(id));
1159
+ this.nativeEventSubscriptionIds.splice(0);
1162
1160
  }
1163
1161
  }
1164
1162
  exports.AppRuntimeModule = AppRuntimeModule;
@@ -3218,10 +3216,11 @@ const EventBus_1 = __webpack_require__(/*! ../EventBus */ "./node_modules/@js-so
3218
3216
  const SubscriptionTargetInfo_1 = __webpack_require__(/*! ../SubscriptionTargetInfo */ "./node_modules/@js-soft/ts-utils/dist/eventBus/SubscriptionTargetInfo.js");
3219
3217
  class EventEmitter2EventBus {
3220
3218
  emitter;
3221
- wrappers = new Map();
3219
+ listeners = new Map();
3222
3220
  nextId = 0;
3223
- constructor() {
3224
- this.emitter = new eventemitter2_1.EventEmitter2({ wildcard: true, maxListeners: 50, verboseMemoryLeak: true });
3221
+ invocationPromises = [];
3222
+ constructor(options) {
3223
+ this.emitter = new eventemitter2_1.EventEmitter2({ ...options, wildcard: true, maxListeners: 50, verboseMemoryLeak: true });
3225
3224
  }
3226
3225
  subscribe(subscriptionTarget, handler) {
3227
3226
  return this.registerHandler(subscriptionTarget, handler);
@@ -3229,33 +3228,39 @@ class EventEmitter2EventBus {
3229
3228
  subscribeOnce(subscriptionTarget, handler) {
3230
3229
  return this.registerHandler(subscriptionTarget, handler, true);
3231
3230
  }
3232
- unsubscribe(subscriptionTarget, subscriptionId) {
3233
- return this.unregisterHandler(subscriptionTarget, subscriptionId);
3231
+ unsubscribe(subscriptionId) {
3232
+ return this.unregisterHandler(subscriptionId);
3234
3233
  }
3235
3234
  registerHandler(subscriptionTarget, handler, isOneTimeHandler = false) {
3236
3235
  const subscriptionTargetInfo = SubscriptionTargetInfo_1.SubscriptionTargetInfo.from(subscriptionTarget);
3237
- const handlerId = this.nextId++;
3238
- const handlerWrapper = (event) => {
3236
+ const listenerId = this.nextId++;
3237
+ const handlerWrapper = async (event) => {
3239
3238
  if (!subscriptionTargetInfo.isCompatibleWith(event)) {
3240
3239
  return;
3241
3240
  }
3242
- handler(event);
3243
- if (isOneTimeHandler) {
3244
- this.unsubscribe(subscriptionTarget, handlerId);
3245
- }
3241
+ const invocationPromise = (async () => await handler(event))();
3242
+ this.invocationPromises.push(invocationPromise);
3243
+ await invocationPromise;
3244
+ this.invocationPromises = this.invocationPromises.filter((p) => p !== invocationPromise);
3245
+ if (isOneTimeHandler)
3246
+ this.listeners.delete(listenerId);
3246
3247
  };
3247
- this.wrappers.set(handlerId, handlerWrapper);
3248
- this.emitter.on(subscriptionTargetInfo.namespace, handlerWrapper);
3249
- return handlerId;
3250
- }
3251
- unregisterHandler(subscriptionTarget, handlerId) {
3252
- const subscriptionTargetInfo = SubscriptionTargetInfo_1.SubscriptionTargetInfo.from(subscriptionTarget);
3253
- const handlerWrapper = this.wrappers.get(handlerId);
3254
- if (!handlerWrapper) {
3248
+ if (isOneTimeHandler) {
3249
+ const listener = this.emitter.once(subscriptionTargetInfo.namespace, handlerWrapper, { objectify: true });
3250
+ this.listeners.set(listenerId, listener);
3251
+ return listenerId;
3252
+ }
3253
+ const listener = this.emitter.on(subscriptionTargetInfo.namespace, handlerWrapper, { objectify: true });
3254
+ this.listeners.set(listenerId, listener);
3255
+ return listenerId;
3256
+ }
3257
+ unregisterHandler(listenerId) {
3258
+ const listener = this.listeners.get(listenerId);
3259
+ if (!listener) {
3255
3260
  return false;
3256
3261
  }
3257
- this.emitter.off(subscriptionTargetInfo.namespace, handlerWrapper);
3258
- this.wrappers.delete(handlerId);
3262
+ listener.off();
3263
+ this.listeners.delete(listenerId);
3259
3264
  return true;
3260
3265
  }
3261
3266
  publish(event) {
@@ -3265,6 +3270,24 @@ class EventEmitter2EventBus {
3265
3270
  }
3266
3271
  this.emitter.emit(namespace, event);
3267
3272
  }
3273
+ async close(timeout) {
3274
+ this.emitter.removeAllListeners();
3275
+ const waitForInvocations = Promise.all(this.invocationPromises).catch(() => {
3276
+ /* ignore errors */
3277
+ });
3278
+ if (!timeout) {
3279
+ await waitForInvocations;
3280
+ return;
3281
+ }
3282
+ let timeoutId;
3283
+ const timeoutPromise = new Promise((_, reject) => {
3284
+ timeoutId = setTimeout(() => {
3285
+ reject(new Error("timeout exceeded while waiting for events to process"));
3286
+ }, timeout);
3287
+ });
3288
+ await Promise.race([waitForInvocations, timeoutPromise]);
3289
+ clearTimeout(timeoutId);
3290
+ }
3268
3291
  }
3269
3292
  exports.EventEmitter2EventBus = EventEmitter2EventBus;
3270
3293
  //# sourceMappingURL=EventEmitter2EventBus.js.map