trpc-nuxt-module 4.4.0 → 4.5.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.
Files changed (98) hide show
  1. package/README.md +21 -13
  2. package/dist/index.d.ts +9 -0
  3. package/dist/index.js +84 -0
  4. package/dist/models/ExportReference.d.ts +4 -0
  5. package/dist/models/ModuleOptions.d.ts +8 -0
  6. package/dist/models/TrpcServerFetch.d.ts +2 -0
  7. package/dist/models/WebSocketOptions.d.ts +6 -0
  8. package/dist/runtime/client/createTRPCNuxtClient.d.ts +4 -0
  9. package/dist/runtime/client/createTRPCNuxtClient.js +28 -0
  10. package/dist/runtime/client/getMutationKey.d.ts +2 -0
  11. package/dist/runtime/client/getMutationKey.js +4 -0
  12. package/dist/runtime/client/getQueryKey.d.ts +2 -0
  13. package/dist/runtime/client/getQueryKey.js +4 -0
  14. package/dist/runtime/client/httpBatchLink.d.ts +3 -0
  15. package/dist/runtime/client/httpBatchLink.js +8 -0
  16. package/dist/runtime/client/httpLink.d.ts +3 -0
  17. package/dist/runtime/client/httpLink.js +8 -0
  18. package/dist/runtime/client/models/ConnectionStateSubscriptionStatus.d.ts +5 -0
  19. package/dist/runtime/client/models/ConnectionStateSubscriptionStatus.js +8 -0
  20. package/dist/runtime/client/models/DecoratedMutation.d.ts +9 -0
  21. package/dist/runtime/client/models/DecoratedMutation.js +1 -0
  22. package/dist/runtime/client/models/DecoratedProcedure.d.ts +6 -0
  23. package/dist/runtime/client/models/DecoratedProcedure.js +1 -0
  24. package/dist/runtime/client/models/DecoratedQuery.d.ts +8 -0
  25. package/dist/runtime/client/models/DecoratedQuery.js +1 -0
  26. package/dist/runtime/client/models/DecoratedRouterRecord.d.ts +9 -0
  27. package/dist/runtime/client/models/DecoratedRouterRecord.js +1 -0
  28. package/dist/runtime/client/models/DecoratedSubscription.d.ts +8 -0
  29. package/dist/runtime/client/models/DecoratedSubscription.js +1 -0
  30. package/dist/runtime/client/models/KeysOf.d.ts +1 -0
  31. package/dist/runtime/client/models/KeysOf.js +1 -0
  32. package/dist/runtime/client/models/PickFrom.d.ts +1 -0
  33. package/dist/runtime/client/models/PickFrom.js +1 -0
  34. package/dist/runtime/client/models/ProcedureNode.d.ts +4 -0
  35. package/dist/runtime/client/models/ProcedureNode.js +1 -0
  36. package/dist/runtime/client/models/ProcedurePath.d.ts +3 -0
  37. package/dist/runtime/client/models/ProcedurePath.js +1 -0
  38. package/dist/runtime/client/models/QueryAsyncData.d.ts +6 -0
  39. package/dist/runtime/client/models/QueryAsyncData.js +1 -0
  40. package/dist/runtime/client/models/QueryError.d.ts +3 -0
  41. package/dist/runtime/client/models/QueryError.js +1 -0
  42. package/dist/runtime/client/models/SubscriptionStatus.d.ts +7 -0
  43. package/dist/runtime/client/models/SubscriptionStatus.js +8 -0
  44. package/dist/runtime/client/models/TRPCNuxtClient.d.ts +3 -0
  45. package/dist/runtime/client/models/TRPCNuxtClient.js +1 -0
  46. package/dist/runtime/client/models/UseMutationOptions.d.ts +8 -0
  47. package/dist/runtime/client/models/UseMutationOptions.js +1 -0
  48. package/dist/runtime/client/models/UseMutationReturn.d.ts +7 -0
  49. package/dist/runtime/client/models/UseMutationReturn.js +1 -0
  50. package/dist/runtime/client/models/UseQuery.d.ts +6 -0
  51. package/dist/runtime/client/models/UseQuery.js +1 -0
  52. package/dist/runtime/client/models/UseQueryOptions.d.ts +9 -0
  53. package/dist/runtime/client/models/UseQueryOptions.js +1 -0
  54. package/dist/runtime/client/models/UseSubscriptionOptions.d.ts +5 -0
  55. package/dist/runtime/client/models/UseSubscriptionOptions.js +1 -0
  56. package/dist/runtime/client/models/UseSubscriptionReturn.d.ts +8 -0
  57. package/dist/runtime/client/models/UseSubscriptionReturn.js +1 -0
  58. package/dist/runtime/client/services/getLinkFetch.d.ts +2 -0
  59. package/dist/runtime/client/services/getLinkFetch.js +24 -0
  60. package/dist/runtime/client/services/getProcedureKey.d.ts +1 -0
  61. package/dist/runtime/client/services/getProcedureKey.js +4 -0
  62. package/dist/runtime/client/services/mergeSignals.d.ts +1 -0
  63. package/dist/runtime/client/services/mergeSignals.js +3 -0
  64. package/dist/runtime/client/services/useProcedureMutation.d.ts +6 -0
  65. package/dist/runtime/client/services/useProcedureMutation.js +28 -0
  66. package/dist/runtime/client/services/useProcedureQuery.d.ts +7 -0
  67. package/dist/runtime/client/services/useProcedureQuery.js +13 -0
  68. package/dist/runtime/client/services/useProcedureSubscription.d.ts +6 -0
  69. package/dist/runtime/client/services/useProcedureSubscription.js +68 -0
  70. package/dist/runtime/client/services/useTrpcServerFetch.d.ts +2 -0
  71. package/dist/runtime/client/services/useTrpcServerFetch.js +7 -0
  72. package/dist/runtime/constants.d.ts +4 -0
  73. package/dist/runtime/constants.js +6 -0
  74. package/dist/runtime/server/createTRPCEventHandler.d.ts +4 -0
  75. package/dist/runtime/server/createTRPCEventHandler.js +30 -0
  76. package/dist/runtime/server/createTRPCWebSocketHandler.d.ts +4 -0
  77. package/dist/runtime/server/createTRPCWebSocketHandler.js +65 -0
  78. package/dist/runtime/server/models/PeerWebSocketAdapter.d.ts +6 -0
  79. package/dist/runtime/server/models/PeerWebSocketAdapter.js +15 -0
  80. package/dist/runtime/server/models/TRPCEventHandlerOptions.d.ts +9 -0
  81. package/dist/runtime/server/models/TRPCEventHandlerOptions.js +1 -0
  82. package/dist/runtime/server/models/TRPCWebSocketConnection.d.ts +5 -0
  83. package/dist/runtime/server/models/TRPCWebSocketConnection.js +1 -0
  84. package/dist/runtime/server/models/TRPCWebSocketHandler.d.ts +5 -0
  85. package/dist/runtime/server/models/TRPCWebSocketHandler.js +1 -0
  86. package/dist/runtime/server/models/TRPCWebSocketHandlerOptions.d.ts +11 -0
  87. package/dist/runtime/server/models/TRPCWebSocketHandlerOptions.js +1 -0
  88. package/dist/runtime/server/models/WebSocketClientAdapter.d.ts +16 -0
  89. package/dist/runtime/server/models/WebSocketClientAdapter.js +27 -0
  90. package/dist/runtime/server/models/WebSocketServerAdapter.d.ts +5 -0
  91. package/dist/runtime/server/models/WebSocketServerAdapter.js +15 -0
  92. package/dist/runtime/server/services/toIncomingMessage.d.ts +3 -0
  93. package/dist/runtime/server/services/toIncomingMessage.js +11 -0
  94. package/dist/services/getEventHandlerTemplate.js +9 -0
  95. package/dist/services/getImportStatement.js +3 -0
  96. package/dist/services/getWebSocketHandlerTemplate.js +22 -0
  97. package/dist/services/getWebSocketHooksTypeTemplate.js +17 -0
  98. package/package.json +9 -8
@@ -0,0 +1,7 @@
1
+ import { KeysOf } from "../models/KeysOf.js";
2
+ import { QueryAsyncData } from "../models/QueryAsyncData.js";
3
+ import { UseQueryOptions } from "../models/UseQueryOptions.js";
4
+ import { MaybeRefOrGetter } from "vue";
5
+ import { TRPCResolverDef, TRPCUntypedClient } from "@trpc/client";
6
+ import { AnyTRPCRouter } from "@trpc/server";
7
+ export declare const useProcedureQuery: (client: TRPCUntypedClient<AnyTRPCRouter>, path: string, input: MaybeRefOrGetter<unknown>, { queryKey, trpc, watch, ...options }?: UseQueryOptions<TRPCResolverDef>) => QueryAsyncData<TRPCResolverDef, unknown, KeysOf<unknown>, undefined>;
@@ -0,0 +1,13 @@
1
+ import { getProcedureKey } from "./getProcedureKey.js";
2
+ import { mergeSignals } from "./mergeSignals.js";
3
+ import { useAsyncData } from "nuxt/app";
4
+ import { toValue } from "vue";
5
+ // src/runtime/client/services/useProcedureQuery.ts
6
+ const useProcedureQuery = (client, path, input, { queryKey, trpc, watch, ...options } = {}) => useAsyncData(() => queryKey ?? getProcedureKey(path, toValue(input)), (_nuxtApp, { signal }) => client.query(path, toValue(input), {
7
+ ...trpc,
8
+ signal: mergeSignals(signal, trpc?.signal)
9
+ }), {
10
+ ...options,
11
+ watch: watch === false ? void 0 : queryKey === void 0 ? watch : [...watch ?? [], () => toValue(input)]
12
+ });
13
+ export { useProcedureQuery };
@@ -0,0 +1,6 @@
1
+ import { UseSubscriptionOptions } from "../models/UseSubscriptionOptions.js";
2
+ import { UseSubscriptionReturn } from "../models/UseSubscriptionReturn.js";
3
+ import { MaybeRefOrGetter } from "vue";
4
+ import { TRPCClientError, TRPCResolverDef, TRPCUntypedClient } from "@trpc/client";
5
+ import { AnyTRPCRouter } from "@trpc/server";
6
+ export declare const useProcedureSubscription: (client: TRPCUntypedClient<AnyTRPCRouter>, path: string, input: MaybeRefOrGetter<unknown>, { enabled, ...options }?: UseSubscriptionOptions<TRPCResolverDef>) => UseSubscriptionReturn<unknown, TRPCClientError<AnyTRPCRouter>>;
@@ -0,0 +1,68 @@
1
+ import "../models/ConnectionStateSubscriptionStatus.js";
2
+ import { SubscriptionStatus } from "../models/SubscriptionStatus.js";
3
+ import { getCurrentScope, onScopeDispose, shallowRef, toValue, watch } from "vue";
4
+ import { checkIsServer } from "@esposter/shared";
5
+ // src/runtime/client/services/useProcedureSubscription.ts
6
+ const ConnectionStateSubscriptionStatusMap = {
7
+ ["connecting"]: SubscriptionStatus.Connecting,
8
+ ["idle"]: SubscriptionStatus.Idle,
9
+ ["pending"]: SubscriptionStatus.Pending
10
+ };
11
+ const useProcedureSubscription = (client, path, input, { enabled = true, ...options } = {}) => {
12
+ const data = shallowRef();
13
+ const error = shallowRef();
14
+ const status = shallowRef(SubscriptionStatus.Idle);
15
+ let unsubscribable;
16
+ const unsubscribe = () => {
17
+ unsubscribable?.unsubscribe();
18
+ unsubscribable = void 0;
19
+ status.value = SubscriptionStatus.Idle;
20
+ };
21
+ const subscribe = () => {
22
+ unsubscribable?.unsubscribe();
23
+ error.value = void 0;
24
+ status.value = SubscriptionStatus.Connecting;
25
+ unsubscribable = client.subscription(path, toValue(input), {
26
+ ...options,
27
+ onComplete: () => {
28
+ status.value = SubscriptionStatus.Idle;
29
+ options.onComplete?.();
30
+ },
31
+ onConnectionStateChange: (state) => {
32
+ status.value = state.error ? SubscriptionStatus.Error : ConnectionStateSubscriptionStatusMap[state.state];
33
+ options.onConnectionStateChange?.(state);
34
+ },
35
+ onData: (value) => {
36
+ data.value = value;
37
+ options.onData?.(value);
38
+ },
39
+ onError: (newError) => {
40
+ error.value = newError;
41
+ status.value = SubscriptionStatus.Error;
42
+ options.onError?.(newError);
43
+ },
44
+ onStarted: (startedOptions) => {
45
+ status.value = SubscriptionStatus.Pending;
46
+ options.onStarted?.(startedOptions);
47
+ }
48
+ });
49
+ };
50
+ if (!checkIsServer()) watch([() => toValue(input), () => toValue(enabled)], ([, isEnabled]) => {
51
+ if (isEnabled) subscribe();
52
+ else unsubscribe();
53
+ }, { immediate: true });
54
+ if (getCurrentScope()) onScopeDispose(() => {
55
+ unsubscribe();
56
+ });
57
+ return {
58
+ data,
59
+ error,
60
+ reset: () => {
61
+ data.value = void 0;
62
+ unsubscribe();
63
+ if (toValue(enabled)) subscribe();
64
+ },
65
+ status
66
+ };
67
+ };
68
+ export { useProcedureSubscription };
@@ -0,0 +1,2 @@
1
+ import { TrpcServerFetch } from "../../../models/TrpcServerFetch.js";
2
+ export declare const useTrpcServerFetch: () => TrpcServerFetch;
@@ -0,0 +1,7 @@
1
+ // src/runtime/client/services/useTrpcServerFetch.ts
2
+ const useTrpcServerFetch = () => async (resource, init, context) => {
3
+ if (!import.meta.server) throw new TypeError("The in-process tRPC fetch exists on the server only");
4
+ const { serverFetch } = await import("nitro/app");
5
+ return serverFetch(resource, init, context);
6
+ };
7
+ export { useTrpcServerFetch };
@@ -0,0 +1,4 @@
1
+ export declare const DEFAULT_ENDPOINT = "/api/trpc";
2
+ export declare const MODULE_NAME = "trpc-nuxt-module";
3
+ export declare const WEBSOCKET_CLOSE_HOOK: `${typeof MODULE_NAME}:webSocket:close`;
4
+ export declare const WEBSOCKET_OPEN_HOOK: `${typeof MODULE_NAME}:webSocket:open`;
@@ -0,0 +1,6 @@
1
+ // src/runtime/constants.ts
2
+ const DEFAULT_ENDPOINT = "/api/trpc";
3
+ const MODULE_NAME = "trpc-nuxt-module";
4
+ const WEBSOCKET_CLOSE_HOOK = `${MODULE_NAME}:webSocket:close`;
5
+ const WEBSOCKET_OPEN_HOOK = `${MODULE_NAME}:webSocket:open`;
6
+ export { DEFAULT_ENDPOINT, MODULE_NAME, WEBSOCKET_CLOSE_HOOK, WEBSOCKET_OPEN_HOOK };
@@ -0,0 +1,4 @@
1
+ import { TRPCEventHandlerOptions } from "./models/TRPCEventHandlerOptions.js";
2
+ import { AnyTRPCRouter } from "@trpc/server";
3
+ import { EventHandler } from "nitro/h3";
4
+ export declare const createTRPCEventHandler: <TRouter extends AnyTRPCRouter>({ createContext, endpoint, ...options }: TRPCEventHandlerOptions<TRouter>) => EventHandler;
@@ -0,0 +1,30 @@
1
+ import { DEFAULT_ENDPOINT } from "../constants.js";
2
+ import { defineHandler } from "nitro/h3";
3
+ import { fetchRequestHandler } from "@trpc/server/adapters/fetch";
4
+ // src/runtime/server/createTRPCEventHandler.ts
5
+ const NULL_BODY_STATUSES = /* @__PURE__ */ new Set([
6
+ 204,
7
+ 205,
8
+ 304
9
+ ]);
10
+ const createTRPCEventHandler = ({ createContext, endpoint = DEFAULT_ENDPOINT, ...options }) => defineHandler(async (event) => {
11
+ const response = await fetchRequestHandler({
12
+ ...options,
13
+ createContext: createContext && ((fetchCreateContextOptions) => createContext(event, fetchCreateContextOptions)),
14
+ endpoint,
15
+ req: event.req
16
+ });
17
+ const { status } = event.res;
18
+ if (!status) return response;
19
+ else if (!NULL_BODY_STATUSES.has(status)) return new Response(response.body, {
20
+ headers: response.headers,
21
+ status
22
+ });
23
+ const headers = new Headers(response.headers);
24
+ headers.delete("content-length");
25
+ return new Response(null, {
26
+ headers,
27
+ status
28
+ });
29
+ });
30
+ export { createTRPCEventHandler };
@@ -0,0 +1,4 @@
1
+ import { TRPCWebSocketHandler } from "./models/TRPCWebSocketHandler.js";
2
+ import { TRPCWebSocketHandlerOptions } from "./models/TRPCWebSocketHandlerOptions.js";
3
+ import { AnyTRPCRouter } from "@trpc/server";
4
+ export declare const createTRPCWebSocketHandler: <TRouter extends AnyTRPCRouter>({ createContext, onClose, onOpen, ...options }: TRPCWebSocketHandlerOptions<TRouter>) => TRPCWebSocketHandler;
@@ -0,0 +1,65 @@
1
+ import { PeerWebSocketAdapter } from "./models/PeerWebSocketAdapter.js";
2
+ import { WebSocketServerAdapter } from "./models/WebSocketServerAdapter.js";
3
+ import { toIncomingMessage } from "./services/toIncomingMessage.js";
4
+ import { getResultAsync, noop } from "@esposter/shared";
5
+ import { applyWSSHandler } from "@trpc/server/adapters/ws";
6
+ // src/runtime/server/createTRPCWebSocketHandler.ts
7
+ const createTRPCWebSocketHandler = ({ createContext, onClose, onOpen, ...options }) => {
8
+ const webSocketServer = new WebSocketServerAdapter();
9
+ const { broadcastReconnectNotification } = applyWSSHandler({
10
+ ...options,
11
+ createContext,
12
+ wss: webSocketServer
13
+ });
14
+ const peerConnections = /* @__PURE__ */ new Map();
15
+ return {
16
+ broadcastReconnectNotification,
17
+ hooks: {
18
+ close: async (peer, { code, reason }) => {
19
+ const peerConnection = peerConnections.get(peer.id);
20
+ if (!peerConnection) return;
21
+ peerConnections.delete(peer.id);
22
+ PeerWebSocketAdapter.receiveClose(peerConnection.client, code, reason);
23
+ await peerConnection.context.match((context) => getResultAsync(() => Promise.resolve(onClose?.({
24
+ context,
25
+ peer
26
+ }))).match(noop, console.error), noop);
27
+ },
28
+ error: (peer, error) => {
29
+ const peerConnection = peerConnections.get(peer.id);
30
+ if (peerConnection) PeerWebSocketAdapter.receiveError(peerConnection.client, error);
31
+ },
32
+ message: (peer, message) => {
33
+ const peerConnection = peerConnections.get(peer.id);
34
+ if (peerConnection) PeerWebSocketAdapter.receiveMessage(peerConnection.client, message.text());
35
+ },
36
+ open: async (peer) => {
37
+ const client = new PeerWebSocketAdapter(peer);
38
+ const request = toIncomingMessage(peer);
39
+ const context = getResultAsync(() => Promise.resolve(createContext({
40
+ info: {
41
+ accept: null,
42
+ calls: [],
43
+ connectionParams: null,
44
+ isBatchCall: false,
45
+ signal: new AbortController().signal,
46
+ type: "unknown",
47
+ url: new URL(peer.request.url)
48
+ },
49
+ req: request,
50
+ res: client
51
+ })));
52
+ peerConnections.set(peer.id, {
53
+ client,
54
+ context
55
+ });
56
+ webSocketServer.emit("connection", client, request);
57
+ await context.andThen((value) => getResultAsync(() => Promise.resolve(onOpen?.({
58
+ context: value,
59
+ peer
60
+ })))).match(noop, console.error);
61
+ }
62
+ }
63
+ };
64
+ };
65
+ export { createTRPCWebSocketHandler };
@@ -0,0 +1,6 @@
1
+ import { WebSocketClientAdapter } from "./WebSocketClientAdapter.js";
2
+ export declare class PeerWebSocketAdapter extends WebSocketClientAdapter {
3
+ static receiveClose(client: PeerWebSocketAdapter, code?: number, reason?: string): void;
4
+ static receiveError(client: PeerWebSocketAdapter, error: unknown): void;
5
+ static receiveMessage(client: PeerWebSocketAdapter, message: string): void;
6
+ }
@@ -0,0 +1,15 @@
1
+ import { WebSocketClientAdapter } from "./WebSocketClientAdapter.js";
2
+ // src/runtime/server/models/PeerWebSocketAdapter.ts
3
+ var PeerWebSocketAdapter = class extends WebSocketClientAdapter {
4
+ static receiveClose(client, code, reason) {
5
+ client.readyState = WebSocket.CLOSED;
6
+ client.emit("close", code, reason);
7
+ }
8
+ static receiveError(client, error) {
9
+ client.emit("error", error);
10
+ }
11
+ static receiveMessage(client, message) {
12
+ client.emit("message", Buffer.from(message), false);
13
+ }
14
+ };
15
+ export { PeerWebSocketAdapter };
@@ -0,0 +1,9 @@
1
+ import { AnyTRPCRouter, inferRouterContext } from "@trpc/server";
2
+ import { H3Event } from "nitro/h3";
3
+ import { FetchCreateContextFnOptions } from "@trpc/server/adapters/fetch";
4
+ import { Promisable } from "type-fest";
5
+ import { HTTPBaseHandlerOptions } from "@trpc/server/http";
6
+ export type TRPCEventHandlerOptions<TRouter extends AnyTRPCRouter> = HTTPBaseHandlerOptions<TRouter, Request> & {
7
+ createContext?: (event: H3Event, options: FetchCreateContextFnOptions) => Promisable<inferRouterContext<TRouter>>;
8
+ endpoint?: string;
9
+ };
@@ -0,0 +1,5 @@
1
+ import { Peer } from "crossws";
2
+ export interface TRPCWebSocketConnection<TContext> {
3
+ context: TContext;
4
+ peer: Peer;
5
+ }
@@ -0,0 +1,5 @@
1
+ import { Hooks } from "crossws";
2
+ export interface TRPCWebSocketHandler {
3
+ broadcastReconnectNotification: () => void;
4
+ hooks: Partial<Hooks>;
5
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,11 @@
1
+ import { TRPCWebSocketConnection } from "./TRPCWebSocketConnection.js";
2
+ import { AnyTRPCRouter, inferRouterContext } from "@trpc/server";
3
+ import { IncomingMessage } from "node:http";
4
+ import { CreateWSSContextFnOptions, WSSHandlerOptions } from "@trpc/server/adapters/ws";
5
+ import { Promisable } from "type-fest";
6
+ import { BaseHandlerOptions } from "@trpc/server/http";
7
+ export type TRPCWebSocketHandlerOptions<TRouter extends AnyTRPCRouter> = BaseHandlerOptions<TRouter, IncomingMessage> & Pick<WSSHandlerOptions<TRouter>, "dangerouslyDisablePong" | "experimental_encoder" | "keepAlive" | "prefix"> & {
8
+ createContext: (options: CreateWSSContextFnOptions) => Promisable<inferRouterContext<TRouter>>;
9
+ onClose?: (connection: TRPCWebSocketConnection<inferRouterContext<TRouter>>) => Promisable<void>;
10
+ onOpen?: (connection: TRPCWebSocketConnection<inferRouterContext<TRouter>>) => Promisable<void>;
11
+ };
@@ -0,0 +1,16 @@
1
+ import { EventEmitter } from "node:events";
2
+ export declare class WebSocketClientAdapter extends EventEmitter {
3
+ readonly close: (code?: number, reason?: string) => void;
4
+ readonly CLOSED: number;
5
+ readonly CLOSING: number;
6
+ readonly CONNECTING: number;
7
+ readonly OPEN: number;
8
+ readyState: number;
9
+ readonly send: (data: string) => void;
10
+ readonly terminate: () => void;
11
+ constructor(transport: {
12
+ close: (code?: number, reason?: string) => void;
13
+ send: (data: string) => void;
14
+ terminate: () => void;
15
+ });
16
+ }
@@ -0,0 +1,27 @@
1
+ import { EventEmitter } from "node:events";
2
+ // src/runtime/server/models/WebSocketClientAdapter.ts
3
+ var WebSocketClientAdapter = class extends EventEmitter {
4
+ close;
5
+ CLOSED = WebSocket.CLOSED;
6
+ CLOSING = WebSocket.CLOSING;
7
+ CONNECTING = WebSocket.CONNECTING;
8
+ OPEN = WebSocket.OPEN;
9
+ readyState = WebSocket.OPEN;
10
+ send;
11
+ terminate;
12
+ constructor(transport) {
13
+ super();
14
+ this.close = (code, reason) => {
15
+ this.readyState = WebSocket.CLOSING;
16
+ transport.close(code, reason);
17
+ };
18
+ this.send = (data) => {
19
+ transport.send(data);
20
+ };
21
+ this.terminate = () => {
22
+ this.readyState = WebSocket.CLOSING;
23
+ transport.terminate();
24
+ };
25
+ }
26
+ };
27
+ export { WebSocketClientAdapter };
@@ -0,0 +1,5 @@
1
+ import { EventEmitter } from "node:events";
2
+ export declare class WebSocketServerAdapter<TClient extends EventEmitter> extends EventEmitter {
3
+ readonly clients: Set<TClient>;
4
+ constructor();
5
+ }
@@ -0,0 +1,15 @@
1
+ import { EventEmitter } from "node:events";
2
+ // src/runtime/server/models/WebSocketServerAdapter.ts
3
+ var WebSocketServerAdapter = class extends EventEmitter {
4
+ clients = /* @__PURE__ */ new Set();
5
+ constructor() {
6
+ super();
7
+ this.on("connection", (client) => {
8
+ this.clients.add(client);
9
+ client.once("close", () => {
10
+ this.clients.delete(client);
11
+ });
12
+ });
13
+ }
14
+ };
15
+ export { WebSocketServerAdapter };
@@ -0,0 +1,3 @@
1
+ import { IncomingMessage } from "node:http";
2
+ import { Peer } from "crossws";
3
+ export declare const toIncomingMessage: ({ request }: Peer) => IncomingMessage;
@@ -0,0 +1,11 @@
1
+ import { IncomingMessage } from "node:http";
2
+ import { Socket } from "node:net";
3
+ // src/runtime/server/services/toIncomingMessage.ts
4
+ const toIncomingMessage = ({ request }) => {
5
+ const incomingMessage = new IncomingMessage(new Socket());
6
+ const { pathname, search } = new URL(request.url);
7
+ incomingMessage.url = `${pathname}${search}`;
8
+ incomingMessage.headers = Object.fromEntries(request.headers);
9
+ return incomingMessage;
10
+ };
11
+ export { toIncomingMessage };
@@ -0,0 +1,9 @@
1
+ import { getImportStatement } from "./getImportStatement.js";
2
+ // src/services/getEventHandlerTemplate.ts
3
+ const getEventHandlerTemplate = (router, endpoint, createContext) => [
4
+ `import { createTRPCEventHandler } from "trpc-nuxt-module/runtime/server/createTRPCEventHandler";`,
5
+ getImportStatement(router, "router"),
6
+ ...createContext ? [getImportStatement(createContext, "createContext")] : [],
7
+ `export default createTRPCEventHandler({ ${createContext ? "createContext, " : ""}endpoint: ${JSON.stringify(endpoint)}, router });`
8
+ ].join("\n");
9
+ export { getEventHandlerTemplate };
@@ -0,0 +1,3 @@
1
+ // src/services/getImportStatement.ts
2
+ const getImportStatement = ({ from, name }, localName) => `import { ${name} as ${localName} } from ${JSON.stringify(from)};`;
3
+ export { getImportStatement };
@@ -0,0 +1,22 @@
1
+ import { MODULE_NAME } from "../runtime/constants.js";
2
+ import { getImportStatement } from "./getImportStatement.js";
3
+ // src/services/getWebSocketHandlerTemplate.ts
4
+ const getWebSocketHandlerTemplate = (router, { keepAlive }, createContext) => [
5
+ `import { useNitroHooks } from "nitro/app";`,
6
+ `import { defineWebSocketHandler } from "nitro/h3";`,
7
+ `import { WEBSOCKET_CLOSE_HOOK, WEBSOCKET_OPEN_HOOK } from "${MODULE_NAME}/runtime/constants";`,
8
+ `import { createTRPCWebSocketHandler } from "trpc-nuxt-module/runtime/server/createTRPCWebSocketHandler";`,
9
+ getImportStatement(router, "router"),
10
+ createContext ? getImportStatement(createContext, "createContext") : "const createContext = () => ({});",
11
+ `const nitroHooks = useNitroHooks();`,
12
+ `const { broadcastReconnectNotification, hooks } = createTRPCWebSocketHandler({`,
13
+ ` createContext,`,
14
+ ` keepAlive: ${JSON.stringify(keepAlive)},`,
15
+ ` onClose: (connection) => nitroHooks.callHook(WEBSOCKET_CLOSE_HOOK, connection),`,
16
+ ` onOpen: (connection) => nitroHooks.callHook(WEBSOCKET_OPEN_HOOK, connection),`,
17
+ ` router,`,
18
+ `});`,
19
+ `nitroHooks.hook("close", broadcastReconnectNotification);`,
20
+ `export default defineWebSocketHandler(hooks);`
21
+ ].join("\n");
22
+ export { getWebSocketHandlerTemplate };
@@ -0,0 +1,17 @@
1
+ import { MODULE_NAME, WEBSOCKET_CLOSE_HOOK, WEBSOCKET_OPEN_HOOK } from "../runtime/constants.js";
2
+ // src/services/getWebSocketHooksTypeTemplate.ts
3
+ const getWebSocketHooksTypeTemplate = ({ from, name }) => {
4
+ const connectionType = `TRPCWebSocketConnection<inferRouterContext<typeof import(${JSON.stringify(from)})[${JSON.stringify(name)}]>>`;
5
+ return [
6
+ `import type { inferRouterContext } from "@trpc/server";`,
7
+ `import type { TRPCWebSocketConnection } from "${MODULE_NAME}/runtime/server/models/TRPCWebSocketConnection";`,
8
+ `declare module "nitro/types" {`,
9
+ ` interface NitroRuntimeHooks {`,
10
+ ` ${JSON.stringify(WEBSOCKET_CLOSE_HOOK)}: (connection: ${connectionType}) => Promise<void> | void;`,
11
+ ` ${JSON.stringify(WEBSOCKET_OPEN_HOOK)}: (connection: ${connectionType}) => Promise<void> | void;`,
12
+ ` }`,
13
+ `}`,
14
+ `export {};`
15
+ ].join("\n");
16
+ };
17
+ export { getWebSocketHooksTypeTemplate };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "trpc-nuxt-module",
3
- "version": "4.4.0",
3
+ "version": "4.5.0",
4
4
  "description": "tRPC for Nuxt — a Nuxt module that registers your router's HTTP and WebSocket handlers, fetches through the request event during SSR, and decorates the typed client with useQuery, useMutation and useSubscription over useAsyncData.",
5
5
  "keywords": [
6
6
  "nitro",
@@ -42,6 +42,7 @@
42
42
  "./runtime/server/createTRPCEventHandler": "./dist/runtime/server/createTRPCEventHandler.js",
43
43
  "./runtime/server/createTRPCWebSocketHandler": "./dist/runtime/server/createTRPCWebSocketHandler.js",
44
44
  "./runtime/server/models/TRPCWebSocketConnection": "./dist/runtime/server/models/TRPCWebSocketConnection.js",
45
+ "./runtime/server/models/WebSocketClientAdapter": "./dist/runtime/server/models/WebSocketClientAdapter.js",
45
46
  "./runtime/server/models/WebSocketServerAdapter": "./dist/runtime/server/models/WebSocketServerAdapter.js",
46
47
  "./package.json": "./package.json"
47
48
  },
@@ -57,30 +58,30 @@
57
58
  "typecheck": "tsrs --fast"
58
59
  },
59
60
  "dependencies": {
60
- "@esposter/shared": "4.4.0",
61
+ "@esposter/shared": "4.5.0",
61
62
  "@nuxt/kit": "npm:@nuxt/kit-nightly@5x",
62
63
  "@nuxt/schema": "npm:@nuxt/schema-nightly@5x",
63
64
  "ohash": "^2.0.12",
64
65
  "type-fest": "^5.10.0"
65
66
  },
66
67
  "devDependencies": {
67
- "@esposter/configuration": "4.4.0",
68
- "@esposter/shared-node": "4.4.0",
68
+ "@esposter/configuration": "4.5.0",
69
+ "@esposter/shared-node": "4.5.0",
69
70
  "@nuxt/nitro-server": "npm:@nuxt/nitro-server-nightly@5x",
70
71
  "@nuxt/test-utils": "^4.3.4",
71
72
  "@types/node": "^26.6.6",
72
73
  "happy-dom": "^21.0.4",
73
74
  "superjson": "^2.2.6",
74
- "tsdown": "0.23.2",
75
+ "tsdown": "^0.23.5",
75
76
  "zod": "^4.6.7"
76
77
  },
77
78
  "peerDependencies": {
78
- "@trpc/client": "^11.22.1",
79
- "@trpc/server": "^11.22.1",
79
+ "@trpc/client": "^11.24.0",
80
+ "@trpc/server": "^11.24.0",
80
81
  "crossws": "^0.4.17",
81
82
  "nitro": "npm:nitro-nightly@latest",
82
83
  "nuxt": "npm:nuxt-nightly@5x",
83
84
  "vue": "^3.5.44"
84
85
  },
85
- "gitHead": "e1a416c4b91da69cc2aa259b50a4d656f204d272"
86
+ "gitHead": "e30c001f3b4b15693e75fb53092d62a97ade4d2b"
86
87
  }