@verdant-web/server 3.3.11 → 4.0.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 (204) hide show
  1. package/bin/server.mjs +110 -107
  2. package/dist/esm/TokenVerifier.d.ts +1 -0
  3. package/dist/esm/TokenVerifier.js +3 -0
  4. package/dist/esm/TokenVerifier.js.map +1 -1
  5. package/dist/esm/adapters/node/errorHandler.d.ts +2 -0
  6. package/dist/esm/adapters/node/errorHandler.js +12 -0
  7. package/dist/esm/adapters/node/errorHandler.js.map +1 -0
  8. package/dist/esm/adapters/node/getRequestToken.d.ts +1 -0
  9. package/dist/esm/adapters/node/getRequestToken.js +25 -0
  10. package/dist/esm/adapters/node/getRequestToken.js.map +1 -0
  11. package/dist/esm/adapters/node/httpRouter.d.ts +47 -0
  12. package/dist/esm/adapters/node/httpRouter.js +88 -0
  13. package/dist/esm/adapters/node/httpRouter.js.map +1 -0
  14. package/dist/esm/adapters/node/index.d.ts +5 -0
  15. package/dist/esm/adapters/node/index.js +6 -0
  16. package/dist/esm/adapters/node/index.js.map +1 -0
  17. package/dist/esm/adapters/node/tokenMiddleware.d.ts +7 -0
  18. package/dist/esm/adapters/node/tokenMiddleware.js +22 -0
  19. package/dist/esm/adapters/node/tokenMiddleware.js.map +1 -0
  20. package/dist/esm/adapters/node/websocketHandler.d.ts +4 -0
  21. package/dist/esm/adapters/node/websocketHandler.js +54 -0
  22. package/dist/esm/adapters/node/websocketHandler.js.map +1 -0
  23. package/dist/esm/connections/ClientConnection.d.ts +25 -0
  24. package/dist/esm/{ClientConnection.js → connections/ClientConnection.js} +47 -38
  25. package/dist/esm/connections/ClientConnection.js.map +1 -0
  26. package/dist/esm/connections/MessageSender.d.ts +5 -0
  27. package/dist/esm/connections/MessageSender.js.map +1 -0
  28. package/dist/esm/connections/Presence.d.ts +23 -0
  29. package/dist/esm/connections/Presence.js +65 -0
  30. package/dist/esm/connections/Presence.js.map +1 -0
  31. package/dist/esm/core.d.ts +15 -0
  32. package/dist/esm/core.js +15 -0
  33. package/dist/esm/core.js.map +1 -0
  34. package/dist/esm/defaults.d.ts +2 -0
  35. package/dist/esm/defaults.js +3 -0
  36. package/dist/esm/defaults.js.map +1 -0
  37. package/dist/esm/files/FileStorage.d.ts +12 -3
  38. package/dist/esm/files/FileStorage.js +20 -0
  39. package/dist/esm/files/FileStorage.js.map +1 -1
  40. package/dist/esm/index.d.ts +7 -7
  41. package/dist/esm/index.js +2 -2
  42. package/dist/esm/index.js.map +1 -1
  43. package/dist/esm/internals.d.ts +14 -0
  44. package/dist/esm/internals.js +12 -0
  45. package/dist/esm/internals.js.map +1 -0
  46. package/dist/esm/libraries/Library.d.ts +78 -0
  47. package/dist/esm/{ServerLibrary.js → libraries/Library.js} +153 -144
  48. package/dist/esm/libraries/Library.js.map +1 -0
  49. package/dist/esm/{ServerLibrary.test.js → libraries/Library.test.js} +42 -33
  50. package/dist/esm/libraries/Library.test.js.map +1 -0
  51. package/dist/esm/libraries/generic.d.ts +8 -0
  52. package/dist/esm/libraries/generic.js +2 -0
  53. package/dist/esm/libraries/generic.js.map +1 -0
  54. package/dist/esm/libraries/singleNode.d.ts +53 -0
  55. package/dist/esm/libraries/singleNode.js +88 -0
  56. package/dist/esm/libraries/singleNode.js.map +1 -0
  57. package/dist/esm/logger.d.ts +1 -0
  58. package/dist/esm/logger.js +2 -0
  59. package/dist/esm/logger.js.map +1 -0
  60. package/dist/esm/storage/Storage.d.ts +39 -38
  61. package/dist/esm/storage/StorageManager.d.ts +11 -0
  62. package/dist/esm/storage/StorageManager.js +32 -0
  63. package/dist/esm/storage/StorageManager.js.map +1 -0
  64. package/dist/esm/storage/index.d.ts +1 -2
  65. package/dist/esm/storage/index.js +1 -2
  66. package/dist/esm/storage/index.js.map +1 -1
  67. package/dist/esm/storage/sqlShard/Databases.d.ts +5 -3
  68. package/dist/esm/storage/sqlShard/Databases.js +11 -7
  69. package/dist/esm/storage/sqlShard/Databases.js.map +1 -1
  70. package/dist/esm/storage/sqlShard/SqlBaselines.d.ts +16 -17
  71. package/dist/esm/storage/sqlShard/SqlBaselines.js +55 -59
  72. package/dist/esm/storage/sqlShard/SqlBaselines.js.map +1 -1
  73. package/dist/esm/storage/sqlShard/SqlFileMetadata.d.ts +13 -13
  74. package/dist/esm/storage/sqlShard/SqlFileMetadata.js +44 -57
  75. package/dist/esm/storage/sqlShard/SqlFileMetadata.js.map +1 -1
  76. package/dist/esm/storage/sqlShard/SqlOperations.d.ts +12 -12
  77. package/dist/esm/storage/sqlShard/SqlOperations.js +38 -73
  78. package/dist/esm/storage/sqlShard/SqlOperations.js.map +1 -1
  79. package/dist/esm/storage/sqlShard/SqlReplicas.d.ts +18 -17
  80. package/dist/esm/storage/sqlShard/SqlReplicas.js +63 -100
  81. package/dist/esm/storage/sqlShard/SqlReplicas.js.map +1 -1
  82. package/dist/esm/storage/sqlShard/database.d.ts +25 -5
  83. package/dist/esm/storage/sqlShard/database.js +47 -15
  84. package/dist/esm/storage/sqlShard/database.js.map +1 -1
  85. package/dist/esm/storage/sqlShard/migrations/v1.d.ts +2 -3
  86. package/dist/esm/storage/sqlShard/migrations/v1.js +42 -47
  87. package/dist/esm/storage/sqlShard/migrations/v1.js.map +1 -1
  88. package/dist/esm/storage/sqlShard/migrations/v2.d.ts +2 -3
  89. package/dist/esm/storage/sqlShard/migrations/v2.js +5 -15
  90. package/dist/esm/storage/sqlShard/migrations/v2.js.map +1 -1
  91. package/dist/esm/storage/sqlShard/migrations.d.ts +5 -7
  92. package/dist/esm/storage/sqlShard/migrations.js +48 -1
  93. package/dist/esm/storage/sqlShard/migrations.js.map +1 -1
  94. package/dist/esm/storage/sqlShard/sqlShardStorage.d.ts +25 -4
  95. package/dist/esm/storage/sqlShard/sqlShardStorage.js +43 -40
  96. package/dist/esm/storage/sqlShard/sqlShardStorage.js.map +1 -1
  97. package/dist/esm/storage/sqlShard/tables.d.ts +9 -6
  98. package/dist/esm/types.d.ts +1 -2
  99. package/package.json +24 -13
  100. package/src/TokenVerifier.ts +4 -0
  101. package/src/adapters/node/errorHandler.ts +18 -0
  102. package/src/adapters/node/getRequestToken.ts +34 -0
  103. package/src/adapters/node/httpRouter.ts +139 -0
  104. package/src/adapters/node/index.ts +5 -0
  105. package/src/adapters/node/tokenMiddleware.ts +32 -0
  106. package/src/adapters/node/websocketHandler.ts +79 -0
  107. package/src/{ClientConnection.ts → connections/ClientConnection.ts} +64 -57
  108. package/src/connections/MessageSender.ts +6 -0
  109. package/src/connections/Presence.ts +95 -0
  110. package/src/core.ts +36 -0
  111. package/src/defaults.ts +2 -0
  112. package/src/files/FileStorage.ts +36 -3
  113. package/src/index.ts +7 -7
  114. package/src/internals.ts +14 -0
  115. package/src/{ServerLibrary.test.ts → libraries/Library.test.ts} +51 -49
  116. package/src/{ServerLibrary.ts → libraries/Library.ts} +203 -206
  117. package/src/libraries/generic.ts +9 -0
  118. package/src/libraries/singleNode.ts +145 -0
  119. package/src/logger.ts +4 -0
  120. package/src/storage/Storage.ts +37 -66
  121. package/src/storage/StorageManager.ts +39 -0
  122. package/src/storage/index.ts +1 -2
  123. package/src/storage/sqlShard/Databases.ts +26 -13
  124. package/src/storage/sqlShard/SqlBaselines.ts +58 -67
  125. package/src/storage/sqlShard/SqlFileMetadata.ts +51 -72
  126. package/src/storage/sqlShard/SqlOperations.ts +57 -81
  127. package/src/storage/sqlShard/SqlReplicas.ts +80 -121
  128. package/src/storage/sqlShard/database.ts +82 -18
  129. package/src/storage/sqlShard/migrations/v1.ts +42 -52
  130. package/src/storage/sqlShard/migrations/v2.ts +5 -19
  131. package/src/storage/sqlShard/migrations.ts +66 -1
  132. package/src/storage/sqlShard/sqlShardStorage.ts +56 -55
  133. package/src/storage/sqlShard/tables.ts +6 -6
  134. package/src/types.ts +1 -2
  135. package/dist/esm/ClientConnection.d.ts +0 -19
  136. package/dist/esm/ClientConnection.js.map +0 -1
  137. package/dist/esm/MessageSender.d.ts +0 -5
  138. package/dist/esm/MessageSender.js.map +0 -1
  139. package/dist/esm/Presence.d.ts +0 -18
  140. package/dist/esm/Presence.js +0 -65
  141. package/dist/esm/Presence.js.map +0 -1
  142. package/dist/esm/ReplicaKeepaliveTimers.d.ts +0 -17
  143. package/dist/esm/ReplicaKeepaliveTimers.js +0 -27
  144. package/dist/esm/ReplicaKeepaliveTimers.js.map +0 -1
  145. package/dist/esm/Server.d.ts +0 -166
  146. package/dist/esm/Server.js +0 -572
  147. package/dist/esm/Server.js.map +0 -1
  148. package/dist/esm/ServerLibrary.d.ts +0 -64
  149. package/dist/esm/ServerLibrary.js.map +0 -1
  150. package/dist/esm/ServerLibrary.test.js.map +0 -1
  151. package/dist/esm/storage/sql/SqlBaselines.d.ts +0 -22
  152. package/dist/esm/storage/sql/SqlBaselines.js +0 -107
  153. package/dist/esm/storage/sql/SqlBaselines.js.map +0 -1
  154. package/dist/esm/storage/sql/SqlFileMetadata.d.ts +0 -18
  155. package/dist/esm/storage/sql/SqlFileMetadata.js +0 -69
  156. package/dist/esm/storage/sql/SqlFileMetadata.js.map +0 -1
  157. package/dist/esm/storage/sql/SqlOperations.d.ts +0 -19
  158. package/dist/esm/storage/sql/SqlOperations.js +0 -122
  159. package/dist/esm/storage/sql/SqlOperations.js.map +0 -1
  160. package/dist/esm/storage/sql/SqlReplicas.d.ts +0 -32
  161. package/dist/esm/storage/sql/SqlReplicas.js +0 -163
  162. package/dist/esm/storage/sql/SqlReplicas.js.map +0 -1
  163. package/dist/esm/storage/sql/database.d.ts +0 -9
  164. package/dist/esm/storage/sql/database.js +0 -24
  165. package/dist/esm/storage/sql/database.js.map +0 -1
  166. package/dist/esm/storage/sql/migrations/v1.d.ts +0 -3
  167. package/dist/esm/storage/sql/migrations/v1.js +0 -59
  168. package/dist/esm/storage/sql/migrations/v1.js.map +0 -1
  169. package/dist/esm/storage/sql/migrations/v2.d.ts +0 -3
  170. package/dist/esm/storage/sql/migrations/v2.js +0 -16
  171. package/dist/esm/storage/sql/migrations/v2.js.map +0 -1
  172. package/dist/esm/storage/sql/migrations.d.ts +0 -7
  173. package/dist/esm/storage/sql/migrations.js +0 -4
  174. package/dist/esm/storage/sql/migrations.js.map +0 -1
  175. package/dist/esm/storage/sql/sqlStorage.d.ts +0 -6
  176. package/dist/esm/storage/sql/sqlStorage.js +0 -35
  177. package/dist/esm/storage/sql/sqlStorage.js.map +0 -1
  178. package/dist/esm/storage/sql/tables.d.ts +0 -44
  179. package/dist/esm/storage/sql/tables.js +0 -2
  180. package/dist/esm/storage/sql/tables.js.map +0 -1
  181. package/dist/esm/storage/sqlShard/transfer.d.ts +0 -7
  182. package/dist/esm/storage/sqlShard/transfer.js +0 -90
  183. package/dist/esm/storage/sqlShard/transfer.js.map +0 -1
  184. package/dist/esm/storage/sqlShard/transfer.test.d.ts +0 -1
  185. package/dist/esm/storage/sqlShard/transfer.test.js +0 -109
  186. package/dist/esm/storage/sqlShard/transfer.test.js.map +0 -1
  187. package/src/MessageSender.ts +0 -10
  188. package/src/Presence.ts +0 -86
  189. package/src/ReplicaKeepaliveTimers.ts +0 -34
  190. package/src/Server.ts +0 -859
  191. package/src/storage/sql/SqlBaselines.ts +0 -147
  192. package/src/storage/sql/SqlFileMetadata.ts +0 -94
  193. package/src/storage/sql/SqlOperations.ts +0 -160
  194. package/src/storage/sql/SqlReplicas.ts +0 -234
  195. package/src/storage/sql/database.ts +0 -32
  196. package/src/storage/sql/migrations/v1.ts +0 -64
  197. package/src/storage/sql/migrations/v2.ts +0 -20
  198. package/src/storage/sql/migrations.ts +0 -4
  199. package/src/storage/sql/sqlStorage.ts +0 -57
  200. package/src/storage/sql/tables.ts +0 -51
  201. package/src/storage/sqlShard/transfer.test.ts +0 -149
  202. package/src/storage/sqlShard/transfer.ts +0 -123
  203. /package/dist/esm/{MessageSender.js → connections/MessageSender.js} +0 -0
  204. /package/dist/esm/{ServerLibrary.test.d.ts → libraries/Library.test.d.ts} +0 -0
@@ -1,48 +1,43 @@
1
- export async function up(db) {
2
- await db.schema
3
- .createTable('DocumentBaseline')
4
- .ifNotExists()
5
- .addColumn('oid', 'text', (cb) => cb.primaryKey())
6
- .addColumn('snapshot', 'text')
7
- .addColumn('timestamp', 'text', (cb) => cb.notNull())
8
- .execute();
9
- await db.schema
10
- .createTable('OperationHistory')
11
- .ifNotExists()
12
- .addColumn('oid', 'text', (cb) => cb.notNull())
13
- .addColumn('timestamp', 'text', (cb) => cb.notNull())
14
- .addColumn('data', 'text', (cb) => cb.notNull())
15
- .addColumn('serverOrder', 'integer', (cb) => cb.notNull().defaultTo(0))
16
- .addColumn('replicaId', 'text', (cb) => cb.notNull())
17
- .addPrimaryKeyConstraint('OperationHistory_primaryKey', [
18
- 'replicaId',
19
- 'oid',
20
- 'timestamp',
21
- ])
22
- .execute();
23
- await db.schema
24
- .createTable('ReplicaInfo')
25
- .ifNotExists()
26
- .addColumn('id', 'text', (cb) => cb.primaryKey())
27
- .addColumn('clientId', 'text', (cb) => cb.notNull())
28
- .addColumn('lastSeenWallClockTime', 'integer')
29
- .addColumn('ackedLogicalTime', 'text')
30
- .addColumn('type', 'integer', (cb) => cb.notNull().defaultTo(0))
31
- .addColumn('ackedServerOrder', 'integer', (cb) => cb.notNull().defaultTo(0))
32
- .execute();
33
- await db.schema
34
- .createTable('FileMetadata')
35
- .ifNotExists()
36
- .addColumn('fileId', 'text', (cb) => cb.primaryKey())
37
- .addColumn('name', 'text', (cb) => cb.notNull())
38
- .addColumn('type', 'text', (cb) => cb.notNull())
39
- .addColumn('pendingDeleteAt', 'integer')
40
- .execute();
41
- }
42
- export async function down(db) {
43
- await db.schema.dropTable('DocumentBaseline').execute();
44
- await db.schema.dropTable('OperationHistory').execute();
45
- await db.schema.dropTable('ReplicaInfo').execute();
46
- await db.schema.dropTable('FileMetadata').execute();
47
- }
1
+ export const version = 1;
2
+ export const up = [
3
+ `
4
+ CREATE TABLE IF NOT EXISTS "_Migrations" (
5
+ "id" INTEGER PRIMARY KEY,
6
+ "appliedAt" TEXT NOT NULL
7
+ );`,
8
+ `
9
+ CREATE TABLE IF NOT EXISTS "DocumentBaseline" (
10
+ "oid" TEXT PRIMARY KEY,
11
+ "snapshot" TEXT,
12
+ "timestamp" TEXT NOT NULL
13
+ );
14
+ `,
15
+ `
16
+ CREATE TABLE IF NOT EXISTS "OperationHistory" (
17
+ "oid" TEXT NOT NULL,
18
+ "timestamp" TEXT NOT NULL,
19
+ "data" TEXT NOT NULL,
20
+ "serverOrder" INTEGER NOT NULL DEFAULT 0,
21
+ "replicaId" TEXT NOT NULL,
22
+ PRIMARY KEY ("replicaId", "oid", "timestamp")
23
+ );
24
+ `,
25
+ `
26
+ CREATE TABLE IF NOT EXISTS "ReplicaInfo" (
27
+ "id" TEXT PRIMARY KEY,
28
+ "clientId" TEXT NOT NULL,
29
+ "lastSeenWallClockTime" INTEGER,
30
+ "ackedLogicalTime" TEXT,
31
+ "type" INTEGER NOT NULL DEFAULT 0,
32
+ "ackedServerOrder" INTEGER NOT NULL DEFAULT 0
33
+ );`,
34
+ `
35
+ CREATE TABLE IF NOT EXISTS "FileMetadata" (
36
+ "fileId" TEXT PRIMARY KEY,
37
+ "name" TEXT NOT NULL,
38
+ "type" TEXT NOT NULL,
39
+ "pendingDeleteAt" INTEGER
40
+ );
41
+ `,
42
+ ];
48
43
  //# sourceMappingURL=v1.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"v1.js","sourceRoot":"","sources":["../../../../../src/storage/sqlShard/migrations/v1.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,KAAK,UAAU,EAAE,CAAC,EAAe;IACvC,MAAM,EAAE,CAAC,MAAM;SACb,WAAW,CAAC,kBAAkB,CAAC;SAC/B,WAAW,EAAE;SACb,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,UAAU,EAAE,CAAC;SACjD,SAAS,CAAC,UAAU,EAAE,MAAM,CAAC;SAC7B,SAAS,CAAC,WAAW,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC;SACpD,OAAO,EAAE,CAAC;IAEZ,MAAM,EAAE,CAAC,MAAM;SACb,WAAW,CAAC,kBAAkB,CAAC;SAC/B,WAAW,EAAE;SACb,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC;SAC9C,SAAS,CAAC,WAAW,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC;SACpD,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC;SAC/C,SAAS,CAAC,aAAa,EAAE,SAAS,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;SACtE,SAAS,CAAC,WAAW,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC;SACpD,uBAAuB,CAAC,6BAA6B,EAAE;QACvD,WAAW;QACX,KAAK;QACL,WAAW;KACX,CAAC;SACD,OAAO,EAAE,CAAC;IAEZ,MAAM,EAAE,CAAC,MAAM;SACb,WAAW,CAAC,aAAa,CAAC;SAC1B,WAAW,EAAE;SACb,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,UAAU,EAAE,CAAC;SAChD,SAAS,CAAC,UAAU,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC;SACnD,SAAS,CAAC,uBAAuB,EAAE,SAAS,CAAC;SAC7C,SAAS,CAAC,kBAAkB,EAAE,MAAM,CAAC;SACrC,SAAS,CAAC,MAAM,EAAE,SAAS,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;SAC/D,SAAS,CAAC,kBAAkB,EAAE,SAAS,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;SAC3E,OAAO,EAAE,CAAC;IAEZ,MAAM,EAAE,CAAC,MAAM;SACb,WAAW,CAAC,cAAc,CAAC;SAC3B,WAAW,EAAE;SACb,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,UAAU,EAAE,CAAC;SACpD,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC;SAC/C,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC;SAC/C,SAAS,CAAC,iBAAiB,EAAE,SAAS,CAAC;SACvC,OAAO,EAAE,CAAC;AACb,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,IAAI,CAAC,EAAe;IACzC,MAAM,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC,OAAO,EAAE,CAAC;IACxD,MAAM,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC,OAAO,EAAE,CAAC;IACxD,MAAM,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC,OAAO,EAAE,CAAC;IACnD,MAAM,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC,OAAO,EAAE,CAAC;AACrD,CAAC"}
1
+ {"version":3,"file":"v1.js","sourceRoot":"","sources":["../../../../../src/storage/sqlShard/migrations/v1.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,CAAC;AAEzB,MAAM,CAAC,MAAM,EAAE,GAAG;IACjB;;;;GAIE;IACF;;;;;;CAMA;IACA;;;;;;;;;CASA;IACA;;;;;;;;GAQE;IACF;;;;;;;CAOA;CACA,CAAC"}
@@ -1,3 +1,2 @@
1
- import { Kysely } from 'kysely';
2
- export declare function up(db: Kysely<any>): Promise<void>;
3
- export declare function down(db: Kysely<any>): Promise<void>;
1
+ export declare const version = 2;
2
+ export declare const up: string[];
@@ -1,16 +1,6 @@
1
- export async function up(db) {
2
- // add authz column to OperationHistory and DocumentBaseline
3
- await db.schema
4
- .alterTable('OperationHistory')
5
- .addColumn('authz', 'text', (cb) => cb.defaultTo(null))
6
- .execute();
7
- await db.schema
8
- .alterTable('DocumentBaseline')
9
- .addColumn('authz', 'text', (cb) => cb.defaultTo(null))
10
- .execute();
11
- }
12
- export async function down(db) {
13
- await db.schema.alterTable('OperationHistory').dropColumn('authz').execute();
14
- await db.schema.alterTable('DocumentBaseline').dropColumn('authz').execute();
15
- }
1
+ export const version = 2;
2
+ export const up = [
3
+ `ALTER TABLE "OperationHistory" ADD COLUMN "authz" TEXT DEFAULT NULL;`,
4
+ `ALTER TABLE "DocumentBaseline" ADD COLUMN "authz" TEXT DEFAULT NULL;`,
5
+ ];
16
6
  //# sourceMappingURL=v2.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"v2.js","sourceRoot":"","sources":["../../../../../src/storage/sqlShard/migrations/v2.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,KAAK,UAAU,EAAE,CAAC,EAAe;IACvC,4DAA4D;IAC5D,MAAM,EAAE,CAAC,MAAM;SACb,UAAU,CAAC,kBAAkB,CAAC;SAC9B,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;SACtD,OAAO,EAAE,CAAC;IAEZ,MAAM,EAAE,CAAC,MAAM;SACb,UAAU,CAAC,kBAAkB,CAAC;SAC9B,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;SACtD,OAAO,EAAE,CAAC;AACb,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,IAAI,CAAC,EAAe;IACzC,MAAM,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,kBAAkB,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,CAAC;IAE7E,MAAM,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,kBAAkB,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,CAAC;AAC9E,CAAC"}
1
+ {"version":3,"file":"v2.js","sourceRoot":"","sources":["../../../../../src/storage/sqlShard/migrations/v2.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,CAAC;AAEzB,MAAM,CAAC,MAAM,EAAE,GAAG;IACjB,sEAAsE;IACtE,sEAAsE;CACtE,CAAC"}
@@ -1,7 +1,5 @@
1
- import * as v1 from './migrations/v1.js';
2
- import * as v2 from './migrations/v2.js';
3
- declare const _default: {
4
- v1: typeof v1;
5
- v2: typeof v2;
6
- };
7
- export default _default;
1
+ import { Logger } from '../../logger.js';
2
+ import { SqliteExecutor } from './database.js';
3
+ export declare function getMigrationVersion(run: SqliteExecutor['query']): any;
4
+ export declare function updateMigrationVersion(run: SqliteExecutor['exec'], version: number): void;
5
+ export declare function migrateToLatest(e: Pick<SqliteExecutor, 'exec' | 'query' | 'migrated'>, log: Logger): void;
@@ -1,4 +1,51 @@
1
1
  import * as v1 from './migrations/v1.js';
2
2
  import * as v2 from './migrations/v2.js';
3
- export default { v1, v2 };
3
+ export function getMigrationVersion(run) {
4
+ var _a, _b;
5
+ try {
6
+ const result = run(`SELECT id FROM _Migrations
7
+ ORDER BY id DESC
8
+ LIMIT 1;`);
9
+ const value = (_b = (_a = result[0]) === null || _a === void 0 ? void 0 : _a.id) !== null && _b !== void 0 ? _b : 0;
10
+ return value;
11
+ }
12
+ catch (e) {
13
+ if (e instanceof Error &&
14
+ e.message.includes('no such table: _Migrations')) {
15
+ return 0;
16
+ }
17
+ throw e;
18
+ }
19
+ }
20
+ export function updateMigrationVersion(run, version) {
21
+ run(`INSERT INTO _Migrations (id, appliedAt) VALUES (?, ?)`, [
22
+ version,
23
+ Date.now(),
24
+ ]);
25
+ }
26
+ export function migrateToLatest(e, log) {
27
+ const allMigrations = [v1, v2];
28
+ const currentVersion = getMigrationVersion(e.query);
29
+ const pendingMigrations = allMigrations.slice(currentVersion);
30
+ if (pendingMigrations.length === 0) {
31
+ e.migrated = true;
32
+ return;
33
+ }
34
+ log('info', `Applying ${pendingMigrations.length} pending migrations...`);
35
+ for (const migration of pendingMigrations) {
36
+ for (const step of migration.up) {
37
+ try {
38
+ e.exec(step);
39
+ }
40
+ catch (err) {
41
+ log('error', `Error applying migration v${migration.version}:`, err);
42
+ log('error', `SQL:`, step);
43
+ throw err;
44
+ }
45
+ }
46
+ log('info', `Applied migration v${migration.version}`);
47
+ }
48
+ updateMigrationVersion(e.exec, allMigrations[allMigrations.length - 1].version);
49
+ e.migrated = true;
50
+ }
4
51
  //# sourceMappingURL=migrations.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"migrations.js","sourceRoot":"","sources":["../../../../src/storage/sqlShard/migrations.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,oBAAoB,CAAC;AACzC,OAAO,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAEzC,eAAe,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC"}
1
+ {"version":3,"file":"migrations.js","sourceRoot":"","sources":["../../../../src/storage/sqlShard/migrations.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,oBAAoB,CAAC;AACzC,OAAO,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAEzC,MAAM,UAAU,mBAAmB,CAAC,GAA4B;;IAC/D,IAAI,CAAC;QACJ,MAAM,MAAM,GAAG,GAAG,CACjB;;YAES,CACT,CAAC;QACF,MAAM,KAAK,GAAG,MAAA,MAAA,MAAM,CAAC,CAAC,CAAC,0CAAE,EAAE,mCAAI,CAAC,CAAC;QACjC,OAAO,KAAK,CAAC;IACd,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACZ,IACC,CAAC,YAAY,KAAK;YAClB,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,4BAA4B,CAAC,EAC/C,CAAC;YACF,OAAO,CAAC,CAAC;QACV,CAAC;QACD,MAAM,CAAC,CAAC;IACT,CAAC;AACF,CAAC;AAED,MAAM,UAAU,sBAAsB,CACrC,GAA2B,EAC3B,OAAe;IAEf,GAAG,CAAC,uDAAuD,EAAE;QAC5D,OAAO;QACP,IAAI,CAAC,GAAG,EAAE;KACV,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,eAAe,CAC9B,CAAsD,EACtD,GAAW;IAEX,MAAM,aAAa,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;IAE/B,MAAM,cAAc,GAAG,mBAAmB,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IAEpD,MAAM,iBAAiB,GAAG,aAAa,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;IAC9D,IAAI,iBAAiB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACpC,CAAC,CAAC,QAAQ,GAAG,IAAI,CAAC;QAClB,OAAO;IACR,CAAC;IACD,GAAG,CAAC,MAAM,EAAE,YAAY,iBAAiB,CAAC,MAAM,wBAAwB,CAAC,CAAC;IAC1E,KAAK,MAAM,SAAS,IAAI,iBAAiB,EAAE,CAAC;QAC3C,KAAK,MAAM,IAAI,IAAI,SAAS,CAAC,EAAE,EAAE,CAAC;YACjC,IAAI,CAAC;gBACJ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACd,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACd,GAAG,CAAC,OAAO,EAAE,6BAA6B,SAAS,CAAC,OAAO,GAAG,EAAE,GAAG,CAAC,CAAC;gBACrE,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;gBAC3B,MAAM,GAAG,CAAC;YACX,CAAC;QACF,CAAC;QACD,GAAG,CAAC,MAAM,EAAE,sBAAsB,SAAS,CAAC,OAAO,EAAE,CAAC,CAAC;IACxD,CAAC;IAED,sBAAsB,CACrB,CAAC,CAAC,IAAI,EACN,aAAa,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,OAAO,CAC/C,CAAC;IAEF,CAAC,CAAC,QAAQ,GAAG,IAAI,CAAC;AACnB,CAAC"}
@@ -1,7 +1,28 @@
1
- import { StorageFactory } from '../Storage.js';
2
- export declare const sqlShardStorage: ({ databasesDirectory, transferFromUnifiedDatabaseFile, disableWal, closeTimeout, }: {
1
+ import { Logger } from '../../logger.js';
2
+ import { Storage, StorageFactory, StorageOptions } from '../Storage.js';
3
+ import { Databases } from './Databases.js';
4
+ import { SqlBaselines } from './SqlBaselines.js';
5
+ import { SqlFileMetadata } from './SqlFileMetadata.js';
6
+ import { SqlOperations } from './SqlOperations.js';
7
+ import { SqlReplicas } from './SqlReplicas.js';
8
+ import { SqliteExecutor } from './database.js';
9
+ export declare const sqlShardStorage: ({ databasesDirectory, disableWal, closeTimeout, fileDeleteExpirationDays, replicaTruancyMinutes, log, }: {
3
10
  databasesDirectory: string;
4
- transferFromUnifiedDatabaseFile?: string;
5
11
  disableWal?: boolean;
6
12
  closeTimeout?: number;
7
- }) => StorageFactory;
13
+ databases?: Databases;
14
+ log?: Logger;
15
+ } & StorageOptions) => StorageFactory;
16
+ export declare class SqlShardStorage implements Storage {
17
+ #private;
18
+ private db;
19
+ baselines: SqlBaselines;
20
+ operations: SqlOperations;
21
+ replicas: SqlReplicas;
22
+ fileMetadata: SqlFileMetadata;
23
+ get open(): boolean;
24
+ constructor(db: SqliteExecutor, options: Required<StorageOptions> & {
25
+ libraryId: string;
26
+ });
27
+ close: () => Promise<void>;
28
+ }
@@ -1,55 +1,58 @@
1
+ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
2
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
3
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
4
+ return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
5
+ };
6
+ var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
7
+ if (kind === "m") throw new TypeError("Private method is not writable");
8
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
9
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
10
+ return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
11
+ };
12
+ var _SqlShardStorage_open;
13
+ import { existsSync, mkdirSync } from 'fs';
14
+ import { defaultFileExpirationDays, defaultReplicaTruancyMinutes, } from '../../defaults.js';
15
+ import { Databases } from './Databases.js';
1
16
  import { SqlBaselines } from './SqlBaselines.js';
17
+ import { SqlFileMetadata } from './SqlFileMetadata.js';
2
18
  import { SqlOperations } from './SqlOperations.js';
3
19
  import { SqlReplicas } from './SqlReplicas.js';
4
- import { SqlFileMetadata } from './SqlFileMetadata.js';
5
- import { Databases } from './Databases.js';
6
- import { transferToShards } from './transfer.js';
7
- import { existsSync, mkdirSync, readdirSync } from 'fs';
8
- export const sqlShardStorage = ({ databasesDirectory, transferFromUnifiedDatabaseFile, disableWal, closeTimeout, }) => {
9
- let ready = Promise.resolve(undefined);
20
+ export const sqlShardStorage = ({ databasesDirectory, disableWal, closeTimeout, fileDeleteExpirationDays = defaultFileExpirationDays, replicaTruancyMinutes = defaultReplicaTruancyMinutes, log, }) => {
10
21
  if (databasesDirectory !== ':memory:' && !existsSync(databasesDirectory)) {
11
22
  mkdirSync(databasesDirectory);
12
23
  console.info(`Created databases directory: ${databasesDirectory}`);
13
24
  }
14
- if (transferFromUnifiedDatabaseFile) {
15
- // check if directory is empty
16
- const files = databasesDirectory === ':memory:' ? [] : readdirSync(databasesDirectory);
17
- if (files.length > 0) {
18
- console.error(`Cannot transfer from unified database to non-empty directory: ${databasesDirectory}. This might mean the transfer has already happened and you're free to turn off the transferFromUnifiedDatabaseFile option.`);
19
- }
20
- else {
21
- ready = transferToShards({
22
- file: transferFromUnifiedDatabaseFile,
23
- directory: databasesDirectory,
24
- }).then();
25
- }
26
- }
27
25
  const dbs = new Databases({
28
26
  directory: databasesDirectory,
29
27
  disableWal,
30
28
  closeTimeout,
29
+ log,
31
30
  });
32
- return (options) => {
33
- const baselines = new SqlBaselines(dbs, 'sqlite');
34
- const operations = new SqlOperations(dbs, 'sqlite');
35
- const replicas = new SqlReplicas(dbs, options.replicaTruancyMinutes, 'sqlite');
36
- const fileMetadata = new SqlFileMetadata(dbs, options.fileDeleteExpirationDays, 'sqlite');
37
- const close = async () => {
38
- storage.open = false;
39
- await dbs.destroy();
40
- };
41
- const storage = {
42
- baselines,
43
- operations,
44
- replicas,
45
- fileMetadata,
46
- close,
47
- open: false,
48
- ready: ready.then(() => {
49
- storage.open = true;
50
- }),
51
- };
52
- return storage;
31
+ return async (libraryId) => {
32
+ const db = await dbs.get(libraryId);
33
+ return new SqlShardStorage(db, {
34
+ fileDeleteExpirationDays,
35
+ replicaTruancyMinutes,
36
+ libraryId,
37
+ });
53
38
  };
54
39
  };
40
+ export class SqlShardStorage {
41
+ get open() {
42
+ return __classPrivateFieldGet(this, _SqlShardStorage_open, "f");
43
+ }
44
+ constructor(db, options) {
45
+ this.db = db;
46
+ _SqlShardStorage_open.set(this, true);
47
+ this.close = async () => {
48
+ __classPrivateFieldSet(this, _SqlShardStorage_open, false, "f");
49
+ await this.db.close();
50
+ };
51
+ this.baselines = new SqlBaselines(db, options.libraryId);
52
+ this.operations = new SqlOperations(db, options.libraryId);
53
+ this.replicas = new SqlReplicas(db, options.libraryId, options.replicaTruancyMinutes);
54
+ this.fileMetadata = new SqlFileMetadata(db, options.libraryId, options.fileDeleteExpirationDays);
55
+ }
56
+ }
57
+ _SqlShardStorage_open = new WeakMap();
55
58
  //# sourceMappingURL=sqlShardStorage.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"sqlShardStorage.js","sourceRoot":"","sources":["../../../../src/storage/sqlShard/sqlShardStorage.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE/C,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAGvD,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,IAAI,CAAC;AAExD,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,EAC/B,kBAAkB,EAClB,+BAA+B,EAC/B,UAAU,EACV,YAAY,GAMZ,EAAkB,EAAE;IACpB,IAAI,KAAK,GAAG,OAAO,CAAC,OAAO,CAAO,SAAS,CAAC,CAAC;IAC7C,IAAI,kBAAkB,KAAK,UAAU,IAAI,CAAC,UAAU,CAAC,kBAAkB,CAAC,EAAE,CAAC;QAC1E,SAAS,CAAC,kBAAkB,CAAC,CAAC;QAC9B,OAAO,CAAC,IAAI,CAAC,gCAAgC,kBAAkB,EAAE,CAAC,CAAC;IACpE,CAAC;IACD,IAAI,+BAA+B,EAAE,CAAC;QACrC,8BAA8B;QAC9B,MAAM,KAAK,GACV,kBAAkB,KAAK,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,kBAAkB,CAAC,CAAC;QAC1E,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtB,OAAO,CAAC,KAAK,CACZ,iEAAiE,kBAAkB,6HAA6H,CAChN,CAAC;QACH,CAAC;aAAM,CAAC;YACP,KAAK,GAAG,gBAAgB,CAAC;gBACxB,IAAI,EAAE,+BAA+B;gBACrC,SAAS,EAAE,kBAAkB;aAC7B,CAAC,CAAC,IAAI,EAAE,CAAC;QACX,CAAC;IACF,CAAC;IACD,MAAM,GAAG,GAAG,IAAI,SAAS,CAAC;QACzB,SAAS,EAAE,kBAAkB;QAC7B,UAAU;QACV,YAAY;KACZ,CAAC,CAAC;IACH,OAAO,CAAC,OAAO,EAAE,EAAE;QAClB,MAAM,SAAS,GAAG,IAAI,YAAY,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;QAClD,MAAM,UAAU,GAAG,IAAI,aAAa,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;QACpD,MAAM,QAAQ,GAAG,IAAI,WAAW,CAC/B,GAAG,EACH,OAAO,CAAC,qBAAqB,EAC7B,QAAQ,CACR,CAAC;QACF,MAAM,YAAY,GAAG,IAAI,eAAe,CACvC,GAAG,EACH,OAAO,CAAC,wBAAwB,EAChC,QAAQ,CACR,CAAC;QACF,MAAM,KAAK,GAAG,KAAK,IAAI,EAAE;YACxB,OAAO,CAAC,IAAI,GAAG,KAAK,CAAC;YACrB,MAAM,GAAG,CAAC,OAAO,EAAE,CAAC;QACrB,CAAC,CAAC;QACF,MAAM,OAAO,GAAG;YACf,SAAS;YACT,UAAU;YACV,QAAQ;YACR,YAAY;YACZ,KAAK;YACL,IAAI,EAAE,KAAK;YACX,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE;gBACtB,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;YACrB,CAAC,CAAC;SACF,CAAC;QACF,OAAO,OAAO,CAAC;IAChB,CAAC,CAAC;AACH,CAAC,CAAC"}
1
+ {"version":3,"file":"sqlShardStorage.js","sourceRoot":"","sources":["../../../../src/storage/sqlShard/sqlShardStorage.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AAC3C,OAAO,EACN,yBAAyB,EACzB,4BAA4B,GAC5B,MAAM,mBAAmB,CAAC;AAG3B,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAG/C,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,EAC/B,kBAAkB,EAClB,UAAU,EACV,YAAY,EACZ,wBAAwB,GAAG,yBAAyB,EACpD,qBAAqB,GAAG,4BAA4B,EACpD,GAAG,GAOc,EAAkB,EAAE;IACrC,IAAI,kBAAkB,KAAK,UAAU,IAAI,CAAC,UAAU,CAAC,kBAAkB,CAAC,EAAE,CAAC;QAC1E,SAAS,CAAC,kBAAkB,CAAC,CAAC;QAC9B,OAAO,CAAC,IAAI,CAAC,gCAAgC,kBAAkB,EAAE,CAAC,CAAC;IACpE,CAAC;IACD,MAAM,GAAG,GAAG,IAAI,SAAS,CAAC;QACzB,SAAS,EAAE,kBAAkB;QAC7B,UAAU;QACV,YAAY;QACZ,GAAG;KACH,CAAC,CAAC;IACH,OAAO,KAAK,EAAE,SAAS,EAAE,EAAE;QAC1B,MAAM,EAAE,GAAG,MAAM,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QACpC,OAAO,IAAI,eAAe,CAAC,EAAE,EAAE;YAC9B,wBAAwB;YACxB,qBAAqB;YACrB,SAAS;SACT,CAAC,CAAC;IACJ,CAAC,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,OAAO,eAAe;IAO3B,IAAI,IAAI;QACP,OAAO,uBAAA,IAAI,6BAAM,CAAC;IACnB,CAAC;IAED,YACS,EAAkB,EAC1B,OAAyD;QADjD,OAAE,GAAF,EAAE,CAAgB;QAN3B,gCAAQ,IAAI,EAAC;QAuBb,UAAK,GAAG,KAAK,IAAI,EAAE;YAClB,uBAAA,IAAI,yBAAS,KAAK,MAAA,CAAC;YACnB,MAAM,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC;QACvB,CAAC,CAAC;QAjBD,IAAI,CAAC,SAAS,GAAG,IAAI,YAAY,CAAC,EAAE,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC;QACzD,IAAI,CAAC,UAAU,GAAG,IAAI,aAAa,CAAC,EAAE,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC;QAC3D,IAAI,CAAC,QAAQ,GAAG,IAAI,WAAW,CAC9B,EAAE,EACF,OAAO,CAAC,SAAS,EACjB,OAAO,CAAC,qBAAqB,CAC7B,CAAC;QACF,IAAI,CAAC,YAAY,GAAG,IAAI,eAAe,CACtC,EAAE,EACF,OAAO,CAAC,SAAS,EACjB,OAAO,CAAC,wBAAwB,CAChC,CAAC;IACH,CAAC;CAMD"}
@@ -1,10 +1,13 @@
1
1
  import { ReplicaType } from '@verdant-web/common';
2
- import { Generated, Selectable } from 'kysely';
3
2
  export interface Database {
4
3
  OperationHistory: OperationHistoryTable;
5
4
  DocumentBaseline: DocumentBaselineTable;
6
5
  ReplicaInfo: ReplicaInfoTable;
7
6
  FileMetadata: FileMetadataTable;
7
+ _Migrations: {
8
+ id: number;
9
+ appliedAt: string;
10
+ };
8
11
  }
9
12
  export interface OperationHistoryTable {
10
13
  oid: string;
@@ -14,27 +17,27 @@ export interface OperationHistoryTable {
14
17
  replicaId: string;
15
18
  authz: string | null;
16
19
  }
17
- export type OperationHistoryRow = Selectable<OperationHistoryTable>;
20
+ export type OperationHistoryRow = OperationHistoryTable;
18
21
  export interface DocumentBaselineTable {
19
22
  oid: string;
20
23
  snapshot: string;
21
24
  timestamp: string;
22
25
  authz: string | null;
23
26
  }
24
- export type DocumentBaselineRow = Selectable<DocumentBaselineTable>;
27
+ export type DocumentBaselineRow = DocumentBaselineTable;
25
28
  export interface ReplicaInfoTable {
26
29
  id: string;
27
30
  clientId: string;
28
31
  lastSeenWallClockTime: number | null;
29
32
  ackedLogicalTime: string | null;
30
33
  type: ReplicaType;
31
- ackedServerOrder: Generated<number>;
34
+ ackedServerOrder: number;
32
35
  }
33
- export type ReplicaInfoRow = Selectable<ReplicaInfoTable>;
36
+ export type ReplicaInfoRow = ReplicaInfoTable;
34
37
  export interface FileMetadataTable {
35
38
  fileId: string;
36
39
  name: string;
37
40
  type: string;
38
41
  pendingDeleteAt: number | null;
39
42
  }
40
- export type FileMetadataRow = Selectable<FileMetadataTable>;
43
+ export type FileMetadataRow = FileMetadataTable;
@@ -17,7 +17,7 @@ export interface StoredReplicaInfo extends ReplicaInfo {
17
17
  type: ReplicaType;
18
18
  ackedServerOrder: number;
19
19
  }
20
- export type LibraryInfo<Profile = unknown> = {
20
+ export type LibraryInfo = {
21
21
  id: string;
22
22
  replicas: {
23
23
  id: string;
@@ -25,7 +25,6 @@ export type LibraryInfo<Profile = unknown> = {
25
25
  ackedServerOrder: number;
26
26
  type: ReplicaType;
27
27
  truant: boolean;
28
- profile: Profile;
29
28
  }[];
30
29
  latestServerOrder: number;
31
30
  operationsCount: number;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@verdant-web/server",
3
- "version": "3.3.11",
3
+ "version": "4.0.0",
4
4
  "access": "public",
5
5
  "type": "module",
6
6
  "bin": {
@@ -14,6 +14,10 @@
14
14
  "./storage": {
15
15
  "import": "./dist/esm/storage/index.js",
16
16
  "types": "./dist/esm/storage/index.d.ts"
17
+ },
18
+ "./internals": {
19
+ "import": "./dist/esm/internals.js",
20
+ "types": "./dist/esm/internals.d.ts"
17
21
  }
18
22
  },
19
23
  "publishConfig": {
@@ -24,29 +28,36 @@
24
28
  "src/",
25
29
  "bin/"
26
30
  ],
31
+ "peerDependencies": {
32
+ "hono": "^4.7.2",
33
+ "@hono/node-server": "^1.13.8"
34
+ },
35
+ "peerDependenciesMeta": {
36
+ "hono": {
37
+ "optional": true
38
+ },
39
+ "@hono/node-server": {
40
+ "optional": true
41
+ }
42
+ },
27
43
  "dependencies": {
28
- "@a-type/kysely": "^1.0.2",
29
- "@fastify/busboy": "^3.1.1",
30
- "async-lock": "^1.4.0",
31
- "better-sqlite3": "^11.8.1",
32
- "busboy": "^1.6.0",
44
+ "@hono/node-server": "^1.19.5",
45
+ "better-sqlite3": "^11.10.0",
46
+ "hono": "^4.9.9",
33
47
  "jsonwebtoken": "^8.5.1",
34
- "kysely": "0.27.5",
35
- "kysely-plugin-serialize": "^0.5.7",
36
48
  "minimist": "^1.2.8",
37
49
  "ws": "^8.9.0",
38
- "@verdant-web/common": "2.9.1"
50
+ "@verdant-web/common": "3.0.0"
39
51
  },
40
52
  "devDependencies": {
41
53
  "@types/async-lock": "^1.3.0",
42
54
  "@types/better-sqlite3": "^7.6.12",
43
- "@types/busboy": "^1.5.0",
44
55
  "@types/jsonwebtoken": "^8.5.9",
45
- "@types/node": "^20.11.5",
56
+ "@types/node": "24.6.1",
46
57
  "@types/ws": "^8.5.3",
47
58
  "cross-env": "7.0.3",
48
- "typescript": "^5.4.2",
49
- "vitest": "^2.0.5"
59
+ "typescript": "5.9.3",
60
+ "vitest": "3.2.4"
50
61
  },
51
62
  "scripts": {
52
63
  "build": "tsc",
@@ -4,6 +4,10 @@ import jwt, { JwtPayload } from 'jsonwebtoken';
4
4
  export class TokenVerifier {
5
5
  constructor(private config: { secret: string }) {}
6
6
 
7
+ get secret() {
8
+ return this.config.secret;
9
+ }
10
+
7
11
  verifyToken = (token: string): TokenInfo => {
8
12
  try {
9
13
  const decoded = jwt.verify(token, this.config.secret, {
@@ -0,0 +1,18 @@
1
+ import { VerdantError } from '@verdant-web/common';
2
+ import { ErrorHandler } from 'hono';
3
+ import { ContentfulStatusCode } from 'hono/utils/http-status';
4
+
5
+ export const errorHandler: ErrorHandler = (err, ctx) => {
6
+ if (err instanceof VerdantError) {
7
+ if (err.code > VerdantError.Code.Unexpected) {
8
+ console.error('Verdant error:', err);
9
+ }
10
+ return ctx.json(err.toResponse(), err.httpStatus as ContentfulStatusCode);
11
+ }
12
+
13
+ console.error('Unexpected error:', err);
14
+ return ctx.json(
15
+ new VerdantError(VerdantError.Code.Unexpected).toResponse(),
16
+ 500,
17
+ );
18
+ };
@@ -0,0 +1,34 @@
1
+ import { VerdantError } from '@verdant-web/common';
2
+
3
+ export function getRequestToken(req: Request) {
4
+ if (req.method === 'OPTIONS') {
5
+ // preflight request, np
6
+ return null;
7
+ }
8
+ // websocket compat - we only receive one header...
9
+ const protocolHeader = req.headers.get('Sec-WebSocket-Protocol');
10
+ if (protocolHeader) {
11
+ const [type, token] = protocolHeader.split(',');
12
+ if (type === 'Bearer') {
13
+ return token.trim();
14
+ }
15
+ }
16
+
17
+ const authHeader = req.headers.get('Authorization');
18
+ if (!authHeader) {
19
+ throw new VerdantError(
20
+ VerdantError.Code.NoToken,
21
+ undefined,
22
+ 'Authorization header is required',
23
+ );
24
+ }
25
+ const [type, token] = authHeader.split(' ');
26
+ if (type !== 'Bearer') {
27
+ throw new VerdantError(
28
+ VerdantError.Code.InvalidToken,
29
+ undefined,
30
+ 'Authorization type must be Bearer',
31
+ );
32
+ }
33
+ return token;
34
+ }