trpc-nuxt-module 3.6.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/LICENSE +201 -0
- package/README.md +115 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.js +72 -0
- package/dist/models/ExportReference.d.ts +6 -0
- package/dist/models/ModuleOptions.d.ts +10 -0
- package/dist/models/WebSocketOptions.d.ts +8 -0
- package/dist/runtime/client/createTRPCNuxtClient.d.ts +6 -0
- package/dist/runtime/client/createTRPCNuxtClient.js +29 -0
- package/dist/runtime/client/getMutationKey.d.ts +4 -0
- package/dist/runtime/client/getMutationKey.js +5 -0
- package/dist/runtime/client/getQueryKey.d.ts +4 -0
- package/dist/runtime/client/getQueryKey.js +5 -0
- package/dist/runtime/client/httpBatchLink.d.ts +5 -0
- package/dist/runtime/client/httpBatchLink.js +9 -0
- package/dist/runtime/client/httpLink.d.ts +5 -0
- package/dist/runtime/client/httpLink.js +9 -0
- package/dist/runtime/client/models/DecoratedMutation.d.ts +11 -0
- package/dist/runtime/client/models/DecoratedMutation.js +1 -0
- package/dist/runtime/client/models/DecoratedProcedure.d.ts +8 -0
- package/dist/runtime/client/models/DecoratedProcedure.js +1 -0
- package/dist/runtime/client/models/DecoratedQuery.d.ts +10 -0
- package/dist/runtime/client/models/DecoratedQuery.js +1 -0
- package/dist/runtime/client/models/DecoratedRouterRecord.d.ts +11 -0
- package/dist/runtime/client/models/DecoratedRouterRecord.js +1 -0
- package/dist/runtime/client/models/DecoratedSubscription.d.ts +10 -0
- package/dist/runtime/client/models/DecoratedSubscription.js +1 -0
- package/dist/runtime/client/models/KeysOf.d.ts +3 -0
- package/dist/runtime/client/models/KeysOf.js +1 -0
- package/dist/runtime/client/models/PickFrom.d.ts +3 -0
- package/dist/runtime/client/models/PickFrom.js +1 -0
- package/dist/runtime/client/models/ProcedureNode.d.ts +6 -0
- package/dist/runtime/client/models/ProcedureNode.js +1 -0
- package/dist/runtime/client/models/ProcedurePath.d.ts +5 -0
- package/dist/runtime/client/models/ProcedurePath.js +1 -0
- package/dist/runtime/client/models/QueryAsyncData.d.ts +8 -0
- package/dist/runtime/client/models/QueryAsyncData.js +1 -0
- package/dist/runtime/client/models/QueryError.d.ts +5 -0
- package/dist/runtime/client/models/QueryError.js +1 -0
- package/dist/runtime/client/models/SubscriptionStatus.d.ts +8 -0
- package/dist/runtime/client/models/SubscriptionStatus.js +10 -0
- package/dist/runtime/client/models/TRPCNuxtClient.d.ts +5 -0
- package/dist/runtime/client/models/TRPCNuxtClient.js +1 -0
- package/dist/runtime/client/models/UseMutationOptions.d.ts +10 -0
- package/dist/runtime/client/models/UseMutationOptions.js +1 -0
- package/dist/runtime/client/models/UseMutationReturn.d.ts +9 -0
- package/dist/runtime/client/models/UseMutationReturn.js +1 -0
- package/dist/runtime/client/models/UseQuery.d.ts +8 -0
- package/dist/runtime/client/models/UseQuery.js +1 -0
- package/dist/runtime/client/models/UseQueryOptions.d.ts +11 -0
- package/dist/runtime/client/models/UseQueryOptions.js +1 -0
- package/dist/runtime/client/models/UseSubscriptionOptions.d.ts +7 -0
- package/dist/runtime/client/models/UseSubscriptionOptions.js +1 -0
- package/dist/runtime/client/models/UseSubscriptionReturn.d.ts +10 -0
- package/dist/runtime/client/models/UseSubscriptionReturn.js +1 -0
- package/dist/runtime/client/services/getLinkFetch.d.ts +4 -0
- package/dist/runtime/client/services/getLinkFetch.js +12 -0
- package/dist/runtime/client/services/getProcedureKey.d.ts +3 -0
- package/dist/runtime/client/services/getProcedureKey.js +5 -0
- package/dist/runtime/client/services/mergeSignals.d.ts +3 -0
- package/dist/runtime/client/services/mergeSignals.js +4 -0
- package/dist/runtime/client/services/useProcedureMutation.d.ts +8 -0
- package/dist/runtime/client/services/useProcedureMutation.js +23 -0
- package/dist/runtime/client/services/useProcedureQuery.d.ts +9 -0
- package/dist/runtime/client/services/useProcedureQuery.js +14 -0
- package/dist/runtime/client/services/useProcedureSubscription.d.ts +8 -0
- package/dist/runtime/client/services/useProcedureSubscription.js +66 -0
- package/dist/runtime/constants.d.ts +6 -0
- package/dist/runtime/constants.js +7 -0
- package/dist/runtime/server/createTRPCEventHandler.d.ts +6 -0
- package/dist/runtime/server/createTRPCEventHandler.js +17 -0
- package/dist/runtime/server/createTRPCWebSocketHandler.d.ts +6 -0
- package/dist/runtime/server/createTRPCWebSocketHandler.js +63 -0
- package/dist/runtime/server/models/PeerWebSocketAdapter.d.ts +19 -0
- package/dist/runtime/server/models/PeerWebSocketAdapter.js +37 -0
- package/dist/runtime/server/models/TRPCEventHandlerOptions.d.ts +11 -0
- package/dist/runtime/server/models/TRPCEventHandlerOptions.js +1 -0
- package/dist/runtime/server/models/TRPCWebSocketConnection.d.ts +7 -0
- package/dist/runtime/server/models/TRPCWebSocketConnection.js +1 -0
- package/dist/runtime/server/models/TRPCWebSocketHandler.d.ts +7 -0
- package/dist/runtime/server/models/TRPCWebSocketHandler.js +1 -0
- package/dist/runtime/server/models/TRPCWebSocketHandlerOptions.d.ts +13 -0
- package/dist/runtime/server/models/TRPCWebSocketHandlerOptions.js +1 -0
- package/dist/runtime/server/models/WebSocketServerAdapter.d.ts +8 -0
- package/dist/runtime/server/models/WebSocketServerAdapter.js +14 -0
- package/dist/runtime/server/services/getRequestSignal.d.ts +4 -0
- package/dist/runtime/server/services/getRequestSignal.js +11 -0
- package/dist/runtime/server/services/toIncomingMessage.d.ts +5 -0
- package/dist/runtime/server/services/toIncomingMessage.js +12 -0
- package/dist/runtime/server/services/toRequest.d.ts +4 -0
- package/dist/runtime/server/services/toRequest.js +20 -0
- package/dist/services/getEventHandlerTemplate.js +11 -0
- package/dist/services/getImportStatement.js +4 -0
- package/dist/services/getWebSocketHandlerTemplate.js +23 -0
- package/dist/services/getWebSocketHooksTypeTemplate.js +18 -0
- package/package.json +114 -0
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { KeysOf } from "./KeysOf.js";
|
|
2
|
+
import { PickFrom } from "./PickFrom.js";
|
|
3
|
+
import { QueryError } from "./QueryError.js";
|
|
4
|
+
import { AsyncData } from "nuxt/app";
|
|
5
|
+
import { TRPCResolverDef } from "@trpc/client";
|
|
6
|
+
//#region src/runtime/client/models/QueryAsyncData.d.ts
|
|
7
|
+
export type QueryAsyncData<TDefinition extends TRPCResolverDef, TData, TPickKeys extends KeysOf<TData>, TDefault> = AsyncData<PickFrom<TData, TPickKeys> | TDefault, QueryError<TDefinition> | undefined>;
|
|
8
|
+
//#endregion
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { NuxtError } from "nuxt/app";
|
|
2
|
+
import { TRPCClientErrorLike, TRPCResolverDef } from "@trpc/client";
|
|
3
|
+
//#region src/runtime/client/models/QueryError.d.ts
|
|
4
|
+
export type QueryError<TDefinition extends TRPCResolverDef> = NuxtError<TRPCClientErrorLike<TDefinition>["data"]>;
|
|
5
|
+
//#endregion
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
//#region src/runtime/client/models/SubscriptionStatus.ts
|
|
2
|
+
let SubscriptionStatus = /* @__PURE__ */ function(SubscriptionStatus) {
|
|
3
|
+
SubscriptionStatus["Connecting"] = "connecting";
|
|
4
|
+
SubscriptionStatus["Error"] = "error";
|
|
5
|
+
SubscriptionStatus["Idle"] = "idle";
|
|
6
|
+
SubscriptionStatus["Pending"] = "pending";
|
|
7
|
+
return SubscriptionStatus;
|
|
8
|
+
}({});
|
|
9
|
+
//#endregion
|
|
10
|
+
export { SubscriptionStatus };
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { DecoratedRouterRecord } from "./DecoratedRouterRecord.js";
|
|
2
|
+
import { AnyTRPCRouter } from "@trpc/server";
|
|
3
|
+
//#region src/runtime/client/models/TRPCNuxtClient.d.ts
|
|
4
|
+
export type TRPCNuxtClient<TRouter extends AnyTRPCRouter> = DecoratedRouterRecord<TRouter["_def"]["_config"]["$types"], TRouter["_def"]["record"]>;
|
|
5
|
+
//#endregion
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { KeysOf } from "./KeysOf.js";
|
|
2
|
+
import { AsyncDataOptions } from "nuxt/app";
|
|
3
|
+
import { TRPCRequestOptions, TRPCResolverDef } from "@trpc/client";
|
|
4
|
+
import { Except } from "type-fest";
|
|
5
|
+
//#region src/runtime/client/models/UseMutationOptions.d.ts
|
|
6
|
+
export type UseMutationOptions<TDefinition extends TRPCResolverDef, TData = TDefinition["output"], TPickKeys extends KeysOf<TData> = KeysOf<TData>, TDefault = undefined> = Except<AsyncDataOptions<TDefinition["output"], TData, TPickKeys, TDefault>, "enabled" | "immediate" | "lazy" | "server" | "watch"> & {
|
|
7
|
+
mutationKey?: string;
|
|
8
|
+
trpc?: TRPCRequestOptions;
|
|
9
|
+
};
|
|
10
|
+
//#endregion
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { KeysOf } from "./KeysOf.js";
|
|
2
|
+
import { PickFrom } from "./PickFrom.js";
|
|
3
|
+
import { QueryAsyncData } from "./QueryAsyncData.js";
|
|
4
|
+
import { TRPCResolverDef } from "@trpc/client";
|
|
5
|
+
//#region src/runtime/client/models/UseMutationReturn.d.ts
|
|
6
|
+
export type UseMutationReturn<TDefinition extends TRPCResolverDef, TData, TPickKeys extends KeysOf<TData>, TDefault> = QueryAsyncData<TDefinition, TData, TPickKeys, TDefault> & {
|
|
7
|
+
mutate: (input: TDefinition["input"]) => Promise<PickFrom<TData, TPickKeys> | TDefault>;
|
|
8
|
+
};
|
|
9
|
+
//#endregion
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { KeysOf } from "./KeysOf.js";
|
|
2
|
+
import { QueryAsyncData } from "./QueryAsyncData.js";
|
|
3
|
+
import { UseQueryOptions } from "./UseQueryOptions.js";
|
|
4
|
+
import { MaybeRefOrGetter } from "vue";
|
|
5
|
+
import { TRPCResolverDef } from "@trpc/client";
|
|
6
|
+
//#region src/runtime/client/models/UseQuery.d.ts
|
|
7
|
+
export type UseQuery<TDefinition extends TRPCResolverDef> = <TData = TDefinition["output"], TPickKeys extends KeysOf<TData> = KeysOf<TData>, TDefault = undefined>(input: MaybeRefOrGetter<TDefinition["input"]>, options?: UseQueryOptions<TDefinition, TData, TPickKeys, TDefault>) => QueryAsyncData<TDefinition, TData, TPickKeys, TDefault>;
|
|
8
|
+
//#endregion
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { KeysOf } from "./KeysOf.js";
|
|
2
|
+
import { AsyncDataOptions } from "nuxt/app";
|
|
3
|
+
import { TRPCRequestOptions, TRPCResolverDef } from "@trpc/client";
|
|
4
|
+
import { Except } from "type-fest";
|
|
5
|
+
//#region src/runtime/client/models/UseQueryOptions.d.ts
|
|
6
|
+
export type UseQueryOptions<TDefinition extends TRPCResolverDef, TData = TDefinition["output"], TPickKeys extends KeysOf<TData> = KeysOf<TData>, TDefault = undefined> = Except<AsyncDataOptions<TDefinition["output"], TData, TPickKeys, TDefault>, "watch"> & {
|
|
7
|
+
queryKey?: string;
|
|
8
|
+
trpc?: TRPCRequestOptions;
|
|
9
|
+
watch?: false | NonNullable<AsyncDataOptions<TDefinition["output"], TData, TPickKeys, TDefault>["watch"]>;
|
|
10
|
+
};
|
|
11
|
+
//#endregion
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { MaybeRefOrGetter } from "vue";
|
|
2
|
+
import { SubscriptionResolver, TRPCResolverDef } from "@trpc/client";
|
|
3
|
+
//#region src/runtime/client/models/UseSubscriptionOptions.d.ts
|
|
4
|
+
export type UseSubscriptionOptions<TDefinition extends TRPCResolverDef> = Parameters<SubscriptionResolver<TDefinition>>[1] & {
|
|
5
|
+
enabled?: MaybeRefOrGetter<boolean>;
|
|
6
|
+
};
|
|
7
|
+
//#endregion
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { SubscriptionStatus } from "./SubscriptionStatus.js";
|
|
2
|
+
import { ShallowRef } from "vue";
|
|
3
|
+
//#region src/runtime/client/models/UseSubscriptionReturn.d.ts
|
|
4
|
+
export interface UseSubscriptionReturn<TData, TError> {
|
|
5
|
+
data: ShallowRef<TData | undefined>;
|
|
6
|
+
error: ShallowRef<TError | undefined>;
|
|
7
|
+
reset: () => void;
|
|
8
|
+
status: ShallowRef<SubscriptionStatus>;
|
|
9
|
+
}
|
|
10
|
+
//#endregion
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { useRequestEvent } from "nuxt/app";
|
|
2
|
+
import { checkIsServer } from "@esposter/shared";
|
|
3
|
+
//#region src/runtime/client/services/getLinkFetch.ts
|
|
4
|
+
const getLinkFetch = () => {
|
|
5
|
+
if (checkIsServer()) {
|
|
6
|
+
const event = useRequestEvent();
|
|
7
|
+
if (event) return event.fetch;
|
|
8
|
+
}
|
|
9
|
+
return (input, init) => fetch(new URL(input, window.location.href), init);
|
|
10
|
+
};
|
|
11
|
+
//#endregion
|
|
12
|
+
export { getLinkFetch };
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { KeysOf } from "../models/KeysOf.js";
|
|
2
|
+
import { UseMutationOptions } from "../models/UseMutationOptions.js";
|
|
3
|
+
import { UseMutationReturn } from "../models/UseMutationReturn.js";
|
|
4
|
+
import { TRPCResolverDef, TRPCUntypedClient } from "@trpc/client";
|
|
5
|
+
import { AnyTRPCRouter } from "@trpc/server";
|
|
6
|
+
//#region src/runtime/client/services/useProcedureMutation.d.ts
|
|
7
|
+
export declare const useProcedureMutation: (client: TRPCUntypedClient<AnyTRPCRouter>, path: string, { mutationKey, trpc, ...options }?: UseMutationOptions<TRPCResolverDef>) => UseMutationReturn<TRPCResolverDef, unknown, KeysOf<unknown>, undefined>;
|
|
8
|
+
//#endregion
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { getProcedureKey } from "./getProcedureKey.js";
|
|
2
|
+
import { mergeSignals } from "./mergeSignals.js";
|
|
3
|
+
import { useAsyncData } from "nuxt/app";
|
|
4
|
+
//#region src/runtime/client/services/useProcedureMutation.ts
|
|
5
|
+
const useProcedureMutation = (client, path, { mutationKey = getProcedureKey(path), trpc, ...options } = {}) => {
|
|
6
|
+
let mutationInput;
|
|
7
|
+
const asyncData = useAsyncData(mutationKey, (_nuxtApp, { signal }) => client.mutation(path, mutationInput, {
|
|
8
|
+
...trpc,
|
|
9
|
+
signal: mergeSignals(signal, trpc?.signal)
|
|
10
|
+
}), {
|
|
11
|
+
...options,
|
|
12
|
+
immediate: false,
|
|
13
|
+
server: false
|
|
14
|
+
});
|
|
15
|
+
return Object.assign(asyncData, { mutate: async (input) => {
|
|
16
|
+
mutationInput = input;
|
|
17
|
+
await asyncData.execute();
|
|
18
|
+
if (asyncData.error.value) throw asyncData.error.value;
|
|
19
|
+
return asyncData.data.value;
|
|
20
|
+
} });
|
|
21
|
+
};
|
|
22
|
+
//#endregion
|
|
23
|
+
export { useProcedureMutation };
|
|
@@ -0,0 +1,9 @@
|
|
|
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
|
+
//#region src/runtime/client/services/useProcedureQuery.d.ts
|
|
8
|
+
export declare const useProcedureQuery: (client: TRPCUntypedClient<AnyTRPCRouter>, path: string, input: MaybeRefOrGetter<unknown>, { queryKey, trpc, watch, ...options }?: UseQueryOptions<TRPCResolverDef>) => QueryAsyncData<TRPCResolverDef, unknown, KeysOf<unknown>, undefined>;
|
|
9
|
+
//#endregion
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { getProcedureKey } from "./getProcedureKey.js";
|
|
2
|
+
import { mergeSignals } from "./mergeSignals.js";
|
|
3
|
+
import { useAsyncData } from "nuxt/app";
|
|
4
|
+
import { toValue } from "vue";
|
|
5
|
+
//#region 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
|
+
//#endregion
|
|
14
|
+
export { useProcedureQuery };
|
|
@@ -0,0 +1,8 @@
|
|
|
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
|
+
//#region src/runtime/client/services/useProcedureSubscription.d.ts
|
|
7
|
+
export declare const useProcedureSubscription: (client: TRPCUntypedClient<AnyTRPCRouter>, path: string, input: MaybeRefOrGetter<unknown>, { enabled, ...options }?: UseSubscriptionOptions<TRPCResolverDef>) => UseSubscriptionReturn<unknown, TRPCClientError<AnyTRPCRouter>>;
|
|
8
|
+
//#endregion
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import "../models/SubscriptionStatus.js";
|
|
2
|
+
import { getCurrentScope, onScopeDispose, shallowRef, toValue, watch } from "vue";
|
|
3
|
+
import { checkIsServer } from "@esposter/shared";
|
|
4
|
+
//#region src/runtime/client/services/useProcedureSubscription.ts
|
|
5
|
+
const ConnectionStateSubscriptionStatusMap = {
|
|
6
|
+
connecting: "connecting",
|
|
7
|
+
idle: "idle",
|
|
8
|
+
pending: "pending"
|
|
9
|
+
};
|
|
10
|
+
const useProcedureSubscription = (client, path, input, { enabled = true, ...options } = {}) => {
|
|
11
|
+
const data = shallowRef();
|
|
12
|
+
const error = shallowRef();
|
|
13
|
+
const status = shallowRef("idle");
|
|
14
|
+
let unsubscribable;
|
|
15
|
+
const unsubscribe = () => {
|
|
16
|
+
unsubscribable?.unsubscribe();
|
|
17
|
+
unsubscribable = void 0;
|
|
18
|
+
status.value = "idle";
|
|
19
|
+
};
|
|
20
|
+
const subscribe = () => {
|
|
21
|
+
unsubscribable?.unsubscribe();
|
|
22
|
+
error.value = void 0;
|
|
23
|
+
status.value = "connecting";
|
|
24
|
+
unsubscribable = client.subscription(path, toValue(input), {
|
|
25
|
+
...options,
|
|
26
|
+
onComplete: () => {
|
|
27
|
+
status.value = "idle";
|
|
28
|
+
options.onComplete?.();
|
|
29
|
+
},
|
|
30
|
+
onConnectionStateChange: (state) => {
|
|
31
|
+
status.value = state.error ? "error" : ConnectionStateSubscriptionStatusMap[state.state];
|
|
32
|
+
options.onConnectionStateChange?.(state);
|
|
33
|
+
},
|
|
34
|
+
onData: (value) => {
|
|
35
|
+
data.value = value;
|
|
36
|
+
options.onData?.(value);
|
|
37
|
+
},
|
|
38
|
+
onError: (newError) => {
|
|
39
|
+
error.value = newError;
|
|
40
|
+
status.value = "error";
|
|
41
|
+
options.onError?.(newError);
|
|
42
|
+
},
|
|
43
|
+
onStarted: (startedOptions) => {
|
|
44
|
+
status.value = "pending";
|
|
45
|
+
options.onStarted?.(startedOptions);
|
|
46
|
+
}
|
|
47
|
+
});
|
|
48
|
+
};
|
|
49
|
+
if (!checkIsServer()) watch([() => toValue(input), () => toValue(enabled)], ([, isEnabled]) => {
|
|
50
|
+
if (isEnabled) subscribe();
|
|
51
|
+
else unsubscribe();
|
|
52
|
+
}, { immediate: true });
|
|
53
|
+
if (getCurrentScope()) onScopeDispose(unsubscribe);
|
|
54
|
+
return {
|
|
55
|
+
data,
|
|
56
|
+
error,
|
|
57
|
+
reset: () => {
|
|
58
|
+
data.value = void 0;
|
|
59
|
+
unsubscribe();
|
|
60
|
+
if (toValue(enabled)) subscribe();
|
|
61
|
+
},
|
|
62
|
+
status
|
|
63
|
+
};
|
|
64
|
+
};
|
|
65
|
+
//#endregion
|
|
66
|
+
export { useProcedureSubscription };
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
//#region src/runtime/constants.d.ts
|
|
2
|
+
export declare const DEFAULT_ENDPOINT = "/api/trpc";
|
|
3
|
+
export declare const MODULE_NAME = "trpc-nuxt-module";
|
|
4
|
+
export declare const WEBSOCKET_CLOSE_HOOK: `${typeof MODULE_NAME}:webSocket:close`;
|
|
5
|
+
export declare const WEBSOCKET_OPEN_HOOK: `${typeof MODULE_NAME}:webSocket:open`;
|
|
6
|
+
//#endregion
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
//#region 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
|
+
//#endregion
|
|
7
|
+
export { DEFAULT_ENDPOINT, MODULE_NAME, WEBSOCKET_CLOSE_HOOK, WEBSOCKET_OPEN_HOOK };
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { TRPCEventHandlerOptions } from "./models/TRPCEventHandlerOptions.js";
|
|
2
|
+
import { AnyTRPCRouter } from "@trpc/server";
|
|
3
|
+
import { EventHandler, EventHandlerRequest } from "h3";
|
|
4
|
+
//#region src/runtime/server/createTRPCEventHandler.d.ts
|
|
5
|
+
export declare const createTRPCEventHandler: <TRouter extends AnyTRPCRouter>({ createContext, endpoint, ...options }: TRPCEventHandlerOptions<TRouter>) => EventHandler<EventHandlerRequest, Promise<Response | undefined>>;
|
|
6
|
+
//#endregion
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { DEFAULT_ENDPOINT } from "../constants.js";
|
|
2
|
+
import { toRequest } from "./services/toRequest.js";
|
|
3
|
+
import { defineEventHandler } from "h3";
|
|
4
|
+
import { fetchRequestHandler } from "@trpc/server/adapters/fetch";
|
|
5
|
+
//#region src/runtime/server/createTRPCEventHandler.ts
|
|
6
|
+
const createTRPCEventHandler = ({ createContext, endpoint = DEFAULT_ENDPOINT, ...options }) => defineEventHandler(async (event) => {
|
|
7
|
+
const response = await fetchRequestHandler({
|
|
8
|
+
...options,
|
|
9
|
+
createContext: createContext && ((fetchCreateContextOptions) => createContext(event, fetchCreateContextOptions)),
|
|
10
|
+
endpoint,
|
|
11
|
+
req: await toRequest(event)
|
|
12
|
+
});
|
|
13
|
+
if (event.handled) return void 0;
|
|
14
|
+
return response;
|
|
15
|
+
});
|
|
16
|
+
//#endregion
|
|
17
|
+
export { createTRPCEventHandler };
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { TRPCWebSocketHandler } from "./models/TRPCWebSocketHandler.js";
|
|
2
|
+
import { TRPCWebSocketHandlerOptions } from "./models/TRPCWebSocketHandlerOptions.js";
|
|
3
|
+
import { AnyTRPCRouter } from "@trpc/server";
|
|
4
|
+
//#region src/runtime/server/createTRPCWebSocketHandler.d.ts
|
|
5
|
+
export declare const createTRPCWebSocketHandler: <TRouter extends AnyTRPCRouter>({ createContext, onClose, onOpen, ...options }: TRPCWebSocketHandlerOptions<TRouter>) => TRPCWebSocketHandler;
|
|
6
|
+
//#endregion
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { PeerWebSocketAdapter } from "./models/PeerWebSocketAdapter.js";
|
|
2
|
+
import { WebSocketServerAdapter } from "./models/WebSocketServerAdapter.js";
|
|
3
|
+
import { toIncomingMessage } from "./services/toIncomingMessage.js";
|
|
4
|
+
import { applyWSSHandler } from "@trpc/server/adapters/ws";
|
|
5
|
+
//#region src/runtime/server/createTRPCWebSocketHandler.ts
|
|
6
|
+
const createTRPCWebSocketHandler = ({ createContext, onClose, onOpen, ...options }) => {
|
|
7
|
+
const webSocketServer = new WebSocketServerAdapter();
|
|
8
|
+
const { broadcastReconnectNotification } = applyWSSHandler({
|
|
9
|
+
...options,
|
|
10
|
+
createContext,
|
|
11
|
+
wss: webSocketServer
|
|
12
|
+
});
|
|
13
|
+
const peerConnections = /* @__PURE__ */ new Map();
|
|
14
|
+
return {
|
|
15
|
+
broadcastReconnectNotification,
|
|
16
|
+
hooks: {
|
|
17
|
+
close: async (peer, { code, reason }) => {
|
|
18
|
+
const peerConnection = peerConnections.get(peer.id);
|
|
19
|
+
if (!peerConnection) return;
|
|
20
|
+
peerConnections.delete(peer.id);
|
|
21
|
+
peerConnection.client.receiveClose(code, reason);
|
|
22
|
+
await onClose?.({
|
|
23
|
+
context: await peerConnection.context,
|
|
24
|
+
peer
|
|
25
|
+
});
|
|
26
|
+
},
|
|
27
|
+
error: (peer, error) => {
|
|
28
|
+
peerConnections.get(peer.id)?.client.receiveError(error);
|
|
29
|
+
},
|
|
30
|
+
message: (peer, message) => {
|
|
31
|
+
peerConnections.get(peer.id)?.client.receiveMessage(message.text());
|
|
32
|
+
},
|
|
33
|
+
open: async (peer) => {
|
|
34
|
+
const client = new PeerWebSocketAdapter(peer);
|
|
35
|
+
const request = toIncomingMessage(peer);
|
|
36
|
+
const context = Promise.resolve(createContext({
|
|
37
|
+
info: {
|
|
38
|
+
accept: null,
|
|
39
|
+
calls: [],
|
|
40
|
+
connectionParams: null,
|
|
41
|
+
isBatchCall: false,
|
|
42
|
+
signal: new AbortController().signal,
|
|
43
|
+
type: "unknown",
|
|
44
|
+
url: new URL(peer.request.url)
|
|
45
|
+
},
|
|
46
|
+
req: request,
|
|
47
|
+
res: client
|
|
48
|
+
}));
|
|
49
|
+
peerConnections.set(peer.id, {
|
|
50
|
+
client,
|
|
51
|
+
context
|
|
52
|
+
});
|
|
53
|
+
webSocketServer.addConnection(client, request);
|
|
54
|
+
await onOpen?.({
|
|
55
|
+
context: await context,
|
|
56
|
+
peer
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
};
|
|
61
|
+
};
|
|
62
|
+
//#endregion
|
|
63
|
+
export { createTRPCWebSocketHandler };
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { EventEmitter } from "node:events";
|
|
2
|
+
import { Peer } from "crossws";
|
|
3
|
+
//#region src/runtime/server/models/PeerWebSocketAdapter.d.ts
|
|
4
|
+
export declare class PeerWebSocketAdapter extends EventEmitter {
|
|
5
|
+
#private;
|
|
6
|
+
readonly CLOSED: number;
|
|
7
|
+
readonly CLOSING: number;
|
|
8
|
+
readonly CONNECTING: number;
|
|
9
|
+
readonly OPEN: number;
|
|
10
|
+
readyState: number;
|
|
11
|
+
constructor(peer: Peer);
|
|
12
|
+
close(code?: number, reason?: string): void;
|
|
13
|
+
receiveClose(code?: number, reason?: string): void;
|
|
14
|
+
receiveError(error: unknown): void;
|
|
15
|
+
receiveMessage(message: string): void;
|
|
16
|
+
send(data: string): void;
|
|
17
|
+
terminate(): void;
|
|
18
|
+
}
|
|
19
|
+
//#endregion
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { EventEmitter } from "node:events";
|
|
2
|
+
//#region src/runtime/server/models/PeerWebSocketAdapter.ts
|
|
3
|
+
var PeerWebSocketAdapter = class extends EventEmitter {
|
|
4
|
+
CLOSED = WebSocket.CLOSED;
|
|
5
|
+
CLOSING = WebSocket.CLOSING;
|
|
6
|
+
CONNECTING = WebSocket.CONNECTING;
|
|
7
|
+
OPEN = WebSocket.OPEN;
|
|
8
|
+
readyState = WebSocket.OPEN;
|
|
9
|
+
#peer;
|
|
10
|
+
constructor(peer) {
|
|
11
|
+
super();
|
|
12
|
+
this.#peer = peer;
|
|
13
|
+
}
|
|
14
|
+
close(code, reason) {
|
|
15
|
+
this.readyState = WebSocket.CLOSING;
|
|
16
|
+
this.#peer.close(code, reason);
|
|
17
|
+
}
|
|
18
|
+
receiveClose(code, reason) {
|
|
19
|
+
this.readyState = WebSocket.CLOSED;
|
|
20
|
+
this.emit("close", code, reason);
|
|
21
|
+
}
|
|
22
|
+
receiveError(error) {
|
|
23
|
+
this.emit("error", error);
|
|
24
|
+
}
|
|
25
|
+
receiveMessage(message) {
|
|
26
|
+
this.emit("message", Buffer.from(message), false);
|
|
27
|
+
}
|
|
28
|
+
send(data) {
|
|
29
|
+
this.#peer.send(data);
|
|
30
|
+
}
|
|
31
|
+
terminate() {
|
|
32
|
+
this.readyState = WebSocket.CLOSING;
|
|
33
|
+
this.#peer.terminate();
|
|
34
|
+
}
|
|
35
|
+
};
|
|
36
|
+
//#endregion
|
|
37
|
+
export { PeerWebSocketAdapter };
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { AnyTRPCRouter, inferRouterContext } from "@trpc/server";
|
|
2
|
+
import { H3Event } from "h3";
|
|
3
|
+
import { FetchCreateContextFnOptions } from "@trpc/server/adapters/fetch";
|
|
4
|
+
import { Promisable } from "type-fest";
|
|
5
|
+
import { HTTPBaseHandlerOptions } from "@trpc/server/http";
|
|
6
|
+
//#region src/runtime/server/models/TRPCEventHandlerOptions.d.ts
|
|
7
|
+
export type TRPCEventHandlerOptions<TRouter extends AnyTRPCRouter> = HTTPBaseHandlerOptions<TRouter, Request> & {
|
|
8
|
+
createContext?: (event: H3Event, options: FetchCreateContextFnOptions) => Promisable<inferRouterContext<TRouter>>;
|
|
9
|
+
endpoint?: string;
|
|
10
|
+
};
|
|
11
|
+
//#endregion
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,13 @@
|
|
|
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
|
+
//#region src/runtime/server/models/TRPCWebSocketHandlerOptions.d.ts
|
|
8
|
+
export type TRPCWebSocketHandlerOptions<TRouter extends AnyTRPCRouter> = BaseHandlerOptions<TRouter, IncomingMessage> & Pick<WSSHandlerOptions<TRouter>, "dangerouslyDisablePong" | "experimental_encoder" | "keepAlive" | "prefix"> & {
|
|
9
|
+
createContext: (options: CreateWSSContextFnOptions) => Promisable<inferRouterContext<TRouter>>;
|
|
10
|
+
onClose?: (connection: TRPCWebSocketConnection<inferRouterContext<TRouter>>) => Promisable<void>;
|
|
11
|
+
onOpen?: (connection: TRPCWebSocketConnection<inferRouterContext<TRouter>>) => Promisable<void>;
|
|
12
|
+
};
|
|
13
|
+
//#endregion
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { EventEmitter } from "node:events";
|
|
2
|
+
import { IncomingMessage } from "node:http";
|
|
3
|
+
//#region src/runtime/server/models/WebSocketServerAdapter.d.ts
|
|
4
|
+
export declare class WebSocketServerAdapter<TClient extends EventEmitter> extends EventEmitter {
|
|
5
|
+
readonly clients: Set<TClient>;
|
|
6
|
+
addConnection(client: TClient, request: IncomingMessage): void;
|
|
7
|
+
}
|
|
8
|
+
//#endregion
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { EventEmitter } from "node:events";
|
|
2
|
+
//#region src/runtime/server/models/WebSocketServerAdapter.ts
|
|
3
|
+
var WebSocketServerAdapter = class extends EventEmitter {
|
|
4
|
+
clients = /* @__PURE__ */ new Set();
|
|
5
|
+
addConnection(client, request) {
|
|
6
|
+
this.clients.add(client);
|
|
7
|
+
client.once("close", () => {
|
|
8
|
+
this.clients.delete(client);
|
|
9
|
+
});
|
|
10
|
+
this.emit("connection", client, request);
|
|
11
|
+
}
|
|
12
|
+
};
|
|
13
|
+
//#endregion
|
|
14
|
+
export { WebSocketServerAdapter };
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
//#region src/runtime/server/services/getRequestSignal.ts
|
|
2
|
+
const getRequestSignal = (event) => {
|
|
3
|
+
const abortController = new AbortController();
|
|
4
|
+
const { res } = event.node;
|
|
5
|
+
res.once("close", () => {
|
|
6
|
+
if (!res.writableFinished) abortController.abort();
|
|
7
|
+
});
|
|
8
|
+
return abortController.signal;
|
|
9
|
+
};
|
|
10
|
+
//#endregion
|
|
11
|
+
export { getRequestSignal };
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { IncomingMessage } from "node:http";
|
|
2
|
+
import { Socket } from "node:net";
|
|
3
|
+
//#region 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
|
+
//#endregion
|
|
12
|
+
export { toIncomingMessage };
|