rivetkit 2.0.27 → 2.0.29-rc.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/schemas/file-system-driver/v3.ts +167 -0
- package/dist/tsup/actor/errors.cjs +2 -2
- package/dist/tsup/actor/errors.js +1 -1
- package/dist/tsup/{chunk-TJ2PJ5C7.cjs → chunk-2Q6FJITJ.cjs} +3 -3
- package/dist/tsup/{chunk-TJ2PJ5C7.cjs.map → chunk-2Q6FJITJ.cjs.map} +1 -1
- package/dist/tsup/{chunk-GUH2PNPG.js → chunk-5RN6O2RW.js} +3 -3
- package/dist/tsup/{chunk-F3SQLO3X.cjs → chunk-AJ36VBHL.cjs} +13 -12
- package/dist/tsup/chunk-AJ36VBHL.cjs.map +1 -0
- package/dist/tsup/{chunk-4GJQDTAG.cjs → chunk-BAEMOCS7.cjs} +666 -342
- package/dist/tsup/chunk-BAEMOCS7.cjs.map +1 -0
- package/dist/tsup/chunk-CGIRSKRW.js +891 -0
- package/dist/tsup/chunk-CGIRSKRW.js.map +1 -0
- package/dist/tsup/{chunk-BBTOBXEO.js → chunk-CHPLLKNL.js} +579 -103
- package/dist/tsup/chunk-CHPLLKNL.js.map +1 -0
- package/dist/tsup/{chunk-D7A47BVR.js → chunk-EU7VV5PU.js} +2 -2
- package/dist/tsup/{chunk-2NNICHGY.js → chunk-EVQJYFFP.js} +2 -2
- package/dist/tsup/{chunk-C3UREFUI.js → chunk-HXWPIIEM.js} +15 -6
- package/dist/tsup/chunk-HXWPIIEM.js.map +1 -0
- package/dist/tsup/chunk-IRGPMCKQ.cjs +129 -0
- package/dist/tsup/chunk-IRGPMCKQ.cjs.map +1 -0
- package/dist/tsup/{chunk-QC4AE54W.cjs → chunk-J3M5ATO5.cjs} +3 -3
- package/dist/tsup/{chunk-QC4AE54W.cjs.map → chunk-J3M5ATO5.cjs.map} +1 -1
- package/dist/tsup/{chunk-DRJCTDDT.cjs → chunk-J74MGKP5.cjs} +20 -11
- package/dist/tsup/chunk-J74MGKP5.cjs.map +1 -0
- package/dist/tsup/{chunk-XJMYGATE.cjs → chunk-MAQSR26X.cjs} +8 -3
- package/dist/tsup/chunk-MAQSR26X.cjs.map +1 -0
- package/dist/tsup/{chunk-XNKWXMIT.cjs → chunk-MG2TWYPF.cjs} +794 -318
- package/dist/tsup/chunk-MG2TWYPF.cjs.map +1 -0
- package/dist/tsup/{chunk-LQOCWGP6.js → chunk-P2RZJPYI.js} +1 -1
- package/dist/tsup/{chunk-XU4GGB6J.js → chunk-QKDCNAPW.js} +504 -181
- package/dist/tsup/chunk-QKDCNAPW.js.map +1 -0
- package/dist/tsup/{chunk-G7YZSSWV.cjs → chunk-QT7PPLSB.cjs} +6 -6
- package/dist/tsup/{chunk-G7YZSSWV.cjs.map → chunk-QT7PPLSB.cjs.map} +1 -1
- package/dist/tsup/{chunk-VRZNWBDK.js → chunk-SDJFBUFE.js} +45 -46
- package/dist/tsup/chunk-SDJFBUFE.js.map +1 -0
- package/dist/tsup/chunk-SE37OCA2.cjs +891 -0
- package/dist/tsup/chunk-SE37OCA2.cjs.map +1 -0
- package/dist/tsup/{chunk-6F2NCX7R.js → chunk-WUFUT7CZ.js} +2 -2
- package/dist/tsup/{chunk-LZADH4QA.cjs → chunk-XVBIJET6.cjs} +10 -10
- package/dist/tsup/{chunk-LZADH4QA.cjs.map → chunk-XVBIJET6.cjs.map} +1 -1
- package/dist/tsup/{chunk-KSQQU7NC.js → chunk-YJXB7BPR.js} +8 -7
- package/dist/tsup/chunk-YJXB7BPR.js.map +1 -0
- package/dist/tsup/client/mod.cjs +9 -9
- package/dist/tsup/client/mod.d.cts +3 -2
- package/dist/tsup/client/mod.d.ts +3 -2
- package/dist/tsup/client/mod.js +8 -8
- package/dist/tsup/common/log.cjs +3 -3
- package/dist/tsup/common/log.d.cts +9 -1
- package/dist/tsup/common/log.d.ts +9 -1
- package/dist/tsup/common/log.js +2 -2
- package/dist/tsup/common/websocket.cjs +4 -4
- package/dist/tsup/common/websocket.js +3 -3
- package/dist/tsup/{config-Bo-blHpJ.d.ts → config-CcMdKDv9.d.ts} +301 -899
- package/dist/tsup/{config-BRDYDraU.d.cts → config-DxlmiJS1.d.cts} +301 -899
- package/dist/tsup/driver-helpers/mod.cjs +5 -5
- package/dist/tsup/driver-helpers/mod.d.cts +2 -1
- package/dist/tsup/driver-helpers/mod.d.ts +2 -1
- package/dist/tsup/driver-helpers/mod.js +4 -4
- package/dist/tsup/driver-test-suite/mod.cjs +74 -74
- package/dist/tsup/driver-test-suite/mod.d.cts +2 -1
- package/dist/tsup/driver-test-suite/mod.d.ts +2 -1
- package/dist/tsup/driver-test-suite/mod.js +11 -11
- package/dist/tsup/inspector/mod.cjs +6 -6
- package/dist/tsup/inspector/mod.d.cts +5 -4
- package/dist/tsup/inspector/mod.d.ts +5 -4
- package/dist/tsup/inspector/mod.js +5 -5
- package/dist/tsup/mod.cjs +10 -10
- package/dist/tsup/mod.d.cts +3 -2
- package/dist/tsup/mod.d.ts +3 -2
- package/dist/tsup/mod.js +9 -9
- package/dist/tsup/test/mod.cjs +12 -11
- package/dist/tsup/test/mod.cjs.map +1 -1
- package/dist/tsup/test/mod.d.cts +2 -6
- package/dist/tsup/test/mod.d.ts +2 -6
- package/dist/tsup/test/mod.js +11 -10
- package/dist/tsup/utils.cjs +3 -3
- package/dist/tsup/utils.js +2 -2
- package/package.json +7 -6
- package/src/actor/config.ts +21 -20
- package/src/actor/conn/mod.ts +5 -1
- package/src/actor/instance/connection-manager.ts +5 -1
- package/src/actor/instance/event-manager.ts +5 -1
- package/src/actor/instance/state-manager.ts +19 -3
- package/src/actor/protocol/old.ts +3 -0
- package/src/actor/protocol/serde.ts +5 -1
- package/src/actor/router-endpoints.ts +2 -0
- package/src/client/actor-conn.ts +2 -0
- package/src/client/actor-handle.ts +3 -0
- package/src/client/config.ts +1 -1
- package/src/client/utils.ts +4 -1
- package/src/common/router.ts +5 -1
- package/src/driver-helpers/utils.ts +8 -2
- package/src/drivers/engine/config.ts +6 -3
- package/src/drivers/file-system/global-state.ts +46 -1
- package/src/drivers/file-system/manager.ts +4 -0
- package/src/inspector/config.ts +1 -2
- package/src/manager/driver.ts +4 -0
- package/src/manager/router-schema.ts +7 -7
- package/src/manager/router.ts +4 -4
- package/src/registry/run-config.ts +9 -5
- package/src/remote-manager-driver/actor-http-client.ts +1 -1
- package/src/remote-manager-driver/api-utils.ts +2 -0
- package/src/schemas/actor-persist/versioned.ts +126 -54
- package/src/schemas/client-protocol/versioned.ts +173 -42
- package/src/schemas/file-system-driver/mod.ts +1 -1
- package/src/schemas/file-system-driver/versioned.ts +129 -45
- package/src/serde.ts +9 -2
- package/src/test/config.ts +13 -12
- package/src/test/mod.ts +56 -82
- package/dist/tsup/chunk-2TZH6VO6.cjs +0 -514
- package/dist/tsup/chunk-2TZH6VO6.cjs.map +0 -1
- package/dist/tsup/chunk-4GJQDTAG.cjs.map +0 -1
- package/dist/tsup/chunk-5YDKTW6Y.js +0 -514
- package/dist/tsup/chunk-5YDKTW6Y.js.map +0 -1
- package/dist/tsup/chunk-BBTOBXEO.js.map +0 -1
- package/dist/tsup/chunk-C3UREFUI.js.map +0 -1
- package/dist/tsup/chunk-DRJCTDDT.cjs.map +0 -1
- package/dist/tsup/chunk-F3SQLO3X.cjs.map +0 -1
- package/dist/tsup/chunk-FYZLEH57.cjs +0 -130
- package/dist/tsup/chunk-FYZLEH57.cjs.map +0 -1
- package/dist/tsup/chunk-KSQQU7NC.js.map +0 -1
- package/dist/tsup/chunk-VRZNWBDK.js.map +0 -1
- package/dist/tsup/chunk-XJMYGATE.cjs.map +0 -1
- package/dist/tsup/chunk-XNKWXMIT.cjs.map +0 -1
- package/dist/tsup/chunk-XU4GGB6J.js.map +0 -1
- package/src/common/versioned-data.ts +0 -95
- /package/dist/tsup/{chunk-GUH2PNPG.js.map → chunk-5RN6O2RW.js.map} +0 -0
- /package/dist/tsup/{chunk-D7A47BVR.js.map → chunk-EU7VV5PU.js.map} +0 -0
- /package/dist/tsup/{chunk-2NNICHGY.js.map → chunk-EVQJYFFP.js.map} +0 -0
- /package/dist/tsup/{chunk-LQOCWGP6.js.map → chunk-P2RZJPYI.js.map} +0 -0
- /package/dist/tsup/{chunk-6F2NCX7R.js.map → chunk-WUFUT7CZ.js.map} +0 -0
|
@@ -1,66 +1,138 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
} from "@/common/versioned-data";
|
|
5
|
-
import type * as v1 from "../../../dist/schemas/actor-persist/v1";
|
|
6
|
-
import type * as v2 from "../../../dist/schemas/actor-persist/v2";
|
|
1
|
+
import { createVersionedDataHandler } from "vbare";
|
|
2
|
+
import * as v1 from "../../../dist/schemas/actor-persist/v1";
|
|
3
|
+
import * as v2 from "../../../dist/schemas/actor-persist/v2";
|
|
7
4
|
import * as v3 from "../../../dist/schemas/actor-persist/v3";
|
|
8
5
|
|
|
9
6
|
export const CURRENT_VERSION = 3;
|
|
10
7
|
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
hibernatableWebSockets: [],
|
|
21
|
-
}),
|
|
22
|
-
],
|
|
23
|
-
[
|
|
24
|
-
2,
|
|
25
|
-
(v2Data: v2.PersistedActor): v3.Actor => {
|
|
26
|
-
// Transform scheduled events from nested structure to flat structure
|
|
27
|
-
const scheduledEvents: v3.ScheduleEvent[] =
|
|
28
|
-
v2Data.scheduledEvents.map((event) => {
|
|
29
|
-
// Extract action and args from the kind wrapper
|
|
30
|
-
if (event.kind.tag === "GenericPersistedScheduleEvent") {
|
|
31
|
-
return {
|
|
32
|
-
eventId: event.eventId,
|
|
33
|
-
timestamp: event.timestamp,
|
|
34
|
-
action: event.kind.val.action,
|
|
35
|
-
args: event.kind.val.args,
|
|
36
|
-
};
|
|
37
|
-
}
|
|
38
|
-
// Fallback for unknown kinds
|
|
39
|
-
throw new Error(
|
|
40
|
-
`Unknown schedule event kind: ${event.kind.tag}`,
|
|
41
|
-
);
|
|
42
|
-
});
|
|
8
|
+
// Converter from v1 to v2
|
|
9
|
+
const v1ToV2 = (v1Data: v1.PersistedActor): v2.PersistedActor => ({
|
|
10
|
+
...v1Data,
|
|
11
|
+
connections: v1Data.connections.map((conn) => ({
|
|
12
|
+
...conn,
|
|
13
|
+
hibernatableRequestId: null,
|
|
14
|
+
})),
|
|
15
|
+
hibernatableWebSockets: [],
|
|
16
|
+
});
|
|
43
17
|
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
18
|
+
// Converter from v2 to v3
|
|
19
|
+
const v2ToV3 = (v2Data: v2.PersistedActor): v3.Actor => {
|
|
20
|
+
// Transform scheduled events from nested structure to flat structure
|
|
21
|
+
const scheduledEvents: v3.ScheduleEvent[] = v2Data.scheduledEvents.map(
|
|
22
|
+
(event) => {
|
|
23
|
+
// Extract action and args from the kind wrapper
|
|
24
|
+
if (event.kind.tag === "GenericPersistedScheduleEvent") {
|
|
25
|
+
return {
|
|
26
|
+
eventId: event.eventId,
|
|
27
|
+
timestamp: event.timestamp,
|
|
28
|
+
action: event.kind.val.action,
|
|
29
|
+
args: event.kind.val.args,
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
// Fallback for unknown kinds
|
|
33
|
+
throw new Error(`Unknown schedule event kind: ${event.kind.tag}`);
|
|
50
34
|
},
|
|
51
|
-
|
|
52
|
-
|
|
35
|
+
);
|
|
36
|
+
|
|
37
|
+
return {
|
|
38
|
+
input: v2Data.input,
|
|
39
|
+
hasInitialized: v2Data.hasInitialized,
|
|
40
|
+
state: v2Data.state,
|
|
41
|
+
scheduledEvents,
|
|
42
|
+
};
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
// Converter from v3 to v2
|
|
46
|
+
const v3ToV2 = (v3Data: v3.Actor): v2.PersistedActor => {
|
|
47
|
+
// Transform scheduled events from flat structure back to nested structure
|
|
48
|
+
const scheduledEvents: v2.PersistedScheduleEvent[] = v3Data.scheduledEvents.map(
|
|
49
|
+
(event) => ({
|
|
50
|
+
eventId: event.eventId,
|
|
51
|
+
timestamp: event.timestamp,
|
|
52
|
+
kind: {
|
|
53
|
+
tag: "GenericPersistedScheduleEvent" as const,
|
|
54
|
+
val: {
|
|
55
|
+
action: event.action,
|
|
56
|
+
args: event.args,
|
|
57
|
+
},
|
|
58
|
+
},
|
|
59
|
+
}),
|
|
60
|
+
);
|
|
61
|
+
|
|
62
|
+
return {
|
|
63
|
+
input: v3Data.input,
|
|
64
|
+
hasInitialized: v3Data.hasInitialized,
|
|
65
|
+
state: v3Data.state,
|
|
66
|
+
scheduledEvents,
|
|
67
|
+
connections: [],
|
|
68
|
+
hibernatableWebSockets: [],
|
|
69
|
+
};
|
|
70
|
+
};
|
|
71
|
+
|
|
72
|
+
// Converter from v2 to v1
|
|
73
|
+
const v2ToV1 = (v2Data: v2.PersistedActor): v1.PersistedActor => {
|
|
74
|
+
return {
|
|
75
|
+
input: v2Data.input,
|
|
76
|
+
hasInitialized: v2Data.hasInitialized,
|
|
77
|
+
state: v2Data.state,
|
|
78
|
+
scheduledEvents: v2Data.scheduledEvents,
|
|
79
|
+
connections: v2Data.connections.map((conn) => {
|
|
80
|
+
const { hibernatableRequestId, ...rest } = conn;
|
|
81
|
+
return rest;
|
|
82
|
+
}),
|
|
83
|
+
};
|
|
84
|
+
};
|
|
53
85
|
|
|
54
86
|
export const ACTOR_VERSIONED = createVersionedDataHandler<v3.Actor>({
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
87
|
+
deserializeVersion: (bytes, version) => {
|
|
88
|
+
switch (version) {
|
|
89
|
+
case 1:
|
|
90
|
+
return v1.decodePersistedActor(bytes);
|
|
91
|
+
case 2:
|
|
92
|
+
return v2.decodePersistedActor(bytes);
|
|
93
|
+
case 3:
|
|
94
|
+
return v3.decodeActor(bytes);
|
|
95
|
+
default:
|
|
96
|
+
throw new Error(`Unknown version ${version}`);
|
|
97
|
+
}
|
|
98
|
+
},
|
|
99
|
+
serializeVersion: (data, version) => {
|
|
100
|
+
switch (version) {
|
|
101
|
+
case 1:
|
|
102
|
+
return v1.encodePersistedActor(data as v1.PersistedActor);
|
|
103
|
+
case 2:
|
|
104
|
+
return v2.encodePersistedActor(data as v2.PersistedActor);
|
|
105
|
+
case 3:
|
|
106
|
+
return v3.encodeActor(data as v3.Actor);
|
|
107
|
+
default:
|
|
108
|
+
throw new Error(`Unknown version ${version}`);
|
|
109
|
+
}
|
|
110
|
+
},
|
|
111
|
+
deserializeConverters: () => [v1ToV2, v2ToV3],
|
|
112
|
+
serializeConverters: () => [v3ToV2, v2ToV1],
|
|
59
113
|
});
|
|
60
114
|
|
|
61
115
|
export const CONN_VERSIONED = createVersionedDataHandler<v3.Conn>({
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
116
|
+
deserializeVersion: (bytes, version) => {
|
|
117
|
+
switch (version) {
|
|
118
|
+
case 3:
|
|
119
|
+
return v3.decodeConn(bytes);
|
|
120
|
+
default:
|
|
121
|
+
throw new Error(
|
|
122
|
+
`Conn type only exists in version 3+, got version ${version}`,
|
|
123
|
+
);
|
|
124
|
+
}
|
|
125
|
+
},
|
|
126
|
+
serializeVersion: (data, version) => {
|
|
127
|
+
switch (version) {
|
|
128
|
+
case 3:
|
|
129
|
+
return v3.encodeConn(data as v3.Conn);
|
|
130
|
+
default:
|
|
131
|
+
throw new Error(
|
|
132
|
+
`Conn type only exists in version 3+, got version ${version}`,
|
|
133
|
+
);
|
|
134
|
+
}
|
|
135
|
+
},
|
|
136
|
+
deserializeConverters: () => [],
|
|
137
|
+
serializeConverters: () => [],
|
|
66
138
|
});
|
|
@@ -1,16 +1,11 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
type MigrationFn,
|
|
4
|
-
} from "@/common/versioned-data";
|
|
5
|
-
import type * as v1 from "../../../dist/schemas/client-protocol/v1";
|
|
1
|
+
import { createVersionedDataHandler } from "vbare";
|
|
2
|
+
import * as v1 from "../../../dist/schemas/client-protocol/v1";
|
|
6
3
|
import * as v2 from "../../../dist/schemas/client-protocol/v2";
|
|
7
4
|
|
|
8
5
|
export const CURRENT_VERSION = 2;
|
|
9
6
|
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
// Migration from v1 to v2: Remove connectionToken from Init message
|
|
13
|
-
migrations.set(1, (v1Data: v1.ToClient): v2.ToClient => {
|
|
7
|
+
// Converter from v1 to v2: Remove connectionToken from Init message
|
|
8
|
+
const v1ToV2 = (v1Data: v1.ToClient): v2.ToClient => {
|
|
14
9
|
// Handle Init message specifically to remove connectionToken
|
|
15
10
|
if (v1Data.body.tag === "Init") {
|
|
16
11
|
const { actorId, connectionId } = v1Data.body.val as v1.Init;
|
|
@@ -26,58 +21,194 @@ migrations.set(1, (v1Data: v1.ToClient): v2.ToClient => {
|
|
|
26
21
|
}
|
|
27
22
|
// All other messages are unchanged
|
|
28
23
|
return v1Data as unknown as v2.ToClient;
|
|
29
|
-
}
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
// Converter from v2 to v1: Add empty connectionToken to Init message
|
|
27
|
+
const v2ToV1 = (v2Data: v2.ToClient): v1.ToClient => {
|
|
28
|
+
// Handle Init message specifically to add connectionToken
|
|
29
|
+
if (v2Data.body.tag === "Init") {
|
|
30
|
+
const { actorId, connectionId } = v2Data.body.val;
|
|
31
|
+
return {
|
|
32
|
+
body: {
|
|
33
|
+
tag: "Init",
|
|
34
|
+
val: {
|
|
35
|
+
actorId,
|
|
36
|
+
connectionId,
|
|
37
|
+
connectionToken: "", // Add empty connectionToken for v1 compatibility
|
|
38
|
+
},
|
|
39
|
+
},
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
// All other messages are unchanged
|
|
43
|
+
return v2Data as unknown as v1.ToClient;
|
|
44
|
+
};
|
|
30
45
|
|
|
31
46
|
export const TO_SERVER_VERSIONED = createVersionedDataHandler<v2.ToServer>({
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
47
|
+
deserializeVersion: (bytes, version) => {
|
|
48
|
+
switch (version) {
|
|
49
|
+
case 1:
|
|
50
|
+
return v1.decodeToServer(bytes);
|
|
51
|
+
case 2:
|
|
52
|
+
return v2.decodeToServer(bytes);
|
|
53
|
+
default:
|
|
54
|
+
throw new Error(`Unknown version ${version}`);
|
|
55
|
+
}
|
|
56
|
+
},
|
|
57
|
+
serializeVersion: (data, version) => {
|
|
58
|
+
switch (version) {
|
|
59
|
+
case 1:
|
|
60
|
+
return v1.encodeToServer(data as v1.ToServer);
|
|
61
|
+
case 2:
|
|
62
|
+
return v2.encodeToServer(data as v2.ToServer);
|
|
63
|
+
default:
|
|
64
|
+
throw new Error(`Unknown version ${version}`);
|
|
65
|
+
}
|
|
66
|
+
},
|
|
67
|
+
deserializeConverters: () => [v1ToV2],
|
|
68
|
+
serializeConverters: () => [v2ToV1],
|
|
36
69
|
});
|
|
37
70
|
|
|
38
71
|
export const TO_CLIENT_VERSIONED = createVersionedDataHandler<v2.ToClient>({
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
72
|
+
deserializeVersion: (bytes, version) => {
|
|
73
|
+
switch (version) {
|
|
74
|
+
case 1:
|
|
75
|
+
return v1.decodeToClient(bytes);
|
|
76
|
+
case 2:
|
|
77
|
+
return v2.decodeToClient(bytes);
|
|
78
|
+
default:
|
|
79
|
+
throw new Error(`Unknown version ${version}`);
|
|
80
|
+
}
|
|
81
|
+
},
|
|
82
|
+
serializeVersion: (data, version) => {
|
|
83
|
+
switch (version) {
|
|
84
|
+
case 1:
|
|
85
|
+
return v1.encodeToClient(data as v1.ToClient);
|
|
86
|
+
case 2:
|
|
87
|
+
return v2.encodeToClient(data as v2.ToClient);
|
|
88
|
+
default:
|
|
89
|
+
throw new Error(`Unknown version ${version}`);
|
|
90
|
+
}
|
|
91
|
+
},
|
|
92
|
+
deserializeConverters: () => [v1ToV2],
|
|
93
|
+
serializeConverters: () => [v2ToV1],
|
|
43
94
|
});
|
|
44
95
|
|
|
45
96
|
export const HTTP_ACTION_REQUEST_VERSIONED =
|
|
46
97
|
createVersionedDataHandler<v2.HttpActionRequest>({
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
98
|
+
deserializeVersion: (bytes, version) => {
|
|
99
|
+
switch (version) {
|
|
100
|
+
case 1:
|
|
101
|
+
return v1.decodeHttpActionRequest(bytes);
|
|
102
|
+
case 2:
|
|
103
|
+
return v2.decodeHttpActionRequest(bytes);
|
|
104
|
+
default:
|
|
105
|
+
throw new Error(`Unknown version ${version}`);
|
|
106
|
+
}
|
|
107
|
+
},
|
|
108
|
+
serializeVersion: (data, version) => {
|
|
109
|
+
switch (version) {
|
|
110
|
+
case 1:
|
|
111
|
+
return v1.encodeHttpActionRequest(
|
|
112
|
+
data as v1.HttpActionRequest,
|
|
113
|
+
);
|
|
114
|
+
case 2:
|
|
115
|
+
return v2.encodeHttpActionRequest(
|
|
116
|
+
data as v2.HttpActionRequest,
|
|
117
|
+
);
|
|
118
|
+
default:
|
|
119
|
+
throw new Error(`Unknown version ${version}`);
|
|
120
|
+
}
|
|
121
|
+
},
|
|
122
|
+
deserializeConverters: () => [],
|
|
123
|
+
serializeConverters: () => [],
|
|
51
124
|
});
|
|
52
125
|
|
|
53
126
|
export const HTTP_ACTION_RESPONSE_VERSIONED =
|
|
54
127
|
createVersionedDataHandler<v2.HttpActionResponse>({
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
128
|
+
deserializeVersion: (bytes, version) => {
|
|
129
|
+
switch (version) {
|
|
130
|
+
case 1:
|
|
131
|
+
return v1.decodeHttpActionResponse(bytes);
|
|
132
|
+
case 2:
|
|
133
|
+
return v2.decodeHttpActionResponse(bytes);
|
|
134
|
+
default:
|
|
135
|
+
throw new Error(`Unknown version ${version}`);
|
|
136
|
+
}
|
|
137
|
+
},
|
|
138
|
+
serializeVersion: (data, version) => {
|
|
139
|
+
switch (version) {
|
|
140
|
+
case 1:
|
|
141
|
+
return v1.encodeHttpActionResponse(
|
|
142
|
+
data as v1.HttpActionResponse,
|
|
143
|
+
);
|
|
144
|
+
case 2:
|
|
145
|
+
return v2.encodeHttpActionResponse(
|
|
146
|
+
data as v2.HttpActionResponse,
|
|
147
|
+
);
|
|
148
|
+
default:
|
|
149
|
+
throw new Error(`Unknown version ${version}`);
|
|
150
|
+
}
|
|
151
|
+
},
|
|
152
|
+
deserializeConverters: () => [],
|
|
153
|
+
serializeConverters: () => [],
|
|
59
154
|
});
|
|
60
155
|
|
|
61
156
|
export const HTTP_RESPONSE_ERROR_VERSIONED =
|
|
62
157
|
createVersionedDataHandler<v2.HttpResponseError>({
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
serializeVersion: (
|
|
74
|
-
|
|
158
|
+
deserializeVersion: (bytes, version) => {
|
|
159
|
+
switch (version) {
|
|
160
|
+
case 1:
|
|
161
|
+
return v1.decodeHttpResponseError(bytes);
|
|
162
|
+
case 2:
|
|
163
|
+
return v2.decodeHttpResponseError(bytes);
|
|
164
|
+
default:
|
|
165
|
+
throw new Error(`Unknown version ${version}`);
|
|
166
|
+
}
|
|
167
|
+
},
|
|
168
|
+
serializeVersion: (data, version) => {
|
|
169
|
+
switch (version) {
|
|
170
|
+
case 1:
|
|
171
|
+
return v1.encodeHttpResponseError(
|
|
172
|
+
data as v1.HttpResponseError,
|
|
173
|
+
);
|
|
174
|
+
case 2:
|
|
175
|
+
return v2.encodeHttpResponseError(
|
|
176
|
+
data as v2.HttpResponseError,
|
|
177
|
+
);
|
|
178
|
+
default:
|
|
179
|
+
throw new Error(`Unknown version ${version}`);
|
|
180
|
+
}
|
|
181
|
+
},
|
|
182
|
+
deserializeConverters: () => [],
|
|
183
|
+
serializeConverters: () => [],
|
|
75
184
|
});
|
|
76
185
|
|
|
77
186
|
export const HTTP_RESOLVE_RESPONSE_VERSIONED =
|
|
78
187
|
createVersionedDataHandler<v2.HttpResolveResponse>({
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
188
|
+
deserializeVersion: (bytes, version) => {
|
|
189
|
+
switch (version) {
|
|
190
|
+
case 1:
|
|
191
|
+
return v1.decodeHttpResolveResponse(bytes);
|
|
192
|
+
case 2:
|
|
193
|
+
return v2.decodeHttpResolveResponse(bytes);
|
|
194
|
+
default:
|
|
195
|
+
throw new Error(`Unknown version ${version}`);
|
|
196
|
+
}
|
|
197
|
+
},
|
|
198
|
+
serializeVersion: (data, version) => {
|
|
199
|
+
switch (version) {
|
|
200
|
+
case 1:
|
|
201
|
+
return v1.encodeHttpResolveResponse(
|
|
202
|
+
data as v1.HttpResolveResponse,
|
|
203
|
+
);
|
|
204
|
+
case 2:
|
|
205
|
+
return v2.encodeHttpResolveResponse(
|
|
206
|
+
data as v2.HttpResolveResponse,
|
|
207
|
+
);
|
|
208
|
+
default:
|
|
209
|
+
throw new Error(`Unknown version ${version}`);
|
|
210
|
+
}
|
|
211
|
+
},
|
|
212
|
+
deserializeConverters: () => [],
|
|
213
|
+
serializeConverters: () => [],
|
|
83
214
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export * from "../../../dist/schemas/file-system-driver/
|
|
1
|
+
export * from "../../../dist/schemas/file-system-driver/v3";
|
|
@@ -1,51 +1,135 @@
|
|
|
1
|
-
import {
|
|
2
|
-
createVersionedDataHandler,
|
|
3
|
-
type MigrationFn,
|
|
4
|
-
} from "@/common/versioned-data";
|
|
1
|
+
import { createVersionedDataHandler } from "vbare";
|
|
5
2
|
import { bufferToArrayBuffer } from "@/utils";
|
|
6
|
-
import
|
|
3
|
+
import * as v1 from "../../../dist/schemas/file-system-driver/v1";
|
|
7
4
|
import * as v2 from "../../../dist/schemas/file-system-driver/v2";
|
|
5
|
+
import * as v3 from "../../../dist/schemas/file-system-driver/v3";
|
|
8
6
|
|
|
9
|
-
export const CURRENT_VERSION =
|
|
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
|
-
|
|
7
|
+
export const CURRENT_VERSION = 3;
|
|
8
|
+
|
|
9
|
+
// Converter from v1 to v2
|
|
10
|
+
const v1ToV2 = (v1State: v1.ActorState): v2.ActorState => {
|
|
11
|
+
// Create a new kvStorage list with the legacy persist data
|
|
12
|
+
const kvStorage: v2.ActorKvEntry[] = [];
|
|
13
|
+
|
|
14
|
+
// Store the legacy persist data under key [1]
|
|
15
|
+
if (v1State.persistedData) {
|
|
16
|
+
// Key [1] as Uint8Array
|
|
17
|
+
const key = new Uint8Array([1]);
|
|
18
|
+
kvStorage.push({
|
|
19
|
+
key: bufferToArrayBuffer(key),
|
|
20
|
+
value: v1State.persistedData,
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
return {
|
|
25
|
+
actorId: v1State.actorId,
|
|
26
|
+
name: v1State.name,
|
|
27
|
+
key: v1State.key,
|
|
28
|
+
kvStorage,
|
|
29
|
+
createdAt: v1State.createdAt,
|
|
30
|
+
};
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
// Converter from v2 to v3
|
|
34
|
+
const v2ToV3 = (v2State: v2.ActorState): v3.ActorState => {
|
|
35
|
+
// Migrate from v2 to v3 by adding the new optional timestamp fields
|
|
36
|
+
return {
|
|
37
|
+
actorId: v2State.actorId,
|
|
38
|
+
name: v2State.name,
|
|
39
|
+
key: v2State.key,
|
|
40
|
+
kvStorage: v2State.kvStorage,
|
|
41
|
+
createdAt: v2State.createdAt,
|
|
42
|
+
startTs: null,
|
|
43
|
+
connectableTs: null,
|
|
44
|
+
sleepTs: null,
|
|
45
|
+
destroyTs: null,
|
|
46
|
+
};
|
|
47
|
+
};
|
|
48
|
+
|
|
49
|
+
// Converter from v3 to v2
|
|
50
|
+
const v3ToV2 = (v3State: v3.ActorState): v2.ActorState => {
|
|
51
|
+
// Downgrade from v3 to v2 by removing the timestamp fields
|
|
52
|
+
return {
|
|
53
|
+
actorId: v3State.actorId,
|
|
54
|
+
name: v3State.name,
|
|
55
|
+
key: v3State.key,
|
|
56
|
+
kvStorage: v3State.kvStorage,
|
|
57
|
+
createdAt: v3State.createdAt,
|
|
58
|
+
};
|
|
59
|
+
};
|
|
60
|
+
|
|
61
|
+
// Converter from v2 to v1
|
|
62
|
+
const v2ToV1 = (v2State: v2.ActorState): v1.ActorState => {
|
|
63
|
+
// Downgrade from v2 to v1 by converting kvStorage back to persistedData
|
|
64
|
+
// Find the persist data entry (key [1])
|
|
65
|
+
const persistDataEntry = v2State.kvStorage.find((entry) => {
|
|
66
|
+
const key = new Uint8Array(entry.key);
|
|
67
|
+
return key.length === 1 && key[0] === 1;
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
return {
|
|
71
|
+
actorId: v2State.actorId,
|
|
72
|
+
name: v2State.name,
|
|
73
|
+
key: v2State.key,
|
|
74
|
+
persistedData: persistDataEntry?.value || new ArrayBuffer(0),
|
|
75
|
+
createdAt: v2State.createdAt,
|
|
76
|
+
};
|
|
77
|
+
};
|
|
78
|
+
|
|
79
|
+
export const ACTOR_STATE_VERSIONED = createVersionedDataHandler<v3.ActorState>({
|
|
80
|
+
deserializeVersion: (bytes, version) => {
|
|
81
|
+
switch (version) {
|
|
82
|
+
case 1:
|
|
83
|
+
return v1.decodeActorState(bytes);
|
|
84
|
+
case 2:
|
|
85
|
+
return v2.decodeActorState(bytes);
|
|
86
|
+
case 3:
|
|
87
|
+
return v3.decodeActorState(bytes);
|
|
88
|
+
default:
|
|
89
|
+
throw new Error(`Unknown version ${version}`);
|
|
90
|
+
}
|
|
91
|
+
},
|
|
92
|
+
serializeVersion: (data, version) => {
|
|
93
|
+
switch (version) {
|
|
94
|
+
case 1:
|
|
95
|
+
return v1.encodeActorState(data as v1.ActorState);
|
|
96
|
+
case 2:
|
|
97
|
+
return v2.encodeActorState(data as v2.ActorState);
|
|
98
|
+
case 3:
|
|
99
|
+
return v3.encodeActorState(data as v3.ActorState);
|
|
100
|
+
default:
|
|
101
|
+
throw new Error(`Unknown version ${version}`);
|
|
102
|
+
}
|
|
103
|
+
},
|
|
104
|
+
deserializeConverters: () => [v1ToV2, v2ToV3],
|
|
105
|
+
serializeConverters: () => [v3ToV2, v2ToV1],
|
|
44
106
|
});
|
|
45
107
|
|
|
46
|
-
export const ACTOR_ALARM_VERSIONED = createVersionedDataHandler<
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
108
|
+
export const ACTOR_ALARM_VERSIONED = createVersionedDataHandler<v3.ActorAlarm>({
|
|
109
|
+
deserializeVersion: (bytes, version) => {
|
|
110
|
+
switch (version) {
|
|
111
|
+
case 1:
|
|
112
|
+
return v1.decodeActorAlarm(bytes);
|
|
113
|
+
case 2:
|
|
114
|
+
return v2.decodeActorAlarm(bytes);
|
|
115
|
+
case 3:
|
|
116
|
+
return v3.decodeActorAlarm(bytes);
|
|
117
|
+
default:
|
|
118
|
+
throw new Error(`Unknown version ${version}`);
|
|
119
|
+
}
|
|
120
|
+
},
|
|
121
|
+
serializeVersion: (data, version) => {
|
|
122
|
+
switch (version) {
|
|
123
|
+
case 1:
|
|
124
|
+
return v1.encodeActorAlarm(data as v1.ActorAlarm);
|
|
125
|
+
case 2:
|
|
126
|
+
return v2.encodeActorAlarm(data as v2.ActorAlarm);
|
|
127
|
+
case 3:
|
|
128
|
+
return v3.encodeActorAlarm(data as v3.ActorAlarm);
|
|
129
|
+
default:
|
|
130
|
+
throw new Error(`Unknown version ${version}`);
|
|
131
|
+
}
|
|
132
|
+
},
|
|
133
|
+
deserializeConverters: () => [],
|
|
134
|
+
serializeConverters: () => [],
|
|
51
135
|
});
|
package/src/serde.ts
CHANGED
|
@@ -2,7 +2,7 @@ import * as cbor from "cbor-x";
|
|
|
2
2
|
import invariant from "invariant";
|
|
3
3
|
import type { z } from "zod";
|
|
4
4
|
import { assertUnreachable } from "@/common/utils";
|
|
5
|
-
import type { VersionedDataHandler } from "
|
|
5
|
+
import type { VersionedDataHandler } from "vbare";
|
|
6
6
|
import type { Encoding } from "@/mod";
|
|
7
7
|
import { jsonParseCompat, jsonStringifyCompat } from "./actor/protocol/serde";
|
|
8
8
|
|
|
@@ -57,6 +57,7 @@ export function serializeWithEncoding<TBare, TJson, T = TBare>(
|
|
|
57
57
|
encoding: Encoding,
|
|
58
58
|
value: T,
|
|
59
59
|
versionedDataHandler: VersionedDataHandler<TBare> | undefined,
|
|
60
|
+
version: number | undefined,
|
|
60
61
|
zodSchema: z.ZodType<TJson>,
|
|
61
62
|
toJson: (value: T) => TJson,
|
|
62
63
|
toBare: (value: T) => TBare,
|
|
@@ -75,8 +76,14 @@ export function serializeWithEncoding<TBare, TJson, T = TBare>(
|
|
|
75
76
|
"VersionedDataHandler is required for 'bare' encoding",
|
|
76
77
|
);
|
|
77
78
|
}
|
|
79
|
+
if (version === undefined) {
|
|
80
|
+
throw new Error("version is required for 'bare' encoding");
|
|
81
|
+
}
|
|
78
82
|
const bareValue = toBare(value);
|
|
79
|
-
return versionedDataHandler.serializeWithEmbeddedVersion(
|
|
83
|
+
return versionedDataHandler.serializeWithEmbeddedVersion(
|
|
84
|
+
bareValue,
|
|
85
|
+
version,
|
|
86
|
+
);
|
|
80
87
|
} else {
|
|
81
88
|
assertUnreachable(encoding);
|
|
82
89
|
}
|
package/src/test/config.ts
CHANGED
|
@@ -1,16 +1,17 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
2
|
import { RunnerConfigSchema } from "@/registry/run-config";
|
|
3
3
|
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
.
|
|
4
|
+
const ConfigSchemaBase = RunnerConfigSchema.removeDefault().extend({
|
|
5
|
+
hostname: z
|
|
6
|
+
.string()
|
|
7
|
+
.optional()
|
|
8
|
+
.default(process.env.HOSTNAME ?? "127.0.0.1"),
|
|
9
|
+
port: z
|
|
10
|
+
.number()
|
|
11
|
+
.optional()
|
|
12
|
+
.default(Number.parseInt(process.env.PORT ?? "8080")),
|
|
13
|
+
});
|
|
14
|
+
export const ConfigSchema = ConfigSchemaBase.default(() =>
|
|
15
|
+
ConfigSchemaBase.parse({}),
|
|
16
|
+
);
|
|
16
17
|
export type InputConfig = z.input<typeof ConfigSchema>;
|