@tthr/vue 0.0.29 → 0.0.31
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/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/nuxt/module.js +133 -0
- package/nuxt/module.js.map +1 -0
- package/nuxt/module.ts +31 -1
- package/nuxt/runtime/composables.d.ts +87 -0
- package/nuxt/runtime/composables.d.ts.map +1 -0
- package/nuxt/runtime/composables.js +275 -0
- package/nuxt/runtime/composables.js.map +1 -0
- package/nuxt/runtime/plugin.client.d.ts +17 -0
- package/nuxt/runtime/plugin.client.d.ts.map +1 -0
- package/nuxt/runtime/plugin.client.js +21 -0
- package/nuxt/runtime/plugin.client.js.map +1 -0
- package/nuxt/runtime/plugin.client.ts +0 -6
- package/nuxt/runtime/server/mutation.post.js +7 -5
- package/nuxt/runtime/server/plugins/cron.d.ts +36 -0
- package/nuxt/runtime/server/plugins/cron.d.ts.map +1 -0
- package/nuxt/runtime/server/plugins/cron.js +268 -0
- package/nuxt/runtime/server/plugins/cron.js.map +1 -0
- package/nuxt/runtime/server/plugins/cron.ts +342 -0
- package/package.json +4 -2
package/dist/index.d.ts
CHANGED
|
@@ -110,6 +110,8 @@ export interface TetherConfig {
|
|
|
110
110
|
projectId?: string;
|
|
111
111
|
/** API endpoint (defaults to Tether Cloud) */
|
|
112
112
|
url?: string;
|
|
113
|
+
/** Environment name (defaults to 'production') */
|
|
114
|
+
environment?: string;
|
|
113
115
|
/** Path to schema file */
|
|
114
116
|
schema?: string;
|
|
115
117
|
/** Path to functions directory */
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAA+B,KAAK,GAAG,EAAE,KAAK,GAAG,EAAE,MAAM,KAAK,CAAC;AACtE,OAAO,EAAE,YAAY,EAAE,KAAK,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAKtE;;GAEG;AACH,eAAO,MAAM,YAAY;iBACV,GAAG,WAAW,mBAAmB;uBAK3B,mBAAmB;CAGvC,CAAC;AAEF;;GAEG;AACH,wBAAgB,SAAS,IAAI,YAAY,CAKxC;AAED;;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;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;;;;;;;;;;;;GAYG;AACH,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,EACrC,KAAK,EAAE,aAAa,CAAC,KAAK,EAAE,OAAO,CAAC,EACpC,IAAI,CAAC,EAAE,KAAK,GACX,UAAU,CAAC,OAAO,CAAC,CA4CrB;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;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC;;;;;;;;;OASG;IACH,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;CACxB;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,EACxC,QAAQ,EAAE,gBAAgB,CAAC,KAAK,EAAE,OAAO,CAAC,EAC1C,OAAO,CAAC,EAAE,kBAAkB,GAC3B,aAAa,CAAC,KAAK,EAAE,OAAO,CAAC,CAqC/B;AAGD,YAAY,EAAE,mBAAmB,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAEzE;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,uCAAuC;IACvC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,8CAA8C;IAC9C,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,0BAA0B;IAC1B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,kCAAkC;IAClC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,sCAAsC;IACtC,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,YAAY,GAAG,YAAY,CAE/D"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAA+B,KAAK,GAAG,EAAE,KAAK,GAAG,EAAE,MAAM,KAAK,CAAC;AACtE,OAAO,EAAE,YAAY,EAAE,KAAK,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAKtE;;GAEG;AACH,eAAO,MAAM,YAAY;iBACV,GAAG,WAAW,mBAAmB;uBAK3B,mBAAmB;CAGvC,CAAC;AAEF;;GAEG;AACH,wBAAgB,SAAS,IAAI,YAAY,CAKxC;AAED;;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;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;;;;;;;;;;;;GAYG;AACH,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,EACrC,KAAK,EAAE,aAAa,CAAC,KAAK,EAAE,OAAO,CAAC,EACpC,IAAI,CAAC,EAAE,KAAK,GACX,UAAU,CAAC,OAAO,CAAC,CA4CrB;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;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC;;;;;;;;;OASG;IACH,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;CACxB;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,EACxC,QAAQ,EAAE,gBAAgB,CAAC,KAAK,EAAE,OAAO,CAAC,EAC1C,OAAO,CAAC,EAAE,kBAAkB,GAC3B,aAAa,CAAC,KAAK,EAAE,OAAO,CAAC,CAqC/B;AAGD,YAAY,EAAE,mBAAmB,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAEzE;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,uCAAuC;IACvC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,8CAA8C;IAC9C,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,kDAAkD;IAClD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,0BAA0B;IAC1B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,kCAAkC;IAClC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,sCAAsC;IACtC,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,YAAY,GAAG,YAAY,CAE/D"}
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/nuxt/module.js
ADDED
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @tthr/vue/nuxt - Tether Nuxt Module
|
|
3
|
+
*
|
|
4
|
+
* Automatically configures Tether for Nuxt applications.
|
|
5
|
+
* All API calls are proxied through Nuxt server routes to keep API keys secure.
|
|
6
|
+
*
|
|
7
|
+
* Usage in nuxt.config.ts:
|
|
8
|
+
* ```ts
|
|
9
|
+
* export default defineNuxtConfig({
|
|
10
|
+
* modules: ['@tthr/vue/nuxt'],
|
|
11
|
+
* tether: {
|
|
12
|
+
* projectId: 'your-project-id',
|
|
13
|
+
* url: 'https://api.tether.strands.gg', // optional
|
|
14
|
+
* },
|
|
15
|
+
* })
|
|
16
|
+
* ```
|
|
17
|
+
*
|
|
18
|
+
* Environment variables (in .env):
|
|
19
|
+
* - TETHER_API_KEY: Your project's API key (required, kept server-side)
|
|
20
|
+
*/
|
|
21
|
+
import { defineNuxtModule, addPlugin, createResolver, addImports, addComponent, addServerHandler, addServerImports } from '@nuxt/kit';
|
|
22
|
+
export default defineNuxtModule({
|
|
23
|
+
meta: {
|
|
24
|
+
name: '@tthr/vue',
|
|
25
|
+
configKey: 'tether',
|
|
26
|
+
compatibility: {
|
|
27
|
+
nuxt: '>=3.0.0',
|
|
28
|
+
},
|
|
29
|
+
},
|
|
30
|
+
defaults: {
|
|
31
|
+
projectId: undefined,
|
|
32
|
+
url: undefined,
|
|
33
|
+
},
|
|
34
|
+
setup(options, nuxt) {
|
|
35
|
+
const resolver = createResolver(import.meta.url);
|
|
36
|
+
// Get values from options or env vars (build-time defaults)
|
|
37
|
+
// These can be overridden at runtime via NUXT_TETHER_* and NUXT_PUBLIC_TETHER_* env vars
|
|
38
|
+
const apiKey = process.env.TETHER_API_KEY || '';
|
|
39
|
+
const url = options.url || process.env.TETHER_URL || 'https://tether-api.strands.gg';
|
|
40
|
+
const projectId = options.projectId || process.env.TETHER_PROJECT_ID || '';
|
|
41
|
+
// Calculate WebSocket URL from HTTP URL
|
|
42
|
+
const wsUrl = url.replace(/^https:/, 'wss:').replace(/^http:/, 'ws:');
|
|
43
|
+
// Server-side config (includes API key - never exposed to client)
|
|
44
|
+
// Can be overridden at runtime via:
|
|
45
|
+
// - NUXT_TETHER_API_KEY
|
|
46
|
+
// - NUXT_TETHER_URL
|
|
47
|
+
// - NUXT_TETHER_PROJECT_ID
|
|
48
|
+
nuxt.options.runtimeConfig.tether = {
|
|
49
|
+
apiKey,
|
|
50
|
+
url,
|
|
51
|
+
projectId,
|
|
52
|
+
};
|
|
53
|
+
// Public config (safe for client - no secrets)
|
|
54
|
+
// Can be overridden at runtime via:
|
|
55
|
+
// - NUXT_PUBLIC_TETHER_PROJECT_ID
|
|
56
|
+
// - NUXT_PUBLIC_TETHER_WS_URL
|
|
57
|
+
nuxt.options.runtimeConfig.public.tether = {
|
|
58
|
+
projectId,
|
|
59
|
+
wsUrl,
|
|
60
|
+
};
|
|
61
|
+
// Add server API routes for proxying Tether requests
|
|
62
|
+
addServerHandler({
|
|
63
|
+
route: '/api/_tether/query',
|
|
64
|
+
method: 'post',
|
|
65
|
+
handler: resolver.resolve('./runtime/server/query.post.js'),
|
|
66
|
+
});
|
|
67
|
+
addServerHandler({
|
|
68
|
+
route: '/api/_tether/mutation',
|
|
69
|
+
method: 'post',
|
|
70
|
+
handler: resolver.resolve('./runtime/server/mutation.post.js'),
|
|
71
|
+
});
|
|
72
|
+
// Add the client plugin for WebSocket subscriptions only
|
|
73
|
+
addPlugin({
|
|
74
|
+
src: resolver.resolve('./runtime/plugin.client'),
|
|
75
|
+
mode: 'client',
|
|
76
|
+
});
|
|
77
|
+
// Auto-import composables so users don't need explicit imports
|
|
78
|
+
addImports([
|
|
79
|
+
{
|
|
80
|
+
name: 'useQuery',
|
|
81
|
+
from: resolver.resolve('./runtime/composables'),
|
|
82
|
+
},
|
|
83
|
+
{
|
|
84
|
+
name: 'useMutation',
|
|
85
|
+
from: resolver.resolve('./runtime/composables'),
|
|
86
|
+
},
|
|
87
|
+
{
|
|
88
|
+
name: 'useTetherSubscription',
|
|
89
|
+
from: resolver.resolve('./runtime/composables'),
|
|
90
|
+
},
|
|
91
|
+
]);
|
|
92
|
+
// Auto-import components
|
|
93
|
+
addComponent({
|
|
94
|
+
name: 'TetherWelcome',
|
|
95
|
+
filePath: resolver.resolve('./runtime/components/TetherWelcome.vue'),
|
|
96
|
+
});
|
|
97
|
+
// Auto-import server utilities (available in server/ directory)
|
|
98
|
+
// Use .js extensions to ensure the pre-built files are used
|
|
99
|
+
addServerImports([
|
|
100
|
+
{
|
|
101
|
+
name: 'useTetherServer',
|
|
102
|
+
from: resolver.resolve('./runtime/server/utils/tether.js'),
|
|
103
|
+
},
|
|
104
|
+
{
|
|
105
|
+
name: 'registerCronHandler',
|
|
106
|
+
from: resolver.resolve('./runtime/server/plugins/cron.js'),
|
|
107
|
+
},
|
|
108
|
+
{
|
|
109
|
+
name: 'unregisterCronHandler',
|
|
110
|
+
from: resolver.resolve('./runtime/server/plugins/cron.js'),
|
|
111
|
+
},
|
|
112
|
+
{
|
|
113
|
+
name: 'getCronHandlers',
|
|
114
|
+
from: resolver.resolve('./runtime/server/plugins/cron.js'),
|
|
115
|
+
},
|
|
116
|
+
]);
|
|
117
|
+
// Ensure the runtime files are transpiled
|
|
118
|
+
nuxt.options.build.transpile = nuxt.options.build.transpile || [];
|
|
119
|
+
nuxt.options.build.transpile.push('@tthr/vue');
|
|
120
|
+
// Add Nitro plugin for cron WebSocket connection
|
|
121
|
+
// This auto-connects to Tether when the server starts
|
|
122
|
+
// Use .js extension to ensure the pre-built file is used
|
|
123
|
+
nuxt.hook('nitro:config', (nitroConfig) => {
|
|
124
|
+
nitroConfig.plugins = nitroConfig.plugins || [];
|
|
125
|
+
nitroConfig.plugins.push(resolver.resolve('./runtime/server/plugins/cron.js'));
|
|
126
|
+
// Ensure Nitro inlines and transpiles the plugin from node_modules
|
|
127
|
+
nitroConfig.externals = nitroConfig.externals || {};
|
|
128
|
+
nitroConfig.externals.inline = nitroConfig.externals.inline || [];
|
|
129
|
+
nitroConfig.externals.inline.push('@tthr/vue');
|
|
130
|
+
});
|
|
131
|
+
},
|
|
132
|
+
});
|
|
133
|
+
//# sourceMappingURL=module.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"module.js","sourceRoot":"","sources":["module.ts"],"names":[],"mappings":"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"}
|
package/nuxt/module.ts
CHANGED
|
@@ -114,11 +114,41 @@ export default defineNuxtModule<TetherModuleOptions>({
|
|
|
114
114
|
});
|
|
115
115
|
|
|
116
116
|
// Auto-import server utilities (available in server/ directory)
|
|
117
|
+
// Use .js extensions to ensure the pre-built files are used
|
|
117
118
|
addServerImports([
|
|
118
119
|
{
|
|
119
120
|
name: 'useTetherServer',
|
|
120
|
-
from: resolver.resolve('./runtime/server/utils/tether'),
|
|
121
|
+
from: resolver.resolve('./runtime/server/utils/tether.js'),
|
|
122
|
+
},
|
|
123
|
+
{
|
|
124
|
+
name: 'registerCronHandler',
|
|
125
|
+
from: resolver.resolve('./runtime/server/plugins/cron.js'),
|
|
126
|
+
},
|
|
127
|
+
{
|
|
128
|
+
name: 'unregisterCronHandler',
|
|
129
|
+
from: resolver.resolve('./runtime/server/plugins/cron.js'),
|
|
130
|
+
},
|
|
131
|
+
{
|
|
132
|
+
name: 'getCronHandlers',
|
|
133
|
+
from: resolver.resolve('./runtime/server/plugins/cron.js'),
|
|
121
134
|
},
|
|
122
135
|
]);
|
|
136
|
+
|
|
137
|
+
// Ensure the runtime files are transpiled
|
|
138
|
+
nuxt.options.build.transpile = nuxt.options.build.transpile || [];
|
|
139
|
+
nuxt.options.build.transpile.push('@tthr/vue');
|
|
140
|
+
|
|
141
|
+
// Add Nitro plugin for cron WebSocket connection
|
|
142
|
+
// This auto-connects to Tether when the server starts
|
|
143
|
+
// Use .js extension to ensure the pre-built file is used
|
|
144
|
+
nuxt.hook('nitro:config', (nitroConfig) => {
|
|
145
|
+
nitroConfig.plugins = nitroConfig.plugins || [];
|
|
146
|
+
nitroConfig.plugins.push(resolver.resolve('./runtime/server/plugins/cron.js'));
|
|
147
|
+
|
|
148
|
+
// Ensure Nitro inlines and transpiles the plugin from node_modules
|
|
149
|
+
nitroConfig.externals = nitroConfig.externals || {};
|
|
150
|
+
nitroConfig.externals.inline = nitroConfig.externals.inline || [];
|
|
151
|
+
nitroConfig.externals.inline.push('@tthr/vue');
|
|
152
|
+
});
|
|
123
153
|
},
|
|
124
154
|
});
|
|
@@ -0,0 +1,87 @@
|
|
|
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.
|
|
7
|
+
*/
|
|
8
|
+
import { type Ref } 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: Ref<boolean>;
|
|
16
|
+
refetch: () => Promise<void>;
|
|
17
|
+
/** Update data directly (used for hot-swapping from WebSocket) */
|
|
18
|
+
setData: (newData: T) => void;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Query function reference
|
|
22
|
+
*/
|
|
23
|
+
export interface QueryFunction<TArgs = void, TResult = unknown> {
|
|
24
|
+
_name: string;
|
|
25
|
+
_args?: TArgs;
|
|
26
|
+
_result?: TResult;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Reactive query composable with auto-refresh on subscription updates
|
|
30
|
+
*
|
|
31
|
+
* @example
|
|
32
|
+
* ```vue
|
|
33
|
+
* <script setup>
|
|
34
|
+
* const { data: posts, isLoading } = useQuery(api.posts.list);
|
|
35
|
+
* </script>
|
|
36
|
+
* ```
|
|
37
|
+
*/
|
|
38
|
+
export declare function useQuery<TArgs, TResult>(query: QueryFunction<TArgs, TResult> | string, args?: TArgs): QueryState<TResult>;
|
|
39
|
+
/**
|
|
40
|
+
* Mutation state returned by useMutation
|
|
41
|
+
*/
|
|
42
|
+
export interface MutationState<TArgs, TResult> {
|
|
43
|
+
data: Ref<TResult | undefined>;
|
|
44
|
+
error: Ref<Error | null>;
|
|
45
|
+
isPending: Ref<boolean>;
|
|
46
|
+
mutate: (args: TArgs) => Promise<TResult>;
|
|
47
|
+
reset: () => void;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Mutation function reference
|
|
51
|
+
*/
|
|
52
|
+
export interface MutationFunction<TArgs = void, TResult = unknown> {
|
|
53
|
+
_name: string;
|
|
54
|
+
_args?: TArgs;
|
|
55
|
+
_result?: TResult;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Mutation composable
|
|
59
|
+
*
|
|
60
|
+
* @example
|
|
61
|
+
* ```vue
|
|
62
|
+
* <script setup>
|
|
63
|
+
* const { mutate: createPost, isPending } = useMutation(api.posts.create);
|
|
64
|
+
*
|
|
65
|
+
* async function handleSubmit() {
|
|
66
|
+
* await createPost({ title: 'Hello', content: '...' });
|
|
67
|
+
* }
|
|
68
|
+
* </script>
|
|
69
|
+
* ```
|
|
70
|
+
*/
|
|
71
|
+
export declare function useMutation<TArgs, TResult>(mutation: MutationFunction<TArgs, TResult> | string): MutationState<TArgs, TResult>;
|
|
72
|
+
/**
|
|
73
|
+
* WebSocket subscription composable for realtime updates
|
|
74
|
+
* This runs client-side only and calls refetch when updates are received
|
|
75
|
+
*
|
|
76
|
+
* @example
|
|
77
|
+
* ```vue
|
|
78
|
+
* <script setup>
|
|
79
|
+
* const { data: posts, refetch } = useQuery('posts.list');
|
|
80
|
+
* useTetherSubscription('posts.list', {}, refetch);
|
|
81
|
+
* </script>
|
|
82
|
+
* ```
|
|
83
|
+
*/
|
|
84
|
+
export declare function useTetherSubscription(queryName: string, args: Record<string, unknown> | undefined, onUpdate: (data?: unknown) => void): {
|
|
85
|
+
isConnected: Ref<boolean>;
|
|
86
|
+
};
|
|
87
|
+
//# sourceMappingURL=composables.d.ts.map
|
|
@@ -0,0 +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"}
|
|
@@ -0,0 +1,275 @@
|
|
|
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.
|
|
7
|
+
*/
|
|
8
|
+
import { ref, onMounted, onUnmounted } from 'vue';
|
|
9
|
+
/**
|
|
10
|
+
* Reactive query composable with auto-refresh on subscription updates
|
|
11
|
+
*
|
|
12
|
+
* @example
|
|
13
|
+
* ```vue
|
|
14
|
+
* <script setup>
|
|
15
|
+
* const { data: posts, isLoading } = useQuery(api.posts.list);
|
|
16
|
+
* </script>
|
|
17
|
+
* ```
|
|
18
|
+
*/
|
|
19
|
+
export function useQuery(query, args) {
|
|
20
|
+
const queryName = typeof query === 'string' ? query : query._name;
|
|
21
|
+
const data = ref();
|
|
22
|
+
const error = ref(null);
|
|
23
|
+
const isLoading = ref(true);
|
|
24
|
+
const fetchData = async () => {
|
|
25
|
+
try {
|
|
26
|
+
isLoading.value = true;
|
|
27
|
+
error.value = null;
|
|
28
|
+
const response = await $fetch('/api/_tether/query', {
|
|
29
|
+
method: 'POST',
|
|
30
|
+
body: {
|
|
31
|
+
function: queryName,
|
|
32
|
+
args,
|
|
33
|
+
},
|
|
34
|
+
});
|
|
35
|
+
data.value = response.data;
|
|
36
|
+
}
|
|
37
|
+
catch (e) {
|
|
38
|
+
error.value = e instanceof Error ? e : new Error(String(e));
|
|
39
|
+
}
|
|
40
|
+
finally {
|
|
41
|
+
isLoading.value = false;
|
|
42
|
+
}
|
|
43
|
+
};
|
|
44
|
+
// Fetch on mount (client-side)
|
|
45
|
+
onMounted(() => {
|
|
46
|
+
fetchData();
|
|
47
|
+
});
|
|
48
|
+
// Also fetch immediately for SSR
|
|
49
|
+
if (import.meta.server) {
|
|
50
|
+
fetchData();
|
|
51
|
+
}
|
|
52
|
+
// Direct data setter for hot-swapping from WebSocket
|
|
53
|
+
const setData = (newData) => {
|
|
54
|
+
data.value = newData;
|
|
55
|
+
};
|
|
56
|
+
return {
|
|
57
|
+
data: data,
|
|
58
|
+
error,
|
|
59
|
+
isLoading,
|
|
60
|
+
refetch: fetchData,
|
|
61
|
+
setData,
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Mutation composable
|
|
66
|
+
*
|
|
67
|
+
* @example
|
|
68
|
+
* ```vue
|
|
69
|
+
* <script setup>
|
|
70
|
+
* const { mutate: createPost, isPending } = useMutation(api.posts.create);
|
|
71
|
+
*
|
|
72
|
+
* async function handleSubmit() {
|
|
73
|
+
* await createPost({ title: 'Hello', content: '...' });
|
|
74
|
+
* }
|
|
75
|
+
* </script>
|
|
76
|
+
* ```
|
|
77
|
+
*/
|
|
78
|
+
export function useMutation(mutation) {
|
|
79
|
+
const mutationName = typeof mutation === 'string' ? mutation : mutation._name;
|
|
80
|
+
const data = ref();
|
|
81
|
+
const error = ref(null);
|
|
82
|
+
const isPending = ref(false);
|
|
83
|
+
const mutate = async (args) => {
|
|
84
|
+
try {
|
|
85
|
+
isPending.value = true;
|
|
86
|
+
error.value = null;
|
|
87
|
+
const response = await $fetch('/api/_tether/mutation', {
|
|
88
|
+
method: 'POST',
|
|
89
|
+
body: {
|
|
90
|
+
function: mutationName,
|
|
91
|
+
args,
|
|
92
|
+
},
|
|
93
|
+
});
|
|
94
|
+
data.value = response.data;
|
|
95
|
+
return response.data;
|
|
96
|
+
}
|
|
97
|
+
catch (e) {
|
|
98
|
+
error.value = e instanceof Error ? e : new Error(String(e));
|
|
99
|
+
throw e;
|
|
100
|
+
}
|
|
101
|
+
finally {
|
|
102
|
+
isPending.value = false;
|
|
103
|
+
}
|
|
104
|
+
};
|
|
105
|
+
const reset = () => {
|
|
106
|
+
data.value = undefined;
|
|
107
|
+
error.value = null;
|
|
108
|
+
isPending.value = false;
|
|
109
|
+
};
|
|
110
|
+
return {
|
|
111
|
+
data: data,
|
|
112
|
+
error,
|
|
113
|
+
isPending,
|
|
114
|
+
mutate,
|
|
115
|
+
reset,
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* WebSocket subscription composable for realtime updates
|
|
120
|
+
* This runs client-side only and calls refetch when updates are received
|
|
121
|
+
*
|
|
122
|
+
* @example
|
|
123
|
+
* ```vue
|
|
124
|
+
* <script setup>
|
|
125
|
+
* const { data: posts, refetch } = useQuery('posts.list');
|
|
126
|
+
* useTetherSubscription('posts.list', {}, refetch);
|
|
127
|
+
* </script>
|
|
128
|
+
* ```
|
|
129
|
+
*/
|
|
130
|
+
export function useTetherSubscription(queryName, args, onUpdate) {
|
|
131
|
+
const isConnected = ref(false);
|
|
132
|
+
if (import.meta.client) {
|
|
133
|
+
let ws = null;
|
|
134
|
+
let reconnectTimeout = null;
|
|
135
|
+
let heartbeatInterval = null;
|
|
136
|
+
let heartbeatTimeout = null;
|
|
137
|
+
let awaitingPong = false;
|
|
138
|
+
let isConnecting = false;
|
|
139
|
+
let isMounted = false;
|
|
140
|
+
// Heartbeat configuration
|
|
141
|
+
const HEARTBEAT_INTERVAL = 25000; // 25 seconds (well under server's 90s timeout)
|
|
142
|
+
const HEARTBEAT_TIMEOUT = 15000; // 15 seconds to receive pong (generous for slow networks)
|
|
143
|
+
// Generate a unique subscription ID
|
|
144
|
+
const subscriptionId = `${Date.now()}-${Math.random().toString(36).slice(2, 9)}`;
|
|
145
|
+
const startHeartbeat = () => {
|
|
146
|
+
stopHeartbeat();
|
|
147
|
+
heartbeatInterval = setInterval(() => {
|
|
148
|
+
if (ws?.readyState === WebSocket.OPEN) {
|
|
149
|
+
awaitingPong = true;
|
|
150
|
+
ws.send(JSON.stringify({ type: 'ping' }));
|
|
151
|
+
heartbeatTimeout = setTimeout(() => {
|
|
152
|
+
if (awaitingPong && isMounted) {
|
|
153
|
+
console.warn('[Tether] Heartbeat timeout - forcing reconnect');
|
|
154
|
+
ws?.close();
|
|
155
|
+
}
|
|
156
|
+
}, HEARTBEAT_TIMEOUT);
|
|
157
|
+
}
|
|
158
|
+
}, HEARTBEAT_INTERVAL);
|
|
159
|
+
};
|
|
160
|
+
const stopHeartbeat = () => {
|
|
161
|
+
if (heartbeatInterval) {
|
|
162
|
+
clearInterval(heartbeatInterval);
|
|
163
|
+
heartbeatInterval = null;
|
|
164
|
+
}
|
|
165
|
+
if (heartbeatTimeout) {
|
|
166
|
+
clearTimeout(heartbeatTimeout);
|
|
167
|
+
heartbeatTimeout = null;
|
|
168
|
+
}
|
|
169
|
+
awaitingPong = false;
|
|
170
|
+
};
|
|
171
|
+
const connect = () => {
|
|
172
|
+
// Don't connect if unmounted or already connecting/connected
|
|
173
|
+
if (!isMounted)
|
|
174
|
+
return;
|
|
175
|
+
if (isConnecting)
|
|
176
|
+
return;
|
|
177
|
+
if (ws && (ws.readyState === WebSocket.OPEN || ws.readyState === WebSocket.CONNECTING)) {
|
|
178
|
+
return;
|
|
179
|
+
}
|
|
180
|
+
// Get config from window (set by plugin)
|
|
181
|
+
const config = window.__TETHER_CONFIG__;
|
|
182
|
+
if (!config?.wsUrl || !config?.projectId) {
|
|
183
|
+
console.warn('[Tether] WebSocket config not available');
|
|
184
|
+
return;
|
|
185
|
+
}
|
|
186
|
+
isConnecting = true;
|
|
187
|
+
const wsUrl = `${config.wsUrl}/ws/${config.projectId}`;
|
|
188
|
+
ws = new WebSocket(wsUrl);
|
|
189
|
+
ws.onopen = () => {
|
|
190
|
+
isConnecting = false;
|
|
191
|
+
// Wait for connected message before subscribing
|
|
192
|
+
};
|
|
193
|
+
ws.onmessage = (event) => {
|
|
194
|
+
try {
|
|
195
|
+
const message = JSON.parse(event.data);
|
|
196
|
+
if (message.type === 'connected') {
|
|
197
|
+
isConnected.value = true;
|
|
198
|
+
startHeartbeat();
|
|
199
|
+
// Subscribe to the query with our ID
|
|
200
|
+
ws?.send(JSON.stringify({
|
|
201
|
+
type: 'subscribe',
|
|
202
|
+
id: subscriptionId,
|
|
203
|
+
query: queryName,
|
|
204
|
+
args,
|
|
205
|
+
}));
|
|
206
|
+
}
|
|
207
|
+
else if (message.type === 'data' && message.id === subscriptionId) {
|
|
208
|
+
// Call onUpdate with the fresh data
|
|
209
|
+
onUpdate(message.data);
|
|
210
|
+
}
|
|
211
|
+
else if (message.type === 'pong') {
|
|
212
|
+
// Heartbeat acknowledged
|
|
213
|
+
awaitingPong = false;
|
|
214
|
+
if (heartbeatTimeout) {
|
|
215
|
+
clearTimeout(heartbeatTimeout);
|
|
216
|
+
heartbeatTimeout = null;
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
catch {
|
|
221
|
+
// Ignore parse errors
|
|
222
|
+
}
|
|
223
|
+
};
|
|
224
|
+
ws.onclose = () => {
|
|
225
|
+
isConnected.value = false;
|
|
226
|
+
isConnecting = false;
|
|
227
|
+
stopHeartbeat();
|
|
228
|
+
// Only reconnect if still mounted
|
|
229
|
+
if (isMounted) {
|
|
230
|
+
reconnectTimeout = setTimeout(connect, 3000);
|
|
231
|
+
}
|
|
232
|
+
};
|
|
233
|
+
ws.onerror = () => {
|
|
234
|
+
isConnecting = false;
|
|
235
|
+
ws?.close();
|
|
236
|
+
};
|
|
237
|
+
};
|
|
238
|
+
// Handle page visibility changes - reconnect when tab becomes visible
|
|
239
|
+
const handleVisibilityChange = () => {
|
|
240
|
+
if (!isMounted)
|
|
241
|
+
return;
|
|
242
|
+
if (document.visibilityState === 'visible') {
|
|
243
|
+
// Tab became visible - check connection health
|
|
244
|
+
if (!ws || ws.readyState === WebSocket.CLOSED) {
|
|
245
|
+
// Clear any pending reconnect and connect immediately
|
|
246
|
+
if (reconnectTimeout) {
|
|
247
|
+
clearTimeout(reconnectTimeout);
|
|
248
|
+
reconnectTimeout = null;
|
|
249
|
+
}
|
|
250
|
+
connect();
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
};
|
|
254
|
+
onMounted(() => {
|
|
255
|
+
isMounted = true;
|
|
256
|
+
connect();
|
|
257
|
+
document.addEventListener('visibilitychange', handleVisibilityChange);
|
|
258
|
+
});
|
|
259
|
+
onUnmounted(() => {
|
|
260
|
+
isMounted = false;
|
|
261
|
+
document.removeEventListener('visibilitychange', handleVisibilityChange);
|
|
262
|
+
stopHeartbeat();
|
|
263
|
+
if (reconnectTimeout) {
|
|
264
|
+
clearTimeout(reconnectTimeout);
|
|
265
|
+
reconnectTimeout = null;
|
|
266
|
+
}
|
|
267
|
+
if (ws) {
|
|
268
|
+
ws.close();
|
|
269
|
+
ws = null;
|
|
270
|
+
}
|
|
271
|
+
});
|
|
272
|
+
}
|
|
273
|
+
return { isConnected };
|
|
274
|
+
}
|
|
275
|
+
//# sourceMappingURL=composables.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"composables.js","sourceRoot":"","sources":["composables.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Client-side Tether plugin
|
|
3
|
+
*
|
|
4
|
+
* Sets up the WebSocket configuration for realtime subscriptions.
|
|
5
|
+
* This only exposes the project ID and WebSocket URL - no secrets.
|
|
6
|
+
*/
|
|
7
|
+
declare global {
|
|
8
|
+
interface Window {
|
|
9
|
+
__TETHER_CONFIG__?: {
|
|
10
|
+
projectId: string;
|
|
11
|
+
wsUrl: string;
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
declare const _default: any;
|
|
16
|
+
export default _default;
|
|
17
|
+
//# sourceMappingURL=plugin.client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin.client.d.ts","sourceRoot":"","sources":["plugin.client.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,MAAM;QACd,iBAAiB,CAAC,EAAE;YAClB,SAAS,EAAE,MAAM,CAAC;YAClB,KAAK,EAAE,MAAM,CAAC;SACf,CAAC;KACH;CACF;;AAED,wBAeG"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Client-side Tether plugin
|
|
3
|
+
*
|
|
4
|
+
* Sets up the WebSocket configuration for realtime subscriptions.
|
|
5
|
+
* This only exposes the project ID and WebSocket URL - no secrets.
|
|
6
|
+
*/
|
|
7
|
+
import { defineNuxtPlugin, useRuntimeConfig } from '#imports';
|
|
8
|
+
export default defineNuxtPlugin(() => {
|
|
9
|
+
const config = useRuntimeConfig();
|
|
10
|
+
// Make config available for WebSocket connections
|
|
11
|
+
// This is safe - no secrets are exposed
|
|
12
|
+
const tetherConfig = {
|
|
13
|
+
projectId: config.public.tether?.projectId || '',
|
|
14
|
+
wsUrl: config.public.tether?.wsUrl || '',
|
|
15
|
+
};
|
|
16
|
+
window.__TETHER_CONFIG__ = tetherConfig;
|
|
17
|
+
if (!tetherConfig.wsUrl || !tetherConfig.projectId) {
|
|
18
|
+
console.warn('[Tether] Config incomplete - WebSocket subscriptions will not work');
|
|
19
|
+
}
|
|
20
|
+
});
|
|
21
|
+
//# sourceMappingURL=plugin.client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin.client.js","sourceRoot":"","sources":["plugin.client.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAW9D,eAAe,gBAAgB,CAAC,GAAG,EAAE;IACnC,MAAM,MAAM,GAAG,gBAAgB,EAAE,CAAC;IAElC,kDAAkD;IAClD,wCAAwC;IACxC,MAAM,YAAY,GAAG;QACnB,SAAS,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,IAAI,EAAE;QAChD,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,IAAI,EAAE;KACzC,CAAC;IAEF,MAAM,CAAC,iBAAiB,GAAG,YAAY,CAAC;IAExC,IAAI,CAAC,YAAY,CAAC,KAAK,IAAI,CAAC,YAAY,CAAC,SAAS,EAAE,CAAC;QACnD,OAAO,CAAC,IAAI,CAAC,oEAAoE,CAAC,CAAC;IACrF,CAAC;AACH,CAAC,CAAC,CAAC"}
|
|
@@ -28,12 +28,6 @@ export default defineNuxtPlugin(() => {
|
|
|
28
28
|
|
|
29
29
|
window.__TETHER_CONFIG__ = tetherConfig;
|
|
30
30
|
|
|
31
|
-
// Debug logging
|
|
32
|
-
console.log('[Tether] Client plugin loaded with config:', {
|
|
33
|
-
projectId: tetherConfig.projectId ? `${tetherConfig.projectId.slice(0, 8)}...` : '(empty)',
|
|
34
|
-
wsUrl: tetherConfig.wsUrl || '(empty)',
|
|
35
|
-
});
|
|
36
|
-
|
|
37
31
|
if (!tetherConfig.wsUrl || !tetherConfig.projectId) {
|
|
38
32
|
console.warn('[Tether] Config incomplete - WebSocket subscriptions will not work');
|
|
39
33
|
}
|