@nmtjs/ws-client 0.10.5 → 0.11.1

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
@@ -3,10 +3,14 @@ import { ProtocolTransport } from "@nmtjs/protocol/client";
3
3
  export class WebSocketClientTransport extends ProtocolTransport {
4
4
  webSocket = null;
5
5
  connecting = null;
6
+ options;
6
7
  constructor(protocol, options) {
7
8
  super();
8
9
  this.protocol = protocol;
9
- this.options = options;
10
+ this.options = {
11
+ debug: false,
12
+ ...options
13
+ };
10
14
  }
11
15
  connect(auth, transformer) {
12
16
  const wsUrl = new URL("/api", this.options.origin);
@@ -20,28 +24,25 @@ export class WebSocketClientTransport extends ProtocolTransport {
20
24
  ws.addEventListener("message", ({ data }) => {
21
25
  this.protocol.handleServerMessage(data, this, transformer);
22
26
  });
27
+ ws.addEventListener("close", (error) => {
28
+ if (error.reason !== "user") this.emit("disconnected");
29
+ this.webSocket = null;
30
+ }, { once: true });
23
31
  this.webSocket = ws;
24
32
  this.connecting = new Promise((resolve, reject) => {
25
33
  ws.addEventListener("open", () => {
26
- this.protocol.emit("connected");
34
+ this.emit("connected");
27
35
  resolve();
28
36
  }, { once: true });
29
37
  ws.addEventListener("error", (event) => {
30
38
  reject(new Error("WebSocket error", { cause: event }));
31
39
  }, { once: true });
32
- ws.addEventListener("close", () => {
33
- this.protocol.emit("disconnected");
34
- this.webSocket = null;
35
- if (this.options.autoreconnect === true) {
36
- setTimeout(this.connect.bind(this), 1e3);
37
- }
38
- }, { once: true });
39
40
  });
40
41
  return this.connecting;
41
42
  }
42
43
  async disconnect() {
43
44
  if (this.webSocket === null) return;
44
- this.webSocket.close();
45
+ this.webSocket.close(undefined, "user");
45
46
  return _once(this.webSocket, "close");
46
47
  }
47
48
  async call(namespace, procedure, payload, options, transformer) {
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"mappings":"AAAA,SAAS,mBAAmB,QAAQ,oBAAoB,iBAAiB;AACzE,SAIE,yBACK,wBAAwB;AAsB/B,OAAO,MAAM,iCAAiC,kBAAkB;CAC9D,AAAU,YAA8B;CACxC,AAAU,aAAmC;CAE7C,YACqBA,UACAC,SACnB;AACA,SAAO;OAHY;OACA;CAGpB;CAED,QAAQC,MAAWC,aAAqD;EACtE,MAAM,QAAQ,IAAI,IAAI,QAAQ,KAAK,QAAQ;AAC3C,MAAI,KAAK,SAAS,aAAa;AAC7B,SAAM,aAAa,IAAI,gBAAgB,KAAK,SAAS,YAAY;AACjE,SAAM,aAAa,IAAI,UAAU,KAAK,SAAS,YAAY;EAC5D;AACD,MAAI,KAAM,OAAM,aAAa,IAAI,QAAQ,KAAK;EAE9C,MAAM,KACJ,KAAK,QAAQ,YAAY,MAAM,IAAI,IAAI,UAAU,MAAM,UAAU;AAEnE,KAAG,aAAa;AAEhB,KAAG,iBAAiB,WAAW,CAAC,EAAE,MAAM,KAAK;AAC3C,QAAK,SAAS,oBAAoB,MAAqB,MAAM,YAAY;EAC1E,EAAC;AAEF,OAAK,YAAY;AAEjB,OAAK,aAAa,IAAI,QAAQ,CAAC,SAAS,WAAW;AACjD,MAAG,iBACD,QACA,MAAM;AACJ,SAAK,SAAS,KAAK,YAAY;AAC/B,aAAS;GACV,GACD,EAAE,MAAM,KAAM,EACf;AAED,MAAG,iBACD,SACA,CAAC,UAAU;AACT,WAAO,IAAI,MAAM,mBAAmB,EAAE,OAAO,MAAO,GAAE;GACvD,GACD,EAAE,MAAM,KAAM,EACf;AAED,MAAG,iBACD,SACA,MAAM;AACJ,SAAK,SAAS,KAAK,eAAe;AAClC,SAAK,YAAY;AACjB,QAAI,KAAK,QAAQ,kBAAkB,MAAM;AACvC,gBAAW,KAAK,QAAQ,KAAK,KAAK,EAAE,IAAK;IAC1C;GACF,GACD,EAAE,MAAM,KAAM,EACf;EACF;AAED,SAAO,KAAK;CACb;CAED,MAAM,aAA4B;AAChC,MAAI,KAAK,cAAc,KAAM;AAC7B,OAAK,UAAW,OAAO;AACvB,SAAO,MAAM,KAAK,WAAW,QAAQ;CACtC;CAED,MAAM,KACJC,WACAC,WACAC,SACAC,SACAJ,aACA;EACA,MAAM,EAAE,MAAM,QAAQ,GAAG,KAAK,SAAS,UACrC,WACA,WACA,SACA,SACA,YACD;AACD,QAAM,KAAK,KAAK,kBAAkB,KAAK,OAAO;AAC9C,SAAO;CACR;CAED,MAAM,KACJK,aACAC,QACe;AACf,MAAI,KAAK,WAAY,OAAM,KAAK;AAChC,OAAK,UAAW,KAAK,OAAO,aAAa,aAAa,QAAQ,EAAE,OAAO,CAAC;CACzE;AACF;AAED,SAAS,MAAMC,QAAqBC,OAAe;AACjD,QAAO,IAAI,QAAc,CAAC,YAAY;AACpC,SAAO,iBAAiB,OAAO,MAAM,SAAS,EAAE,EAAE,MAAM,KAAM,EAAC;CAChE;AACF","names":["protocol: Protocol","options: WebSocketClientTransportOptions","auth: any","transformer: ProtocolBaseTransformer","namespace: string","procedure: string","payload: any","options: ProtocolBaseClientCallOptions","messageType: ClientMessageType","buffer: ArrayBuffer","target: EventTarget","event: string"],"sources":["../src/index.ts"],"sourcesContent":["import { ClientMessageType, concat, encodeNumber } from '@nmtjs/protocol'\nimport {\n type Protocol,\n type ProtocolBaseClientCallOptions,\n type ProtocolBaseTransformer,\n ProtocolTransport,\n} from '@nmtjs/protocol/client'\n\nexport type WebSocketClientTransportOptions = {\n /**\n * The origin of the server\n * @example 'http://localhost:3000'\n */\n origin: string\n /**\n * Whether to autoreconnect on close\n * @default true\n */\n autoreconnect?: boolean\n /**\n * Custom WebSocket class\n * @default globalThis.WebSocket\n */\n wsFactory?: (url: URL) => WebSocket\n\n debug?: boolean\n}\n\nexport class WebSocketClientTransport extends ProtocolTransport {\n protected webSocket: WebSocket | null = null\n protected connecting: Promise<void> | null = null\n\n constructor(\n protected readonly protocol: Protocol,\n protected readonly options: WebSocketClientTransportOptions,\n ) {\n super()\n }\n\n connect(auth: any, transformer: ProtocolBaseTransformer): Promise<void> {\n const wsUrl = new URL('/api', this.options.origin)\n if (this.protocol.contentType) {\n wsUrl.searchParams.set('content-type', this.protocol.contentType)\n wsUrl.searchParams.set('accept', this.protocol.contentType)\n }\n if (auth) wsUrl.searchParams.set('auth', auth)\n\n const ws =\n this.options.wsFactory?.(wsUrl) ?? new WebSocket(wsUrl.toString())\n\n ws.binaryType = 'arraybuffer'\n\n ws.addEventListener('message', ({ data }) => {\n this.protocol.handleServerMessage(data as ArrayBuffer, this, transformer)\n })\n\n this.webSocket = ws\n\n this.connecting = new Promise((resolve, reject) => {\n ws.addEventListener(\n 'open',\n () => {\n this.protocol.emit('connected')\n resolve()\n },\n { once: true },\n )\n\n ws.addEventListener(\n 'error',\n (event) => {\n reject(new Error('WebSocket error', { cause: event }))\n },\n { once: true },\n )\n\n ws.addEventListener(\n 'close',\n () => {\n this.protocol.emit('disconnected')\n this.webSocket = null\n if (this.options.autoreconnect === true) {\n setTimeout(this.connect.bind(this), 1000)\n }\n },\n { once: true },\n )\n })\n\n return this.connecting\n }\n\n async disconnect(): Promise<void> {\n if (this.webSocket === null) return\n this.webSocket!.close()\n return _once(this.webSocket, 'close')\n }\n\n async call(\n namespace: string,\n procedure: string,\n payload: any,\n options: ProtocolBaseClientCallOptions,\n transformer: ProtocolBaseTransformer,\n ) {\n const { call, buffer } = this.protocol.createRpc(\n namespace,\n procedure,\n payload,\n options,\n transformer,\n )\n await this.send(ClientMessageType.Rpc, buffer)\n return call\n }\n\n async send(\n messageType: ClientMessageType,\n buffer: ArrayBuffer,\n ): Promise<void> {\n if (this.connecting) await this.connecting\n this.webSocket!.send(concat(encodeNumber(messageType, 'Uint8'), buffer))\n }\n}\n\nfunction _once(target: EventTarget, event: string) {\n return new Promise<void>((resolve) => {\n target.addEventListener(event, () => resolve(), { once: true })\n })\n}\n"],"version":3,"file":"index.js"}
1
+ {"mappings":"AAAA,SAAS,mBAAmB,QAAQ,oBAAoB,iBAAiB;AACzE,SAIE,yBACK,wBAAwB;AAiB/B,OAAO,MAAM,iCAAiC,kBAAkB;CAC9D,AAAU,YAA8B;CACxC,AAAU,aAAmC;CAC7C,AAAU;CAEV,YACqBA,UACnBC,SACA;AACA,SAAO;OAHY;AAInB,OAAK,UAAU;GACb,OAAO;GACP,GAAG;EACJ;CACF;CAED,QAAQC,MAAWC,aAAqD;EAEtE,MAAM,QAAQ,IAAI,IAAI,QAAQ,KAAK,QAAQ;AAC3C,MAAI,KAAK,SAAS,aAAa;AAC7B,SAAM,aAAa,IAAI,gBAAgB,KAAK,SAAS,YAAY;AACjE,SAAM,aAAa,IAAI,UAAU,KAAK,SAAS,YAAY;EAC5D;AACD,MAAI,KAAM,OAAM,aAAa,IAAI,QAAQ,KAAK;EAE9C,MAAM,KACJ,KAAK,QAAQ,YAAY,MAAM,IAAI,IAAI,UAAU,MAAM,UAAU;AAEnE,KAAG,aAAa;AAEhB,KAAG,iBAAiB,WAAW,CAAC,EAAE,MAAM,KAAK;AAC3C,QAAK,SAAS,oBAAoB,MAAqB,MAAM,YAAY;EAC1E,EAAC;AAEF,KAAG,iBACD,SACA,CAAC,UAAU;AACT,OAAI,MAAM,WAAW,OAAQ,MAAK,KAAK,eAAe;AACtD,QAAK,YAAY;EAClB,GACD,EAAE,MAAM,KAAM,EACf;AAED,OAAK,YAAY;AAEjB,OAAK,aAAa,IAAI,QAAQ,CAAC,SAAS,WAAW;AACjD,MAAG,iBACD,QACA,MAAM;AACJ,SAAK,KAAK,YAAY;AACtB,aAAS;GACV,GACD,EAAE,MAAM,KAAM,EACf;AAED,MAAG,iBACD,SACA,CAAC,UAAU;AACT,WAAO,IAAI,MAAM,mBAAmB,EAAE,OAAO,MAAO,GAAE;GACvD,GACD,EAAE,MAAM,KAAM,EACf;EACF;AAED,SAAO,KAAK;CACb;CAED,MAAM,aAA4B;AAChC,MAAI,KAAK,cAAc,KAAM;AAC7B,OAAK,UAAW,MAAM,WAAW,OAAO;AACxC,SAAO,MAAM,KAAK,WAAW,QAAQ;CACtC;CAED,MAAM,KACJC,WACAC,WACAC,SACAC,SACAJ,aACA;EACA,MAAM,EAAE,MAAM,QAAQ,GAAG,KAAK,SAAS,UACrC,WACA,WACA,SACA,SACA,YACD;AACD,QAAM,KAAK,KAAK,kBAAkB,KAAK,OAAO;AAC9C,SAAO;CACR;CAED,MAAM,KACJK,aACAC,QACe;AACf,MAAI,KAAK,WAAY,OAAM,KAAK;AAChC,OAAK,UAAW,KAAK,OAAO,aAAa,aAAa,QAAQ,EAAE,OAAO,CAAC;CACzE;AACF;AAED,SAAS,MAAMC,QAAqBC,OAAe;AACjD,QAAO,IAAI,QAAc,CAAC,YAAY;AACpC,SAAO,iBAAiB,OAAO,MAAM,SAAS,EAAE,EAAE,MAAM,KAAM,EAAC;CAChE;AACF","names":["protocol: Protocol","options: WebSocketClientTransportOptions","auth: any","transformer: ProtocolBaseTransformer","namespace: string","procedure: string","payload: any","options: ProtocolBaseClientCallOptions","messageType: ClientMessageType","buffer: ArrayBuffer","target: EventTarget","event: string"],"sources":["../src/index.ts"],"sourcesContent":["import { ClientMessageType, concat, encodeNumber } from '@nmtjs/protocol'\nimport {\n type Protocol,\n type ProtocolBaseClientCallOptions,\n type ProtocolBaseTransformer,\n ProtocolTransport,\n} from '@nmtjs/protocol/client'\n\nexport type WebSocketClientTransportOptions = {\n /**\n * The origin of the server\n * @example 'http://localhost:3000'\n */\n origin: string\n /**\n * Custom WebSocket class\n * @default globalThis.WebSocket\n */\n wsFactory?: (url: URL) => WebSocket\n\n debug?: boolean\n}\n\nexport class WebSocketClientTransport extends ProtocolTransport {\n protected webSocket: WebSocket | null = null\n protected connecting: Promise<void> | null = null\n protected options: WebSocketClientTransportOptions\n\n constructor(\n protected readonly protocol: Protocol,\n options: WebSocketClientTransportOptions,\n ) {\n super()\n this.options = {\n debug: false,\n ...options,\n }\n }\n\n connect(auth: any, transformer: ProtocolBaseTransformer): Promise<void> {\n // this.auth = auth\n const wsUrl = new URL('/api', this.options.origin)\n if (this.protocol.contentType) {\n wsUrl.searchParams.set('content-type', this.protocol.contentType)\n wsUrl.searchParams.set('accept', this.protocol.contentType)\n }\n if (auth) wsUrl.searchParams.set('auth', auth)\n\n const ws =\n this.options.wsFactory?.(wsUrl) ?? new WebSocket(wsUrl.toString())\n\n ws.binaryType = 'arraybuffer'\n\n ws.addEventListener('message', ({ data }) => {\n this.protocol.handleServerMessage(data as ArrayBuffer, this, transformer)\n })\n\n ws.addEventListener(\n 'close',\n (error) => {\n if (error.reason !== 'user') this.emit('disconnected')\n this.webSocket = null\n },\n { once: true },\n )\n\n this.webSocket = ws\n\n this.connecting = new Promise((resolve, reject) => {\n ws.addEventListener(\n 'open',\n () => {\n this.emit('connected')\n resolve()\n },\n { once: true },\n )\n\n ws.addEventListener(\n 'error',\n (event) => {\n reject(new Error('WebSocket error', { cause: event }))\n },\n { once: true },\n )\n })\n\n return this.connecting\n }\n\n async disconnect(): Promise<void> {\n if (this.webSocket === null) return\n this.webSocket!.close(undefined, 'user')\n return _once(this.webSocket, 'close')\n }\n\n async call(\n namespace: string,\n procedure: string,\n payload: any,\n options: ProtocolBaseClientCallOptions,\n transformer: ProtocolBaseTransformer,\n ) {\n const { call, buffer } = this.protocol.createRpc(\n namespace,\n procedure,\n payload,\n options,\n transformer,\n )\n await this.send(ClientMessageType.Rpc, buffer)\n return call\n }\n\n async send(\n messageType: ClientMessageType,\n buffer: ArrayBuffer,\n ): Promise<void> {\n if (this.connecting) await this.connecting\n this.webSocket!.send(concat(encodeNumber(messageType, 'Uint8'), buffer))\n }\n}\n\nfunction _once(target: EventTarget, event: string) {\n return new Promise<void>((resolve) => {\n target.addEventListener(event, () => resolve(), { once: true })\n })\n}\n"],"version":3,"file":"index.js"}
package/package.json CHANGED
@@ -8,14 +8,14 @@
8
8
  }
9
9
  },
10
10
  "dependencies": {
11
- "@nmtjs/client": "0.10.5",
12
- "@nmtjs/common": "0.10.5",
13
- "@nmtjs/protocol": "0.10.5"
11
+ "@nmtjs/protocol": "0.11.1",
12
+ "@nmtjs/common": "0.11.1",
13
+ "@nmtjs/client": "0.11.1"
14
14
  },
15
15
  "peerDependencies": {
16
- "@nmtjs/client": "0.10.5",
17
- "@nmtjs/protocol": "0.10.5",
18
- "@nmtjs/common": "0.10.5"
16
+ "@nmtjs/client": "0.11.1",
17
+ "@nmtjs/protocol": "0.11.1",
18
+ "@nmtjs/common": "0.11.1"
19
19
  },
20
20
  "files": [
21
21
  "src",
@@ -23,7 +23,7 @@
23
23
  "LICENSE.md",
24
24
  "README.md"
25
25
  ],
26
- "version": "0.10.5",
26
+ "version": "0.11.1",
27
27
  "scripts": {
28
28
  "build": "neemata-build --root=./src './*.ts'",
29
29
  "type-check": "tsc --noEmit"
package/src/index.ts CHANGED
@@ -12,11 +12,6 @@ export type WebSocketClientTransportOptions = {
12
12
  * @example 'http://localhost:3000'
13
13
  */
14
14
  origin: string
15
- /**
16
- * Whether to autoreconnect on close
17
- * @default true
18
- */
19
- autoreconnect?: boolean
20
15
  /**
21
16
  * Custom WebSocket class
22
17
  * @default globalThis.WebSocket
@@ -29,15 +24,21 @@ export type WebSocketClientTransportOptions = {
29
24
  export class WebSocketClientTransport extends ProtocolTransport {
30
25
  protected webSocket: WebSocket | null = null
31
26
  protected connecting: Promise<void> | null = null
27
+ protected options: WebSocketClientTransportOptions
32
28
 
33
29
  constructor(
34
30
  protected readonly protocol: Protocol,
35
- protected readonly options: WebSocketClientTransportOptions,
31
+ options: WebSocketClientTransportOptions,
36
32
  ) {
37
33
  super()
34
+ this.options = {
35
+ debug: false,
36
+ ...options,
37
+ }
38
38
  }
39
39
 
40
40
  connect(auth: any, transformer: ProtocolBaseTransformer): Promise<void> {
41
+ // this.auth = auth
41
42
  const wsUrl = new URL('/api', this.options.origin)
42
43
  if (this.protocol.contentType) {
43
44
  wsUrl.searchParams.set('content-type', this.protocol.contentType)
@@ -54,13 +55,22 @@ export class WebSocketClientTransport extends ProtocolTransport {
54
55
  this.protocol.handleServerMessage(data as ArrayBuffer, this, transformer)
55
56
  })
56
57
 
58
+ ws.addEventListener(
59
+ 'close',
60
+ (error) => {
61
+ if (error.reason !== 'user') this.emit('disconnected')
62
+ this.webSocket = null
63
+ },
64
+ { once: true },
65
+ )
66
+
57
67
  this.webSocket = ws
58
68
 
59
69
  this.connecting = new Promise((resolve, reject) => {
60
70
  ws.addEventListener(
61
71
  'open',
62
72
  () => {
63
- this.protocol.emit('connected')
73
+ this.emit('connected')
64
74
  resolve()
65
75
  },
66
76
  { once: true },
@@ -73,18 +83,6 @@ export class WebSocketClientTransport extends ProtocolTransport {
73
83
  },
74
84
  { once: true },
75
85
  )
76
-
77
- ws.addEventListener(
78
- 'close',
79
- () => {
80
- this.protocol.emit('disconnected')
81
- this.webSocket = null
82
- if (this.options.autoreconnect === true) {
83
- setTimeout(this.connect.bind(this), 1000)
84
- }
85
- },
86
- { once: true },
87
- )
88
86
  })
89
87
 
90
88
  return this.connecting
@@ -92,7 +90,7 @@ export class WebSocketClientTransport extends ProtocolTransport {
92
90
 
93
91
  async disconnect(): Promise<void> {
94
92
  if (this.webSocket === null) return
95
- this.webSocket!.close()
93
+ this.webSocket!.close(undefined, 'user')
96
94
  return _once(this.webSocket, 'close')
97
95
  }
98
96