@tthr/server 0.0.4 → 0.0.6

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 CHANGED
@@ -12,33 +12,58 @@ export interface AuthContext {
12
12
  claims: Record<string, unknown>;
13
13
  }
14
14
  /**
15
- * Database client type - represents the generated db object
15
+ * Table operations interface
16
16
  */
17
- export type DatabaseClient = Record<string, {
18
- findMany: (options?: unknown) => Promise<unknown[]>;
19
- findFirst: (options?: unknown) => Promise<unknown | null>;
20
- findUnique: (options?: unknown) => Promise<unknown | null>;
21
- findById: (id: unknown) => Promise<unknown | null>;
22
- count: (options?: unknown) => Promise<number>;
23
- insert: (data: unknown) => Promise<unknown>;
24
- insertMany: (data: unknown[]) => Promise<unknown[]>;
17
+ export interface TableOperations<T = unknown> {
18
+ findMany: (options?: {
19
+ where?: Partial<T>;
20
+ orderBy?: Partial<Record<keyof T, 'asc' | 'desc'>>;
21
+ limit?: number;
22
+ offset?: number;
23
+ }) => Promise<T[]>;
24
+ findFirst: (options?: {
25
+ where?: Partial<T>;
26
+ orderBy?: Partial<Record<keyof T, 'asc' | 'desc'>>;
27
+ }) => Promise<T | null>;
28
+ findUnique: (options?: {
29
+ where?: Partial<T>;
30
+ }) => Promise<T | null>;
31
+ findById: (id: unknown) => Promise<T | null>;
32
+ count: (options?: {
33
+ where?: Partial<T>;
34
+ }) => Promise<number>;
35
+ insert: (data: T) => Promise<T>;
36
+ insertMany: (data: T[]) => Promise<T[]>;
25
37
  create: (options: {
26
- data: unknown;
27
- }) => Promise<unknown>;
38
+ data: T;
39
+ }) => Promise<T>;
28
40
  update: (options: {
29
- where: unknown;
30
- data: unknown;
41
+ where: Partial<T>;
42
+ data: Partial<T>;
31
43
  }) => Promise<number>;
32
44
  upsert: (options: {
33
- where: unknown;
34
- create: unknown;
35
- update: unknown;
36
- }) => Promise<unknown>;
45
+ where: Partial<T>;
46
+ create: T;
47
+ update: Partial<T>;
48
+ }) => Promise<T>;
37
49
  delete: (options: {
38
- where: unknown;
50
+ where: Partial<T>;
39
51
  }) => Promise<number>;
40
52
  deleteById: (id: unknown) => Promise<boolean>;
41
- }>;
53
+ }
54
+ /**
55
+ * Database client type - represents the generated db object
56
+ * Can be used with a schema type for full type safety:
57
+ *
58
+ * @example
59
+ * ```ts
60
+ * import type { Schema } from '~/tether/_generated/db';
61
+ * type DB = DatabaseClient<Schema>;
62
+ * ```
63
+ */
64
+ export type DatabaseClient<TSchema = Record<string, unknown>> = {
65
+ [K in keyof TSchema]: TableOperations<TSchema[K]>;
66
+ };
42
67
  /**
43
68
  * Tether context for actions - provides access to queries, mutations, and env vars
44
69
  */
@@ -71,47 +96,47 @@ export interface ExecutionCtx {
71
96
  /**
72
97
  * Base handler context (without args) for queries/mutations with no arguments
73
98
  */
74
- export interface BaseHandlerContext {
99
+ export interface BaseHandlerContext<TSchema = Record<string, unknown>> {
75
100
  /** Database client for the project */
76
- db: DatabaseClient;
101
+ db: DatabaseClient<TSchema>;
77
102
  /** Execution context with auth info */
78
103
  ctx: ExecutionCtx;
79
104
  }
80
105
  /**
81
106
  * Query/Mutation handler context with typed args
82
107
  */
83
- export type FunctionHandlerContext<TArgs> = TArgs extends void ? BaseHandlerContext : BaseHandlerContext & {
108
+ export type FunctionHandlerContext<TArgs, TSchema = Record<string, unknown>> = TArgs extends void ? BaseHandlerContext<TSchema> : BaseHandlerContext<TSchema> & {
84
109
  args: TArgs;
85
110
  };
86
111
  /**
87
112
  * Action handler context with typed args
88
113
  */
89
- export type ActionHandlerCtx<TArgs> = TArgs extends void ? BaseHandlerContext & {
114
+ export type ActionHandlerCtx<TArgs, TSchema = Record<string, unknown>> = TArgs extends void ? BaseHandlerContext<TSchema> & {
90
115
  tether: TetherContext;
91
- } : BaseHandlerContext & {
116
+ } : BaseHandlerContext<TSchema> & {
92
117
  args: TArgs;
93
118
  tether: TetherContext;
94
119
  };
95
120
  /**
96
121
  * Query function definition
97
122
  */
98
- export interface QueryDefinition<TArgs, TResult> {
123
+ export interface QueryDefinition<TArgs, TResult, TSchema = Record<string, unknown>> {
99
124
  args?: ZodType<TArgs>;
100
- handler: (context: FunctionHandlerContext<TArgs>) => Promise<TResult> | TResult;
125
+ handler: (context: FunctionHandlerContext<TArgs, TSchema>) => Promise<TResult> | TResult;
101
126
  }
102
127
  /**
103
128
  * Mutation function definition
104
129
  */
105
- export interface MutationDefinition<TArgs, TResult> {
130
+ export interface MutationDefinition<TArgs, TResult, TSchema = Record<string, unknown>> {
106
131
  args?: ZodType<TArgs>;
107
- handler: (context: FunctionHandlerContext<TArgs>) => Promise<TResult> | TResult;
132
+ handler: (context: FunctionHandlerContext<TArgs, TSchema>) => Promise<TResult> | TResult;
108
133
  }
109
134
  /**
110
135
  * Action function definition
111
136
  */
112
- export interface ActionDefinition<TArgs, TResult> {
137
+ export interface ActionDefinition<TArgs, TResult, TSchema = Record<string, unknown>> {
113
138
  args?: ZodType<TArgs>;
114
- handler: (context: ActionHandlerCtx<TArgs>) => Promise<TResult> | TResult;
139
+ handler: (context: ActionHandlerCtx<TArgs, TSchema>) => Promise<TResult> | TResult;
115
140
  }
116
141
  /**
117
142
  * Define a query function
@@ -142,7 +167,7 @@ export interface ActionDefinition<TArgs, TResult> {
142
167
  * });
143
168
  * ```
144
169
  */
145
- export declare function query<TArgs = void, TResult = unknown>(definition: QueryDefinition<TArgs, TResult>): QueryDefinition<TArgs, TResult>;
170
+ export declare function query<TArgs = void, TResult = unknown, TSchema = Record<string, unknown>>(definition: QueryDefinition<TArgs, TResult, TSchema>): QueryDefinition<TArgs, TResult, TSchema>;
146
171
  /**
147
172
  * Define a mutation function
148
173
  *
@@ -171,7 +196,7 @@ export declare function query<TArgs = void, TResult = unknown>(definition: Query
171
196
  * });
172
197
  * ```
173
198
  */
174
- export declare function mutation<TArgs = void, TResult = unknown>(definition: MutationDefinition<TArgs, TResult>): MutationDefinition<TArgs, TResult>;
199
+ export declare function mutation<TArgs = void, TResult = unknown, TSchema = Record<string, unknown>>(definition: MutationDefinition<TArgs, TResult, TSchema>): MutationDefinition<TArgs, TResult, TSchema>;
175
200
  /**
176
201
  * Define an action function
177
202
  *
@@ -203,17 +228,26 @@ export declare function mutation<TArgs = void, TResult = unknown>(definition: Mu
203
228
  * });
204
229
  * ```
205
230
  */
206
- export declare function action<TArgs = void, TResult = unknown>(definition: ActionDefinition<TArgs, TResult>): ActionDefinition<TArgs, TResult>;
231
+ export declare function action<TArgs = void, TResult = unknown, TSchema = Record<string, unknown>>(definition: ActionDefinition<TArgs, TResult, TSchema>): ActionDefinition<TArgs, TResult, TSchema>;
207
232
  /**
208
233
  * Server-side Tether client for direct function calls
209
234
  */
210
235
  export interface ServerClientOptions {
211
236
  url: string;
237
+ /** Project ID */
238
+ projectId: string;
239
+ /** Environment name (defaults to 'production') */
240
+ environment?: string;
241
+ /** API key for authentication */
212
242
  apiKey: string;
213
243
  }
214
244
  export declare class TetherServerClient {
215
245
  private options;
216
246
  constructor(options: ServerClientOptions);
247
+ /**
248
+ * Get the base URL for API calls
249
+ */
250
+ private getBaseUrl;
217
251
  /**
218
252
  * Execute a query function
219
253
  */
@@ -227,5 +261,198 @@ export declare class TetherServerClient {
227
261
  * Create a server-side Tether client
228
262
  */
229
263
  export declare function createClient(options: ServerClientOptions): TetherServerClient;
264
+ /**
265
+ * Runtime configuration
266
+ */
267
+ export interface TetherRuntimeConfig {
268
+ /** Tether API URL */
269
+ url: string;
270
+ /** Project ID */
271
+ projectId: string;
272
+ /** Environment name (defaults to 'production') */
273
+ environment?: string;
274
+ /** API key or auth token */
275
+ apiKey?: string;
276
+ /** Auth token function (for user context) */
277
+ authToken?: string | (() => string | Promise<string>);
278
+ /** Whether to send logs to Tether (default: true in production) */
279
+ enableLogging?: boolean;
280
+ /** Batch size before flushing logs (default: 10) */
281
+ batchSize?: number;
282
+ /** Flush interval in ms (default: 5000) */
283
+ flushInterval?: number;
284
+ }
285
+ /**
286
+ * Initialise the Tether runtime
287
+ *
288
+ * Call this once at app startup to enable console capture and logging.
289
+ *
290
+ * @example
291
+ * ```ts
292
+ * // In your Nuxt plugin or app entry
293
+ * import { initTetherRuntime } from '@tthr/server';
294
+ *
295
+ * initTetherRuntime({
296
+ * url: process.env.TETHER_URL!,
297
+ * projectId: process.env.TETHER_PROJECT_ID!,
298
+ * apiKey: process.env.TETHER_API_KEY,
299
+ * });
300
+ * ```
301
+ */
302
+ export declare function initTetherRuntime(config: TetherRuntimeConfig): void;
303
+ /**
304
+ * Get the current runtime config
305
+ */
306
+ export declare function getRuntimeConfig(): TetherRuntimeConfig | null;
307
+ /**
308
+ * Execute a function with Tether console capture
309
+ *
310
+ * Wraps the function execution to capture all console.* calls and send them
311
+ * to Tether for dashboard visibility.
312
+ *
313
+ * @example
314
+ * ```ts
315
+ * // In your Nuxt server route
316
+ * import { executeWithLogging } from '@tthr/server';
317
+ * import { list } from '~/tether/functions/posts';
318
+ *
319
+ * export default defineEventHandler(async (event) => {
320
+ * return executeWithLogging('posts.list', async (ctx) => {
321
+ * return list.handler(ctx);
322
+ * }, { db, ctx });
323
+ * });
324
+ * ```
325
+ */
326
+ export declare function executeWithLogging<TResult>(functionName: string, fn: () => Promise<TResult> | TResult): Promise<TResult>;
327
+ /**
328
+ * Manually flush any pending logs
329
+ *
330
+ * Call this before your server shuts down to ensure all logs are sent.
331
+ */
332
+ export declare function flushTetherLogs(): Promise<void>;
230
333
  export { z };
334
+ /**
335
+ * Cron trigger message from Tether server
336
+ */
337
+ export interface CronTriggerMessage {
338
+ type: 'cron_trigger';
339
+ executionId: string;
340
+ cronId: string;
341
+ functionName: string;
342
+ functionType: 'query' | 'mutation' | 'action';
343
+ args?: unknown;
344
+ }
345
+ /**
346
+ * Cron handler function type
347
+ */
348
+ export type CronHandler = (functionName: string, args: unknown) => Promise<{
349
+ success: boolean;
350
+ result?: unknown;
351
+ error?: string;
352
+ }>;
353
+ /**
354
+ * Options for TetherCronConnection
355
+ */
356
+ export interface TetherCronConnectionOptions {
357
+ /** Tether API URL */
358
+ url: string;
359
+ /** Project ID */
360
+ projectId: string;
361
+ /** Environment name (defaults to 'production') */
362
+ environment?: string;
363
+ /** API key for authentication */
364
+ apiKey: string;
365
+ /** Handler function for cron triggers */
366
+ onCronTrigger: CronHandler;
367
+ /** Called when connection is established */
368
+ onConnected?: () => void;
369
+ /** Called when connection is closed */
370
+ onDisconnected?: () => void;
371
+ /** Called on connection error */
372
+ onError?: (error: Error) => void;
373
+ }
374
+ /**
375
+ * Server-side WebSocket connection for receiving cron triggers.
376
+ *
377
+ * This connects to Tether with `?type=server` to identify as a server connection.
378
+ * Only server connections receive cron triggers - client connections do not.
379
+ *
380
+ * @example
381
+ * ```ts
382
+ * import { TetherCronConnection } from '@tthr/server';
383
+ *
384
+ * const cronConnection = new TetherCronConnection({
385
+ * url: process.env.TETHER_URL!,
386
+ * projectId: process.env.TETHER_PROJECT_ID!,
387
+ * apiKey: process.env.TETHER_API_KEY!,
388
+ * onCronTrigger: async (functionName, args) => {
389
+ * // Execute your function here
390
+ * try {
391
+ * const result = await executeFunction(functionName, args);
392
+ * return { success: true, result };
393
+ * } catch (error) {
394
+ * return { success: false, error: error.message };
395
+ * }
396
+ * },
397
+ * });
398
+ *
399
+ * await cronConnection.connect();
400
+ * ```
401
+ */
402
+ export declare class TetherCronConnection {
403
+ private options;
404
+ private ws;
405
+ private connectionId;
406
+ private reconnectAttempts;
407
+ private maxReconnectAttempts;
408
+ private reconnectDelay;
409
+ private isConnecting;
410
+ private shouldReconnect;
411
+ private heartbeatInterval;
412
+ private heartbeatTimeout;
413
+ private heartbeatTimer;
414
+ private heartbeatTimeoutTimer;
415
+ private awaitingPong;
416
+ constructor(options: TetherCronConnectionOptions);
417
+ /**
418
+ * Get the WebSocket URL with server type parameter
419
+ */
420
+ private getWsUrl;
421
+ /**
422
+ * Connect to Tether server
423
+ */
424
+ connect(): Promise<void>;
425
+ /**
426
+ * Handle incoming WebSocket message
427
+ */
428
+ private handleMessage;
429
+ /**
430
+ * Handle a cron trigger message
431
+ */
432
+ private handleCronTrigger;
433
+ /**
434
+ * Report execution result back to Tether
435
+ */
436
+ private reportExecution;
437
+ /**
438
+ * Start heartbeat timer
439
+ */
440
+ private startHeartbeat;
441
+ /**
442
+ * Stop heartbeat timer
443
+ */
444
+ private stopHeartbeat;
445
+ /**
446
+ * Handle reconnection
447
+ */
448
+ private handleReconnect;
449
+ /**
450
+ * Disconnect from Tether
451
+ */
452
+ disconnect(): void;
453
+ /**
454
+ * Check if connected
455
+ */
456
+ get isConnected(): boolean;
457
+ }
231
458
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -106,11 +106,23 @@ export class TetherServerClient {
106
106
  constructor(options) {
107
107
  this.options = options;
108
108
  }
109
+ /**
110
+ * Get the base URL for API calls
111
+ */
112
+ getBaseUrl() {
113
+ const base = this.options.url.replace(/\/$/, '');
114
+ const env = this.options.environment;
115
+ // Only include /env/{env} if not production (production is the default)
116
+ if (env && env !== 'production') {
117
+ return `${base}/api/v1/projects/${this.options.projectId}/env/${env}`;
118
+ }
119
+ return `${base}/api/v1/projects/${this.options.projectId}`;
120
+ }
109
121
  /**
110
122
  * Execute a query function
111
123
  */
112
124
  async query(name, args) {
113
- const response = await fetch(`${this.options.url}/api/v1/query`, {
125
+ const response = await fetch(`${this.getBaseUrl()}/query`, {
114
126
  method: 'POST',
115
127
  headers: {
116
128
  'Content-Type': 'application/json',
@@ -129,7 +141,7 @@ export class TetherServerClient {
129
141
  * Execute a mutation function
130
142
  */
131
143
  async mutation(name, args) {
132
- const response = await fetch(`${this.options.url}/api/v1/mutation`, {
144
+ const response = await fetch(`${this.getBaseUrl()}/mutation`, {
133
145
  method: 'POST',
134
146
  headers: {
135
147
  'Content-Type': 'application/json',
@@ -151,6 +163,494 @@ export class TetherServerClient {
151
163
  export function createClient(options) {
152
164
  return new TetherServerClient(options);
153
165
  }
166
+ // Global runtime instance
167
+ let _runtimeConfig = null;
168
+ let _logBuffer = [];
169
+ let _flushTimer = null;
170
+ /**
171
+ * Initialise the Tether runtime
172
+ *
173
+ * Call this once at app startup to enable console capture and logging.
174
+ *
175
+ * @example
176
+ * ```ts
177
+ * // In your Nuxt plugin or app entry
178
+ * import { initTetherRuntime } from '@tthr/server';
179
+ *
180
+ * initTetherRuntime({
181
+ * url: process.env.TETHER_URL!,
182
+ * projectId: process.env.TETHER_PROJECT_ID!,
183
+ * apiKey: process.env.TETHER_API_KEY,
184
+ * });
185
+ * ```
186
+ */
187
+ export function initTetherRuntime(config) {
188
+ _runtimeConfig = {
189
+ enableLogging: process.env.NODE_ENV === 'production',
190
+ batchSize: 10,
191
+ flushInterval: 5000,
192
+ ...config,
193
+ };
194
+ }
195
+ /**
196
+ * Get the current runtime config
197
+ */
198
+ export function getRuntimeConfig() {
199
+ return _runtimeConfig;
200
+ }
201
+ /**
202
+ * Flush pending logs to Tether
203
+ */
204
+ async function flushLogs() {
205
+ if (!_runtimeConfig || _logBuffer.length === 0)
206
+ return;
207
+ const logs = _logBuffer.splice(0, _logBuffer.length);
208
+ try {
209
+ const token = typeof _runtimeConfig.authToken === 'function'
210
+ ? await _runtimeConfig.authToken()
211
+ : _runtimeConfig.authToken ?? _runtimeConfig.apiKey;
212
+ // Build URL with optional environment
213
+ const base = _runtimeConfig.url.replace(/\/$/, '');
214
+ const env = _runtimeConfig.environment;
215
+ const baseUrl = env && env !== 'production'
216
+ ? `${base}/api/v1/projects/${_runtimeConfig.projectId}/env/${env}`
217
+ : `${base}/api/v1/projects/${_runtimeConfig.projectId}`;
218
+ const response = await fetch(`${baseUrl}/logs`, {
219
+ method: 'POST',
220
+ headers: {
221
+ 'Content-Type': 'application/json',
222
+ ...(token ? { 'Authorization': `Bearer ${token}` } : {}),
223
+ },
224
+ body: JSON.stringify({ logs }),
225
+ });
226
+ if (!response.ok) {
227
+ // Re-add logs on failure (with limit to prevent memory issues)
228
+ if (_logBuffer.length < 1000) {
229
+ _logBuffer.unshift(...logs);
230
+ }
231
+ console.error('[Tether] Failed to send logs:', response.statusText);
232
+ }
233
+ }
234
+ catch (error) {
235
+ // Re-add logs on failure
236
+ if (_logBuffer.length < 1000) {
237
+ _logBuffer.unshift(...logs);
238
+ }
239
+ console.error('[Tether] Failed to send logs:', error);
240
+ }
241
+ }
242
+ /**
243
+ * Schedule a flush of logs
244
+ */
245
+ function scheduleFlush() {
246
+ if (_flushTimer)
247
+ return;
248
+ _flushTimer = setTimeout(() => {
249
+ _flushTimer = null;
250
+ flushLogs();
251
+ }, _runtimeConfig?.flushInterval ?? 5000);
252
+ }
253
+ /**
254
+ * Add a log entry to the buffer
255
+ */
256
+ function addLog(entry) {
257
+ if (!_runtimeConfig?.enableLogging)
258
+ return;
259
+ _logBuffer.push(entry);
260
+ // Flush if batch size reached
261
+ if (_logBuffer.length >= (_runtimeConfig.batchSize ?? 10)) {
262
+ flushLogs();
263
+ }
264
+ else {
265
+ scheduleFlush();
266
+ }
267
+ }
268
+ /**
269
+ * Create a wrapped console that captures logs for a specific function execution
270
+ */
271
+ function createTetherConsole(functionName, executionId) {
272
+ const originalConsole = globalThis.console;
273
+ const createMethod = (level) => {
274
+ return (...args) => {
275
+ // Still call original console
276
+ originalConsole[level](...args);
277
+ // Capture for Tether
278
+ const message = args
279
+ .map(arg => typeof arg === 'string' ? arg : JSON.stringify(arg))
280
+ .join(' ');
281
+ // Extract structured data if first arg is an object
282
+ const data = args.length === 1 && typeof args[0] === 'object' && args[0] !== null
283
+ ? args[0]
284
+ : args.length > 1
285
+ ? args
286
+ : undefined;
287
+ addLog({
288
+ function: functionName,
289
+ level,
290
+ message,
291
+ data,
292
+ execution_id: executionId,
293
+ timestamp: new Date().toISOString(),
294
+ });
295
+ };
296
+ };
297
+ // Create a proxy that wraps console methods
298
+ return new Proxy(originalConsole, {
299
+ get(target, prop) {
300
+ if (prop === 'log')
301
+ return createMethod('log');
302
+ if (prop === 'info')
303
+ return createMethod('info');
304
+ if (prop === 'warn')
305
+ return createMethod('warn');
306
+ if (prop === 'error')
307
+ return createMethod('error');
308
+ if (prop === 'debug')
309
+ return createMethod('debug');
310
+ return target[prop];
311
+ },
312
+ });
313
+ }
314
+ /**
315
+ * Generate a unique execution ID
316
+ */
317
+ function generateExecutionId() {
318
+ return `${Date.now()}-${Math.random().toString(36).slice(2, 9)}`;
319
+ }
320
+ /**
321
+ * Execute a function with Tether console capture
322
+ *
323
+ * Wraps the function execution to capture all console.* calls and send them
324
+ * to Tether for dashboard visibility.
325
+ *
326
+ * @example
327
+ * ```ts
328
+ * // In your Nuxt server route
329
+ * import { executeWithLogging } from '@tthr/server';
330
+ * import { list } from '~/tether/functions/posts';
331
+ *
332
+ * export default defineEventHandler(async (event) => {
333
+ * return executeWithLogging('posts.list', async (ctx) => {
334
+ * return list.handler(ctx);
335
+ * }, { db, ctx });
336
+ * });
337
+ * ```
338
+ */
339
+ export async function executeWithLogging(functionName, fn) {
340
+ const executionId = generateExecutionId();
341
+ const tetherConsole = createTetherConsole(functionName, executionId);
342
+ // Store original console
343
+ const originalConsole = globalThis.console;
344
+ try {
345
+ // Replace global console
346
+ globalThis.console = tetherConsole;
347
+ // Execute function
348
+ const result = await fn();
349
+ return result;
350
+ }
351
+ catch (error) {
352
+ // Log the error
353
+ tetherConsole.error(error instanceof Error ? error.message : String(error), error instanceof Error ? { stack: error.stack } : undefined);
354
+ throw error;
355
+ }
356
+ finally {
357
+ // Restore original console
358
+ globalThis.console = originalConsole;
359
+ // Flush logs after execution (don't await to not block response)
360
+ flushLogs().catch(() => { });
361
+ }
362
+ }
363
+ /**
364
+ * Manually flush any pending logs
365
+ *
366
+ * Call this before your server shuts down to ensure all logs are sent.
367
+ */
368
+ export async function flushTetherLogs() {
369
+ if (_flushTimer) {
370
+ clearTimeout(_flushTimer);
371
+ _flushTimer = null;
372
+ }
373
+ await flushLogs();
374
+ }
154
375
  // Re-export zod for convenience
155
376
  export { z };
377
+ /**
378
+ * Server-side WebSocket connection for receiving cron triggers.
379
+ *
380
+ * This connects to Tether with `?type=server` to identify as a server connection.
381
+ * Only server connections receive cron triggers - client connections do not.
382
+ *
383
+ * @example
384
+ * ```ts
385
+ * import { TetherCronConnection } from '@tthr/server';
386
+ *
387
+ * const cronConnection = new TetherCronConnection({
388
+ * url: process.env.TETHER_URL!,
389
+ * projectId: process.env.TETHER_PROJECT_ID!,
390
+ * apiKey: process.env.TETHER_API_KEY!,
391
+ * onCronTrigger: async (functionName, args) => {
392
+ * // Execute your function here
393
+ * try {
394
+ * const result = await executeFunction(functionName, args);
395
+ * return { success: true, result };
396
+ * } catch (error) {
397
+ * return { success: false, error: error.message };
398
+ * }
399
+ * },
400
+ * });
401
+ *
402
+ * await cronConnection.connect();
403
+ * ```
404
+ */
405
+ export class TetherCronConnection {
406
+ options;
407
+ ws = null;
408
+ connectionId = null;
409
+ reconnectAttempts = 0;
410
+ maxReconnectAttempts = 10;
411
+ reconnectDelay = 1000;
412
+ isConnecting = false;
413
+ shouldReconnect = true;
414
+ // Heartbeat configuration
415
+ heartbeatInterval = 30000; // 30 seconds
416
+ heartbeatTimeout = 10000; // 10 seconds to receive pong
417
+ heartbeatTimer = null;
418
+ heartbeatTimeoutTimer = null;
419
+ awaitingPong = false;
420
+ constructor(options) {
421
+ this.options = options;
422
+ }
423
+ /**
424
+ * Get the WebSocket URL with server type parameter
425
+ */
426
+ getWsUrl() {
427
+ const base = this.options.url
428
+ .replace('https://', 'wss://')
429
+ .replace('http://', 'ws://')
430
+ .replace(/\/$/, '');
431
+ const env = this.options.environment;
432
+ let wsPath;
433
+ if (env && env !== 'production') {
434
+ wsPath = `${base}/ws/${this.options.projectId}/${env}`;
435
+ }
436
+ else {
437
+ wsPath = `${base}/ws/${this.options.projectId}`;
438
+ }
439
+ // Add type=server to identify as server connection and token for auth
440
+ return `${wsPath}?type=server&token=${encodeURIComponent(this.options.apiKey)}`;
441
+ }
442
+ /**
443
+ * Connect to Tether server
444
+ */
445
+ async connect() {
446
+ if (this.ws?.readyState === WebSocket.OPEN) {
447
+ return;
448
+ }
449
+ if (this.isConnecting) {
450
+ return;
451
+ }
452
+ this.isConnecting = true;
453
+ this.shouldReconnect = true;
454
+ return new Promise((resolve, reject) => {
455
+ try {
456
+ const url = this.getWsUrl();
457
+ // Use ws package for Node.js if available, otherwise use global WebSocket
458
+ const WebSocketImpl = typeof WebSocket !== 'undefined' ? WebSocket : require('ws');
459
+ this.ws = new WebSocketImpl(url);
460
+ this.ws.onopen = () => {
461
+ this.reconnectAttempts = 0;
462
+ console.log('[Tether Cron] WebSocket connected');
463
+ };
464
+ this.ws.onmessage = async (event) => {
465
+ const data = typeof event.data === 'string' ? event.data : event.data.toString();
466
+ await this.handleMessage(data, resolve);
467
+ };
468
+ this.ws.onerror = (error) => {
469
+ const err = error instanceof Error ? error : new Error('WebSocket error');
470
+ console.error('[Tether Cron] WebSocket error:', err.message);
471
+ this.isConnecting = false;
472
+ this.options.onError?.(err);
473
+ reject(err);
474
+ };
475
+ this.ws.onclose = () => {
476
+ this.connectionId = null;
477
+ this.isConnecting = false;
478
+ this.stopHeartbeat();
479
+ console.log('[Tether Cron] WebSocket disconnected');
480
+ this.options.onDisconnected?.();
481
+ this.handleReconnect();
482
+ };
483
+ }
484
+ catch (error) {
485
+ this.isConnecting = false;
486
+ reject(error);
487
+ }
488
+ });
489
+ }
490
+ /**
491
+ * Handle incoming WebSocket message
492
+ */
493
+ async handleMessage(data, resolveConnect) {
494
+ try {
495
+ const message = JSON.parse(data);
496
+ switch (message.type) {
497
+ case 'connected':
498
+ this.connectionId = message.connection_id ?? null;
499
+ this.isConnecting = false;
500
+ this.startHeartbeat();
501
+ console.log(`[Tether Cron] Connected with ID: ${this.connectionId}`);
502
+ this.options.onConnected?.();
503
+ resolveConnect?.();
504
+ break;
505
+ case 'cron_trigger':
506
+ await this.handleCronTrigger(message);
507
+ break;
508
+ case 'pong':
509
+ this.awaitingPong = false;
510
+ if (this.heartbeatTimeoutTimer) {
511
+ clearTimeout(this.heartbeatTimeoutTimer);
512
+ this.heartbeatTimeoutTimer = null;
513
+ }
514
+ break;
515
+ case 'error':
516
+ console.error('[Tether Cron] Server error:', message.error);
517
+ break;
518
+ }
519
+ }
520
+ catch (e) {
521
+ console.error('[Tether Cron] Failed to parse message:', e);
522
+ }
523
+ }
524
+ /**
525
+ * Handle a cron trigger message
526
+ */
527
+ async handleCronTrigger(trigger) {
528
+ console.log(`[Tether Cron] Received trigger for ${trigger.functionName} (execution: ${trigger.executionId})`);
529
+ const startTime = Date.now();
530
+ try {
531
+ // Execute the handler
532
+ const result = await this.options.onCronTrigger(trigger.functionName, trigger.args);
533
+ const durationMs = Date.now() - startTime;
534
+ // Report result back to Tether
535
+ await this.reportExecution(trigger, result, durationMs);
536
+ }
537
+ catch (error) {
538
+ const durationMs = Date.now() - startTime;
539
+ const errorMessage = error instanceof Error ? error.message : String(error);
540
+ console.error(`[Tether Cron] Handler error for ${trigger.functionName}:`, errorMessage);
541
+ // Report failure
542
+ await this.reportExecution(trigger, { success: false, error: errorMessage }, durationMs);
543
+ }
544
+ }
545
+ /**
546
+ * Report execution result back to Tether
547
+ */
548
+ async reportExecution(trigger, result, durationMs) {
549
+ const base = this.options.url.replace(/\/$/, '');
550
+ const env = this.options.environment;
551
+ let apiPath;
552
+ if (env && env !== 'production') {
553
+ apiPath = `${base}/api/v1/projects/${this.options.projectId}/env/${env}`;
554
+ }
555
+ else {
556
+ apiPath = `${base}/api/v1/projects/${this.options.projectId}`;
557
+ }
558
+ const url = `${apiPath}/crons/${trigger.cronId}/executions`;
559
+ try {
560
+ const response = await fetch(url, {
561
+ method: 'POST',
562
+ headers: {
563
+ 'Content-Type': 'application/json',
564
+ 'Authorization': `Bearer ${this.options.apiKey}`,
565
+ },
566
+ body: JSON.stringify({
567
+ executionId: trigger.executionId,
568
+ success: result.success,
569
+ errorMessage: result.error,
570
+ result: result.result,
571
+ durationMs,
572
+ }),
573
+ });
574
+ if (!response.ok) {
575
+ console.error(`[Tether Cron] Failed to report execution: ${response.status} ${response.statusText}`);
576
+ }
577
+ else {
578
+ console.log(`[Tether Cron] Reported execution ${trigger.executionId}: ${result.success ? 'success' : 'failed'}`);
579
+ }
580
+ }
581
+ catch (error) {
582
+ console.error('[Tether Cron] Failed to report execution:', error);
583
+ }
584
+ }
585
+ /**
586
+ * Start heartbeat timer
587
+ */
588
+ startHeartbeat() {
589
+ this.stopHeartbeat();
590
+ this.heartbeatTimer = setInterval(() => {
591
+ if (this.ws?.readyState === WebSocket.OPEN) {
592
+ this.awaitingPong = true;
593
+ this.ws.send(JSON.stringify({ type: 'ping' }));
594
+ this.heartbeatTimeoutTimer = setTimeout(() => {
595
+ if (this.awaitingPong) {
596
+ console.warn('[Tether Cron] Heartbeat timeout - forcing reconnect');
597
+ this.ws?.close();
598
+ }
599
+ }, this.heartbeatTimeout);
600
+ }
601
+ }, this.heartbeatInterval);
602
+ }
603
+ /**
604
+ * Stop heartbeat timer
605
+ */
606
+ stopHeartbeat() {
607
+ if (this.heartbeatTimer) {
608
+ clearInterval(this.heartbeatTimer);
609
+ this.heartbeatTimer = null;
610
+ }
611
+ if (this.heartbeatTimeoutTimer) {
612
+ clearTimeout(this.heartbeatTimeoutTimer);
613
+ this.heartbeatTimeoutTimer = null;
614
+ }
615
+ this.awaitingPong = false;
616
+ }
617
+ /**
618
+ * Handle reconnection
619
+ */
620
+ handleReconnect() {
621
+ if (!this.shouldReconnect) {
622
+ return;
623
+ }
624
+ if (this.reconnectAttempts >= this.maxReconnectAttempts) {
625
+ console.error('[Tether Cron] Max reconnection attempts reached');
626
+ return;
627
+ }
628
+ this.reconnectAttempts++;
629
+ const delay = Math.min(this.reconnectDelay * Math.pow(2, this.reconnectAttempts - 1), 30000);
630
+ console.log(`[Tether Cron] Reconnecting in ${delay}ms (attempt ${this.reconnectAttempts}/${this.maxReconnectAttempts})`);
631
+ setTimeout(() => {
632
+ this.connect().catch((error) => {
633
+ console.error('[Tether Cron] Reconnection failed:', error);
634
+ });
635
+ }, delay);
636
+ }
637
+ /**
638
+ * Disconnect from Tether
639
+ */
640
+ disconnect() {
641
+ this.shouldReconnect = false;
642
+ this.stopHeartbeat();
643
+ if (this.ws) {
644
+ this.ws.close();
645
+ this.ws = null;
646
+ }
647
+ this.connectionId = null;
648
+ }
649
+ /**
650
+ * Check if connected
651
+ */
652
+ get isConnected() {
653
+ return this.ws?.readyState === WebSocket.OPEN;
654
+ }
655
+ }
156
656
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,CAAC,EAAgB,MAAM,KAAK,CAAC;AA6GtC;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,MAAM,UAAU,KAAK,CACnB,UAA2C;IAE3C,OAAO,UAAU,CAAC;AACpB,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,MAAM,UAAU,QAAQ,CACtB,UAA8C;IAE9C,OAAO,UAAU,CAAC;AACpB,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,MAAM,UAAU,MAAM,CACpB,UAA4C;IAE5C,OAAO,UAAU,CAAC;AACpB,CAAC;AAUD,MAAM,OAAO,kBAAkB;IACrB,OAAO,CAAsB;IAErC,YAAY,OAA4B;QACtC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,KAAK,CAAc,IAAY,EAAE,IAAc;QACnD,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,eAAe,EAAE;YAC/D,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;gBAClC,eAAe,EAAE,UAAU,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE;aACjD;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;SAC/C,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;YACpF,MAAM,IAAI,KAAK,CAAC,KAAK,CAAC,OAAO,IAAI,cAAc,CAAC,CAAC;QACnD,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QACrC,OAAO,MAAM,CAAC,IAAS,CAAC;IAC1B,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,QAAQ,CAAc,IAAY,EAAE,IAAc;QACtD,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,kBAAkB,EAAE;YAClE,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;gBAClC,eAAe,EAAE,UAAU,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE;aACjD;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;SAC/C,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;YACpF,MAAM,IAAI,KAAK,CAAC,KAAK,CAAC,OAAO,IAAI,iBAAiB,CAAC,CAAC;QACtD,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QACrC,OAAO,MAAM,CAAC,IAAS,CAAC;IAC1B,CAAC;CACF;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,OAA4B;IACvD,OAAO,IAAI,kBAAkB,CAAC,OAAO,CAAC,CAAC;AACzC,CAAC;AAED,gCAAgC;AAChC,OAAO,EAAE,CAAC,EAAE,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tthr/server",
3
- "version": "0.0.4",
3
+ "version": "0.0.6",
4
4
  "description": "Tether server SDK for Node.js/Bun/Deno",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -14,15 +14,18 @@
14
14
  "files": [
15
15
  "dist"
16
16
  ],
17
- "scripts": {
18
- "build": "tsc",
19
- "dev": "tsc --watch",
20
- "typecheck": "tsc --noEmit"
21
- },
22
17
  "dependencies": {
18
+ "ws": "^8.18.0",
23
19
  "zod": "^3.24.0"
24
20
  },
25
21
  "devDependencies": {
22
+ "@types/node": "^22.0.0",
23
+ "@types/ws": "^8.5.13",
26
24
  "typescript": "^5.7.2"
25
+ },
26
+ "scripts": {
27
+ "build": "tsc",
28
+ "dev": "tsc --watch",
29
+ "typecheck": "tsc --noEmit"
27
30
  }
28
- }
31
+ }