vona-module-a-broadcast 5.1.13 → 5.1.14

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/index.js CHANGED
@@ -1,4 +1,4 @@
1
- import { BeanInfo, BeanBase, BeanSimple, BeanScopeBase, createBeanDecorator } from 'vona';
1
+ import { BeanInfo, BeanBase, getTestAsyncCompletion, uuidv4, BeanSimple, BeanScopeBase, createBeanDecorator } from 'vona';
2
2
  import { __decorate } from 'tslib';
3
3
  import { isNil } from '@cabloy/utils';
4
4
  import { Service, Scope } from 'vona-module-a-bean';
@@ -11,6 +11,8 @@ let ServiceBroadcast = class ServiceBroadcast extends BeanBase {
11
11
  this.__channelName = void 0;
12
12
  this.__sub = void 0;
13
13
  this.__pub = void 0;
14
+ this.__subReady = void 0;
15
+ this.__ownedDeliveries = new Map();
14
16
  }
15
17
  __init__() {
16
18
  const app = this.app;
@@ -18,11 +20,26 @@ let ServiceBroadcast = class ServiceBroadcast extends BeanBase {
18
20
  this.__channelName = getRedisClientKeyPrefix('broadcast', this.app);
19
21
  this.__pub = app.bean.redis.get('broadcast').duplicate();
20
22
  this.__sub = app.bean.redis.get('broadcast').duplicate();
21
- this.__sub.subscribe(this.__channelName, () => {});
22
- this.__sub.on('message', (_channel, info) => {
23
- this._performTask(JSON.parse(info)).then(() => {
24
- // do nothing
25
- }).catch(err => {
23
+ this.__subReady = new Promise((resolve, reject) => {
24
+ this.__sub.subscribe(this.__channelName, err => {
25
+ if (err) reject(err);else resolve();
26
+ });
27
+ });
28
+ void this.__subReady.catch(err => this.app.handleError(err));
29
+ this.__sub.on('message', (_channel, payload) => {
30
+ const info = JSON.parse(payload);
31
+ const delivery = info.callerId === this.__callerId && info.testCompletionId ? this.__ownedDeliveries.get(info.testCompletionId) : undefined;
32
+ const execute = async () => {
33
+ delivery?.owner.assertScope(info.options);
34
+ await this._performTask(info);
35
+ };
36
+ const task = delivery ? delivery.owner.bind(execute) : execute();
37
+ void task.then(() => {
38
+ delivery?.ticket.complete();
39
+ if (delivery) this.__ownedDeliveries.delete(info.testCompletionId);
40
+ }, err => {
41
+ delivery?.ticket.complete(err);
42
+ if (delivery) this.__ownedDeliveries.delete(info.testCompletionId);
26
43
  this.app.handleError(err);
27
44
  });
28
45
  });
@@ -55,6 +72,35 @@ let ServiceBroadcast = class ServiceBroadcast extends BeanBase {
55
72
  }
56
73
  };
57
74
  }
75
+ const owner = getTestAsyncCompletion(this.app);
76
+ if (owner) {
77
+ owner.assertScope(info.options);
78
+ const deliveryId = uuidv4();
79
+ const ticket = owner.reserve(`broadcast receipt: ${String(info.broadcastName)}`);
80
+ this.__ownedDeliveries.set(deliveryId, {
81
+ owner,
82
+ ticket
83
+ });
84
+ const ownedInfo = {
85
+ ...infoWithCaller,
86
+ testCompletionId: deliveryId
87
+ };
88
+ void owner.track(`broadcast publish: ${String(info.broadcastName)}`, async () => {
89
+ try {
90
+ await this.__subReady;
91
+ } catch (err) {
92
+ this.__ownedDeliveries.delete(deliveryId);
93
+ ticket.complete(err);
94
+ throw err;
95
+ }
96
+ // A transport failure can follow delivery; only receipt can settle its ticket.
97
+ await this.__pub.publish(this.__channelName, JSON.stringify(ownedInfo));
98
+ }).catch(err => {
99
+ if (span) telemetry.recordException(span, err);
100
+ this.app.handleError(err);
101
+ }).finally(() => span?.end());
102
+ return;
103
+ }
58
104
  this.__pub.publish(this.__channelName, JSON.stringify(infoWithCaller)).catch(err => {
59
105
  if (span) telemetry.recordException(span, err);
60
106
  this.app.handleError(err);
@@ -81,6 +127,9 @@ let ServiceBroadcast = class ServiceBroadcast extends BeanBase {
81
127
  try {
82
128
  // check
83
129
  if ((!isNil(instanceName) || instance) && !this.app.meta.appReady) {
130
+ if (info.testCompletionId && info.callerId === this.__callerId) {
131
+ throw new Error('Owned broadcast requires a ready application');
132
+ }
84
133
  // ignore
85
134
  return;
86
135
  }
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../src/service/broadcast.ts","../src/.metadata/this.ts","../src/monkey.ts","../src/main.ts","../src/.metadata/index.ts","../src/lib/beanBroadcastBase.ts","../src/lib/broadcast.ts"],"sourcesContent":[null,null,null,null,null,null,null],"names":["ServiceBroadcast","BeanBase","constructor","args","__callerId","__channelName","__sub","__pub","__init__","app","bean","worker","id","getRedisClientKeyPrefix","redis","get","duplicate","subscribe","on","_channel","info","_performTask","JSON","parse","then","catch","err","handleError","disposePub","disconnect","disposeSub","emit","telemetry","$scope","service","infoWithCaller","callerId","span","enabled","startSpan","String","broadcastName","kind","attributes","undefined","options","injectCarrier","createContext","publish","stringify","recordException","finally","end","parent","extractCarrier","isEmitter","broadcastItem","onion","broadcast","getOnionSlice","broadcastConfig","getOnionOptions","instanceName","instance","isNil","meta","appReady","execute","executor","newCtx","beanFullName","beanOptions","beanInstance","_getBean","data","dbInfo","locale","tz","extraData","state","context","transaction","withSpan","__decorate","Service","__z_BeanInfo","module","__ThisModule__","Monkey","BeanSimple","appClose","scopeSelf","scope","appClosed","Main","moduleLoading","moduleLoaded","configLoaded","_config","ScopeModuleABroadcast","BeanScopeBase","Scope","BeanBroadcastBase","_prepareInfo","prepareGeneralInfo","$onionName","Broadcast","createBeanDecorator"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../src/service/broadcast.ts","../src/.metadata/this.ts","../src/monkey.ts","../src/main.ts","../src/.metadata/index.ts","../src/lib/beanBroadcastBase.ts","../src/lib/broadcast.ts"],"sourcesContent":[null,null,null,null,null,null,null],"names":["ServiceBroadcast","BeanBase","constructor","args","__callerId","__channelName","__sub","__pub","__subReady","__ownedDeliveries","Map","__init__","app","bean","worker","id","getRedisClientKeyPrefix","redis","get","duplicate","Promise","resolve","reject","subscribe","err","catch","handleError","on","_channel","payload","info","JSON","parse","delivery","callerId","testCompletionId","undefined","execute","owner","assertScope","options","_performTask","task","bind","then","ticket","complete","delete","disposePub","disconnect","disposeSub","emit","telemetry","$scope","service","infoWithCaller","span","enabled","startSpan","String","broadcastName","kind","attributes","injectCarrier","createContext","getTestAsyncCompletion","deliveryId","uuidv4","reserve","set","ownedInfo","track","publish","stringify","recordException","finally","end","parent","extractCarrier","isEmitter","broadcastItem","onion","broadcast","getOnionSlice","broadcastConfig","getOnionOptions","instanceName","instance","isNil","meta","appReady","Error","executor","newCtx","beanFullName","beanOptions","beanInstance","_getBean","data","dbInfo","locale","tz","extraData","state","context","transaction","withSpan","__decorate","Service","__z_BeanInfo","module","__ThisModule__","Monkey","BeanSimple","appClose","scopeSelf","scope","appClosed","Main","moduleLoading","moduleLoaded","configLoaded","_config","ScopeModuleABroadcast","BeanScopeBase","Scope","BeanBroadcastBase","_prepareInfo","prepareGeneralInfo","$onionName","Broadcast","createBeanDecorator"],"mappings":"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"}
@@ -5,6 +5,8 @@ export declare class ServiceBroadcast extends BeanBase {
5
5
  private __channelName;
6
6
  private __sub;
7
7
  private __pub;
8
+ private __subReady;
9
+ private readonly __ownedDeliveries;
8
10
  protected __init__(): void;
9
11
  disposePub(): Promise<void>;
10
12
  disposeSub(): Promise<void>;
@@ -1 +1 @@
1
- {"version":3,"file":"broadcast.d.ts","sourceRoot":"","sources":["../../src/service/broadcast.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAC;AAIhC,OAAO,KAAK,EAAqB,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAErF,qBACa,gBAAiB,SAAQ,QAAQ;IAC5C,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,KAAK,CAAQ;IACrB,OAAO,CAAC,KAAK,CAAQ;IAErB,SAAS,CAAC,QAAQ;IAkBL,UAAU;IAIV,UAAU;IAIvB,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,oBAAoB,CAAC,IAAI,CAAC;IAiCrC,YAAY,CAAC,IAAI,EAAE,IAAI,EAAE,oBAAoB,CAAC,IAAI,CAAC;CAiE1D"}
1
+ {"version":3,"file":"broadcast.d.ts","sourceRoot":"","sources":["../../src/service/broadcast.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,QAAQ,EAAkC,MAAM,MAAM,CAAC;AAIhE,OAAO,KAAK,EAAqB,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAErF,qBACa,gBAAiB,SAAQ,QAAQ;IAC5C,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,KAAK,CAAQ;IACrB,OAAO,CAAC,KAAK,CAAQ;IACrB,OAAO,CAAC,UAAU,CAAgB;IAClC,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAG9B;IAEJ,SAAS,CAAC,QAAQ;IAsCL,UAAU;IAIV,UAAU;IAIvB,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,oBAAoB,CAAC,IAAI,CAAC;IA2DrC,YAAY,CAAC,IAAI,EAAE,IAAI,EAAE,oBAAoB,CAAC,IAAI,CAAC;CAoE1D"}
@@ -16,6 +16,7 @@ export interface IBroadcastJobContext<DATA> {
16
16
  data?: DATA;
17
17
  options?: IBroadcastEmitOptions;
18
18
  callerId?: string;
19
+ testCompletionId?: string;
19
20
  }
20
21
  export interface IBroadcastRecord {
21
22
  }
@@ -1 +1 @@
1
- {"version":3,"file":"broadcast.d.ts","sourceRoot":"","sources":["../../src/types/broadcast.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,MAAM,CAAC;AACtC,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAClE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAExD,MAAM,WAAW,qBAAsB,SAAQ,mBAAmB;IAChE,SAAS,CAAC,EAAE;QACV,OAAO,EAAE,CAAC,CAAC;QACX,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,UAAU,CAAC,EAAE,MAAM,CAAC;KACrB,CAAC;CACH;AAED,MAAM,WAAW,iBAAiB,CAAC,IAAI,GAAG,OAAO;IAC/C,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,SAAS,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1D;AAED,MAAM,WAAW,oBAAoB,CAAC,IAAI;IACxC,aAAa,EAAE,MAAM,gBAAgB,CAAC;IACtC,IAAI,CAAC,EAAE,IAAI,CAAC;IACZ,OAAO,CAAC,EAAE,qBAAqB,CAAC;IAChC,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,gBAAgB;CAAG;AAEpC,MAAM,WAAW,0BAA0B;IACzC,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,OAAO,QAAQ,qBAAqB,CAAC;IACnC,UAAiB,SAAS;QACxB,SAAS,EAAE,YAAY,CAAC,gBAAgB,CAAC,CAAC;KAC3C;CACF;AAED,OAAO,QAAQ,MAAM,CAAC;IACpB,UAAiB,YAAY;QAC3B,SAAS,EAAE,SAAS,CAAC,gBAAgB,CAAC,CAAC;KACxC;IAED,UAAiB,gBAAgB;QAC/B,SAAS,EAAE,KAAK,CAAC;KAClB;CACF"}
1
+ {"version":3,"file":"broadcast.d.ts","sourceRoot":"","sources":["../../src/types/broadcast.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,MAAM,CAAC;AACtC,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAClE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAExD,MAAM,WAAW,qBAAsB,SAAQ,mBAAmB;IAChE,SAAS,CAAC,EAAE;QACV,OAAO,EAAE,CAAC,CAAC;QACX,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,UAAU,CAAC,EAAE,MAAM,CAAC;KACrB,CAAC;CACH;AAED,MAAM,WAAW,iBAAiB,CAAC,IAAI,GAAG,OAAO;IAC/C,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,SAAS,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1D;AAED,MAAM,WAAW,oBAAoB,CAAC,IAAI;IACxC,aAAa,EAAE,MAAM,gBAAgB,CAAC;IACtC,IAAI,CAAC,EAAE,IAAI,CAAC;IACZ,OAAO,CAAC,EAAE,qBAAqB,CAAC;IAChC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,gBAAgB;CAAG;AAEpC,MAAM,WAAW,0BAA0B;IACzC,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,OAAO,QAAQ,qBAAqB,CAAC;IACnC,UAAiB,SAAS;QACxB,SAAS,EAAE,YAAY,CAAC,gBAAgB,CAAC,CAAC;KAC3C;CACF;AAED,OAAO,QAAQ,MAAM,CAAC;IACpB,UAAiB,YAAY;QAC3B,SAAS,EAAE,SAAS,CAAC,gBAAgB,CAAC,CAAC;KACxC;IAED,UAAiB,gBAAgB;QAC/B,SAAS,EAAE,KAAK,CAAC;KAClB;CACF"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "vona-module-a-broadcast",
3
- "version": "5.1.13",
4
- "gitHead": "eb85d771ef75776a439e56df3af8be6a3a36c1c2",
3
+ "version": "5.1.14",
4
+ "gitHead": "30aa129a2ca0c4ef6dde9cc910d42f7b3982ef79",
5
5
  "description": "",
6
6
  "keywords": [
7
7
  "Vona Module"
@@ -1,7 +1,8 @@
1
1
  import type { Redis } from 'ioredis';
2
+ import type { TestAsyncCompletion, TestAsyncCompletionTicket } from 'vona';
2
3
 
3
4
  import { isNil } from '@cabloy/utils';
4
- import { BeanBase } from 'vona';
5
+ import { BeanBase, getTestAsyncCompletion, uuidv4 } from 'vona';
5
6
  import { Service } from 'vona-module-a-bean';
6
7
  import { getRedisClientKeyPrefix } from 'vona-module-a-redis';
7
8
 
@@ -13,6 +14,11 @@ export class ServiceBroadcast extends BeanBase {
13
14
  private __channelName: string;
14
15
  private __sub: Redis;
15
16
  private __pub: Redis;
17
+ private __subReady: Promise<void>;
18
+ private readonly __ownedDeliveries = new Map<
19
+ string,
20
+ { owner: TestAsyncCompletion; ticket: TestAsyncCompletionTicket }
21
+ >();
16
22
 
17
23
  protected __init__() {
18
24
  const app = this.app;
@@ -20,15 +26,35 @@ export class ServiceBroadcast extends BeanBase {
20
26
  this.__channelName = getRedisClientKeyPrefix('broadcast', this.app);
21
27
  this.__pub = app.bean.redis.get('broadcast').duplicate();
22
28
  this.__sub = app.bean.redis.get('broadcast').duplicate();
23
- this.__sub.subscribe(this.__channelName, () => {});
24
- this.__sub.on('message', (_channel, info) => {
25
- this._performTask(JSON.parse(info))
26
- .then(() => {
27
- // do nothing
28
- })
29
- .catch((err: Error) => {
29
+ this.__subReady = new Promise<void>((resolve, reject) => {
30
+ this.__sub.subscribe(this.__channelName, err => {
31
+ if (err) reject(err);
32
+ else resolve();
33
+ });
34
+ });
35
+ void this.__subReady.catch(err => this.app.handleError(err));
36
+ this.__sub.on('message', (_channel, payload) => {
37
+ const info: IBroadcastJobContext<unknown> = JSON.parse(payload);
38
+ const delivery =
39
+ info.callerId === this.__callerId && info.testCompletionId
40
+ ? this.__ownedDeliveries.get(info.testCompletionId)
41
+ : undefined;
42
+ const execute = async () => {
43
+ delivery?.owner.assertScope(info.options);
44
+ await this._performTask(info);
45
+ };
46
+ const task = delivery ? delivery.owner.bind(execute) : execute();
47
+ void task.then(
48
+ () => {
49
+ delivery?.ticket.complete();
50
+ if (delivery) this.__ownedDeliveries.delete(info.testCompletionId!);
51
+ },
52
+ err => {
53
+ delivery?.ticket.complete(err);
54
+ if (delivery) this.__ownedDeliveries.delete(info.testCompletionId!);
30
55
  this.app.handleError(err);
31
- });
56
+ },
57
+ );
32
58
  });
33
59
  }
34
60
 
@@ -64,6 +90,32 @@ export class ServiceBroadcast extends BeanBase {
64
90
  },
65
91
  };
66
92
  }
93
+ const owner = getTestAsyncCompletion(this.app);
94
+ if (owner) {
95
+ owner.assertScope(info.options);
96
+ const deliveryId = uuidv4();
97
+ const ticket = owner.reserve(`broadcast receipt: ${String(info.broadcastName)}`);
98
+ this.__ownedDeliveries.set(deliveryId, { owner, ticket });
99
+ const ownedInfo = { ...infoWithCaller, testCompletionId: deliveryId };
100
+ void owner
101
+ .track(`broadcast publish: ${String(info.broadcastName)}`, async () => {
102
+ try {
103
+ await this.__subReady;
104
+ } catch (err) {
105
+ this.__ownedDeliveries.delete(deliveryId);
106
+ ticket.complete(err);
107
+ throw err;
108
+ }
109
+ // A transport failure can follow delivery; only receipt can settle its ticket.
110
+ await this.__pub.publish(this.__channelName, JSON.stringify(ownedInfo));
111
+ })
112
+ .catch(err => {
113
+ if (span) telemetry.recordException(span, err);
114
+ this.app.handleError(err);
115
+ })
116
+ .finally(() => span?.end());
117
+ return;
118
+ }
67
119
  this.__pub
68
120
  .publish(this.__channelName, JSON.stringify(infoWithCaller))
69
121
  .catch(err => {
@@ -100,6 +152,9 @@ export class ServiceBroadcast extends BeanBase {
100
152
  try {
101
153
  // check
102
154
  if ((!isNil(instanceName) || instance) && !this.app.meta.appReady) {
155
+ if (info.testCompletionId && info.callerId === this.__callerId) {
156
+ throw new Error('Owned broadcast requires a ready application');
157
+ }
103
158
  // ignore
104
159
  return;
105
160
  }
@@ -19,6 +19,7 @@ export interface IBroadcastJobContext<DATA> {
19
19
  data?: DATA;
20
20
  options?: IBroadcastEmitOptions;
21
21
  callerId?: string;
22
+ testCompletionId?: string;
22
23
  }
23
24
 
24
25
  export interface IBroadcastRecord {}