@hile/micro 2.0.15 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/client.d.ts CHANGED
@@ -1,4 +1,5 @@
1
1
  import { MessageWs } from "@hile/message-ws";
2
+ import { type ContextData, type ContextInput } from '@hile/context';
2
3
  import { Server } from './server.js';
3
4
  import { WebSocket } from 'ws';
4
5
  import { EventEmitter } from 'node:events';
@@ -8,6 +9,15 @@ export interface ClientProps {
8
9
  server: Server;
9
10
  ws: WebSocket;
10
11
  }
12
+ export type MicroMessageMetadata = {
13
+ context?: ContextInput<ContextData>;
14
+ [key: string]: unknown;
15
+ };
16
+ export type MicroMessage<T = any> = {
17
+ url: string;
18
+ data: T;
19
+ metadata?: MicroMessageMetadata;
20
+ };
11
21
  export declare class Client extends MessageWs {
12
22
  private readonly server;
13
23
  private readonly socket;
@@ -20,10 +30,7 @@ export declare class Client extends MessageWs {
20
30
  readonly events: EventEmitter<any>;
21
31
  constructor(props: ClientProps);
22
32
  private startHeartbeat;
23
- protected exec(data: {
24
- url: string;
25
- data: any;
26
- }): Promise<any>;
33
+ protected exec(data: MicroMessage): Promise<any>;
27
34
  request<T = any>(url: string, data: any, options?: {
28
35
  timeout?: number;
29
36
  signal?: AbortSignal;
package/dist/client.js CHANGED
@@ -1,6 +1,52 @@
1
1
  import { MessageWs } from "@hile/message-ws";
2
+ import { isContextData, runWithContext, snapshotContext, } from '@hile/context';
2
3
  import { WebSocket } from 'ws';
3
4
  import { EventEmitter } from 'node:events';
5
+ function createEnvelope(url, data) {
6
+ const context = snapshotContext();
7
+ if (Object.keys(context).length === 0)
8
+ return { url, data };
9
+ return {
10
+ url,
11
+ data,
12
+ metadata: {
13
+ context,
14
+ },
15
+ };
16
+ }
17
+ function getEnvelopeContext(data) {
18
+ const context = data.metadata?.context;
19
+ if (!isContextData(context))
20
+ return undefined;
21
+ return context;
22
+ }
23
+ function isAsyncIterable(value) {
24
+ return value != null && typeof value[Symbol.asyncIterator] === 'function';
25
+ }
26
+ function bindAsyncIterableToContext(iterable, context) {
27
+ return {
28
+ [Symbol.asyncIterator]() {
29
+ const iterator = iterable[Symbol.asyncIterator]();
30
+ return {
31
+ next() {
32
+ return Promise.resolve(runWithContext(context, () => iterator.next()));
33
+ },
34
+ return(value) {
35
+ if (!iterator.return) {
36
+ return Promise.resolve({ done: true, value });
37
+ }
38
+ return Promise.resolve(runWithContext(context, () => iterator.return(value)));
39
+ },
40
+ throw(error) {
41
+ if (!iterator.throw) {
42
+ return Promise.reject(error);
43
+ }
44
+ return Promise.resolve(runWithContext(context, () => iterator.throw(error)));
45
+ },
46
+ };
47
+ },
48
+ };
49
+ }
4
50
  export class Client extends MessageWs {
5
51
  server;
6
52
  socket;
@@ -48,24 +94,35 @@ export class Client extends MessageWs {
48
94
  }
49
95
  if (!this._online)
50
96
  throw new Error('Client is not online');
51
- return this.server.dispatch(data.url, data.data, {
52
- client: this,
53
- });
97
+ const context = getEnvelopeContext(data);
98
+ const dispatch = async () => {
99
+ const result = await this.server.dispatch(data.url, data.data, {
100
+ client: this,
101
+ metadata: data.metadata,
102
+ });
103
+ if (context && isAsyncIterable(result)) {
104
+ return bindAsyncIterableToContext(result, context);
105
+ }
106
+ return result;
107
+ };
108
+ if (context)
109
+ return runWithContext(context, dispatch);
110
+ return dispatch();
54
111
  }
55
112
  request(url, data, options) {
56
113
  if (!this._online)
57
114
  throw new Error('Client is not online');
58
- return this._send({ url, data }, options);
115
+ return this._send(createEnvelope(url, data), options);
59
116
  }
60
117
  push(url, data, options) {
61
118
  if (!this._online)
62
119
  throw new Error('Client is not online');
63
- return this._push({ url, data }, options);
120
+ return this._push(createEnvelope(url, data), options);
64
121
  }
65
122
  stream(url, data, options) {
66
123
  if (!this._online)
67
124
  throw new Error('Client is not online');
68
- return this._stream({ url, data }, options);
125
+ return this._stream(createEnvelope(url, data), options);
69
126
  }
70
127
  dispose() {
71
128
  if (this.heartbeatTimer)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hile/micro",
3
- "version": "2.0.15",
3
+ "version": "3.0.0",
4
4
  "type": "module",
5
5
  "main": "./dist/index.js",
6
6
  "scripts": {
@@ -23,11 +23,13 @@
23
23
  "vitest": "^4.0.18"
24
24
  },
25
25
  "dependencies": {
26
- "@hile/logger": "workspace:^",
27
- "@hile/message-loader": "workspace:^",
28
- "@hile/message-ws": "workspace:^",
26
+ "@hile/context": "^3.0.1",
27
+ "@hile/logger": "^2.1.1",
28
+ "@hile/message-loader": "^2.1.1",
29
+ "@hile/message-ws": "^2.1.1",
29
30
  "internal-ip": "^9.0.0",
30
31
  "ws": "^8.21.0",
31
32
  "yaml": "^2.9.0"
32
- }
33
+ },
34
+ "gitHead": "14b55afba0e9af80a782eaa84f6f48c1e66861a1"
33
35
  }