@rspack/dev-server 2.0.0 → 2.0.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.
@@ -133,7 +133,7 @@ function ansiHTML(text) {
133
133
  }
134
134
  });
135
135
  const l = ansiCodes.length;
136
- l > 0 && (ret += Array(l + 1).join('</span>'));
136
+ if (l > 0) ret += Array(l + 1).join('</span>');
137
137
  return ret;
138
138
  }
139
139
  ansiHTML.setColors = (colors)=>{
@@ -2842,7 +2842,7 @@ function setupOutgoing(outgoing, options, req, forward) {
2842
2842
  if (options.ca) outgoing.ca = options.ca;
2843
2843
  if (isSSL.test(options[forward || "target"].protocol ?? "http")) outgoing.rejectUnauthorized = void 0 === options.secure ? true : options.secure;
2844
2844
  if (void 0 !== options.agent) outgoing.agent = options.agent || false;
2845
- else if (req.httpVersionMajor > 1) outgoing.agent = false;
2845
+ else if (req.httpVersionMajor > 1 || upgradeHeader.test(req.headers.connection || "")) outgoing.agent = false;
2846
2846
  else {
2847
2847
  const targetProto = options[forward || "target"].protocol ?? "http";
2848
2848
  outgoing.agent = isSSL.test(targetProto) ? defaultAgents.https : defaultAgents.http;
@@ -3040,7 +3040,7 @@ const webIncomingMiddleware = [
3040
3040
  "proto"
3041
3041
  ]){
3042
3042
  const key = "x-forwarded-" + header;
3043
- if (!req.headers[key]) req.headers[key] = values[header];
3043
+ if (!req.headers[key] && void 0 !== values[header]) req.headers[key] = values[header];
3044
3044
  }
3045
3045
  req.headers["x-forwarded-host"] = req.headers["x-forwarded-host"] || req.headers[":authority"] || req.headers.host || "";
3046
3046
  }),
@@ -3197,7 +3197,7 @@ const websocketIncomingMiddleware = [
3197
3197
  "proto"
3198
3198
  ]){
3199
3199
  const key = "x-forwarded-" + header;
3200
- if (!req.headers[key]) req.headers[key] = values[header];
3200
+ if (!req.headers[key] && void 0 !== values[header]) req.headers[key] = values[header];
3201
3201
  }
3202
3202
  }),
3203
3203
  defineProxyMiddleware((req, socket, options, server, head, callback)=>{
@@ -3274,7 +3274,7 @@ var ProxyServer = class extends EventEmitter {
3274
3274
  this.web = _createProxyFn("web", this);
3275
3275
  this.ws = _createProxyFn("ws", this);
3276
3276
  }
3277
- listen(port, hostname) {
3277
+ listen(port, hostname, listeningListener) {
3278
3278
  const closure = (req, res)=>this.web(req, res);
3279
3279
  if (this.options.http2) {
3280
3280
  if (!this.options.ssl) throw new Error("HTTP/2 requires ssl option");
@@ -3287,7 +3287,7 @@ var ProxyServer = class extends EventEmitter {
3287
3287
  if (this.options.ws) this._server.on("upgrade", (req, socket, head)=>{
3288
3288
  this.ws(req, socket, this.options, head).catch(()=>{});
3289
3289
  });
3290
- this._server.listen(port, hostname);
3290
+ this._server.listen(port, hostname, listeningListener);
3291
3291
  return this;
3292
3292
  }
3293
3293
  close(callback) {
@@ -3640,8 +3640,8 @@ async function getTarget(req, config) {
3640
3640
  }
3641
3641
  function getTargetFromProxyTable(req, table) {
3642
3642
  let result;
3643
- const host = req.headers.host;
3644
- const path = req.url;
3643
+ const host = req.headers.host ?? '';
3644
+ const path = req.url ?? '';
3645
3645
  const hostAndPath = host + path;
3646
3646
  for (const [key, value] of Object.entries(table))if (containsPath(key)) {
3647
3647
  if (hostAndPath.indexOf(key) > -1) {
@@ -3659,6 +3659,35 @@ function getTargetFromProxyTable(req, table) {
3659
3659
  function containsPath(v) {
3660
3660
  return v.indexOf('/') > -1;
3661
3661
  }
3662
+ const ipv6_debug = Debug.extend('ipv6');
3663
+ function normalizeIPv6LiteralTargets(options) {
3664
+ options.target = normalizeIPv6ProxyTarget(options.target, 'target');
3665
+ options.forward = normalizeIPv6ProxyTarget(options.forward, 'forward');
3666
+ }
3667
+ function normalizeIPv6ProxyTarget(target, optionName) {
3668
+ const targetUrl = toTargetUrl(target);
3669
+ if (targetUrl && isBracketedIPv6Hostname(targetUrl.hostname)) {
3670
+ ipv6_debug('normalized IPv6 "%s" %s', optionName, target);
3671
+ return {
3672
+ hostname: stripBrackets(targetUrl.hostname),
3673
+ pathname: targetUrl.pathname,
3674
+ port: targetUrl.port,
3675
+ protocol: targetUrl.protocol,
3676
+ search: targetUrl.search
3677
+ };
3678
+ }
3679
+ return target;
3680
+ }
3681
+ function toTargetUrl(target) {
3682
+ if ('string' == typeof target) return new URL(target);
3683
+ if (target instanceof URL) return target;
3684
+ }
3685
+ function isBracketedIPv6Hostname(hostname) {
3686
+ return hostname.startsWith('[') && hostname.endsWith(']');
3687
+ }
3688
+ function stripBrackets(hostname) {
3689
+ return hostname.replace(/^\[|\]$/g, '');
3690
+ }
3662
3691
  class HttpProxyMiddleware {
3663
3692
  wsInternalSubscribed = false;
3664
3693
  serverOnCloseSubscribed = false;
@@ -3746,6 +3775,7 @@ class HttpProxyMiddleware {
3746
3775
  prepareProxyRequest = async (req)=>{
3747
3776
  const newProxyOptions = Object.assign({}, this.proxyOptions);
3748
3777
  await this.applyRouter(req, newProxyOptions);
3778
+ normalizeIPv6LiteralTargets(newProxyOptions);
3749
3779
  await this.applyPathRewrite(req, this.pathRewriter);
3750
3780
  return newProxyOptions;
3751
3781
  };
@@ -442,7 +442,7 @@ __webpack_require__.add({
442
442
  module.exports.createColors = createColors;
443
443
  },
444
444
  "./node_modules/.pnpm/shell-quote@1.8.3/node_modules/shell-quote/index.js" (__unused_rspack_module, exports, __webpack_require__) {
445
- exports.quote = __webpack_require__("./node_modules/.pnpm/shell-quote@1.8.3/node_modules/shell-quote/quote.js");
445
+ __webpack_require__("./node_modules/.pnpm/shell-quote@1.8.3/node_modules/shell-quote/quote.js");
446
446
  exports.parse = __webpack_require__("./node_modules/.pnpm/shell-quote@1.8.3/node_modules/shell-quote/parse.js");
447
447
  },
448
448
  "./node_modules/.pnpm/shell-quote@1.8.3/node_modules/shell-quote/parse.js" (module) {
package/dist/index.d.ts CHANGED
@@ -1,8 +1,14 @@
1
+ /// <reference types="node" />
2
+
3
+ import { Agent } from 'http';
1
4
  import { API } from '@rspack/dev-middleware';
2
5
  import { Callback } from '@rspack/dev-middleware';
6
+ import { ClientRequest } from 'http';
7
+ import { ClientRequestArgs } from 'http';
3
8
  import { Compiler } from '@rspack/core';
4
9
  import { DevServer as Configuration } from '@rspack/core';
5
10
  import { Context } from '@rspack/dev-middleware';
11
+ import { createConnection } from 'net';
6
12
  import type { DevServerClient } from '@rspack/core';
7
13
  import type { DevServerHeaders } from '@rspack/core';
8
14
  import type { DevServerHost } from '@rspack/core';
@@ -11,26 +17,33 @@ import type { DevServerOpenOptions } from '@rspack/core';
11
17
  import type { DevServerProxyConfigArray } from '@rspack/core';
12
18
  import type { DevServerStatic } from '@rspack/core';
13
19
  import type { Dirent } from 'node:fs';
20
+ import { Duplex } from 'stream';
14
21
  import { EventEmitter } from 'node:events';
22
+ import { EventEmitter as EventEmitter_2 } from 'events';
15
23
  import * as http from 'node:http';
16
24
  import type { IncomingMessage as IncomingMessage_2 } from 'node:http';
25
+ import { IncomingMessage as IncomingMessage_3 } from 'http';
17
26
  import type { ListenOptions } from 'node:net';
18
27
  import { MultiCompiler } from '@rspack/core';
19
28
  import { MultiStats } from '@rspack/core';
20
29
  import { Options } from '@rspack/dev-middleware';
30
+ import { OutgoingHttpHeaders } from 'http';
21
31
  import { Readable } from 'node:stream';
32
+ import { SecureContextOptions } from 'tls';
22
33
  import { Server as Server_2 } from 'node:net';
23
34
  import { Server as Server_3 } from 'node:tls';
24
35
  import type { Server as Server_4 } from 'node:http';
36
+ import { Server as Server_6 } from 'http';
37
+ import { Server as Server_7 } from 'https';
25
38
  import type { ServerOptions } from 'node:https';
26
39
  import type { ServerResponse } from 'node:http';
27
40
  import { Socket } from 'node:net';
28
41
  import { Stats } from 'node:fs';
29
42
  import { Stats as Stats_2 } from '@rspack/core';
30
43
  import { StatsOptions } from '@rspack/core';
44
+ import { URL as URL_2 } from 'url';
31
45
  import type { WatchEventType } from 'node:fs';
32
- import { WebSocket as WebSocket_2 } from 'ws';
33
- import { WebSocketServer as WebSocketServer_2 } from 'ws';
46
+ import { ZlibOptions } from 'zlib';
34
47
 
35
48
  declare type AWF = {
36
49
  stabilityThreshold: number;
@@ -57,6 +70,25 @@ declare type BasicOpts = {
57
70
 
58
71
  declare type BasicServer = Server_2 | Server_3;
59
72
 
73
+ declare type BufferLike =
74
+ | string
75
+ | Buffer
76
+ | DataView
77
+ | number
78
+ | ArrayBufferView
79
+ | Uint8Array
80
+ | ArrayBuffer
81
+ | SharedArrayBuffer
82
+ | Blob
83
+ | readonly any[]
84
+ | readonly number[]
85
+ | { valueOf(): ArrayBuffer }
86
+ | { valueOf(): SharedArrayBuffer }
87
+ | { valueOf(): Uint8Array }
88
+ | { valueOf(): readonly number[] }
89
+ | { valueOf(): string }
90
+ | { [Symbol.toPrimitive](hint: string): string };
91
+
60
92
  declare type ChokidarOptions = Partial<BasicOpts & {
61
93
  ignored: Matcher | Matcher[];
62
94
  awaitWriteFinish: boolean | Partial<AWF>;
@@ -510,6 +542,75 @@ declare interface Server extends EventEmitter {
510
542
  listen(handle: unknown, listeningListener?: Function): http.Server;
511
543
  }
512
544
 
545
+ declare class Server_5<
546
+ T extends typeof WebSocket_2 = typeof WebSocket_2,
547
+ U extends typeof IncomingMessage_3 = typeof IncomingMessage_3,
548
+ > extends EventEmitter_2 {
549
+ options: WebSocket_2.ServerOptions<T, U>;
550
+ path: string;
551
+ clients: Set<InstanceType<T>>;
552
+
553
+ constructor(options?: WebSocket_2.ServerOptions<T, U>, callback?: () => void);
554
+
555
+ address(): WebSocket_2.AddressInfo | string | null;
556
+ close(cb?: (err?: Error) => void): void;
557
+ handleUpgrade(
558
+ request: InstanceType<U>,
559
+ socket: Duplex,
560
+ upgradeHead: Buffer,
561
+ callback: (client: InstanceType<T>, request: InstanceType<U>) => void,
562
+ ): void;
563
+ shouldHandle(request: InstanceType<U>): boolean | Promise<boolean>;
564
+
565
+ // Events
566
+ on(event: "connection", cb: (this: Server_5<T>, websocket: InstanceType<T>, request: InstanceType<U>) => void): this;
567
+ on(event: "error", cb: (this: Server_5<T>, error: Error) => void): this;
568
+ on(event: "headers", cb: (this: Server_5<T>, headers: string[], request: InstanceType<U>) => void): this;
569
+ on(event: "close" | "listening", cb: (this: Server_5<T>) => void): this;
570
+ on(
571
+ event: "wsClientError",
572
+ cb: (this: Server_5<T>, error: Error, socket: Duplex, request: InstanceType<U>) => void,
573
+ ): this;
574
+ on(event: string | symbol, listener: (this: Server_5<T>, ...args: any[]) => void): this;
575
+
576
+ once(
577
+ event: "connection",
578
+ cb: (this: Server_5<T>, websocket: InstanceType<T>, request: InstanceType<U>) => void,
579
+ ): this;
580
+ once(event: "error", cb: (this: Server_5<T>, error: Error) => void): this;
581
+ once(event: "headers", cb: (this: Server_5<T>, headers: string[], request: InstanceType<U>) => void): this;
582
+ once(event: "close" | "listening", cb: (this: Server_5<T>) => void): this;
583
+ once(
584
+ event: "wsClientError",
585
+ cb: (this: Server_5<T>, error: Error, socket: Duplex, request: InstanceType<U>) => void,
586
+ ): this;
587
+ once(event: string | symbol, listener: (this: Server_5<T>, ...args: any[]) => void): this;
588
+
589
+ off(event: "connection", cb: (this: Server_5<T>, websocket: InstanceType<T>, request: InstanceType<U>) => void): this;
590
+ off(event: "error", cb: (this: Server_5<T>, error: Error) => void): this;
591
+ off(event: "headers", cb: (this: Server_5<T>, headers: string[], request: InstanceType<U>) => void): this;
592
+ off(event: "close" | "listening", cb: (this: Server_5<T>) => void): this;
593
+ off(
594
+ event: "wsClientError",
595
+ cb: (this: Server_5<T>, error: Error, socket: Duplex, request: InstanceType<U>) => void,
596
+ ): this;
597
+ off(event: string | symbol, listener: (this: Server_5<T>, ...args: any[]) => void): this;
598
+
599
+ addListener(event: "connection", cb: (websocket: InstanceType<T>, request: InstanceType<U>) => void): this;
600
+ addListener(event: "error", cb: (error: Error) => void): this;
601
+ addListener(event: "headers", cb: (headers: string[], request: InstanceType<U>) => void): this;
602
+ addListener(event: "close" | "listening", cb: () => void): this;
603
+ addListener(event: "wsClientError", cb: (error: Error, socket: Duplex, request: InstanceType<U>) => void): this;
604
+ addListener(event: string | symbol, listener: (...args: any[]) => void): this;
605
+
606
+ removeListener(event: "connection", cb: (websocket: InstanceType<T>, request: InstanceType<U>) => void): this;
607
+ removeListener(event: "error", cb: (error: Error) => void): this;
608
+ removeListener(event: "headers", cb: (headers: string[], request: InstanceType<U>) => void): this;
609
+ removeListener(event: "close" | "listening", cb: () => void): this;
610
+ removeListener(event: "wsClientError", cb: (error: Error, socket: Duplex, request: InstanceType<U>) => void): this;
611
+ removeListener(event: string | symbol, listener: (...args: any[]) => void): this;
612
+ }
613
+
513
614
  declare interface ServerConfiguration<A extends BasicApplication = Server, S extends BasicServer = Server_4> {
514
615
  type?: ServerType<A, S>;
515
616
  options?: ServerOptions;
@@ -572,8 +673,328 @@ declare class WatchHelper {
572
673
  filterDir(entry: EntryInfo): boolean;
573
674
  }
574
675
 
676
+ declare class WebSocket_2 extends EventEmitter_2 {
677
+ /** The connection is not yet open. */
678
+ static readonly CONNECTING: 0;
679
+ /** The connection is open and ready to communicate. */
680
+ static readonly OPEN: 1;
681
+ /** The connection is in the process of closing. */
682
+ static readonly CLOSING: 2;
683
+ /** The connection is closed. */
684
+ static readonly CLOSED: 3;
685
+
686
+ binaryType: "nodebuffer" | "arraybuffer" | "fragments";
687
+ readonly bufferedAmount: number;
688
+ readonly extensions: string;
689
+ /** Indicates whether the websocket is paused */
690
+ readonly isPaused: boolean;
691
+ readonly protocol: string;
692
+ /** The current state of the connection */
693
+ readonly readyState:
694
+ | typeof WebSocket_2.CONNECTING
695
+ | typeof WebSocket_2.OPEN
696
+ | typeof WebSocket_2.CLOSING
697
+ | typeof WebSocket_2.CLOSED;
698
+ readonly url: string;
699
+
700
+ /** The connection is not yet open. */
701
+ readonly CONNECTING: 0;
702
+ /** The connection is open and ready to communicate. */
703
+ readonly OPEN: 1;
704
+ /** The connection is in the process of closing. */
705
+ readonly CLOSING: 2;
706
+ /** The connection is closed. */
707
+ readonly CLOSED: 3;
708
+
709
+ onopen: ((event: WebSocket_2.Event) => void) | null;
710
+ onerror: ((event: WebSocket_2.ErrorEvent) => void) | null;
711
+ onclose: ((event: WebSocket_2.CloseEvent) => void) | null;
712
+ onmessage: ((event: WebSocket_2.MessageEvent) => void) | null;
713
+
714
+ constructor(address: null);
715
+ constructor(address: string | URL_2, options?: WebSocket_2.ClientOptions | ClientRequestArgs);
716
+ constructor(
717
+ address: string | URL_2,
718
+ protocols?: string | string[],
719
+ options?: WebSocket_2.ClientOptions | ClientRequestArgs,
720
+ );
721
+
722
+ close(code?: number, data?: string | Buffer): void;
723
+ ping(data?: any, mask?: boolean, cb?: (err: Error) => void): void;
724
+ pong(data?: any, mask?: boolean, cb?: (err: Error) => void): void;
725
+ // https://github.com/websockets/ws/issues/2076#issuecomment-1250354722
726
+ send(data: BufferLike, cb?: (err?: Error) => void): void;
727
+ send(
728
+ data: BufferLike,
729
+ options: {
730
+ mask?: boolean | undefined;
731
+ binary?: boolean | undefined;
732
+ compress?: boolean | undefined;
733
+ fin?: boolean | undefined;
734
+ },
735
+ cb?: (err?: Error) => void,
736
+ ): void;
737
+ terminate(): void;
738
+
739
+ /**
740
+ * Pause the websocket causing it to stop emitting events. Some events can still be
741
+ * emitted after this is called, until all buffered data is consumed. This method
742
+ * is a noop if the ready state is `CONNECTING` or `CLOSED`.
743
+ */
744
+ pause(): void;
745
+ /**
746
+ * Make a paused socket resume emitting events. This method is a noop if the ready
747
+ * state is `CONNECTING` or `CLOSED`.
748
+ */
749
+ resume(): void;
750
+
751
+ // HTML5 WebSocket events
752
+ addEventListener<K extends keyof WebSocket_2.WebSocketEventMap>(
753
+ type: K,
754
+ listener:
755
+ | ((event: WebSocket_2.WebSocketEventMap[K]) => void)
756
+ | { handleEvent(event: WebSocket_2.WebSocketEventMap[K]): void },
757
+ options?: WebSocket_2.EventListenerOptions,
758
+ ): void;
759
+ removeEventListener<K extends keyof WebSocket_2.WebSocketEventMap>(
760
+ type: K,
761
+ listener:
762
+ | ((event: WebSocket_2.WebSocketEventMap[K]) => void)
763
+ | { handleEvent(event: WebSocket_2.WebSocketEventMap[K]): void },
764
+ ): void;
765
+
766
+ // Events
767
+ on(event: "close", listener: (this: WebSocket_2, code: number, reason: Buffer) => void): this;
768
+ on(event: "error", listener: (this: WebSocket_2, error: Error) => void): this;
769
+ on(event: "upgrade", listener: (this: WebSocket_2, request: IncomingMessage_3) => void): this;
770
+ on(event: "message", listener: (this: WebSocket_2, data: WebSocket_2.RawData, isBinary: boolean) => void): this;
771
+ on(event: "open", listener: (this: WebSocket_2) => void): this;
772
+ on(event: "ping" | "pong", listener: (this: WebSocket_2, data: Buffer) => void): this;
773
+ on(event: "redirect", listener: (this: WebSocket_2, url: string, request: ClientRequest) => void): this;
774
+ on(
775
+ event: "unexpected-response",
776
+ listener: (this: WebSocket_2, request: ClientRequest, response: IncomingMessage_3) => void,
777
+ ): this;
778
+ on(event: string | symbol, listener: (this: WebSocket_2, ...args: any[]) => void): this;
779
+
780
+ once(event: "close", listener: (this: WebSocket_2, code: number, reason: Buffer) => void): this;
781
+ once(event: "error", listener: (this: WebSocket_2, error: Error) => void): this;
782
+ once(event: "upgrade", listener: (this: WebSocket_2, request: IncomingMessage_3) => void): this;
783
+ once(event: "message", listener: (this: WebSocket_2, data: WebSocket_2.RawData, isBinary: boolean) => void): this;
784
+ once(event: "open", listener: (this: WebSocket_2) => void): this;
785
+ once(event: "ping" | "pong", listener: (this: WebSocket_2, data: Buffer) => void): this;
786
+ once(event: "redirect", listener: (this: WebSocket_2, url: string, request: ClientRequest) => void): this;
787
+ once(
788
+ event: "unexpected-response",
789
+ listener: (this: WebSocket_2, request: ClientRequest, response: IncomingMessage_3) => void,
790
+ ): this;
791
+ once(event: string | symbol, listener: (this: WebSocket_2, ...args: any[]) => void): this;
792
+
793
+ off(event: "close", listener: (this: WebSocket_2, code: number, reason: Buffer) => void): this;
794
+ off(event: "error", listener: (this: WebSocket_2, error: Error) => void): this;
795
+ off(event: "upgrade", listener: (this: WebSocket_2, request: IncomingMessage_3) => void): this;
796
+ off(event: "message", listener: (this: WebSocket_2, data: WebSocket_2.RawData, isBinary: boolean) => void): this;
797
+ off(event: "open", listener: (this: WebSocket_2) => void): this;
798
+ off(event: "ping" | "pong", listener: (this: WebSocket_2, data: Buffer) => void): this;
799
+ off(event: "redirect", listener: (this: WebSocket_2, url: string, request: ClientRequest) => void): this;
800
+ off(
801
+ event: "unexpected-response",
802
+ listener: (this: WebSocket_2, request: ClientRequest, response: IncomingMessage_3) => void,
803
+ ): this;
804
+ off(event: string | symbol, listener: (this: WebSocket_2, ...args: any[]) => void): this;
805
+
806
+ addListener(event: "close", listener: (code: number, reason: Buffer) => void): this;
807
+ addListener(event: "error", listener: (error: Error) => void): this;
808
+ addListener(event: "upgrade", listener: (request: IncomingMessage_3) => void): this;
809
+ addListener(event: "message", listener: (data: WebSocket_2.RawData, isBinary: boolean) => void): this;
810
+ addListener(event: "open", listener: () => void): this;
811
+ addListener(event: "ping" | "pong", listener: (data: Buffer) => void): this;
812
+ addListener(event: "redirect", listener: (url: string, request: ClientRequest) => void): this;
813
+ addListener(
814
+ event: "unexpected-response",
815
+ listener: (request: ClientRequest, response: IncomingMessage_3) => void,
816
+ ): this;
817
+ addListener(event: string | symbol, listener: (...args: any[]) => void): this;
818
+
819
+ removeListener(event: "close", listener: (code: number, reason: Buffer) => void): this;
820
+ removeListener(event: "error", listener: (error: Error) => void): this;
821
+ removeListener(event: "upgrade", listener: (request: IncomingMessage_3) => void): this;
822
+ removeListener(event: "message", listener: (data: WebSocket_2.RawData, isBinary: boolean) => void): this;
823
+ removeListener(event: "open", listener: () => void): this;
824
+ removeListener(event: "ping" | "pong", listener: (data: Buffer) => void): this;
825
+ removeListener(event: "redirect", listener: (url: string, request: ClientRequest) => void): this;
826
+ removeListener(
827
+ event: "unexpected-response",
828
+ listener: (request: ClientRequest, response: IncomingMessage_3) => void,
829
+ ): this;
830
+ removeListener(event: string | symbol, listener: (...args: any[]) => void): this;
831
+ }
832
+
833
+ declare namespace WebSocket_2 {
834
+ /**
835
+ * Data represents the raw message payload received over the WebSocket.
836
+ */
837
+ type RawData = Buffer | ArrayBuffer | Buffer[];
838
+
839
+ /**
840
+ * Data represents the message payload received over the WebSocket.
841
+ */
842
+ type Data = string | Buffer | ArrayBuffer | Buffer[];
843
+
844
+ /**
845
+ * CertMeta represents the accepted types for certificate & key data.
846
+ */
847
+ type CertMeta = string | string[] | Buffer | Buffer[];
848
+
849
+ /**
850
+ * VerifyClientCallbackSync is a synchronous callback used to inspect the
851
+ * incoming message. The return value (boolean) of the function determines
852
+ * whether or not to accept the handshake.
853
+ */
854
+ type VerifyClientCallbackSync<Request extends IncomingMessage_3 = IncomingMessage_3> = (info: {
855
+ origin: string;
856
+ secure: boolean;
857
+ req: Request;
858
+ }) => boolean;
859
+
860
+ /**
861
+ * VerifyClientCallbackAsync is an asynchronous callback used to inspect the
862
+ * incoming message. The return value (boolean) of the function determines
863
+ * whether or not to accept the handshake.
864
+ */
865
+ type VerifyClientCallbackAsync<Request extends IncomingMessage_3 = IncomingMessage_3> = (
866
+ info: { origin: string; secure: boolean; req: Request },
867
+ callback: (res: boolean, code?: number, message?: string, headers?: OutgoingHttpHeaders) => void,
868
+ ) => void;
869
+
870
+ /**
871
+ * FinishRequestCallback is a callback for last minute customization of the
872
+ * headers. If finishRequest is set, then it has the responsibility to call
873
+ * request.end() once it is done setting request headers.
874
+ */
875
+ type FinishRequestCallback = (request: ClientRequest, websocket: WebSocket_2) => void;
876
+
877
+ interface ClientOptions extends SecureContextOptions {
878
+ protocol?: string | undefined;
879
+ followRedirects?: boolean | undefined;
880
+ generateMask?(mask: Buffer): void;
881
+ handshakeTimeout?: number | undefined;
882
+ maxRedirects?: number | undefined;
883
+ perMessageDeflate?: boolean | PerMessageDeflateOptions | undefined;
884
+ localAddress?: string | undefined;
885
+ protocolVersion?: number | undefined;
886
+ headers?: { [key: string]: string } | undefined;
887
+ origin?: string | undefined;
888
+ agent?: Agent | undefined;
889
+ host?: string | undefined;
890
+ family?: number | undefined;
891
+ checkServerIdentity?(servername: string, cert: CertMeta): boolean;
892
+ rejectUnauthorized?: boolean | undefined;
893
+ allowSynchronousEvents?: boolean | undefined;
894
+ autoPong?: boolean | undefined;
895
+ maxPayload?: number | undefined;
896
+ skipUTF8Validation?: boolean | undefined;
897
+ createConnection?: typeof createConnection | undefined;
898
+ finishRequest?: FinishRequestCallback | undefined;
899
+ }
900
+
901
+ interface PerMessageDeflateOptions {
902
+ serverNoContextTakeover?: boolean | undefined;
903
+ clientNoContextTakeover?: boolean | undefined;
904
+ serverMaxWindowBits?: number | undefined;
905
+ clientMaxWindowBits?: number | undefined;
906
+ zlibDeflateOptions?:
907
+ | {
908
+ flush?: number | undefined;
909
+ finishFlush?: number | undefined;
910
+ chunkSize?: number | undefined;
911
+ windowBits?: number | undefined;
912
+ level?: number | undefined;
913
+ memLevel?: number | undefined;
914
+ strategy?: number | undefined;
915
+ dictionary?: Buffer | Buffer[] | DataView | undefined;
916
+ info?: boolean | undefined;
917
+ }
918
+ | undefined;
919
+ zlibInflateOptions?: ZlibOptions | undefined;
920
+ threshold?: number | undefined;
921
+ concurrencyLimit?: number | undefined;
922
+ }
923
+
924
+ interface Event {
925
+ type: string;
926
+ target: WebSocket_2;
927
+ }
928
+
929
+ interface ErrorEvent {
930
+ error: any;
931
+ message: string;
932
+ type: string;
933
+ target: WebSocket_2;
934
+ }
935
+
936
+ interface CloseEvent {
937
+ wasClean: boolean;
938
+ code: number;
939
+ reason: string;
940
+ type: string;
941
+ target: WebSocket_2;
942
+ }
943
+
944
+ interface MessageEvent {
945
+ data: Data;
946
+ type: string;
947
+ target: WebSocket_2;
948
+ }
949
+
950
+ interface WebSocketEventMap {
951
+ open: Event;
952
+ error: ErrorEvent;
953
+ close: CloseEvent;
954
+ message: MessageEvent;
955
+ }
956
+
957
+ interface EventListenerOptions {
958
+ once?: boolean | undefined;
959
+ }
960
+
961
+ interface ServerOptions<
962
+ U extends typeof WebSocket_2 = typeof WebSocket_2,
963
+ V extends typeof IncomingMessage_3 = typeof IncomingMessage_3,
964
+ > {
965
+ host?: string | undefined;
966
+ port?: number | undefined;
967
+ backlog?: number | undefined;
968
+ server?: Server_6<V> | Server_7<V> | undefined;
969
+ verifyClient?:
970
+ | VerifyClientCallbackAsync<InstanceType<V>>
971
+ | VerifyClientCallbackSync<InstanceType<V>>
972
+ | undefined;
973
+ handleProtocols?: (protocols: Set<string>, request: InstanceType<V>) => string | false;
974
+ path?: string | undefined;
975
+ noServer?: boolean | undefined;
976
+ allowSynchronousEvents?: boolean | undefined;
977
+ autoPong?: boolean | undefined;
978
+ clientTracking?: boolean | undefined;
979
+ perMessageDeflate?: boolean | PerMessageDeflateOptions | undefined;
980
+ maxPayload?: number | undefined;
981
+ skipUTF8Validation?: boolean | undefined;
982
+ WebSocket?: U | undefined;
983
+ }
984
+
985
+ interface AddressInfo {
986
+ address: string;
987
+ family: string;
988
+ port: number;
989
+ }
990
+ }
991
+
575
992
  declare type WebSocketServer = WebSocketServer_2;
576
993
 
994
+ declare const WebSocketServer_2: typeof Server_5;
995
+
996
+ declare interface WebSocketServer_2 extends Server_5 {}
997
+
577
998
  declare interface WebSocketServerConfiguration {
578
999
  type?: LiteralUnion<'ws', string> | (() => WebSocketServerConfiguration);
579
1000
  options?: Record<string, EXPECTED_ANY>;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rspack/dev-server",
3
- "version": "2.0.0",
3
+ "version": "2.0.1",
4
4
  "description": "Development server for Rspack",
5
5
  "homepage": "https://github.com/rstackjs/rspack-dev-server",
6
6
  "bugs": "https://github.com/rstackjs/rspack-dev-server/issues",
@@ -49,13 +49,13 @@
49
49
  "@rspack/dev-middleware": "^2.0.1"
50
50
  },
51
51
  "devDependencies": {
52
- "@hono/node-server": "^1.19.14",
53
- "@microsoft/api-extractor": "^7.58.2",
54
- "@rslib/core": "^0.21.1",
55
- "@rslint/core": "^0.4.2",
52
+ "@hono/node-server": "^2.0.0",
53
+ "@microsoft/api-extractor": "^7.58.7",
54
+ "@rslib/core": "^0.21.3",
55
+ "@rslint/core": "^0.5.0",
56
56
  "@rspack/core": "2.0.0-rc.0",
57
- "@rspack/plugin-react-refresh": "1.6.2",
58
- "@rstest/core": "^0.9.7",
57
+ "@rspack/plugin-react-refresh": "2.0.0",
58
+ "@rstest/core": "^0.9.9",
59
59
  "@types/connect-history-api-fallback": "^1.5.4",
60
60
  "@types/mime-types": "3.0.1",
61
61
  "@types/node": "^24.12.2",
@@ -67,23 +67,23 @@
67
67
  "connect-next": "^4.0.1",
68
68
  "cross-env": "^10.1.0",
69
69
  "express": "^5.2.1",
70
- "hono": "^4.12.14",
70
+ "hono": "^4.12.15",
71
71
  "http-compression": "^1.1.3",
72
72
  "http-proxy": "^1.18.1",
73
- "http-proxy-middleware": "4.0.0-beta.3",
73
+ "http-proxy-middleware": "4.0.0-beta.4",
74
74
  "ipaddr.js": "^2.3.0",
75
75
  "launch-editor": "^2.13.2",
76
76
  "nano-staged": "^0.9.0",
77
77
  "open": "^11.0.0",
78
78
  "p-retry": "^7.1.1",
79
79
  "prettier": "3.8.3",
80
- "puppeteer": "^24.40.0",
80
+ "puppeteer": "^24.42.0",
81
81
  "react-refresh": "0.18.0",
82
82
  "require-from-string": "^2.0.2",
83
83
  "selfsigned": "^5.5.0",
84
84
  "serve-static": "^2.2.1",
85
85
  "simple-git-hooks": "^2.13.1",
86
- "typescript": "^6.0.2",
86
+ "typescript": "^6.0.3",
87
87
  "ws": "^8.20.0"
88
88
  },
89
89
  "peerDependencies": {
@@ -95,7 +95,7 @@
95
95
  "optional": true
96
96
  }
97
97
  },
98
- "packageManager": "pnpm@10.33.0",
98
+ "packageManager": "pnpm@10.33.2",
99
99
  "engines": {
100
100
  "node": "^20.19.0 || >=22.12.0"
101
101
  },