spacetimedb 2.2.0 → 2.4.0

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.
Files changed (83) hide show
  1. package/LICENSE.txt +2 -2
  2. package/dist/browser/vue/index.mjs +36 -1
  3. package/dist/browser/vue/index.mjs.map +1 -1
  4. package/dist/index.browser.mjs +50 -4
  5. package/dist/index.browser.mjs.map +1 -1
  6. package/dist/index.cjs +50 -4
  7. package/dist/index.cjs.map +1 -1
  8. package/dist/index.mjs +50 -4
  9. package/dist/index.mjs.map +1 -1
  10. package/dist/lib/autogen/types.d.ts +674 -18
  11. package/dist/lib/autogen/types.d.ts.map +1 -1
  12. package/dist/lib/reducers.d.ts +2 -0
  13. package/dist/lib/reducers.d.ts.map +1 -1
  14. package/dist/lib/schema.d.ts.map +1 -1
  15. package/dist/min/index.browser.mjs +1 -1
  16. package/dist/min/index.browser.mjs.map +1 -1
  17. package/dist/min/sdk/index.browser.mjs +1 -1
  18. package/dist/min/sdk/index.browser.mjs.map +1 -1
  19. package/dist/sdk/decompress.d.ts.map +1 -1
  20. package/dist/sdk/index.browser.mjs +50 -4
  21. package/dist/sdk/index.browser.mjs.map +1 -1
  22. package/dist/sdk/index.cjs +50 -4
  23. package/dist/sdk/index.cjs.map +1 -1
  24. package/dist/sdk/index.mjs +50 -4
  25. package/dist/sdk/index.mjs.map +1 -1
  26. package/dist/server/http.d.ts +1 -2
  27. package/dist/server/http.d.ts.map +1 -1
  28. package/dist/server/http.test-d.d.ts +2 -0
  29. package/dist/server/http.test-d.d.ts.map +1 -0
  30. package/dist/server/http_handlers.d.ts +82 -0
  31. package/dist/server/http_handlers.d.ts.map +1 -0
  32. package/dist/server/http_internal.d.ts +1 -32
  33. package/dist/server/http_internal.d.ts.map +1 -1
  34. package/dist/server/http_shared.d.ts +44 -0
  35. package/dist/server/http_shared.d.ts.map +1 -0
  36. package/dist/server/index.d.ts +2 -0
  37. package/dist/server/index.d.ts.map +1 -1
  38. package/dist/server/index.mjs +590 -136
  39. package/dist/server/index.mjs.map +1 -1
  40. package/dist/server/procedures.d.ts +2 -0
  41. package/dist/server/procedures.d.ts.map +1 -1
  42. package/dist/server/runtime.d.ts +2 -0
  43. package/dist/server/runtime.d.ts.map +1 -1
  44. package/dist/server/schema.d.ts +16 -1
  45. package/dist/server/schema.d.ts.map +1 -1
  46. package/dist/server/views.d.ts.map +1 -1
  47. package/dist/tanstack/index.cjs +34 -0
  48. package/dist/tanstack/index.cjs.map +1 -1
  49. package/dist/tanstack/index.d.ts +1 -0
  50. package/dist/tanstack/index.d.ts.map +1 -1
  51. package/dist/tanstack/index.mjs +34 -1
  52. package/dist/tanstack/index.mjs.map +1 -1
  53. package/dist/vue/index.cjs +36 -0
  54. package/dist/vue/index.cjs.map +1 -1
  55. package/dist/vue/index.d.ts +1 -0
  56. package/dist/vue/index.d.ts.map +1 -1
  57. package/dist/vue/index.mjs +36 -1
  58. package/dist/vue/index.mjs.map +1 -1
  59. package/dist/vue/useProcedure.d.ts +4 -0
  60. package/dist/vue/useProcedure.d.ts.map +1 -0
  61. package/package.json +1 -1
  62. package/src/lib/autogen/types.ts +29 -0
  63. package/src/lib/reducers.ts +2 -0
  64. package/src/lib/schema.ts +14 -0
  65. package/src/sdk/decompress.ts +19 -4
  66. package/src/sdk/logger.ts +1 -1
  67. package/src/server/http.test-d.ts +80 -0
  68. package/src/server/http.ts +14 -2
  69. package/src/server/http_handlers.ts +413 -0
  70. package/src/server/http_internal.ts +15 -142
  71. package/src/server/http_shared.ts +186 -0
  72. package/src/server/index.ts +11 -0
  73. package/src/server/procedures.ts +15 -31
  74. package/src/server/runtime.ts +142 -2
  75. package/src/server/schema.ts +71 -2
  76. package/src/server/sys.d.ts +7 -0
  77. package/src/server/views.ts +1 -0
  78. package/src/tanstack/index.ts +1 -0
  79. package/src/vue/index.ts +1 -0
  80. package/src/vue/useProcedure.ts +62 -0
  81. package/dist/lib/http_types.d.ts +0 -2
  82. package/dist/lib/http_types.d.ts.map +0 -1
  83. package/src/lib/http_types.ts +0 -8
@@ -1,5 +1,9 @@
1
1
  import { moduleHooks, type ModuleDefaultExport } from 'spacetime:sys@2.0';
2
- import { CaseConversionPolicy, Lifecycle } from '../lib/autogen/types';
2
+ import {
3
+ CaseConversionPolicy,
4
+ Lifecycle,
5
+ type MethodOrAny,
6
+ } from '../lib/autogen/types';
3
7
  import {
4
8
  type ParamsAsObject,
5
9
  type ParamsObj,
@@ -14,6 +18,14 @@ import {
14
18
  } from '../lib/schema';
15
19
  import type { UntypedTableSchema } from '../lib/table_schema';
16
20
  import { ColumnBuilder, TypeBuilder } from '../lib/type_builders';
21
+ import {
22
+ Router,
23
+ type HandlerFn,
24
+ type HttpHandlerExport,
25
+ type HttpHandlerOpts,
26
+ makeHttpHandlerExport,
27
+ makeHttpRouterExport,
28
+ } from './http_handlers';
17
29
  import {
18
30
  makeProcedureExport,
19
31
  type ProcedureExport,
@@ -47,10 +59,12 @@ export class SchemaInner<
47
59
  > extends ModuleContext {
48
60
  schemaType: S;
49
61
  existingFunctions = new Set<string>();
62
+ existingHttpHandlers = new Set<string>();
50
63
  reducers: Reducers = [];
51
64
  procedures: Procedures = [];
52
65
  views: Views = [];
53
66
  anonViews: AnonViews = [];
67
+ httpHandlers: HandlerFn[] = [];
54
68
  /**
55
69
  * Maps ReducerExport objects to the name of the reducer.
56
70
  * Used for resolving the reducers of scheduled tables.
@@ -60,7 +74,10 @@ export class SchemaInner<
60
74
  | ProcedureExport<UntypedSchemaDef, any, any>,
61
75
  string
62
76
  > = new Map();
77
+ httpHandlerExports: Map<HttpHandlerExport<UntypedSchemaDef>, string> =
78
+ new Map();
63
79
  pendingSchedules: PendingSchedule[] = [];
80
+ pendingHttpRoutes: PendingHttpRoute[] = [];
64
81
 
65
82
  constructor(getSchemaType: (ctx: SchemaInner<S>) => S) {
66
83
  super();
@@ -70,12 +87,21 @@ export class SchemaInner<
70
87
  defineFunction(name: string) {
71
88
  if (this.existingFunctions.has(name)) {
72
89
  throw new TypeError(
73
- `There is already a reducer or procedure with the name '${name}'`
90
+ `There is already a reducer, procedure, or view with the name '${name}'`
74
91
  );
75
92
  }
76
93
  this.existingFunctions.add(name);
77
94
  }
78
95
 
96
+ defineHttpHandler(name: string) {
97
+ if (this.existingHttpHandlers.has(name)) {
98
+ throw new TypeError(
99
+ `There is already an HTTP handler with the name '${name}'`
100
+ );
101
+ }
102
+ this.existingHttpHandlers.add(name);
103
+ }
104
+
79
105
  resolveSchedules() {
80
106
  for (const { reducer, scheduleAtCol, tableName } of this.pendingSchedules) {
81
107
  const functionName = this.functionExports.get(reducer());
@@ -91,9 +117,30 @@ export class SchemaInner<
91
117
  });
92
118
  }
93
119
  }
120
+
121
+ resolveHttpRoutes() {
122
+ for (const route of this.pendingHttpRoutes) {
123
+ const handlerFunction = this.httpHandlerExports.get(route.handler);
124
+ if (handlerFunction === undefined) {
125
+ throw new TypeError(
126
+ `HTTP route for path '${route.path}' refers to a handler that was not exported.`
127
+ );
128
+ }
129
+ this.moduleDef.httpRoutes.push({
130
+ handlerFunction,
131
+ method: route.method,
132
+ path: route.path,
133
+ });
134
+ }
135
+ }
94
136
  }
95
137
 
96
138
  type PendingSchedule = UntypedTableSchema['schedule'] & { tableName: string };
139
+ type PendingHttpRoute = {
140
+ handler: HttpHandlerExport<UntypedSchemaDef>;
141
+ method: MethodOrAny;
142
+ path: string;
143
+ };
97
144
 
98
145
  /**
99
146
  * The Schema class represents the database schema for a SpacetimeDB application.
@@ -153,6 +200,7 @@ export class Schema<S extends UntypedSchemaDef> implements ModuleDefaultExport {
153
200
  moduleExport[registerExport](registeredSchema, name);
154
201
  }
155
202
  registeredSchema.resolveSchedules();
203
+ registeredSchema.resolveHttpRoutes();
156
204
  return makeHooks(registeredSchema);
157
205
  }
158
206
 
@@ -458,6 +506,27 @@ export class Schema<S extends UntypedSchemaDef> implements ModuleDefaultExport {
458
506
  return makeProcedureExport(this.#ctx, opts, params, ret, fn);
459
507
  }
460
508
 
509
+ httpHandler(fn: HandlerFn<S>): HttpHandlerExport<S>;
510
+ httpHandler(opts: HttpHandlerOpts, fn: HandlerFn<S>): HttpHandlerExport<S>;
511
+ httpHandler(
512
+ ...args: [HandlerFn<S>] | [HttpHandlerOpts, HandlerFn<S>]
513
+ ): HttpHandlerExport<S> {
514
+ let opts: HttpHandlerOpts | undefined, fn: HandlerFn<S>;
515
+ switch (args.length) {
516
+ case 1:
517
+ [fn] = args;
518
+ break;
519
+ case 2:
520
+ [opts, fn] = args;
521
+ break;
522
+ }
523
+ return makeHttpHandlerExport(this.#ctx, opts, fn);
524
+ }
525
+
526
+ httpRouter(router: Router): ModuleExport {
527
+ return makeHttpRouterExport(this.#ctx, router);
528
+ }
529
+
461
530
  /**
462
531
  * Bundle multiple reducers, procedures, etc into one value to export.
463
532
  * The name they will be exported with is their corresponding key in the `exports` argument.
@@ -37,6 +37,13 @@ declare module 'spacetime:sys@2.0' {
37
37
  timestamp: bigint,
38
38
  args: Uint8Array
39
39
  ): Uint8Array;
40
+
41
+ __call_http_handler__(
42
+ id: u32,
43
+ timestamp: bigint,
44
+ request: Uint8Array,
45
+ body: Uint8Array
46
+ ): [response: Uint8Array, body: Uint8Array];
40
47
  }
41
48
 
42
49
  export function register_hooks(hooks: ModuleHooks);
@@ -143,6 +143,7 @@ export function registerView<
143
143
  ? AnonymousViewFn<S, Params, Ret>
144
144
  : ViewFn<S, Params, Ret>
145
145
  ) {
146
+ ctx.defineFunction(exportName);
146
147
  const paramsBuilder = new RowBuilder(params, toPascalCase(exportName));
147
148
 
148
149
  // Register return types if they are product types
@@ -13,3 +13,4 @@ export {
13
13
  export * from '../react/SpacetimeDBProvider';
14
14
  export { useSpacetimeDB } from '../react/useSpacetimeDB';
15
15
  export { useReducer } from '../react/useReducer';
16
+ export { useProcedure } from '../react/useProcedure';
package/src/vue/index.ts CHANGED
@@ -2,3 +2,4 @@ export * from './SpacetimeDBProvider.ts';
2
2
  export { useSpacetimeDB } from './useSpacetimeDB.ts';
3
3
  export { useTable } from './useTable.ts';
4
4
  export { useReducer } from './useReducer.ts';
5
+ export { useProcedure } from './useProcedure.ts';
@@ -0,0 +1,62 @@
1
+ import { shallowRef, watch, onUnmounted } from 'vue';
2
+ import { useSpacetimeDB } from './useSpacetimeDB';
3
+ import type { UntypedProcedureDef } from '../sdk/procedures';
4
+ import type {
5
+ ProcedureParamsType,
6
+ ProcedureReturnType,
7
+ } from '../sdk/type_utils';
8
+
9
+ export function useProcedure<ProcedureDef extends UntypedProcedureDef>(
10
+ procedureDef: ProcedureDef
11
+ ): (
12
+ ...params: ProcedureParamsType<ProcedureDef>
13
+ ) => Promise<ProcedureReturnType<ProcedureDef>> {
14
+ const conn = useSpacetimeDB();
15
+ const procedureName = procedureDef.accessorName;
16
+
17
+ const queueRef = shallowRef<
18
+ {
19
+ params: ProcedureParamsType<ProcedureDef>;
20
+ resolve: (val: any) => void;
21
+ reject: (err: unknown) => void;
22
+ }[]
23
+ >([]);
24
+
25
+ const stopWatch = watch(
26
+ () => conn.isActive,
27
+ () => {
28
+ const connection = conn.getConnection();
29
+ if (!connection) return;
30
+
31
+ const fn = (connection.procedures as any)[procedureName] as (
32
+ ...p: ProcedureParamsType<ProcedureDef>
33
+ ) => Promise<ProcedureReturnType<ProcedureDef>>;
34
+ if (queueRef.value.length) {
35
+ const pending = queueRef.value.splice(0);
36
+ for (const item of pending) {
37
+ fn(...item.params).then(item.resolve, item.reject);
38
+ }
39
+ }
40
+ },
41
+ { immediate: true }
42
+ );
43
+
44
+ onUnmounted(() => {
45
+ stopWatch();
46
+ });
47
+
48
+ return (...params: ProcedureParamsType<ProcedureDef>) => {
49
+ const connection = conn.getConnection();
50
+ if (!connection) {
51
+ return new Promise<ProcedureReturnType<ProcedureDef>>(
52
+ (resolve, reject) => {
53
+ queueRef.value.push({ params, resolve, reject });
54
+ }
55
+ );
56
+ }
57
+ const fn = (connection.procedures as any)[procedureName] as (
58
+ ...p: ProcedureParamsType<ProcedureDef>
59
+ ) => Promise<ProcedureReturnType<ProcedureDef>>;
60
+ return fn(...params);
61
+ };
62
+ }
@@ -1,2 +0,0 @@
1
- export { HttpHeaderPair, HttpHeaders, HttpMethod, HttpRequest, HttpResponse, HttpVersion, } from './autogen/types';
2
- //# sourceMappingURL=http_types.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"http_types.d.ts","sourceRoot":"","sources":["../../src/lib/http_types.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,EACd,WAAW,EACX,UAAU,EACV,WAAW,EACX,YAAY,EACZ,WAAW,GACZ,MAAM,iBAAiB,CAAC"}
@@ -1,8 +0,0 @@
1
- export {
2
- HttpHeaderPair,
3
- HttpHeaders,
4
- HttpMethod,
5
- HttpRequest,
6
- HttpResponse,
7
- HttpVersion,
8
- } from './autogen/types';