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.
Files changed (131) hide show
  1. package/dist/schemas/file-system-driver/v3.ts +167 -0
  2. package/dist/tsup/actor/errors.cjs +2 -2
  3. package/dist/tsup/actor/errors.js +1 -1
  4. package/dist/tsup/{chunk-TJ2PJ5C7.cjs → chunk-2Q6FJITJ.cjs} +3 -3
  5. package/dist/tsup/{chunk-TJ2PJ5C7.cjs.map → chunk-2Q6FJITJ.cjs.map} +1 -1
  6. package/dist/tsup/{chunk-GUH2PNPG.js → chunk-5RN6O2RW.js} +3 -3
  7. package/dist/tsup/{chunk-F3SQLO3X.cjs → chunk-AJ36VBHL.cjs} +13 -12
  8. package/dist/tsup/chunk-AJ36VBHL.cjs.map +1 -0
  9. package/dist/tsup/{chunk-4GJQDTAG.cjs → chunk-BAEMOCS7.cjs} +666 -342
  10. package/dist/tsup/chunk-BAEMOCS7.cjs.map +1 -0
  11. package/dist/tsup/chunk-CGIRSKRW.js +891 -0
  12. package/dist/tsup/chunk-CGIRSKRW.js.map +1 -0
  13. package/dist/tsup/{chunk-BBTOBXEO.js → chunk-CHPLLKNL.js} +579 -103
  14. package/dist/tsup/chunk-CHPLLKNL.js.map +1 -0
  15. package/dist/tsup/{chunk-D7A47BVR.js → chunk-EU7VV5PU.js} +2 -2
  16. package/dist/tsup/{chunk-2NNICHGY.js → chunk-EVQJYFFP.js} +2 -2
  17. package/dist/tsup/{chunk-C3UREFUI.js → chunk-HXWPIIEM.js} +15 -6
  18. package/dist/tsup/chunk-HXWPIIEM.js.map +1 -0
  19. package/dist/tsup/chunk-IRGPMCKQ.cjs +129 -0
  20. package/dist/tsup/chunk-IRGPMCKQ.cjs.map +1 -0
  21. package/dist/tsup/{chunk-QC4AE54W.cjs → chunk-J3M5ATO5.cjs} +3 -3
  22. package/dist/tsup/{chunk-QC4AE54W.cjs.map → chunk-J3M5ATO5.cjs.map} +1 -1
  23. package/dist/tsup/{chunk-DRJCTDDT.cjs → chunk-J74MGKP5.cjs} +20 -11
  24. package/dist/tsup/chunk-J74MGKP5.cjs.map +1 -0
  25. package/dist/tsup/{chunk-XJMYGATE.cjs → chunk-MAQSR26X.cjs} +8 -3
  26. package/dist/tsup/chunk-MAQSR26X.cjs.map +1 -0
  27. package/dist/tsup/{chunk-XNKWXMIT.cjs → chunk-MG2TWYPF.cjs} +794 -318
  28. package/dist/tsup/chunk-MG2TWYPF.cjs.map +1 -0
  29. package/dist/tsup/{chunk-LQOCWGP6.js → chunk-P2RZJPYI.js} +1 -1
  30. package/dist/tsup/{chunk-XU4GGB6J.js → chunk-QKDCNAPW.js} +504 -181
  31. package/dist/tsup/chunk-QKDCNAPW.js.map +1 -0
  32. package/dist/tsup/{chunk-G7YZSSWV.cjs → chunk-QT7PPLSB.cjs} +6 -6
  33. package/dist/tsup/{chunk-G7YZSSWV.cjs.map → chunk-QT7PPLSB.cjs.map} +1 -1
  34. package/dist/tsup/{chunk-VRZNWBDK.js → chunk-SDJFBUFE.js} +45 -46
  35. package/dist/tsup/chunk-SDJFBUFE.js.map +1 -0
  36. package/dist/tsup/chunk-SE37OCA2.cjs +891 -0
  37. package/dist/tsup/chunk-SE37OCA2.cjs.map +1 -0
  38. package/dist/tsup/{chunk-6F2NCX7R.js → chunk-WUFUT7CZ.js} +2 -2
  39. package/dist/tsup/{chunk-LZADH4QA.cjs → chunk-XVBIJET6.cjs} +10 -10
  40. package/dist/tsup/{chunk-LZADH4QA.cjs.map → chunk-XVBIJET6.cjs.map} +1 -1
  41. package/dist/tsup/{chunk-KSQQU7NC.js → chunk-YJXB7BPR.js} +8 -7
  42. package/dist/tsup/chunk-YJXB7BPR.js.map +1 -0
  43. package/dist/tsup/client/mod.cjs +9 -9
  44. package/dist/tsup/client/mod.d.cts +3 -2
  45. package/dist/tsup/client/mod.d.ts +3 -2
  46. package/dist/tsup/client/mod.js +8 -8
  47. package/dist/tsup/common/log.cjs +3 -3
  48. package/dist/tsup/common/log.d.cts +9 -1
  49. package/dist/tsup/common/log.d.ts +9 -1
  50. package/dist/tsup/common/log.js +2 -2
  51. package/dist/tsup/common/websocket.cjs +4 -4
  52. package/dist/tsup/common/websocket.js +3 -3
  53. package/dist/tsup/{config-Bo-blHpJ.d.ts → config-CcMdKDv9.d.ts} +301 -899
  54. package/dist/tsup/{config-BRDYDraU.d.cts → config-DxlmiJS1.d.cts} +301 -899
  55. package/dist/tsup/driver-helpers/mod.cjs +5 -5
  56. package/dist/tsup/driver-helpers/mod.d.cts +2 -1
  57. package/dist/tsup/driver-helpers/mod.d.ts +2 -1
  58. package/dist/tsup/driver-helpers/mod.js +4 -4
  59. package/dist/tsup/driver-test-suite/mod.cjs +74 -74
  60. package/dist/tsup/driver-test-suite/mod.d.cts +2 -1
  61. package/dist/tsup/driver-test-suite/mod.d.ts +2 -1
  62. package/dist/tsup/driver-test-suite/mod.js +11 -11
  63. package/dist/tsup/inspector/mod.cjs +6 -6
  64. package/dist/tsup/inspector/mod.d.cts +5 -4
  65. package/dist/tsup/inspector/mod.d.ts +5 -4
  66. package/dist/tsup/inspector/mod.js +5 -5
  67. package/dist/tsup/mod.cjs +10 -10
  68. package/dist/tsup/mod.d.cts +3 -2
  69. package/dist/tsup/mod.d.ts +3 -2
  70. package/dist/tsup/mod.js +9 -9
  71. package/dist/tsup/test/mod.cjs +12 -11
  72. package/dist/tsup/test/mod.cjs.map +1 -1
  73. package/dist/tsup/test/mod.d.cts +2 -6
  74. package/dist/tsup/test/mod.d.ts +2 -6
  75. package/dist/tsup/test/mod.js +11 -10
  76. package/dist/tsup/utils.cjs +3 -3
  77. package/dist/tsup/utils.js +2 -2
  78. package/package.json +7 -6
  79. package/src/actor/config.ts +21 -20
  80. package/src/actor/conn/mod.ts +5 -1
  81. package/src/actor/instance/connection-manager.ts +5 -1
  82. package/src/actor/instance/event-manager.ts +5 -1
  83. package/src/actor/instance/state-manager.ts +19 -3
  84. package/src/actor/protocol/old.ts +3 -0
  85. package/src/actor/protocol/serde.ts +5 -1
  86. package/src/actor/router-endpoints.ts +2 -0
  87. package/src/client/actor-conn.ts +2 -0
  88. package/src/client/actor-handle.ts +3 -0
  89. package/src/client/config.ts +1 -1
  90. package/src/client/utils.ts +4 -1
  91. package/src/common/router.ts +5 -1
  92. package/src/driver-helpers/utils.ts +8 -2
  93. package/src/drivers/engine/config.ts +6 -3
  94. package/src/drivers/file-system/global-state.ts +46 -1
  95. package/src/drivers/file-system/manager.ts +4 -0
  96. package/src/inspector/config.ts +1 -2
  97. package/src/manager/driver.ts +4 -0
  98. package/src/manager/router-schema.ts +7 -7
  99. package/src/manager/router.ts +4 -4
  100. package/src/registry/run-config.ts +9 -5
  101. package/src/remote-manager-driver/actor-http-client.ts +1 -1
  102. package/src/remote-manager-driver/api-utils.ts +2 -0
  103. package/src/schemas/actor-persist/versioned.ts +126 -54
  104. package/src/schemas/client-protocol/versioned.ts +173 -42
  105. package/src/schemas/file-system-driver/mod.ts +1 -1
  106. package/src/schemas/file-system-driver/versioned.ts +129 -45
  107. package/src/serde.ts +9 -2
  108. package/src/test/config.ts +13 -12
  109. package/src/test/mod.ts +56 -82
  110. package/dist/tsup/chunk-2TZH6VO6.cjs +0 -514
  111. package/dist/tsup/chunk-2TZH6VO6.cjs.map +0 -1
  112. package/dist/tsup/chunk-4GJQDTAG.cjs.map +0 -1
  113. package/dist/tsup/chunk-5YDKTW6Y.js +0 -514
  114. package/dist/tsup/chunk-5YDKTW6Y.js.map +0 -1
  115. package/dist/tsup/chunk-BBTOBXEO.js.map +0 -1
  116. package/dist/tsup/chunk-C3UREFUI.js.map +0 -1
  117. package/dist/tsup/chunk-DRJCTDDT.cjs.map +0 -1
  118. package/dist/tsup/chunk-F3SQLO3X.cjs.map +0 -1
  119. package/dist/tsup/chunk-FYZLEH57.cjs +0 -130
  120. package/dist/tsup/chunk-FYZLEH57.cjs.map +0 -1
  121. package/dist/tsup/chunk-KSQQU7NC.js.map +0 -1
  122. package/dist/tsup/chunk-VRZNWBDK.js.map +0 -1
  123. package/dist/tsup/chunk-XJMYGATE.cjs.map +0 -1
  124. package/dist/tsup/chunk-XNKWXMIT.cjs.map +0 -1
  125. package/dist/tsup/chunk-XU4GGB6J.js.map +0 -1
  126. package/src/common/versioned-data.ts +0 -95
  127. /package/dist/tsup/{chunk-GUH2PNPG.js.map → chunk-5RN6O2RW.js.map} +0 -0
  128. /package/dist/tsup/{chunk-D7A47BVR.js.map → chunk-EU7VV5PU.js.map} +0 -0
  129. /package/dist/tsup/{chunk-2NNICHGY.js.map → chunk-EVQJYFFP.js.map} +0 -0
  130. /package/dist/tsup/{chunk-LQOCWGP6.js.map → chunk-P2RZJPYI.js.map} +0 -0
  131. /package/dist/tsup/{chunk-6F2NCX7R.js.map → chunk-WUFUT7CZ.js.map} +0 -0
@@ -1,66 +1,138 @@
1
- import {
2
- createVersionedDataHandler,
3
- type MigrationFn,
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
- const migrations = new Map<number, MigrationFn<any, any>>([
12
- [
13
- 1,
14
- (v1Data: v1.PersistedActor): v2.PersistedActor => ({
15
- ...v1Data,
16
- connections: v1Data.connections.map((conn) => ({
17
- ...conn,
18
- hibernatableRequestId: null,
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
- return {
45
- input: v2Data.input,
46
- hasInitialized: v2Data.hasInitialized,
47
- state: v2Data.state,
48
- scheduledEvents,
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
- currentVersion: CURRENT_VERSION,
56
- migrations,
57
- serializeVersion: (data) => v3.encodeActor(data),
58
- deserializeVersion: (bytes) => v3.decodeActor(bytes),
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
- currentVersion: CURRENT_VERSION,
63
- migrations: new Map(),
64
- serializeVersion: (data) => v3.encodeConn(data),
65
- deserializeVersion: (bytes) => v3.decodeConn(bytes),
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
- createVersionedDataHandler,
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
- const migrations = new Map<number, MigrationFn<any, any>>();
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
- currentVersion: CURRENT_VERSION,
33
- migrations,
34
- serializeVersion: (data) => v2.encodeToServer(data),
35
- deserializeVersion: (bytes) => v2.decodeToServer(bytes),
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
- currentVersion: CURRENT_VERSION,
40
- migrations,
41
- serializeVersion: (data) => v2.encodeToClient(data),
42
- deserializeVersion: (bytes) => v2.decodeToClient(bytes),
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
- currentVersion: CURRENT_VERSION,
48
- migrations,
49
- serializeVersion: (data) => v2.encodeHttpActionRequest(data),
50
- deserializeVersion: (bytes) => v2.decodeHttpActionRequest(bytes),
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
- currentVersion: CURRENT_VERSION,
56
- migrations,
57
- serializeVersion: (data) => v2.encodeHttpActionResponse(data),
58
- deserializeVersion: (bytes) => v2.decodeHttpActionResponse(bytes),
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
- currentVersion: CURRENT_VERSION,
64
- migrations,
65
- serializeVersion: (data) => v2.encodeHttpResponseError(data),
66
- deserializeVersion: (bytes) => v2.decodeHttpResponseError(bytes),
67
- });
68
-
69
- export const HTTP_RESOLVE_REQUEST_VERSIONED =
70
- createVersionedDataHandler<v2.HttpResolveRequest>({
71
- currentVersion: CURRENT_VERSION,
72
- migrations,
73
- serializeVersion: (_) => new Uint8Array(),
74
- deserializeVersion: (bytes) => null,
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
- currentVersion: CURRENT_VERSION,
80
- migrations,
81
- serializeVersion: (data) => v2.encodeHttpResolveResponse(data),
82
- deserializeVersion: (bytes) => v2.decodeHttpResolveResponse(bytes),
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/v2";
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 type * as v1 from "../../../dist/schemas/file-system-driver/v1";
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 = 2;
10
-
11
- const migrations = new Map<number, MigrationFn<any, any>>([
12
- [
13
- 2,
14
- (v1State: v1.ActorState): v2.ActorState => {
15
- // Create a new kvStorage list with the legacy persist data
16
- const kvStorage: v2.ActorKvEntry[] = [];
17
-
18
- // Store the legacy persist data under key [1]
19
- if (v1State.persistedData) {
20
- // Key [1] as Uint8Array
21
- const key = new Uint8Array([1]);
22
- kvStorage.push({
23
- key: bufferToArrayBuffer(key),
24
- value: v1State.persistedData,
25
- });
26
- }
27
-
28
- return {
29
- actorId: v1State.actorId,
30
- name: v1State.name,
31
- key: v1State.key,
32
- kvStorage,
33
- createdAt: v1State.createdAt,
34
- };
35
- },
36
- ],
37
- ]);
38
-
39
- export const ACTOR_STATE_VERSIONED = createVersionedDataHandler<v2.ActorState>({
40
- currentVersion: CURRENT_VERSION,
41
- migrations,
42
- serializeVersion: (data) => v2.encodeActorState(data),
43
- deserializeVersion: (bytes) => v2.decodeActorState(bytes),
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<v2.ActorAlarm>({
47
- currentVersion: CURRENT_VERSION,
48
- migrations,
49
- serializeVersion: (data) => v2.encodeActorAlarm(data),
50
- deserializeVersion: (bytes) => v2.decodeActorAlarm(bytes),
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 "@/common/versioned-data";
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(bareValue);
83
+ return versionedDataHandler.serializeWithEmbeddedVersion(
84
+ bareValue,
85
+ version,
86
+ );
80
87
  } else {
81
88
  assertUnreachable(encoding);
82
89
  }
@@ -1,16 +1,17 @@
1
1
  import { z } from "zod";
2
2
  import { RunnerConfigSchema } from "@/registry/run-config";
3
3
 
4
- export const ConfigSchema = RunnerConfigSchema.removeDefault()
5
- .extend({
6
- hostname: z
7
- .string()
8
- .optional()
9
- .default(process.env.HOSTNAME ?? "127.0.0.1"),
10
- port: z
11
- .number()
12
- .optional()
13
- .default(Number.parseInt(process.env.PORT ?? "8080")),
14
- })
15
- .default({});
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>;