@tthr/server 0.0.1
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 +124 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +133 -0
- package/dist/index.js.map +1 -0
- package/package.json +28 -0
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @tthr/server - Tether server SDK
|
|
3
|
+
*
|
|
4
|
+
* Define queries, mutations, and actions for your Tether project.
|
|
5
|
+
*/
|
|
6
|
+
import { z, type ZodType } from 'zod';
|
|
7
|
+
/**
|
|
8
|
+
* Execution context passed to function handlers
|
|
9
|
+
*/
|
|
10
|
+
export interface ExecutionContext {
|
|
11
|
+
auth: {
|
|
12
|
+
userId: string | null;
|
|
13
|
+
claims: Record<string, unknown>;
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Query function definition
|
|
18
|
+
*/
|
|
19
|
+
export interface QueryDefinition<TArgs, TResult> {
|
|
20
|
+
args?: ZodType<TArgs>;
|
|
21
|
+
handler: (args: TArgs, ctx: ExecutionContext) => Promise<TResult> | TResult;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Mutation function definition
|
|
25
|
+
*/
|
|
26
|
+
export interface MutationDefinition<TArgs, TResult> {
|
|
27
|
+
args?: ZodType<TArgs>;
|
|
28
|
+
handler: (args: TArgs, ctx: ExecutionContext) => Promise<TResult> | TResult;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Action function definition
|
|
32
|
+
*/
|
|
33
|
+
export interface ActionDefinition<TArgs, TResult> {
|
|
34
|
+
args?: ZodType<TArgs>;
|
|
35
|
+
handler: (args: TArgs, ctx: ExecutionContext) => Promise<TResult> | TResult;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Define a query function
|
|
39
|
+
*
|
|
40
|
+
* Queries are read-only and can be subscribed to for realtime updates.
|
|
41
|
+
*
|
|
42
|
+
* @example
|
|
43
|
+
* ```ts
|
|
44
|
+
* export const list = query({
|
|
45
|
+
* handler: async () => {
|
|
46
|
+
* return db.posts.findMany();
|
|
47
|
+
* },
|
|
48
|
+
* });
|
|
49
|
+
*
|
|
50
|
+
* export const byId = query({
|
|
51
|
+
* args: z.object({ id: z.number() }),
|
|
52
|
+
* handler: async ({ id }) => {
|
|
53
|
+
* return db.posts.findById(id);
|
|
54
|
+
* },
|
|
55
|
+
* });
|
|
56
|
+
* ```
|
|
57
|
+
*/
|
|
58
|
+
export declare function query<TArgs = void, TResult = unknown>(definition: QueryDefinition<TArgs, TResult> | ((ctx: ExecutionContext) => Promise<TResult> | TResult)): QueryDefinition<TArgs, TResult>;
|
|
59
|
+
/**
|
|
60
|
+
* Define a mutation function
|
|
61
|
+
*
|
|
62
|
+
* Mutations modify data and trigger updates to subscribed queries.
|
|
63
|
+
*
|
|
64
|
+
* @example
|
|
65
|
+
* ```ts
|
|
66
|
+
* export const create = mutation({
|
|
67
|
+
* args: z.object({
|
|
68
|
+
* title: z.string(),
|
|
69
|
+
* content: z.string(),
|
|
70
|
+
* }),
|
|
71
|
+
* handler: async ({ title, content }, { auth }) => {
|
|
72
|
+
* return db.posts.insert({ title, content, authorId: auth.userId });
|
|
73
|
+
* },
|
|
74
|
+
* });
|
|
75
|
+
* ```
|
|
76
|
+
*/
|
|
77
|
+
export declare function mutation<TArgs = void, TResult = unknown>(definition: MutationDefinition<TArgs, TResult>): MutationDefinition<TArgs, TResult>;
|
|
78
|
+
/**
|
|
79
|
+
* Define an action function
|
|
80
|
+
*
|
|
81
|
+
* Actions are for side effects like HTTP calls or sending emails.
|
|
82
|
+
* They are not transactional and don't trigger subscription updates.
|
|
83
|
+
*
|
|
84
|
+
* @example
|
|
85
|
+
* ```ts
|
|
86
|
+
* export const sendEmail = action({
|
|
87
|
+
* args: z.object({
|
|
88
|
+
* to: z.string().email(),
|
|
89
|
+
* subject: z.string(),
|
|
90
|
+
* body: z.string(),
|
|
91
|
+
* }),
|
|
92
|
+
* handler: async ({ to, subject, body }) => {
|
|
93
|
+
* await emailService.send({ to, subject, body });
|
|
94
|
+
* return { sent: true };
|
|
95
|
+
* },
|
|
96
|
+
* });
|
|
97
|
+
* ```
|
|
98
|
+
*/
|
|
99
|
+
export declare function action<TArgs = void, TResult = unknown>(definition: ActionDefinition<TArgs, TResult>): ActionDefinition<TArgs, TResult>;
|
|
100
|
+
/**
|
|
101
|
+
* Server-side Tether client for direct function calls
|
|
102
|
+
*/
|
|
103
|
+
export interface ServerClientOptions {
|
|
104
|
+
url: string;
|
|
105
|
+
apiKey: string;
|
|
106
|
+
}
|
|
107
|
+
export declare class TetherServerClient {
|
|
108
|
+
private options;
|
|
109
|
+
constructor(options: ServerClientOptions);
|
|
110
|
+
/**
|
|
111
|
+
* Execute a query function
|
|
112
|
+
*/
|
|
113
|
+
query<T = unknown>(name: string, args?: unknown): Promise<T>;
|
|
114
|
+
/**
|
|
115
|
+
* Execute a mutation function
|
|
116
|
+
*/
|
|
117
|
+
mutation<T = unknown>(name: string, args?: unknown): Promise<T>;
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Create a server-side Tether client
|
|
121
|
+
*/
|
|
122
|
+
export declare function createClient(options: ServerClientOptions): TetherServerClient;
|
|
123
|
+
export { z };
|
|
124
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,CAAC,EAAE,KAAK,OAAO,EAAE,MAAM,KAAK,CAAC;AAEtC;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE;QACJ,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;QACtB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;KACjC,CAAC;CACH;AAED;;GAEG;AACH,MAAM,WAAW,eAAe,CAAC,KAAK,EAAE,OAAO;IAC7C,IAAI,CAAC,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;IACtB,OAAO,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,gBAAgB,KAAK,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC;CAC7E;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB,CAAC,KAAK,EAAE,OAAO;IAChD,IAAI,CAAC,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;IACtB,OAAO,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,gBAAgB,KAAK,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC;CAC7E;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB,CAAC,KAAK,EAAE,OAAO;IAC9C,IAAI,CAAC,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;IACtB,OAAO,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,gBAAgB,KAAK,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC;CAC7E;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,KAAK,CAAC,KAAK,GAAG,IAAI,EAAE,OAAO,GAAG,OAAO,EACnD,UAAU,EAAE,eAAe,CAAC,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,gBAAgB,KAAK,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC,GACpG,eAAe,CAAC,KAAK,EAAE,OAAO,CAAC,CAOjC;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,QAAQ,CAAC,KAAK,GAAG,IAAI,EAAE,OAAO,GAAG,OAAO,EACtD,UAAU,EAAE,kBAAkB,CAAC,KAAK,EAAE,OAAO,CAAC,GAC7C,kBAAkB,CAAC,KAAK,EAAE,OAAO,CAAC,CAEpC;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,MAAM,CAAC,KAAK,GAAG,IAAI,EAAE,OAAO,GAAG,OAAO,EACpD,UAAU,EAAE,gBAAgB,CAAC,KAAK,EAAE,OAAO,CAAC,GAC3C,gBAAgB,CAAC,KAAK,EAAE,OAAO,CAAC,CAElC;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,OAAO,CAAsB;gBAEzB,OAAO,EAAE,mBAAmB;IAIxC;;OAEG;IACG,KAAK,CAAC,CAAC,GAAG,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC;IAmBlE;;OAEG;IACG,QAAQ,CAAC,CAAC,GAAG,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC;CAkBtE;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,mBAAmB,GAAG,kBAAkB,CAE7E;AAGD,OAAO,EAAE,CAAC,EAAE,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @tthr/server - Tether server SDK
|
|
3
|
+
*
|
|
4
|
+
* Define queries, mutations, and actions for your Tether project.
|
|
5
|
+
*/
|
|
6
|
+
import { z } from 'zod';
|
|
7
|
+
/**
|
|
8
|
+
* Define a query function
|
|
9
|
+
*
|
|
10
|
+
* Queries are read-only and can be subscribed to for realtime updates.
|
|
11
|
+
*
|
|
12
|
+
* @example
|
|
13
|
+
* ```ts
|
|
14
|
+
* export const list = query({
|
|
15
|
+
* handler: async () => {
|
|
16
|
+
* return db.posts.findMany();
|
|
17
|
+
* },
|
|
18
|
+
* });
|
|
19
|
+
*
|
|
20
|
+
* export const byId = query({
|
|
21
|
+
* args: z.object({ id: z.number() }),
|
|
22
|
+
* handler: async ({ id }) => {
|
|
23
|
+
* return db.posts.findById(id);
|
|
24
|
+
* },
|
|
25
|
+
* });
|
|
26
|
+
* ```
|
|
27
|
+
*/
|
|
28
|
+
export function query(definition) {
|
|
29
|
+
if (typeof definition === 'function') {
|
|
30
|
+
return {
|
|
31
|
+
handler: (_, ctx) => definition(ctx),
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
return definition;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Define a mutation function
|
|
38
|
+
*
|
|
39
|
+
* Mutations modify data and trigger updates to subscribed queries.
|
|
40
|
+
*
|
|
41
|
+
* @example
|
|
42
|
+
* ```ts
|
|
43
|
+
* export const create = mutation({
|
|
44
|
+
* args: z.object({
|
|
45
|
+
* title: z.string(),
|
|
46
|
+
* content: z.string(),
|
|
47
|
+
* }),
|
|
48
|
+
* handler: async ({ title, content }, { auth }) => {
|
|
49
|
+
* return db.posts.insert({ title, content, authorId: auth.userId });
|
|
50
|
+
* },
|
|
51
|
+
* });
|
|
52
|
+
* ```
|
|
53
|
+
*/
|
|
54
|
+
export function mutation(definition) {
|
|
55
|
+
return definition;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Define an action function
|
|
59
|
+
*
|
|
60
|
+
* Actions are for side effects like HTTP calls or sending emails.
|
|
61
|
+
* They are not transactional and don't trigger subscription updates.
|
|
62
|
+
*
|
|
63
|
+
* @example
|
|
64
|
+
* ```ts
|
|
65
|
+
* export const sendEmail = action({
|
|
66
|
+
* args: z.object({
|
|
67
|
+
* to: z.string().email(),
|
|
68
|
+
* subject: z.string(),
|
|
69
|
+
* body: z.string(),
|
|
70
|
+
* }),
|
|
71
|
+
* handler: async ({ to, subject, body }) => {
|
|
72
|
+
* await emailService.send({ to, subject, body });
|
|
73
|
+
* return { sent: true };
|
|
74
|
+
* },
|
|
75
|
+
* });
|
|
76
|
+
* ```
|
|
77
|
+
*/
|
|
78
|
+
export function action(definition) {
|
|
79
|
+
return definition;
|
|
80
|
+
}
|
|
81
|
+
export class TetherServerClient {
|
|
82
|
+
options;
|
|
83
|
+
constructor(options) {
|
|
84
|
+
this.options = options;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Execute a query function
|
|
88
|
+
*/
|
|
89
|
+
async query(name, args) {
|
|
90
|
+
const response = await fetch(`${this.options.url}/api/v1/query`, {
|
|
91
|
+
method: 'POST',
|
|
92
|
+
headers: {
|
|
93
|
+
'Content-Type': 'application/json',
|
|
94
|
+
'Authorization': `Bearer ${this.options.apiKey}`,
|
|
95
|
+
},
|
|
96
|
+
body: JSON.stringify({ function: name, args }),
|
|
97
|
+
});
|
|
98
|
+
if (!response.ok) {
|
|
99
|
+
const error = await response.json().catch(() => ({ message: response.statusText }));
|
|
100
|
+
throw new Error(error.message || 'Query failed');
|
|
101
|
+
}
|
|
102
|
+
const result = await response.json();
|
|
103
|
+
return result.data;
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Execute a mutation function
|
|
107
|
+
*/
|
|
108
|
+
async mutation(name, args) {
|
|
109
|
+
const response = await fetch(`${this.options.url}/api/v1/mutation`, {
|
|
110
|
+
method: 'POST',
|
|
111
|
+
headers: {
|
|
112
|
+
'Content-Type': 'application/json',
|
|
113
|
+
'Authorization': `Bearer ${this.options.apiKey}`,
|
|
114
|
+
},
|
|
115
|
+
body: JSON.stringify({ function: name, args }),
|
|
116
|
+
});
|
|
117
|
+
if (!response.ok) {
|
|
118
|
+
const error = await response.json().catch(() => ({ message: response.statusText }));
|
|
119
|
+
throw new Error(error.message || 'Mutation failed');
|
|
120
|
+
}
|
|
121
|
+
const result = await response.json();
|
|
122
|
+
return result.data;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Create a server-side Tether client
|
|
127
|
+
*/
|
|
128
|
+
export function createClient(options) {
|
|
129
|
+
return new TetherServerClient(options);
|
|
130
|
+
}
|
|
131
|
+
// Re-export zod for convenience
|
|
132
|
+
export { z };
|
|
133
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@tthr/server",
|
|
3
|
+
"version": "0.0.1",
|
|
4
|
+
"description": "Tether server SDK for Node.js/Bun/Deno",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./dist/index.js",
|
|
7
|
+
"types": "./dist/index.d.ts",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": {
|
|
10
|
+
"types": "./dist/index.d.ts",
|
|
11
|
+
"import": "./dist/index.js"
|
|
12
|
+
}
|
|
13
|
+
},
|
|
14
|
+
"files": [
|
|
15
|
+
"dist"
|
|
16
|
+
],
|
|
17
|
+
"scripts": {
|
|
18
|
+
"build": "tsc",
|
|
19
|
+
"dev": "tsc --watch",
|
|
20
|
+
"typecheck": "tsc --noEmit"
|
|
21
|
+
},
|
|
22
|
+
"dependencies": {
|
|
23
|
+
"zod": "^3.24.0"
|
|
24
|
+
},
|
|
25
|
+
"devDependencies": {
|
|
26
|
+
"typescript": "^5.7.2"
|
|
27
|
+
}
|
|
28
|
+
}
|