@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.
@@ -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":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,CAAC,EAAgB,MAAM,KAAK,CAAC;AAoCtC;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,UAAU,KAAK,CACnB,UAAqG;IAErG,IAAI,OAAO,UAAU,KAAK,UAAU,EAAE,CAAC;QACrC,OAAO;YACL,OAAO,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC;SACF,CAAC;IACvC,CAAC;IACD,OAAO,UAAU,CAAC;AACpB,CAAC;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,UAAU,QAAQ,CACtB,UAA8C;IAE9C,OAAO,UAAU,CAAC;AACpB,CAAC;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;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"}
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
+ }