-
Notifications
You must be signed in to change notification settings - Fork 5
Expand file tree
/
Copy pathshared.tsx
More file actions
121 lines (105 loc) · 2.49 KB
/
shared.tsx
File metadata and controls
121 lines (105 loc) · 2.49 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
import { SerovalJSON } from "seroval";
import { $TRACK, $PROXY } from "solid-js";
import { enablePatches } from "immer";
enablePatches();
export type WsMessage<T> = T & { id: string };
export type WsMessageUp =
// | {
// type: "subscribe";
// ref: SerializedReactiveThing;
// }
| {
type: "invoke";
ref: SerializedRef;
input: SerovalJSON;
}
| {
type: "value";
value: SerovalJSON;
}
| {
type: "create";
name: string;
input: SerovalJSON;
}
| {
type: "dispose";
};
export type WsMessageDown =
// | {
// type: "subscribe";
// ref: SerializedReactiveThing;
// }
| {
type: "invoke";
ref: SerializedRef;
input: SerovalJSON;
}
| {
type: "value";
value: SerovalJSON;
}
| {
type: "error";
error: SerovalJSON;
};
export type SerializedRef<I = any, O = any> = {
__type: "ref";
id: string;
scope: string;
};
export class SerializedRefClass {
constructor(public handler: Function) {}
}
export type SerializedMemo<O = any> = {
__type: "memo";
id: string;
scope: string;
initial?: O;
};
export class SerializedMemoClass {
constructor(public signal: Function) {}
}
export type SerializedProjection<O = any> = {
__type: "projection";
id: string;
scope: string;
initial?: O;
};
export class SerializedProjectionClass {
constructor(public init: any, public mutation: Function) {}
}
export type SerializedReactiveThing<T = any> =
| SerializedMemo<T>
| SerializedProjection<T>;
export type SerializedThing = SerializedRef | SerializedReactiveThing;
export function createSeriazliedRef(
opts: Omit<SerializedRef, "__type">
): SerializedRef {
return { ...opts, __type: "ref" };
}
export function createSeriazliedMemo(
opts: Omit<SerializedMemo, "__type">
): SerializedMemo {
return { ...opts, __type: "memo" };
}
export function createSeriazliedProjection(
opts: Omit<SerializedProjection, "__type">
): SerializedProjection {
return { ...opts, __type: "projection" };
}
export function createSocketRef<F extends Function>(source: F): F {
// @ts-expect-error
return new SerializedRefClass(source);
}
export function createSocketMemo<T>(source: () => T): () => T | undefined {
// @ts-expect-error
return new SerializedMemoClass(source);
}
export function createSocketProjection<T extends object>(
mutation: (draft: T) => void,
init?: T
): T | undefined {
// @ts-expect-error
return new SerializedProjectionClass(init, mutation);
}