@tthr/vue 0.0.71 → 0.0.76

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/nuxt/module.js CHANGED
@@ -106,15 +106,15 @@ export default defineNuxtModule({
106
106
  },
107
107
  {
108
108
  name: 'registerCronHandler',
109
- from: resolver.resolve('./runtime/server/plugins/cron.js'),
109
+ from: resolver.resolve('./runtime/server/plugins/cron.ts'),
110
110
  },
111
111
  {
112
112
  name: 'unregisterCronHandler',
113
- from: resolver.resolve('./runtime/server/plugins/cron.js'),
113
+ from: resolver.resolve('./runtime/server/plugins/cron.ts'),
114
114
  },
115
115
  {
116
116
  name: 'getCronHandlers',
117
- from: resolver.resolve('./runtime/server/plugins/cron.js'),
117
+ from: resolver.resolve('./runtime/server/plugins/cron.ts'),
118
118
  },
119
119
  ]);
120
120
  // Ensure the runtime files are transpiled
@@ -125,13 +125,16 @@ export default defineNuxtModule({
125
125
  nuxt.hook('nitro:config', (nitroConfig) => {
126
126
  nitroConfig.plugins = nitroConfig.plugins || [];
127
127
  // Use direct path - Nitro will handle the #imports resolution at build time
128
- nitroConfig.plugins.push(resolver.resolve('./runtime/server/plugins/cron.js'));
128
+ nitroConfig.plugins.push(resolver.resolve('./runtime/server/plugins/cron.ts'));
129
129
  // Ensure Nitro inlines and transpiles the plugin from node_modules
130
130
  nitroConfig.externals = nitroConfig.externals || {};
131
131
  nitroConfig.externals.inline = nitroConfig.externals.inline || [];
132
132
  nitroConfig.externals.inline.push('@tthr/vue');
133
133
  // Also inline the user's tether/functions directory so Nitro transpiles TypeScript
134
134
  nitroConfig.externals.inline.push(`${nuxt.options.rootDir}/tether`);
135
+ // Externalize 'ws' so it's not bundled - needed for WebSocket in Node.js
136
+ nitroConfig.externals.external = nitroConfig.externals.external || [];
137
+ nitroConfig.externals.external.push('ws');
135
138
  });
136
139
  },
137
140
  });
package/nuxt/module.ts CHANGED
@@ -127,15 +127,15 @@ export default defineNuxtModule<TetherModuleOptions>({
127
127
  },
128
128
  {
129
129
  name: 'registerCronHandler',
130
- from: resolver.resolve('./runtime/server/plugins/cron.js'),
130
+ from: resolver.resolve('./runtime/server/plugins/cron.ts'),
131
131
  },
132
132
  {
133
133
  name: 'unregisterCronHandler',
134
- from: resolver.resolve('./runtime/server/plugins/cron.js'),
134
+ from: resolver.resolve('./runtime/server/plugins/cron.ts'),
135
135
  },
136
136
  {
137
137
  name: 'getCronHandlers',
138
- from: resolver.resolve('./runtime/server/plugins/cron.js'),
138
+ from: resolver.resolve('./runtime/server/plugins/cron.ts'),
139
139
  },
140
140
  ]);
141
141
 
@@ -148,7 +148,7 @@ export default defineNuxtModule<TetherModuleOptions>({
148
148
  nuxt.hook('nitro:config' as any, (nitroConfig: any) => {
149
149
  nitroConfig.plugins = nitroConfig.plugins || [];
150
150
  // Use direct path - Nitro will handle the #imports resolution at build time
151
- nitroConfig.plugins.push(resolver.resolve('./runtime/server/plugins/cron.js'));
151
+ nitroConfig.plugins.push(resolver.resolve('./runtime/server/plugins/cron.ts'));
152
152
 
153
153
  // Ensure Nitro inlines and transpiles the plugin from node_modules
154
154
  nitroConfig.externals = nitroConfig.externals || {};
@@ -157,6 +157,10 @@ export default defineNuxtModule<TetherModuleOptions>({
157
157
 
158
158
  // Also inline the user's tether/functions directory so Nitro transpiles TypeScript
159
159
  nitroConfig.externals.inline.push(`${nuxt.options.rootDir}/tether`);
160
+
161
+ // Externalize 'ws' so it's not bundled - needed for WebSocket in Node.js
162
+ nitroConfig.externals.external = nitroConfig.externals.external || [];
163
+ nitroConfig.externals.external.push('ws');
160
164
  });
161
165
  },
162
166
  });
@@ -0,0 +1,106 @@
1
+ /**
2
+ * Nuxt composables for Tether
3
+ *
4
+ * These are auto-imported when using the Tether Nuxt module.
5
+ * Queries and mutations are executed server-side to keep API keys secure.
6
+ * WebSocket subscriptions run client-side for realtime updates - automatically!
7
+ */
8
+ import { type Ref, type ComputedRef } from 'vue';
9
+ /**
10
+ * Query state returned by useQuery
11
+ */
12
+ export interface QueryState<T> {
13
+ data: Ref<T | undefined>;
14
+ error: Ref<Error | null>;
15
+ isLoading: ComputedRef<boolean>;
16
+ isConnected: Ref<boolean>;
17
+ refetch: () => Promise<void>;
18
+ }
19
+ /**
20
+ * Query function reference
21
+ */
22
+ export interface QueryFunction<TArgs = void, TResult = unknown> {
23
+ _name: string;
24
+ _args?: TArgs;
25
+ _result?: TResult;
26
+ }
27
+ /**
28
+ * Reactive query composable with automatic realtime updates
29
+ *
30
+ * Uses Nuxt's useAsyncData internally for proper SSR support.
31
+ * Data is fetched on the server and hydrated on the client.
32
+ * Automatically subscribes to WebSocket updates for realtime sync.
33
+ *
34
+ * @example
35
+ * ```vue
36
+ * <script setup>
37
+ * // That's it! Data automatically updates when it changes anywhere
38
+ * const { data: posts, isLoading, isConnected } = useQuery(api.posts.list);
39
+ * </script>
40
+ * ```
41
+ */
42
+ export declare function useQuery<TArgs, TResult>(query: QueryFunction<TArgs, TResult> | string, args?: TArgs): QueryState<TResult>;
43
+ /**
44
+ * Mutation state returned by useMutation
45
+ */
46
+ export interface MutationState<TArgs, TResult> {
47
+ data: Ref<TResult | undefined>;
48
+ error: Ref<Error | null>;
49
+ isPending: Ref<boolean>;
50
+ mutate: (args: TArgs) => Promise<TResult>;
51
+ reset: () => void;
52
+ }
53
+ /**
54
+ * Mutation function reference
55
+ */
56
+ export interface MutationFunction<TArgs = void, TResult = unknown> {
57
+ _name: string;
58
+ _args?: TArgs;
59
+ _result?: TResult;
60
+ }
61
+ /**
62
+ * Mutation composable
63
+ *
64
+ * @example
65
+ * ```vue
66
+ * <script setup>
67
+ * const { mutate: createPost, isPending } = useMutation(api.posts.create);
68
+ *
69
+ * async function handleSubmit() {
70
+ * await createPost({ title: 'Hello', content: '...' });
71
+ * // All useQuery subscribers automatically update!
72
+ * }
73
+ * </script>
74
+ * ```
75
+ */
76
+ export declare function useMutation<TArgs, TResult>(mutation: MutationFunction<TArgs, TResult> | string): MutationState<TArgs, TResult>;
77
+ /**
78
+ * Subscription handler options
79
+ */
80
+ export interface SubscriptionHandlers {
81
+ /** Called when fresh data is received from the server */
82
+ onData?: (data: unknown) => void;
83
+ /** Called when server invalidates the subscription (signals to refetch) */
84
+ onInvalidate?: () => void;
85
+ }
86
+ /**
87
+ * Manual WebSocket subscription composable
88
+ *
89
+ * NOTE: You typically don't need this! useQuery automatically subscribes to updates.
90
+ * This is only for advanced use cases where you need custom subscription handling.
91
+ *
92
+ * @example
93
+ * ```vue
94
+ * <script setup>
95
+ * // For custom subscription handling (rare)
96
+ * const { isConnected } = useTetherSubscription('custom.query', {}, {
97
+ * onData: (data) => console.log('Got data:', data),
98
+ * onInvalidate: () => console.log('Data invalidated'),
99
+ * });
100
+ * </script>
101
+ * ```
102
+ */
103
+ export declare function useTetherSubscription(queryName: string, args: Record<string, unknown> | undefined, handlers: SubscriptionHandlers | ((data?: unknown) => void)): {
104
+ isConnected: Ref<boolean>;
105
+ };
106
+ //# sourceMappingURL=composables.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"composables.d.ts","sourceRoot":"","sources":["composables.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAA+B,KAAK,GAAG,EAAE,MAAM,KAAK,CAAC;AAE5D;;GAEG;AACH,MAAM,WAAW,UAAU,CAAC,CAAC;IAC3B,IAAI,EAAE,GAAG,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC;IACzB,KAAK,EAAE,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC;IACzB,SAAS,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;IACxB,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7B,kEAAkE;IAClE,OAAO,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,IAAI,CAAC;CAC/B;AAED;;GAEG;AACH,MAAM,WAAW,aAAa,CAAC,KAAK,GAAG,IAAI,EAAE,OAAO,GAAG,OAAO;IAC5D,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED;;;;;;;;;GASG;AACH,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,EACrC,KAAK,EAAE,aAAa,CAAC,KAAK,EAAE,OAAO,CAAC,GAAG,MAAM,EAC7C,IAAI,CAAC,EAAE,KAAK,GACX,UAAU,CAAC,OAAO,CAAC,CAiDrB;AAED;;GAEG;AACH,MAAM,WAAW,aAAa,CAAC,KAAK,EAAE,OAAO;IAC3C,IAAI,EAAE,GAAG,CAAC,OAAO,GAAG,SAAS,CAAC,CAAC;IAC/B,KAAK,EAAE,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC;IACzB,SAAS,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;IACxB,MAAM,EAAE,CAAC,IAAI,EAAE,KAAK,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAC1C,KAAK,EAAE,MAAM,IAAI,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB,CAAC,KAAK,GAAG,IAAI,EAAE,OAAO,GAAG,OAAO;IAC/D,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,EACxC,QAAQ,EAAE,gBAAgB,CAAC,KAAK,EAAE,OAAO,CAAC,GAAG,MAAM,GAClD,aAAa,CAAC,KAAK,EAAE,OAAO,CAAC,CA0C/B;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,qBAAqB,CACnC,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,EACzC,QAAQ,EAAE,CAAC,IAAI,CAAC,EAAE,OAAO,KAAK,IAAI,GACjC;IAAE,WAAW,EAAE,GAAG,CAAC,OAAO,CAAC,CAAA;CAAE,CA4J/B"}
1
+ {"version":3,"file":"composables.d.ts","sourceRoot":"","sources":["composables.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAyC,KAAK,GAAG,EAAE,KAAK,WAAW,EAAE,MAAM,KAAK,CAAC;AA2NxF;;GAEG;AACH,MAAM,WAAW,UAAU,CAAC,CAAC;IAC3B,IAAI,EAAE,GAAG,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC;IACzB,KAAK,EAAE,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC;IACzB,SAAS,EAAE,WAAW,CAAC,OAAO,CAAC,CAAC;IAChC,WAAW,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;IAC1B,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9B;AAED;;GAEG;AACH,MAAM,WAAW,aAAa,CAAC,KAAK,GAAG,IAAI,EAAE,OAAO,GAAG,OAAO;IAC5D,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,EACrC,KAAK,EAAE,aAAa,CAAC,KAAK,EAAE,OAAO,CAAC,GAAG,MAAM,EAC7C,IAAI,CAAC,EAAE,KAAK,GACX,UAAU,CAAC,OAAO,CAAC,CAkFrB;AAMD;;GAEG;AACH,MAAM,WAAW,aAAa,CAAC,KAAK,EAAE,OAAO;IAC3C,IAAI,EAAE,GAAG,CAAC,OAAO,GAAG,SAAS,CAAC,CAAC;IAC/B,KAAK,EAAE,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC;IACzB,SAAS,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;IACxB,MAAM,EAAE,CAAC,IAAI,EAAE,KAAK,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAC1C,KAAK,EAAE,MAAM,IAAI,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB,CAAC,KAAK,GAAG,IAAI,EAAE,OAAO,GAAG,OAAO;IAC/D,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,EACxC,QAAQ,EAAE,gBAAgB,CAAC,KAAK,EAAE,OAAO,CAAC,GAAG,MAAM,GAClD,aAAa,CAAC,KAAK,EAAE,OAAO,CAAC,CA0C/B;AAMD;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,yDAAyD;IACzD,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IACjC,2EAA2E;IAC3E,YAAY,CAAC,EAAE,MAAM,IAAI,CAAC;CAC3B;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,qBAAqB,CACnC,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,EACzC,QAAQ,EAAE,oBAAoB,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC,GAC1D;IAAE,WAAW,EAAE,GAAG,CAAC,OAAO,CAAC,CAAA;CAAE,CAoC/B"}
@@ -0,0 +1,370 @@
1
+ /**
2
+ * Nuxt composables for Tether
3
+ *
4
+ * These are auto-imported when using the Tether Nuxt module.
5
+ * Queries and mutations are executed server-side to keep API keys secure.
6
+ * WebSocket subscriptions run client-side for realtime updates - automatically!
7
+ */
8
+ import { ref, onMounted, onUnmounted, computed } from 'vue';
9
+ import { useAsyncData } from '#imports';
10
+ // Singleton connection manager (client-side only)
11
+ let connectionManager = null;
12
+ function getConnectionManager() {
13
+ if (!connectionManager) {
14
+ connectionManager = {
15
+ ws: null,
16
+ subscriptions: new Map(),
17
+ isConnecting: false,
18
+ reconnectTimeout: null,
19
+ heartbeatInterval: null,
20
+ heartbeatTimeout: null,
21
+ awaitingPong: false,
22
+ refCount: 0,
23
+ };
24
+ }
25
+ return connectionManager;
26
+ }
27
+ const HEARTBEAT_INTERVAL = 25000;
28
+ const HEARTBEAT_TIMEOUT = 15000;
29
+ function startHeartbeat(cm) {
30
+ stopHeartbeat(cm);
31
+ cm.heartbeatInterval = setInterval(() => {
32
+ if (cm.ws?.readyState === WebSocket.OPEN) {
33
+ cm.awaitingPong = true;
34
+ cm.ws.send(JSON.stringify({ type: 'ping' }));
35
+ cm.heartbeatTimeout = setTimeout(() => {
36
+ if (cm.awaitingPong) {
37
+ console.warn('[Tether] Heartbeat timeout - forcing reconnect');
38
+ cm.ws?.close();
39
+ }
40
+ }, HEARTBEAT_TIMEOUT);
41
+ }
42
+ }, HEARTBEAT_INTERVAL);
43
+ }
44
+ function stopHeartbeat(cm) {
45
+ if (cm.heartbeatInterval) {
46
+ clearInterval(cm.heartbeatInterval);
47
+ cm.heartbeatInterval = null;
48
+ }
49
+ if (cm.heartbeatTimeout) {
50
+ clearTimeout(cm.heartbeatTimeout);
51
+ cm.heartbeatTimeout = null;
52
+ }
53
+ cm.awaitingPong = false;
54
+ }
55
+ function connectWebSocket(cm) {
56
+ if (cm.isConnecting)
57
+ return;
58
+ if (cm.ws && (cm.ws.readyState === WebSocket.OPEN || cm.ws.readyState === WebSocket.CONNECTING)) {
59
+ return;
60
+ }
61
+ const config = window.__TETHER_CONFIG__;
62
+ if (!config?.wsUrl || !config?.projectId) {
63
+ console.warn('[Tether] WebSocket config not available');
64
+ return;
65
+ }
66
+ cm.isConnecting = true;
67
+ const wsUrl = `${config.wsUrl}/ws/${config.projectId}`;
68
+ cm.ws = new WebSocket(wsUrl);
69
+ cm.ws.onopen = () => {
70
+ cm.isConnecting = false;
71
+ };
72
+ cm.ws.onmessage = (event) => {
73
+ try {
74
+ const message = JSON.parse(event.data);
75
+ if (message.type === 'connected') {
76
+ startHeartbeat(cm);
77
+ // Re-subscribe all active subscriptions
78
+ for (const [subscriptionId, _callback] of cm.subscriptions) {
79
+ const [queryName, argsJson] = subscriptionId.split('::');
80
+ const args = argsJson ? JSON.parse(argsJson) : undefined;
81
+ cm.ws?.send(JSON.stringify({
82
+ type: 'subscribe',
83
+ id: subscriptionId,
84
+ query: queryName,
85
+ args,
86
+ }));
87
+ }
88
+ }
89
+ else if (message.type === 'data') {
90
+ const callback = cm.subscriptions.get(message.id);
91
+ if (callback) {
92
+ callback.onData(message.data);
93
+ }
94
+ }
95
+ else if (message.type === 'invalidate') {
96
+ const callback = cm.subscriptions.get(message.id);
97
+ if (callback) {
98
+ callback.onInvalidate();
99
+ }
100
+ }
101
+ else if (message.type === 'pong') {
102
+ cm.awaitingPong = false;
103
+ if (cm.heartbeatTimeout) {
104
+ clearTimeout(cm.heartbeatTimeout);
105
+ cm.heartbeatTimeout = null;
106
+ }
107
+ }
108
+ }
109
+ catch {
110
+ // Ignore parse errors
111
+ }
112
+ };
113
+ cm.ws.onclose = () => {
114
+ cm.isConnecting = false;
115
+ stopHeartbeat(cm);
116
+ // Reconnect if there are still active subscriptions
117
+ if (cm.subscriptions.size > 0) {
118
+ cm.reconnectTimeout = setTimeout(() => connectWebSocket(cm), 3000);
119
+ }
120
+ };
121
+ cm.ws.onerror = () => {
122
+ cm.isConnecting = false;
123
+ cm.ws?.close();
124
+ };
125
+ }
126
+ function subscribe(queryName, args, callbacks) {
127
+ const cm = getConnectionManager();
128
+ const subscriptionId = `${queryName}::${JSON.stringify(args ?? {})}`;
129
+ cm.subscriptions.set(subscriptionId, callbacks);
130
+ cm.refCount++;
131
+ // Connect if not already connected
132
+ if (!cm.ws || cm.ws.readyState === WebSocket.CLOSED) {
133
+ connectWebSocket(cm);
134
+ }
135
+ else if (cm.ws.readyState === WebSocket.OPEN) {
136
+ // Already connected - subscribe immediately
137
+ cm.ws.send(JSON.stringify({
138
+ type: 'subscribe',
139
+ id: subscriptionId,
140
+ query: queryName,
141
+ args,
142
+ }));
143
+ }
144
+ // Return cleanup function
145
+ return () => {
146
+ cm.subscriptions.delete(subscriptionId);
147
+ cm.refCount--;
148
+ // Unsubscribe from server
149
+ if (cm.ws?.readyState === WebSocket.OPEN) {
150
+ cm.ws.send(JSON.stringify({
151
+ type: 'unsubscribe',
152
+ id: subscriptionId,
153
+ }));
154
+ }
155
+ // Close connection if no more subscriptions
156
+ if (cm.refCount === 0) {
157
+ if (cm.reconnectTimeout) {
158
+ clearTimeout(cm.reconnectTimeout);
159
+ cm.reconnectTimeout = null;
160
+ }
161
+ stopHeartbeat(cm);
162
+ cm.ws?.close();
163
+ cm.ws = null;
164
+ }
165
+ };
166
+ }
167
+ // Handle visibility changes globally
168
+ if (typeof window !== 'undefined') {
169
+ document.addEventListener('visibilitychange', () => {
170
+ if (document.visibilityState === 'visible') {
171
+ const cm = connectionManager;
172
+ if (cm && cm.subscriptions.size > 0) {
173
+ if (!cm.ws || cm.ws.readyState === WebSocket.CLOSED) {
174
+ if (cm.reconnectTimeout) {
175
+ clearTimeout(cm.reconnectTimeout);
176
+ cm.reconnectTimeout = null;
177
+ }
178
+ connectWebSocket(cm);
179
+ }
180
+ }
181
+ }
182
+ });
183
+ }
184
+ /**
185
+ * Reactive query composable with automatic realtime updates
186
+ *
187
+ * Uses Nuxt's useAsyncData internally for proper SSR support.
188
+ * Data is fetched on the server and hydrated on the client.
189
+ * Automatically subscribes to WebSocket updates for realtime sync.
190
+ *
191
+ * @example
192
+ * ```vue
193
+ * <script setup>
194
+ * // That's it! Data automatically updates when it changes anywhere
195
+ * const { data: posts, isLoading, isConnected } = useQuery(api.posts.list);
196
+ * </script>
197
+ * ```
198
+ */
199
+ export function useQuery(query, args) {
200
+ const queryName = typeof query === 'string' ? query : query._name;
201
+ const queryArgs = args;
202
+ // Create a unique key for this query based on name and args
203
+ const queryKey = `tether-${queryName}-${JSON.stringify(args ?? {})}`;
204
+ // Track WebSocket connection state
205
+ const isConnected = ref(false);
206
+ // Use Nuxt's useAsyncData for proper SSR support
207
+ const { data, error: asyncError, status, refresh } = useAsyncData(queryKey, async () => {
208
+ const response = await $fetch('/api/_tether/query', {
209
+ method: 'POST',
210
+ body: {
211
+ function: queryName,
212
+ args,
213
+ },
214
+ });
215
+ return response.data;
216
+ }, {
217
+ dedupe: 'cancel',
218
+ });
219
+ // Wrap the error as a computed ref
220
+ const error = computed(() => {
221
+ if (asyncError.value) {
222
+ return asyncError.value instanceof Error
223
+ ? asyncError.value
224
+ : new Error(String(asyncError.value));
225
+ }
226
+ return null;
227
+ });
228
+ // Compute isLoading from status
229
+ const isLoading = computed(() => status.value === 'pending');
230
+ // Refetch function
231
+ const refetch = async () => {
232
+ await refresh();
233
+ };
234
+ // Auto-subscribe on client side
235
+ if (import.meta.client) {
236
+ let unsubscribe = null;
237
+ onMounted(() => {
238
+ unsubscribe = subscribe(queryName, queryArgs, {
239
+ onData: (newData) => {
240
+ data.value = newData;
241
+ },
242
+ onInvalidate: () => {
243
+ refresh();
244
+ },
245
+ });
246
+ // Track connection state
247
+ const checkConnection = () => {
248
+ const cm = connectionManager;
249
+ isConnected.value = cm?.ws?.readyState === WebSocket.OPEN ?? false;
250
+ };
251
+ checkConnection();
252
+ const interval = setInterval(checkConnection, 1000);
253
+ onUnmounted(() => clearInterval(interval));
254
+ });
255
+ onUnmounted(() => {
256
+ unsubscribe?.();
257
+ });
258
+ }
259
+ return {
260
+ data: data,
261
+ error: error,
262
+ isLoading,
263
+ isConnected,
264
+ refetch,
265
+ };
266
+ }
267
+ /**
268
+ * Mutation composable
269
+ *
270
+ * @example
271
+ * ```vue
272
+ * <script setup>
273
+ * const { mutate: createPost, isPending } = useMutation(api.posts.create);
274
+ *
275
+ * async function handleSubmit() {
276
+ * await createPost({ title: 'Hello', content: '...' });
277
+ * // All useQuery subscribers automatically update!
278
+ * }
279
+ * </script>
280
+ * ```
281
+ */
282
+ export function useMutation(mutation) {
283
+ const mutationName = typeof mutation === 'string' ? mutation : mutation._name;
284
+ const data = ref();
285
+ const error = ref(null);
286
+ const isPending = ref(false);
287
+ const mutate = async (args) => {
288
+ try {
289
+ isPending.value = true;
290
+ error.value = null;
291
+ const response = await $fetch('/api/_tether/mutation', {
292
+ method: 'POST',
293
+ body: {
294
+ function: mutationName,
295
+ args,
296
+ },
297
+ });
298
+ data.value = response.data;
299
+ return response.data;
300
+ }
301
+ catch (e) {
302
+ error.value = e instanceof Error ? e : new Error(String(e));
303
+ throw e;
304
+ }
305
+ finally {
306
+ isPending.value = false;
307
+ }
308
+ };
309
+ const reset = () => {
310
+ data.value = undefined;
311
+ error.value = null;
312
+ isPending.value = false;
313
+ };
314
+ return {
315
+ data: data,
316
+ error,
317
+ isPending,
318
+ mutate,
319
+ reset,
320
+ };
321
+ }
322
+ /**
323
+ * Manual WebSocket subscription composable
324
+ *
325
+ * NOTE: You typically don't need this! useQuery automatically subscribes to updates.
326
+ * This is only for advanced use cases where you need custom subscription handling.
327
+ *
328
+ * @example
329
+ * ```vue
330
+ * <script setup>
331
+ * // For custom subscription handling (rare)
332
+ * const { isConnected } = useTetherSubscription('custom.query', {}, {
333
+ * onData: (data) => console.log('Got data:', data),
334
+ * onInvalidate: () => console.log('Data invalidated'),
335
+ * });
336
+ * </script>
337
+ * ```
338
+ */
339
+ export function useTetherSubscription(queryName, args, handlers) {
340
+ const isConnected = ref(false);
341
+ // Normalize handlers
342
+ const onData = typeof handlers === 'function'
343
+ ? handlers
344
+ : handlers.onData ?? (() => { });
345
+ const onInvalidate = typeof handlers === 'function'
346
+ ? () => handlers(undefined)
347
+ : handlers.onInvalidate ?? (() => { });
348
+ if (import.meta.client) {
349
+ let unsubscribe = null;
350
+ onMounted(() => {
351
+ unsubscribe = subscribe(queryName, args, {
352
+ onData,
353
+ onInvalidate,
354
+ });
355
+ // Track connection state
356
+ const checkConnection = () => {
357
+ const cm = connectionManager;
358
+ isConnected.value = cm?.ws?.readyState === WebSocket.OPEN ?? false;
359
+ };
360
+ checkConnection();
361
+ const interval = setInterval(checkConnection, 1000);
362
+ onUnmounted(() => clearInterval(interval));
363
+ });
364
+ onUnmounted(() => {
365
+ unsubscribe?.();
366
+ });
367
+ }
368
+ return { isConnected };
369
+ }
370
+ //# sourceMappingURL=composables.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"composables.js","sourceRoot":"","sources":["composables.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"composables.js","sourceRoot":"","sources":["composables.ts"],"names":[],"mappings":"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"}