@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 +7 -4
- package/nuxt/module.ts +8 -4
- package/nuxt/runtime/composables.d.ts +106 -0
- package/nuxt/runtime/composables.d.ts.map +1 -1
- package/nuxt/runtime/composables.js +370 -0
- package/nuxt/runtime/composables.js.map +1 -1
- package/nuxt/runtime/composables.ts +506 -0
- package/nuxt/runtime/plugin.client.ts +34 -0
- package/nuxt/runtime/server/plugins/cron.d.ts.map +1 -1
- package/nuxt/runtime/server/plugins/cron.js +28 -12
- package/nuxt/runtime/server/plugins/cron.js.map +1 -1
- package/nuxt/runtime/server/plugins/cron.ts +377 -0
- package/package.json +2 -1
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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,
|
|
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":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,GAAG,EAAE,SAAS,EAAE,WAAW,EAAE,QAAQ,EAA8B,MAAM,KAAK,CAAC;AACxF,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAsBxC,kDAAkD;AAClD,IAAI,iBAAiB,GAA6B,IAAI,CAAC;AAEvD,SAAS,oBAAoB;IAC3B,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACvB,iBAAiB,GAAG;YAClB,EAAE,EAAE,IAAI;YACR,aAAa,EAAE,IAAI,GAAG,EAAE;YACxB,YAAY,EAAE,KAAK;YACnB,gBAAgB,EAAE,IAAI;YACtB,iBAAiB,EAAE,IAAI;YACvB,gBAAgB,EAAE,IAAI;YACtB,YAAY,EAAE,KAAK;YACnB,QAAQ,EAAE,CAAC;SACZ,CAAC;IACJ,CAAC;IACD,OAAO,iBAAiB,CAAC;AAC3B,CAAC;AAED,MAAM,kBAAkB,GAAG,KAAK,CAAC;AACjC,MAAM,iBAAiB,GAAG,KAAK,CAAC;AAEhC,SAAS,cAAc,CAAC,EAAqB;IAC3C,aAAa,CAAC,EAAE,CAAC,CAAC;IAClB,EAAE,CAAC,iBAAiB,GAAG,WAAW,CAAC,GAAG,EAAE;QACtC,IAAI,EAAE,CAAC,EAAE,EAAE,UAAU,KAAK,SAAS,CAAC,IAAI,EAAE,CAAC;YACzC,EAAE,CAAC,YAAY,GAAG,IAAI,CAAC;YACvB,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;YAC7C,EAAE,CAAC,gBAAgB,GAAG,UAAU,CAAC,GAAG,EAAE;gBACpC,IAAI,EAAE,CAAC,YAAY,EAAE,CAAC;oBACpB,OAAO,CAAC,IAAI,CAAC,gDAAgD,CAAC,CAAC;oBAC/D,EAAE,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC;gBACjB,CAAC;YACH,CAAC,EAAE,iBAAiB,CAAC,CAAC;QACxB,CAAC;IACH,CAAC,EAAE,kBAAkB,CAAC,CAAC;AACzB,CAAC;AAED,SAAS,aAAa,CAAC,EAAqB;IAC1C,IAAI,EAAE,CAAC,iBAAiB,EAAE,CAAC;QACzB,aAAa,CAAC,EAAE,CAAC,iBAAiB,CAAC,CAAC;QACpC,EAAE,CAAC,iBAAiB,GAAG,IAAI,CAAC;IAC9B,CAAC;IACD,IAAI,EAAE,CAAC,gBAAgB,EAAE,CAAC;QACxB,YAAY,CAAC,EAAE,CAAC,gBAAgB,CAAC,CAAC;QAClC,EAAE,CAAC,gBAAgB,GAAG,IAAI,CAAC;IAC7B,CAAC;IACD,EAAE,CAAC,YAAY,GAAG,KAAK,CAAC;AAC1B,CAAC;AAED,SAAS,gBAAgB,CAAC,EAAqB;IAC7C,IAAI,EAAE,CAAC,YAAY;QAAE,OAAO;IAC5B,IAAI,EAAE,CAAC,EAAE,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,UAAU,KAAK,SAAS,CAAC,IAAI,IAAI,EAAE,CAAC,EAAE,CAAC,UAAU,KAAK,SAAS,CAAC,UAAU,CAAC,EAAE,CAAC;QAChG,OAAO;IACT,CAAC;IAED,MAAM,MAAM,GAAI,MAAc,CAAC,iBAAiB,CAAC;IACjD,IAAI,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE,CAAC;QACzC,OAAO,CAAC,IAAI,CAAC,yCAAyC,CAAC,CAAC;QACxD,OAAO;IACT,CAAC;IAED,EAAE,CAAC,YAAY,GAAG,IAAI,CAAC;IACvB,MAAM,KAAK,GAAG,GAAG,MAAM,CAAC,KAAK,OAAO,MAAM,CAAC,SAAS,EAAE,CAAC;IACvD,EAAE,CAAC,EAAE,GAAG,IAAI,SAAS,CAAC,KAAK,CAAC,CAAC;IAE7B,EAAE,CAAC,EAAE,CAAC,MAAM,GAAG,GAAG,EAAE;QAClB,EAAE,CAAC,YAAY,GAAG,KAAK,CAAC;IAC1B,CAAC,CAAC;IAEF,EAAE,CAAC,EAAE,CAAC,SAAS,GAAG,CAAC,KAAK,EAAE,EAAE;QAC1B,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAEvC,IAAI,OAAO,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;gBACjC,cAAc,CAAC,EAAE,CAAC,CAAC;gBACnB,wCAAwC;gBACxC,KAAK,MAAM,CAAC,cAAc,EAAE,SAAS,CAAC,IAAI,EAAE,CAAC,aAAa,EAAE,CAAC;oBAC3D,MAAM,CAAC,SAAS,EAAE,QAAQ,CAAC,GAAG,cAAc,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;oBACzD,MAAM,IAAI,GAAG,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;oBACzD,EAAE,CAAC,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC;wBACzB,IAAI,EAAE,WAAW;wBACjB,EAAE,EAAE,cAAc;wBAClB,KAAK,EAAE,SAAS;wBAChB,IAAI;qBACL,CAAC,CAAC,CAAC;gBACN,CAAC;YACH,CAAC;iBAAM,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;gBACnC,MAAM,QAAQ,GAAG,EAAE,CAAC,aAAa,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;gBAClD,IAAI,QAAQ,EAAE,CAAC;oBACb,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;gBAChC,CAAC;YACH,CAAC;iBAAM,IAAI,OAAO,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;gBACzC,MAAM,QAAQ,GAAG,EAAE,CAAC,aAAa,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;gBAClD,IAAI,QAAQ,EAAE,CAAC;oBACb,QAAQ,CAAC,YAAY,EAAE,CAAC;gBAC1B,CAAC;YACH,CAAC;iBAAM,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;gBACnC,EAAE,CAAC,YAAY,GAAG,KAAK,CAAC;gBACxB,IAAI,EAAE,CAAC,gBAAgB,EAAE,CAAC;oBACxB,YAAY,CAAC,EAAE,CAAC,gBAAgB,CAAC,CAAC;oBAClC,EAAE,CAAC,gBAAgB,GAAG,IAAI,CAAC;gBAC7B,CAAC;YACH,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,sBAAsB;QACxB,CAAC;IACH,CAAC,CAAC;IAEF,EAAE,CAAC,EAAE,CAAC,OAAO,GAAG,GAAG,EAAE;QACnB,EAAE,CAAC,YAAY,GAAG,KAAK,CAAC;QACxB,aAAa,CAAC,EAAE,CAAC,CAAC;QAClB,oDAAoD;QACpD,IAAI,EAAE,CAAC,aAAa,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;YAC9B,EAAE,CAAC,gBAAgB,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,gBAAgB,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;QACrE,CAAC;IACH,CAAC,CAAC;IAEF,EAAE,CAAC,EAAE,CAAC,OAAO,GAAG,GAAG,EAAE;QACnB,EAAE,CAAC,YAAY,GAAG,KAAK,CAAC;QACxB,EAAE,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC;IACjB,CAAC,CAAC;AACJ,CAAC;AAED,SAAS,SAAS,CAChB,SAAiB,EACjB,IAAyC,EACzC,SAA+B;IAE/B,MAAM,EAAE,GAAG,oBAAoB,EAAE,CAAC;IAClC,MAAM,cAAc,GAAG,GAAG,SAAS,KAAK,IAAI,CAAC,SAAS,CAAC,IAAI,IAAI,EAAE,CAAC,EAAE,CAAC;IAErE,EAAE,CAAC,aAAa,CAAC,GAAG,CAAC,cAAc,EAAE,SAAS,CAAC,CAAC;IAChD,EAAE,CAAC,QAAQ,EAAE,CAAC;IAEd,mCAAmC;IACnC,IAAI,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,UAAU,KAAK,SAAS,CAAC,MAAM,EAAE,CAAC;QACpD,gBAAgB,CAAC,EAAE,CAAC,CAAC;IACvB,CAAC;SAAM,IAAI,EAAE,CAAC,EAAE,CAAC,UAAU,KAAK,SAAS,CAAC,IAAI,EAAE,CAAC;QAC/C,4CAA4C;QAC5C,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC;YACxB,IAAI,EAAE,WAAW;YACjB,EAAE,EAAE,cAAc;YAClB,KAAK,EAAE,SAAS;YAChB,IAAI;SACL,CAAC,CAAC,CAAC;IACN,CAAC;IAED,0BAA0B;IAC1B,OAAO,GAAG,EAAE;QACV,EAAE,CAAC,aAAa,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;QACxC,EAAE,CAAC,QAAQ,EAAE,CAAC;QAEd,0BAA0B;QAC1B,IAAI,EAAE,CAAC,EAAE,EAAE,UAAU,KAAK,SAAS,CAAC,IAAI,EAAE,CAAC;YACzC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC;gBACxB,IAAI,EAAE,aAAa;gBACnB,EAAE,EAAE,cAAc;aACnB,CAAC,CAAC,CAAC;QACN,CAAC;QAED,4CAA4C;QAC5C,IAAI,EAAE,CAAC,QAAQ,KAAK,CAAC,EAAE,CAAC;YACtB,IAAI,EAAE,CAAC,gBAAgB,EAAE,CAAC;gBACxB,YAAY,CAAC,EAAE,CAAC,gBAAgB,CAAC,CAAC;gBAClC,EAAE,CAAC,gBAAgB,GAAG,IAAI,CAAC;YAC7B,CAAC;YACD,aAAa,CAAC,EAAE,CAAC,CAAC;YAClB,EAAE,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC;YACf,EAAE,CAAC,EAAE,GAAG,IAAI,CAAC;QACf,CAAC;IACH,CAAC,CAAC;AACJ,CAAC;AAED,qCAAqC;AACrC,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE,CAAC;IAClC,QAAQ,CAAC,gBAAgB,CAAC,kBAAkB,EAAE,GAAG,EAAE;QACjD,IAAI,QAAQ,CAAC,eAAe,KAAK,SAAS,EAAE,CAAC;YAC3C,MAAM,EAAE,GAAG,iBAAiB,CAAC;YAC7B,IAAI,EAAE,IAAI,EAAE,CAAC,aAAa,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;gBACpC,IAAI,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,UAAU,KAAK,SAAS,CAAC,MAAM,EAAE,CAAC;oBACpD,IAAI,EAAE,CAAC,gBAAgB,EAAE,CAAC;wBACxB,YAAY,CAAC,EAAE,CAAC,gBAAgB,CAAC,CAAC;wBAClC,EAAE,CAAC,gBAAgB,GAAG,IAAI,CAAC;oBAC7B,CAAC;oBACD,gBAAgB,CAAC,EAAE,CAAC,CAAC;gBACvB,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC;AA0BD;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,QAAQ,CACtB,KAA6C,EAC7C,IAAY;IAEZ,MAAM,SAAS,GAAG,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC;IAClE,MAAM,SAAS,GAAG,IAA2C,CAAC;IAE9D,4DAA4D;IAC5D,MAAM,QAAQ,GAAG,UAAU,SAAS,IAAI,IAAI,CAAC,SAAS,CAAC,IAAI,IAAI,EAAE,CAAC,EAAE,CAAC;IAErE,mCAAmC;IACnC,MAAM,WAAW,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC;IAE/B,iDAAiD;IACjD,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,YAAY,CAC/D,QAAQ,EACR,KAAK,IAAI,EAAE;QACT,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAoB,oBAAoB,EAAE;YACrE,MAAM,EAAE,MAAM;YACd,IAAI,EAAE;gBACJ,QAAQ,EAAE,SAAS;gBACnB,IAAI;aACL;SACF,CAAC,CAAC;QACH,OAAO,QAAQ,CAAC,IAAI,CAAC;IACvB,CAAC,EACD;QACE,MAAM,EAAE,QAAQ;KACjB,CACF,CAAC;IAEF,mCAAmC;IACnC,MAAM,KAAK,GAAG,QAAQ,CAAC,GAAG,EAAE;QAC1B,IAAI,UAAU,CAAC,KAAK,EAAE,CAAC;YACrB,OAAO,UAAU,CAAC,KAAK,YAAY,KAAK;gBACtC,CAAC,CAAC,UAAU,CAAC,KAAK;gBAClB,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC;QAC1C,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC,CAAC,CAAC;IAEH,gCAAgC;IAChC,MAAM,SAAS,GAAG,QAAQ,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC;IAE7D,mBAAmB;IACnB,MAAM,OAAO,GAAG,KAAK,IAAI,EAAE;QACzB,MAAM,OAAO,EAAE,CAAC;IAClB,CAAC,CAAC;IAEF,gCAAgC;IAChC,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;QACvB,IAAI,WAAW,GAAwB,IAAI,CAAC;QAE5C,SAAS,CAAC,GAAG,EAAE;YACb,WAAW,GAAG,SAAS,CAAC,SAAS,EAAE,SAAS,EAAE;gBAC5C,MAAM,EAAE,CAAC,OAAO,EAAE,EAAE;oBAClB,IAAI,CAAC,KAAK,GAAG,OAAkB,CAAC;gBAClC,CAAC;gBACD,YAAY,EAAE,GAAG,EAAE;oBACjB,OAAO,EAAE,CAAC;gBACZ,CAAC;aACF,CAAC,CAAC;YAEH,yBAAyB;YACzB,MAAM,eAAe,GAAG,GAAG,EAAE;gBAC3B,MAAM,EAAE,GAAG,iBAAiB,CAAC;gBAC7B,WAAW,CAAC,KAAK,GAAG,EAAE,EAAE,EAAE,EAAE,UAAU,KAAK,SAAS,CAAC,IAAI,IAAI,KAAK,CAAC;YACrE,CAAC,CAAC;YACF,eAAe,EAAE,CAAC;YAClB,MAAM,QAAQ,GAAG,WAAW,CAAC,eAAe,EAAE,IAAI,CAAC,CAAC;YACpD,WAAW,CAAC,GAAG,EAAE,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC;QAC7C,CAAC,CAAC,CAAC;QAEH,WAAW,CAAC,GAAG,EAAE;YACf,WAAW,EAAE,EAAE,CAAC;QAClB,CAAC,CAAC,CAAC;IACL,CAAC;IAED,OAAO;QACL,IAAI,EAAE,IAAgC;QACtC,KAAK,EAAE,KAAqC;QAC5C,SAAS;QACT,WAAW;QACX,OAAO;KACR,CAAC;AACJ,CAAC;AA0BD;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,WAAW,CACzB,QAAmD;IAEnD,MAAM,YAAY,GAAG,OAAO,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC;IAC9E,MAAM,IAAI,GAAG,GAAG,EAAW,CAAC;IAC5B,MAAM,KAAK,GAAG,GAAG,CAAe,IAAI,CAAC,CAAC;IACtC,MAAM,SAAS,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC;IAE7B,MAAM,MAAM,GAAG,KAAK,EAAE,IAAW,EAAoB,EAAE;QACrD,IAAI,CAAC;YACH,SAAS,CAAC,KAAK,GAAG,IAAI,CAAC;YACvB,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC;YAEnB,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAoB,uBAAuB,EAAE;gBACxE,MAAM,EAAE,MAAM;gBACd,IAAI,EAAE;oBACJ,QAAQ,EAAE,YAAY;oBACtB,IAAI;iBACL;aACF,CAAC,CAAC;YAEH,IAAI,CAAC,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC;YAC3B,OAAO,QAAQ,CAAC,IAAI,CAAC;QACvB,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,KAAK,CAAC,KAAK,GAAG,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;YAC5D,MAAM,CAAC,CAAC;QACV,CAAC;gBAAS,CAAC;YACT,SAAS,CAAC,KAAK,GAAG,KAAK,CAAC;QAC1B,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,KAAK,GAAG,GAAG,EAAE;QACjB,IAAI,CAAC,KAAK,GAAG,SAAS,CAAC;QACvB,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC;QACnB,SAAS,CAAC,KAAK,GAAG,KAAK,CAAC;IAC1B,CAAC,CAAC;IAEF,OAAO;QACL,IAAI,EAAE,IAAgC;QACtC,KAAK;QACL,SAAS;QACT,MAAM;QACN,KAAK;KACN,CAAC;AACJ,CAAC;AAgBD;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,UAAU,qBAAqB,CACnC,SAAiB,EACjB,IAAyC,EACzC,QAA2D;IAE3D,MAAM,WAAW,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC;IAE/B,qBAAqB;IACrB,MAAM,MAAM,GAAG,OAAO,QAAQ,KAAK,UAAU;QAC3C,CAAC,CAAC,QAAQ;QACV,CAAC,CAAC,QAAQ,CAAC,MAAM,IAAI,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IAClC,MAAM,YAAY,GAAG,OAAO,QAAQ,KAAK,UAAU;QACjD,CAAC,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC;QAC3B,CAAC,CAAC,QAAQ,CAAC,YAAY,IAAI,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IAExC,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;QACvB,IAAI,WAAW,GAAwB,IAAI,CAAC;QAE5C,SAAS,CAAC,GAAG,EAAE;YACb,WAAW,GAAG,SAAS,CAAC,SAAS,EAAE,IAAI,EAAE;gBACvC,MAAM;gBACN,YAAY;aACb,CAAC,CAAC;YAEH,yBAAyB;YACzB,MAAM,eAAe,GAAG,GAAG,EAAE;gBAC3B,MAAM,EAAE,GAAG,iBAAiB,CAAC;gBAC7B,WAAW,CAAC,KAAK,GAAG,EAAE,EAAE,EAAE,EAAE,UAAU,KAAK,SAAS,CAAC,IAAI,IAAI,KAAK,CAAC;YACrE,CAAC,CAAC;YACF,eAAe,EAAE,CAAC;YAClB,MAAM,QAAQ,GAAG,WAAW,CAAC,eAAe,EAAE,IAAI,CAAC,CAAC;YACpD,WAAW,CAAC,GAAG,EAAE,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC;QAC7C,CAAC,CAAC,CAAC;QAEH,WAAW,CAAC,GAAG,EAAE;YACf,WAAW,EAAE,EAAE,CAAC;QAClB,CAAC,CAAC,CAAC;IACL,CAAC;IAED,OAAO,EAAE,WAAW,EAAE,CAAC;AACzB,CAAC"}
|