@nmtjs/ws-client 0.2.0 → 0.2.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
@@ -1,5 +1,5 @@
1
1
  import { EventEmitter } from '@nmtjs/protocol/client';
2
- import { ServerMessageType, concat, decodeNumber, encodeNumber } from '@nmtjs/protocol/common';
2
+ import { concat, decodeNumber, encodeNumber, ServerMessageType } from '@nmtjs/protocol/common';
3
3
  export class WebSocketClientTransport extends EventEmitter {
4
4
  options;
5
5
  #webSocket;
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../../index.ts"],"sourcesContent":["import {\n type BaseClientFormat,\n EventEmitter,\n type ProtocolTransport,\n} from '@nmtjs/protocol/client'\nimport {\n type ClientMessageType,\n ServerMessageType,\n concat,\n decodeNumber,\n encodeNumber,\n} from '@nmtjs/protocol/common'\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\n extends EventEmitter\n implements ProtocolTransport\n{\n #webSocket: WebSocket | null = null\n #connecting: Promise<void> | null = null\n\n constructor(private readonly options: WebSocketClientTransportOptions) {\n super()\n }\n\n connect(\n auth: string | undefined = undefined,\n contentType: BaseClientFormat['contentType'],\n ): Promise<void> {\n const wsUrl = new URL(this.options.origin)\n wsUrl.protocol = wsUrl.protocol === 'https:' ? 'wss:' : 'ws:'\n wsUrl.pathname = '/api'\n wsUrl.searchParams.set('content-type', contentType)\n wsUrl.searchParams.set('accept', contentType)\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 const buffer: ArrayBuffer = data\n const type = decodeNumber(buffer, 'Uint8')\n if (type in ServerMessageType) {\n this.emit(`${type}`, buffer.slice(Uint8Array.BYTES_PER_ELEMENT))\n }\n })\n\n this.#webSocket = ws\n\n return new Promise((resolve, reject) => {\n ws.addEventListener(\n 'open',\n () => {\n this.emit('connect')\n resolve()\n },\n { once: true },\n )\n\n ws.addEventListener(\n 'error',\n (event) => reject(new Error('WebSocket error', { cause: event })),\n { once: true },\n )\n\n ws.addEventListener(\n 'close',\n (event) => {\n this.emit('disconnect')\n this.#webSocket = null\n if (this.options.autoreconnect === true) {\n setTimeout(() => this.connect(auth, contentType), 1000)\n }\n },\n { once: true },\n )\n })\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 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"],"names":["EventEmitter","ServerMessageType","concat","decodeNumber","encodeNumber","WebSocketClientTransport","constructor","options","connect","auth","undefined","contentType","wsUrl","URL","origin","protocol","pathname","searchParams","set","ws","wsFactory","WebSocket","toString","binaryType","addEventListener","data","buffer","type","emit","slice","Uint8Array","BYTES_PER_ELEMENT","Promise","resolve","reject","once","event","Error","cause","autoreconnect","setTimeout","disconnect","close","_once","send","messageType","target"],"mappings":"AAAA,SAEEA,YAAY,QAEP,yBAAwB;AAC/B,SAEEC,iBAAiB,EACjBC,MAAM,EACNC,YAAY,EACZC,YAAY,QACP,yBAAwB;AAsB/B,OAAO,MAAMC,iCACHL;;IAGR,CAAA,SAAU,CAAyB;IACnC,CAAA,UAAW,CAA6B;IAExCM,YAAY,AAAiBC,OAAwC,CAAE;QACrE,KAAK,SADsBA,UAAAA,cAH7B,CAAA,SAAU,GAAqB,WAC/B,CAAA,UAAW,GAAyB;IAIpC;IAEAC,QACEC,OAA2BC,SAAS,EACpCC,WAA4C,EAC7B;QACf,MAAMC,QAAQ,IAAIC,IAAI,IAAI,CAACN,OAAO,CAACO,MAAM;QACzCF,MAAMG,QAAQ,GAAGH,MAAMG,QAAQ,KAAK,WAAW,SAAS;QACxDH,MAAMI,QAAQ,GAAG;QACjBJ,MAAMK,YAAY,CAACC,GAAG,CAAC,gBAAgBP;QACvCC,MAAMK,YAAY,CAACC,GAAG,CAAC,UAAUP;QACjC,IAAIF,MAAMG,MAAMK,YAAY,CAACC,GAAG,CAAC,QAAQT;QAEzC,MAAMU,KACJ,IAAI,CAACZ,OAAO,CAACa,SAAS,GAAGR,UAAU,IAAIS,UAAUT,MAAMU,QAAQ;QAEjEH,GAAGI,UAAU,GAAG;QAEhBJ,GAAGK,gBAAgB,CAAC,WAAW,CAAC,EAAEC,IAAI,EAAE;YACtC,MAAMC,SAAsBD;YAC5B,MAAME,OAAOxB,aAAauB,QAAQ;YAClC,IAAIC,QAAQ1B,mBAAmB;gBAC7B,IAAI,CAAC2B,IAAI,CAAC,CAAC,EAAED,KAAK,CAAC,EAAED,OAAOG,KAAK,CAACC,WAAWC,iBAAiB;YAChE;QACF;QAEA,IAAI,CAAC,CAAA,SAAU,GAAGZ;QAElB,OAAO,IAAIa,QAAQ,CAACC,SAASC;YAC3Bf,GAAGK,gBAAgB,CACjB,QACA;gBACE,IAAI,CAACI,IAAI,CAAC;gBACVK;YACF,GACA;gBAAEE,MAAM;YAAK;YAGfhB,GAAGK,gBAAgB,CACjB,SACA,CAACY,QAAUF,OAAO,IAAIG,MAAM,mBAAmB;oBAAEC,OAAOF;gBAAM,KAC9D;gBAAED,MAAM;YAAK;YAGfhB,GAAGK,gBAAgB,CACjB,SACA,CAACY;gBACC,IAAI,CAACR,IAAI,CAAC;gBACV,IAAI,CAAC,CAAA,SAAU,GAAG;gBAClB,IAAI,IAAI,CAACrB,OAAO,CAACgC,aAAa,KAAK,MAAM;oBACvCC,WAAW,IAAM,IAAI,CAAChC,OAAO,CAACC,MAAME,cAAc;gBACpD;YACF,GACA;gBAAEwB,MAAM;YAAK;QAEjB;IACF;IAEA,MAAMM,aAA4B;QAChC,IAAI,IAAI,CAAC,CAAA,SAAU,KAAK,MAAM;QAC9B,IAAI,CAAC,CAAA,SAAU,CAAEC,KAAK;QACtB,OAAOC,MAAM,IAAI,CAAC,CAAA,SAAU,EAAE;IAChC;IAEA,MAAMC,KACJC,WAA8B,EAC9BnB,MAAmB,EACJ;QACf,IAAI,IAAI,CAAC,CAAA,UAAW,EAAE,MAAM,IAAI,CAAC,CAAA,UAAW;QAC5C,IAAI,CAAC,CAAA,SAAU,CAAEkB,IAAI,CAAC1C,OAAOE,aAAayC,aAAa,UAAUnB;IACnE;AACF;AAEA,SAASiB,MAAMG,MAAmB,EAAEV,KAAa;IAC/C,OAAO,IAAIJ,QAAc,CAACC;QACxBa,OAAOtB,gBAAgB,CAACY,OAAO,IAAMH,WAAW;YAAEE,MAAM;QAAK;IAC/D;AACF"}
1
+ {"version":3,"sources":["../../index.ts"],"sourcesContent":["import {\n type BaseClientFormat,\n EventEmitter,\n type ProtocolTransport,\n} from '@nmtjs/protocol/client'\nimport {\n type ClientMessageType,\n concat,\n decodeNumber,\n encodeNumber,\n ServerMessageType,\n} from '@nmtjs/protocol/common'\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\n extends EventEmitter\n implements ProtocolTransport\n{\n #webSocket: WebSocket | null = null\n #connecting: Promise<void> | null = null\n\n constructor(private readonly options: WebSocketClientTransportOptions) {\n super()\n }\n\n connect(\n auth: string | undefined = undefined,\n contentType: BaseClientFormat['contentType'],\n ): Promise<void> {\n const wsUrl = new URL(this.options.origin)\n wsUrl.protocol = wsUrl.protocol === 'https:' ? 'wss:' : 'ws:'\n wsUrl.pathname = '/api'\n wsUrl.searchParams.set('content-type', contentType)\n wsUrl.searchParams.set('accept', contentType)\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 const buffer: ArrayBuffer = data\n const type = decodeNumber(buffer, 'Uint8')\n if (type in ServerMessageType) {\n this.emit(`${type}`, buffer.slice(Uint8Array.BYTES_PER_ELEMENT))\n }\n })\n\n this.#webSocket = ws\n\n return new Promise((resolve, reject) => {\n ws.addEventListener(\n 'open',\n () => {\n this.emit('connect')\n resolve()\n },\n { once: true },\n )\n\n ws.addEventListener(\n 'error',\n (event) => reject(new Error('WebSocket error', { cause: event })),\n { once: true },\n )\n\n ws.addEventListener(\n 'close',\n (event) => {\n this.emit('disconnect')\n this.#webSocket = null\n if (this.options.autoreconnect === true) {\n setTimeout(() => this.connect(auth, contentType), 1000)\n }\n },\n { once: true },\n )\n })\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 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"],"names":["EventEmitter","concat","decodeNumber","encodeNumber","ServerMessageType","WebSocketClientTransport","constructor","options","connect","auth","undefined","contentType","wsUrl","URL","origin","protocol","pathname","searchParams","set","ws","wsFactory","WebSocket","toString","binaryType","addEventListener","data","buffer","type","emit","slice","Uint8Array","BYTES_PER_ELEMENT","Promise","resolve","reject","once","event","Error","cause","autoreconnect","setTimeout","disconnect","close","_once","send","messageType","target"],"mappings":"AAAA,SAEEA,YAAY,QAEP,yBAAwB;AAC/B,SAEEC,MAAM,EACNC,YAAY,EACZC,YAAY,EACZC,iBAAiB,QACZ,yBAAwB;AAsB/B,OAAO,MAAMC,iCACHL;;IAGR,CAAA,SAAU,CAAyB;IACnC,CAAA,UAAW,CAA6B;IAExCM,YAAY,AAAiBC,OAAwC,CAAE;QACrE,KAAK,SADsBA,UAAAA,cAH7B,CAAA,SAAU,GAAqB,WAC/B,CAAA,UAAW,GAAyB;IAIpC;IAEAC,QACEC,OAA2BC,SAAS,EACpCC,WAA4C,EAC7B;QACf,MAAMC,QAAQ,IAAIC,IAAI,IAAI,CAACN,OAAO,CAACO,MAAM;QACzCF,MAAMG,QAAQ,GAAGH,MAAMG,QAAQ,KAAK,WAAW,SAAS;QACxDH,MAAMI,QAAQ,GAAG;QACjBJ,MAAMK,YAAY,CAACC,GAAG,CAAC,gBAAgBP;QACvCC,MAAMK,YAAY,CAACC,GAAG,CAAC,UAAUP;QACjC,IAAIF,MAAMG,MAAMK,YAAY,CAACC,GAAG,CAAC,QAAQT;QAEzC,MAAMU,KACJ,IAAI,CAACZ,OAAO,CAACa,SAAS,GAAGR,UAAU,IAAIS,UAAUT,MAAMU,QAAQ;QAEjEH,GAAGI,UAAU,GAAG;QAEhBJ,GAAGK,gBAAgB,CAAC,WAAW,CAAC,EAAEC,IAAI,EAAE;YACtC,MAAMC,SAAsBD;YAC5B,MAAME,OAAOzB,aAAawB,QAAQ;YAClC,IAAIC,QAAQvB,mBAAmB;gBAC7B,IAAI,CAACwB,IAAI,CAAC,CAAC,EAAED,KAAK,CAAC,EAAED,OAAOG,KAAK,CAACC,WAAWC,iBAAiB;YAChE;QACF;QAEA,IAAI,CAAC,CAAA,SAAU,GAAGZ;QAElB,OAAO,IAAIa,QAAQ,CAACC,SAASC;YAC3Bf,GAAGK,gBAAgB,CACjB,QACA;gBACE,IAAI,CAACI,IAAI,CAAC;gBACVK;YACF,GACA;gBAAEE,MAAM;YAAK;YAGfhB,GAAGK,gBAAgB,CACjB,SACA,CAACY,QAAUF,OAAO,IAAIG,MAAM,mBAAmB;oBAAEC,OAAOF;gBAAM,KAC9D;gBAAED,MAAM;YAAK;YAGfhB,GAAGK,gBAAgB,CACjB,SACA,CAACY;gBACC,IAAI,CAACR,IAAI,CAAC;gBACV,IAAI,CAAC,CAAA,SAAU,GAAG;gBAClB,IAAI,IAAI,CAACrB,OAAO,CAACgC,aAAa,KAAK,MAAM;oBACvCC,WAAW,IAAM,IAAI,CAAChC,OAAO,CAACC,MAAME,cAAc;gBACpD;YACF,GACA;gBAAEwB,MAAM;YAAK;QAEjB;IACF;IAEA,MAAMM,aAA4B;QAChC,IAAI,IAAI,CAAC,CAAA,SAAU,KAAK,MAAM;QAC9B,IAAI,CAAC,CAAA,SAAU,CAAEC,KAAK;QACtB,OAAOC,MAAM,IAAI,CAAC,CAAA,SAAU,EAAE;IAChC;IAEA,MAAMC,KACJC,WAA8B,EAC9BnB,MAAmB,EACJ;QACf,IAAI,IAAI,CAAC,CAAA,UAAW,EAAE,MAAM,IAAI,CAAC,CAAA,UAAW;QAC5C,IAAI,CAAC,CAAA,SAAU,CAAEkB,IAAI,CAAC3C,OAAOE,aAAa0C,aAAa,UAAUnB;IACnE;AACF;AAEA,SAASiB,MAAMG,MAAmB,EAAEV,KAAa;IAC/C,OAAO,IAAIJ,QAAc,CAACC;QACxBa,OAAOtB,gBAAgB,CAACY,OAAO,IAAMH,WAAW;YAAEE,MAAM;QAAK;IAC/D;AACF"}
package/index.ts CHANGED
@@ -5,10 +5,10 @@ import {
5
5
  } from '@nmtjs/protocol/client'
6
6
  import {
7
7
  type ClientMessageType,
8
- ServerMessageType,
9
8
  concat,
10
9
  decodeNumber,
11
10
  encodeNumber,
11
+ ServerMessageType,
12
12
  } from '@nmtjs/protocol/common'
13
13
 
14
14
  export type WebSocketClientTransportOptions = {
package/package.json CHANGED
@@ -8,18 +8,17 @@
8
8
  }
9
9
  },
10
10
  "dependencies": {
11
- "@nmtjs/client": "^0.6.1",
12
- "@nmtjs/common": "^0.6.1",
13
- "@nmtjs/protocol": "^0.6.1"
11
+ "@nmtjs/client": "^0.6.3",
12
+ "@nmtjs/common": "^0.6.3",
13
+ "@nmtjs/protocol": "^0.6.3"
14
14
  },
15
15
  "files": [
16
16
  "index.ts",
17
17
  "dist",
18
- "tsconfig.json",
19
18
  "LICENSE.md",
20
19
  "README.md"
21
20
  ],
22
- "version": "0.2.0",
21
+ "version": "0.2.1",
23
22
  "scripts": {
24
23
  "build": "neemata-build -p neutral ./index.ts",
25
24
  "type-check": "tsc --noEmit"
package/tsconfig.json DELETED
@@ -1,6 +0,0 @@
1
- {
2
- "extends": "../../tsconfig.json",
3
- "compilerOptions": {
4
- "lib": ["ESNext", "DOM"]
5
- }
6
- }