@verdant-web/server 1.7.8

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 (165) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +5 -0
  3. package/dist/cjs/Baselines.d.ts +14 -0
  4. package/dist/cjs/Baselines.js +101 -0
  5. package/dist/cjs/Baselines.js.map +1 -0
  6. package/dist/cjs/ClientConnection.d.ts +18 -0
  7. package/dist/cjs/ClientConnection.js +106 -0
  8. package/dist/cjs/ClientConnection.js.map +1 -0
  9. package/dist/cjs/MessageSender.d.ts +5 -0
  10. package/dist/cjs/MessageSender.js +3 -0
  11. package/dist/cjs/MessageSender.js.map +1 -0
  12. package/dist/cjs/OperationHistory.d.ts +34 -0
  13. package/dist/cjs/OperationHistory.js +147 -0
  14. package/dist/cjs/OperationHistory.js.map +1 -0
  15. package/dist/cjs/Presence.d.ts +15 -0
  16. package/dist/cjs/Presence.js +60 -0
  17. package/dist/cjs/Presence.js.map +1 -0
  18. package/dist/cjs/Profiles.d.ts +10 -0
  19. package/dist/cjs/Profiles.js +20 -0
  20. package/dist/cjs/Profiles.js.map +1 -0
  21. package/dist/cjs/ReplicaKeepaliveTimers.d.ts +17 -0
  22. package/dist/cjs/ReplicaKeepaliveTimers.js +31 -0
  23. package/dist/cjs/ReplicaKeepaliveTimers.js.map +1 -0
  24. package/dist/cjs/Replicas.d.ts +23 -0
  25. package/dist/cjs/Replicas.js +174 -0
  26. package/dist/cjs/Replicas.js.map +1 -0
  27. package/dist/cjs/Server.d.ts +121 -0
  28. package/dist/cjs/Server.js +378 -0
  29. package/dist/cjs/Server.js.map +1 -0
  30. package/dist/cjs/ServerLibrary.d.ts +63 -0
  31. package/dist/cjs/ServerLibrary.js +468 -0
  32. package/dist/cjs/ServerLibrary.js.map +1 -0
  33. package/dist/cjs/ServerStorage.d.ts +35 -0
  34. package/dist/cjs/ServerStorage.js +60 -0
  35. package/dist/cjs/ServerStorage.js.map +1 -0
  36. package/dist/cjs/TokenProvider.d.ts +16 -0
  37. package/dist/cjs/TokenProvider.js +27 -0
  38. package/dist/cjs/TokenProvider.js.map +1 -0
  39. package/dist/cjs/TokenVerifier.d.ts +16 -0
  40. package/dist/cjs/TokenVerifier.js +29 -0
  41. package/dist/cjs/TokenVerifier.js.map +1 -0
  42. package/dist/cjs/files/FileMetadata.d.ts +28 -0
  43. package/dist/cjs/files/FileMetadata.js +69 -0
  44. package/dist/cjs/files/FileMetadata.js.map +1 -0
  45. package/dist/cjs/files/FileStorage.d.ts +35 -0
  46. package/dist/cjs/files/FileStorage.js +72 -0
  47. package/dist/cjs/files/FileStorage.js.map +1 -0
  48. package/dist/cjs/index.d.ts +9 -0
  49. package/dist/cjs/index.js +12 -0
  50. package/dist/cjs/index.js.map +1 -0
  51. package/dist/cjs/migrations/v0.sql.d.ts +2 -0
  52. package/dist/cjs/migrations/v0.sql.js +29 -0
  53. package/dist/cjs/migrations/v0.sql.js.map +1 -0
  54. package/dist/cjs/migrations/v1.sql.d.ts +2 -0
  55. package/dist/cjs/migrations/v1.sql.js +31 -0
  56. package/dist/cjs/migrations/v1.sql.js.map +1 -0
  57. package/dist/cjs/migrations/v2.sql.d.ts +2 -0
  58. package/dist/cjs/migrations/v2.sql.js +28 -0
  59. package/dist/cjs/migrations/v2.sql.js.map +1 -0
  60. package/dist/cjs/migrations/v3.sql.d.ts +2 -0
  61. package/dist/cjs/migrations/v3.sql.js +14 -0
  62. package/dist/cjs/migrations/v3.sql.js.map +1 -0
  63. package/dist/cjs/migrations/v4.sql.d.ts +2 -0
  64. package/dist/cjs/migrations/v4.sql.js +8 -0
  65. package/dist/cjs/migrations/v4.sql.js.map +1 -0
  66. package/dist/cjs/migrations.d.ts +2 -0
  67. package/dist/cjs/migrations.js +41 -0
  68. package/dist/cjs/migrations.js.map +1 -0
  69. package/dist/cjs/types.d.ts +22 -0
  70. package/dist/cjs/types.js +3 -0
  71. package/dist/cjs/types.js.map +1 -0
  72. package/dist/esm/Baselines.d.ts +14 -0
  73. package/dist/esm/Baselines.js +97 -0
  74. package/dist/esm/Baselines.js.map +1 -0
  75. package/dist/esm/ClientConnection.d.ts +18 -0
  76. package/dist/esm/ClientConnection.js +102 -0
  77. package/dist/esm/ClientConnection.js.map +1 -0
  78. package/dist/esm/MessageSender.d.ts +5 -0
  79. package/dist/esm/MessageSender.js +2 -0
  80. package/dist/esm/MessageSender.js.map +1 -0
  81. package/dist/esm/OperationHistory.d.ts +34 -0
  82. package/dist/esm/OperationHistory.js +143 -0
  83. package/dist/esm/OperationHistory.js.map +1 -0
  84. package/dist/esm/Presence.d.ts +15 -0
  85. package/dist/esm/Presence.js +53 -0
  86. package/dist/esm/Presence.js.map +1 -0
  87. package/dist/esm/Profiles.d.ts +10 -0
  88. package/dist/esm/Profiles.js +16 -0
  89. package/dist/esm/Profiles.js.map +1 -0
  90. package/dist/esm/ReplicaKeepaliveTimers.d.ts +17 -0
  91. package/dist/esm/ReplicaKeepaliveTimers.js +27 -0
  92. package/dist/esm/ReplicaKeepaliveTimers.js.map +1 -0
  93. package/dist/esm/Replicas.d.ts +23 -0
  94. package/dist/esm/Replicas.js +170 -0
  95. package/dist/esm/Replicas.js.map +1 -0
  96. package/dist/esm/Server.d.ts +121 -0
  97. package/dist/esm/Server.js +371 -0
  98. package/dist/esm/Server.js.map +1 -0
  99. package/dist/esm/ServerLibrary.d.ts +63 -0
  100. package/dist/esm/ServerLibrary.js +464 -0
  101. package/dist/esm/ServerLibrary.js.map +1 -0
  102. package/dist/esm/ServerStorage.d.ts +44 -0
  103. package/dist/esm/ServerStorage.js +58 -0
  104. package/dist/esm/ServerStorage.js.map +1 -0
  105. package/dist/esm/TokenProvider.d.ts +16 -0
  106. package/dist/esm/TokenProvider.js +20 -0
  107. package/dist/esm/TokenProvider.js.map +1 -0
  108. package/dist/esm/TokenVerifier.d.ts +16 -0
  109. package/dist/esm/TokenVerifier.js +22 -0
  110. package/dist/esm/TokenVerifier.js.map +1 -0
  111. package/dist/esm/files/FileMetadata.d.ts +28 -0
  112. package/dist/esm/files/FileMetadata.js +65 -0
  113. package/dist/esm/files/FileMetadata.js.map +1 -0
  114. package/dist/esm/files/FileStorage.d.ts +35 -0
  115. package/dist/esm/files/FileStorage.js +45 -0
  116. package/dist/esm/files/FileStorage.js.map +1 -0
  117. package/dist/esm/index.d.ts +9 -0
  118. package/dist/esm/index.js +5 -0
  119. package/dist/esm/index.js.map +1 -0
  120. package/dist/esm/migrations/v0.sql.d.ts +2 -0
  121. package/dist/esm/migrations/v0.sql.js +27 -0
  122. package/dist/esm/migrations/v0.sql.js.map +1 -0
  123. package/dist/esm/migrations/v1.sql.d.ts +2 -0
  124. package/dist/esm/migrations/v1.sql.js +29 -0
  125. package/dist/esm/migrations/v1.sql.js.map +1 -0
  126. package/dist/esm/migrations/v2.sql.d.ts +2 -0
  127. package/dist/esm/migrations/v2.sql.js +26 -0
  128. package/dist/esm/migrations/v2.sql.js.map +1 -0
  129. package/dist/esm/migrations/v3.sql.d.ts +2 -0
  130. package/dist/esm/migrations/v3.sql.js +12 -0
  131. package/dist/esm/migrations/v3.sql.js.map +1 -0
  132. package/dist/esm/migrations/v4.sql.d.ts +2 -0
  133. package/dist/esm/migrations/v4.sql.js +6 -0
  134. package/dist/esm/migrations/v4.sql.js.map +1 -0
  135. package/dist/esm/migrations.d.ts +2 -0
  136. package/dist/esm/migrations.js +34 -0
  137. package/dist/esm/migrations.js.map +1 -0
  138. package/dist/esm/types.d.ts +22 -0
  139. package/dist/esm/types.js +2 -0
  140. package/dist/esm/types.js.map +1 -0
  141. package/dist/tsconfig-cjs.tsbuildinfo +1 -0
  142. package/dist/tsconfig.tsbuildinfo +1 -0
  143. package/package.json +43 -0
  144. package/src/Baselines.ts +158 -0
  145. package/src/ClientConnection.ts +150 -0
  146. package/src/MessageSender.ts +10 -0
  147. package/src/OperationHistory.ts +206 -0
  148. package/src/Presence.ts +63 -0
  149. package/src/Profiles.ts +21 -0
  150. package/src/ReplicaKeepaliveTimers.ts +34 -0
  151. package/src/Replicas.ts +238 -0
  152. package/src/Server.ts +553 -0
  153. package/src/ServerLibrary.ts +727 -0
  154. package/src/TokenProvider.ts +39 -0
  155. package/src/TokenVerifier.ts +30 -0
  156. package/src/files/FileMetadata.ts +112 -0
  157. package/src/files/FileStorage.ts +87 -0
  158. package/src/index.ts +9 -0
  159. package/src/migrations/v0.sql.ts +26 -0
  160. package/src/migrations/v1.sql.ts +28 -0
  161. package/src/migrations/v2.sql.ts +26 -0
  162. package/src/migrations/v3.sql.ts +12 -0
  163. package/src/migrations/v4.sql.ts +6 -0
  164. package/src/migrations.ts +51 -0
  165. package/src/types.ts +35 -0
@@ -0,0 +1,58 @@
1
+ import { ServerLibrary } from './ServerLibrary.js';
2
+ import { UserProfileLoader } from './Profiles.js';
3
+ import { migrations } from './migrations.js';
4
+ import { FileMetadata } from './files/FileMetadata.js';
5
+ export class ServerStorage {
6
+ constructor({ db, sender, profiles, replicaTruancyMinutes, disableRebasing = false, log = () => { }, }) {
7
+ /**
8
+ * Call with any message from any replica
9
+ */
10
+ this.receive = (libraryId, clientKey, message, info) => {
11
+ return this.library.receive(message, clientKey, info);
12
+ };
13
+ /**
14
+ * Call when a replica disconnects from the server
15
+ */
16
+ this.remove = (libraryId, replicaId) => {
17
+ this.library.remove(libraryId, replicaId);
18
+ };
19
+ this.evictLibrary = (libraryId) => {
20
+ this.library.destroy(libraryId);
21
+ };
22
+ this.evictUser = (libraryId, userId) => {
23
+ this.library.evictUser(libraryId, userId);
24
+ };
25
+ this.createSchema = () => {
26
+ migrations(this.db);
27
+ };
28
+ this.close = async () => {
29
+ this.db.close();
30
+ };
31
+ this.getLibraryPresence = (libraryId) => {
32
+ return this.library.getPresence(libraryId);
33
+ };
34
+ this.getDocumentSnapshot = (libraryId, oid) => {
35
+ return this.library.getDocumentSnapshot(libraryId, oid);
36
+ };
37
+ this.putFileInfo = (libraryId, fileInfo) => {
38
+ this.fileMetadata.put(libraryId, fileInfo);
39
+ };
40
+ this.getFileInfo = (libraryId, fileId) => {
41
+ return this.fileMetadata.get(libraryId, fileId);
42
+ };
43
+ this.db = db;
44
+ this.sender = sender;
45
+ this.createSchema();
46
+ this.profileLoader = new UserProfileLoader(profiles);
47
+ this.library = new ServerLibrary({
48
+ db: this.db,
49
+ sender: this.sender,
50
+ profiles: this.profileLoader,
51
+ replicaTruancyMinutes,
52
+ log,
53
+ disableRebasing,
54
+ });
55
+ this.fileMetadata = new FileMetadata(this.db);
56
+ }
57
+ }
58
+ //# sourceMappingURL=ServerStorage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ServerStorage.js","sourceRoot":"","sources":["../../src/ServerStorage.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAEnD,OAAO,EAAgB,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAEhE,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAE7C,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAWvD,MAAM,OAAO,aAAa;IAOzB,YAAY,EACX,EAAE,EACF,MAAM,EACN,QAAQ,EACR,qBAAqB,EACrB,eAAe,GAAG,KAAK,EACvB,GAAG,GAAG,GAAG,EAAE,GAAE,CAAC,GACQ;QAgBvB;;WAEG;QACH,YAAO,GAAG,CACT,SAAiB,EACjB,SAAiB,EACjB,OAAsB,EACtB,IAAe,EACd,EAAE;YACH,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC;QACvD,CAAC,CAAC;QAEF;;WAEG;QACH,WAAM,GAAG,CAAC,SAAiB,EAAE,SAAiB,EAAE,EAAE;YACjD,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;QAC3C,CAAC,CAAC;QAEF,iBAAY,GAAG,CAAC,SAAiB,EAAE,EAAE;YACpC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QACjC,CAAC,CAAC;QAEF,cAAS,GAAG,CAAC,SAAiB,EAAE,MAAc,EAAE,EAAE;YACjD,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;QAC3C,CAAC,CAAC;QAEM,iBAAY,GAAG,GAAG,EAAE;YAC3B,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACrB,CAAC,CAAC;QAEF,UAAK,GAAG,KAAK,IAAI,EAAE;YAClB,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC;QACjB,CAAC,CAAC;QAEF,uBAAkB,GAAG,CAAC,SAAiB,EAAE,EAAE;YAC1C,OAAO,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;QAC5C,CAAC,CAAC;QAEF,wBAAmB,GAAG,CAAC,SAAiB,EAAE,GAAW,EAAE,EAAE;YACxD,OAAO,IAAI,CAAC,OAAO,CAAC,mBAAmB,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;QACzD,CAAC,CAAC;QAEF,gBAAW,GAAG,CAAC,SAAiB,EAAE,QAAkB,EAAE,EAAE;YACvD,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;QAC5C,CAAC,CAAC;QAEF,gBAAW,GAAG,CAAC,SAAiB,EAAE,MAAc,EAAE,EAAE;YACnD,OAAO,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;QACjD,CAAC,CAAC;QAhED,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;QACb,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,YAAY,EAAE,CAAC;QACpB,IAAI,CAAC,aAAa,GAAG,IAAI,iBAAiB,CAAC,QAAQ,CAAC,CAAC;QACrD,IAAI,CAAC,OAAO,GAAG,IAAI,aAAa,CAAC;YAChC,EAAE,EAAE,IAAI,CAAC,EAAE;YACX,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,QAAQ,EAAE,IAAI,CAAC,aAAa;YAC5B,qBAAqB;YACrB,GAAG;YACH,eAAe;SACf,CAAC,CAAC;QACH,IAAI,CAAC,YAAY,GAAG,IAAI,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC/C,CAAC;CAoDD"}
@@ -0,0 +1,16 @@
1
+ import { ReplicaType } from '@verdant-web/common';
2
+ export declare class TokenProvider {
3
+ private config;
4
+ constructor(config: {
5
+ secret: string;
6
+ });
7
+ getToken: ({ userId, libraryId, syncEndpoint, role, type, expiresIn, fileEndpoint, }: {
8
+ userId: string;
9
+ libraryId: string;
10
+ syncEndpoint: string;
11
+ fileEndpoint?: string | undefined;
12
+ role?: string | undefined;
13
+ type?: ReplicaType | undefined;
14
+ expiresIn?: string | number | undefined;
15
+ }) => string;
16
+ }
@@ -0,0 +1,20 @@
1
+ import { ReplicaType } from '@verdant-web/common';
2
+ import jwt from 'jsonwebtoken';
3
+ export class TokenProvider {
4
+ constructor(config) {
5
+ this.config = config;
6
+ this.getToken = ({ userId, libraryId, syncEndpoint, role, type = ReplicaType.Realtime, expiresIn = '1d', fileEndpoint, }) => {
7
+ return jwt.sign({
8
+ sub: userId,
9
+ lib: libraryId,
10
+ url: syncEndpoint,
11
+ file: fileEndpoint,
12
+ role,
13
+ type,
14
+ }, this.config.secret, {
15
+ expiresIn,
16
+ });
17
+ };
18
+ }
19
+ }
20
+ //# sourceMappingURL=TokenProvider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TokenProvider.js","sourceRoot":"","sources":["../../src/TokenProvider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,GAAG,MAAM,cAAc,CAAC;AAE/B,MAAM,OAAO,aAAa;IACzB,YAAoB,MAA0B;QAA1B,WAAM,GAAN,MAAM,CAAoB;QAE9C,aAAQ,GAAG,CAAC,EACX,MAAM,EACN,SAAS,EACT,YAAY,EACZ,IAAI,EACJ,IAAI,GAAG,WAAW,CAAC,QAAQ,EAC3B,SAAS,GAAG,IAAI,EAChB,YAAY,GASZ,EAAE,EAAE;YACJ,OAAO,GAAG,CAAC,IAAI,CACd;gBACC,GAAG,EAAE,MAAM;gBACX,GAAG,EAAE,SAAS;gBACd,GAAG,EAAE,YAAY;gBACjB,IAAI,EAAE,YAAY;gBAClB,IAAI;gBACJ,IAAI;aACJ,EACD,IAAI,CAAC,MAAM,CAAC,MAAM,EAClB;gBACC,SAAS;aACT,CACD,CAAC;QACH,CAAC,CAAC;IAjC+C,CAAC;CAkClD"}
@@ -0,0 +1,16 @@
1
+ import { ReplicaType } from '@verdant-web/common';
2
+ export declare class TokenVerifier {
3
+ private config;
4
+ constructor(config: {
5
+ secret: string;
6
+ });
7
+ verifyToken: (token: string) => TokenInfo;
8
+ }
9
+ export interface TokenInfo {
10
+ userId: string;
11
+ libraryId: string;
12
+ syncEndpoint: string;
13
+ role?: string;
14
+ type: ReplicaType;
15
+ token: string;
16
+ }
@@ -0,0 +1,22 @@
1
+ import { assert } from '@verdant-web/common';
2
+ import jwt from 'jsonwebtoken';
3
+ export class TokenVerifier {
4
+ constructor(config) {
5
+ this.config = config;
6
+ this.verifyToken = (token) => {
7
+ const decoded = jwt.verify(token, this.config.secret, {
8
+ complete: false,
9
+ });
10
+ assert(decoded.sub);
11
+ return {
12
+ userId: decoded.sub,
13
+ libraryId: decoded.lib,
14
+ syncEndpoint: decoded.url,
15
+ role: decoded.role,
16
+ type: decoded.type,
17
+ token,
18
+ };
19
+ };
20
+ }
21
+ }
22
+ //# sourceMappingURL=TokenVerifier.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TokenVerifier.js","sourceRoot":"","sources":["../../src/TokenVerifier.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAe,MAAM,qBAAqB,CAAC;AAC1D,OAAO,GAAmB,MAAM,cAAc,CAAC;AAE/C,MAAM,OAAO,aAAa;IACzB,YAAoB,MAA0B;QAA1B,WAAM,GAAN,MAAM,CAAoB;QAE9C,gBAAW,GAAG,CAAC,KAAa,EAAa,EAAE;YAC1C,MAAM,OAAO,GAAG,GAAG,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE;gBACrD,QAAQ,EAAE,KAAK;aACf,CAAe,CAAC;YACjB,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YACpB,OAAO;gBACN,MAAM,EAAE,OAAO,CAAC,GAAG;gBACnB,SAAS,EAAE,OAAO,CAAC,GAAG;gBACtB,YAAY,EAAE,OAAO,CAAC,GAAG;gBACzB,IAAI,EAAE,OAAO,CAAC,IAAI;gBAClB,IAAI,EAAE,OAAO,CAAC,IAAI;gBAClB,KAAK;aACL,CAAC;QACH,CAAC,CAAC;IAf+C,CAAC;CAgBlD"}
@@ -0,0 +1,28 @@
1
+ import { Database } from 'better-sqlite3';
2
+ import { FileInfo } from './FileStorage.js';
3
+ export interface FileMetadataConfig {
4
+ deleteExpirationDays?: number;
5
+ }
6
+ export declare class FileMetadata {
7
+ private db;
8
+ private deleteExpirationDays;
9
+ constructor(db: Database, { deleteExpirationDays }?: FileMetadataConfig);
10
+ get: (libraryId: string, fileId: string) => {
11
+ libraryId: string;
12
+ fileId: string;
13
+ name: string;
14
+ type: string;
15
+ };
16
+ getAll: (libraryId: string) => any[];
17
+ deleteAll: (libraryId: string) => import("better-sqlite3").RunResult;
18
+ put: (libraryId: string, fileInfo: FileInfo) => import("better-sqlite3").RunResult;
19
+ markPendingDelete: (libraryId: string, fileId: string) => import("better-sqlite3").RunResult;
20
+ delete: (libraryId: string, fileId: string) => import("better-sqlite3").RunResult;
21
+ getPendingDeletes: (libraryId: string) => {
22
+ libraryId: string;
23
+ fileId: string;
24
+ name: string;
25
+ type: string;
26
+ pendingDeleteAt: number;
27
+ }[];
28
+ }
@@ -0,0 +1,65 @@
1
+ export class FileMetadata {
2
+ constructor(db, { deleteExpirationDays = 1 } = {}) {
3
+ this.db = db;
4
+ this.deleteExpirationDays = 1;
5
+ this.get = (libraryId, fileId) => {
6
+ return this.db
7
+ .prepare(`
8
+ SELECT * FROM FileMetadata
9
+ WHERE libraryId = ? AND fileId = ?
10
+ `)
11
+ .get(libraryId, fileId);
12
+ };
13
+ this.getAll = (libraryId) => {
14
+ return this.db
15
+ .prepare(`
16
+ SELECT * FROM FileMetadata
17
+ WHERE libraryId = ?
18
+ `)
19
+ .all(libraryId);
20
+ };
21
+ this.deleteAll = (libraryId) => {
22
+ return this.db
23
+ .prepare(`
24
+ DELETE FROM FileMetadata
25
+ WHERE libraryId = ?
26
+ `)
27
+ .run(libraryId);
28
+ };
29
+ this.put = (libraryId, fileInfo) => {
30
+ return this.db
31
+ .prepare(`
32
+ INSERT OR REPLACE INTO FileMetadata (libraryId, fileId, name, type)
33
+ VALUES (?, ?, ?, ?)
34
+ `)
35
+ .run(libraryId, fileInfo.id, fileInfo.fileName, fileInfo.type);
36
+ };
37
+ this.markPendingDelete = (libraryId, fileId) => {
38
+ return this.db
39
+ .prepare(`
40
+ UPDATE FileMetadata
41
+ SET pendingDeleteAt = ?
42
+ WHERE libraryId = ? AND fileId = ?
43
+ `)
44
+ .run(Date.now(), libraryId, fileId);
45
+ };
46
+ this.delete = (libraryId, fileId) => {
47
+ return this.db
48
+ .prepare(`
49
+ DELETE FROM FileMetadata
50
+ WHERE libraryId = ? AND fileId = ?
51
+ `)
52
+ .run(libraryId, fileId);
53
+ };
54
+ this.getPendingDeletes = (libraryId) => {
55
+ return this.db
56
+ .prepare(`
57
+ SELECT * FROM FileMetadata
58
+ WHERE libraryId = ? AND pendingDeleteAt < ?
59
+ `)
60
+ .all(libraryId, Date.now() - 1000 * 60 * 60 * 24 * this.deleteExpirationDays);
61
+ };
62
+ this.deleteExpirationDays = deleteExpirationDays;
63
+ }
64
+ }
65
+ //# sourceMappingURL=FileMetadata.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FileMetadata.js","sourceRoot":"","sources":["../../../src/files/FileMetadata.ts"],"names":[],"mappings":"AAOA,MAAM,OAAO,YAAY;IAGxB,YACS,EAAY,EACpB,EAAE,oBAAoB,GAAG,CAAC,KAAyB,EAAE;QAD7C,OAAE,GAAF,EAAE,CAAU;QAHb,yBAAoB,GAAG,CAAC,CAAC;QASjC,QAAG,GAAG,CACL,SAAiB,EACjB,MAAc,EAMb,EAAE;YACH,OAAO,IAAI,CAAC,EAAE;iBACZ,OAAO,CACP;;;KAGC,CACD;iBACA,GAAG,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;QAC1B,CAAC,CAAC;QAEF,WAAM,GAAG,CAAC,SAAiB,EAAE,EAAE;YAC9B,OAAO,IAAI,CAAC,EAAE;iBACZ,OAAO,CACP;;;GAGD,CACC;iBACA,GAAG,CAAC,SAAS,CAAC,CAAC;QAClB,CAAC,CAAC;QAEF,cAAS,GAAG,CAAC,SAAiB,EAAE,EAAE;YACjC,OAAO,IAAI,CAAC,EAAE;iBACZ,OAAO,CACP;;;GAGD,CACC;iBACA,GAAG,CAAC,SAAS,CAAC,CAAC;QAClB,CAAC,CAAC;QAEF,QAAG,GAAG,CAAC,SAAiB,EAAE,QAAkB,EAAE,EAAE;YAC/C,OAAO,IAAI,CAAC,EAAE;iBACZ,OAAO,CACP;;;KAGC,CACD;iBACA,GAAG,CAAC,SAAS,EAAE,QAAQ,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC;QACjE,CAAC,CAAC;QAEF,sBAAiB,GAAG,CAAC,SAAiB,EAAE,MAAc,EAAE,EAAE;YACzD,OAAO,IAAI,CAAC,EAAE;iBACZ,OAAO,CACP;;;;KAIC,CACD;iBACA,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC;QACtC,CAAC,CAAC;QAEF,WAAM,GAAG,CAAC,SAAiB,EAAE,MAAc,EAAE,EAAE;YAC9C,OAAO,IAAI,CAAC,EAAE;iBACZ,OAAO,CACP;;;KAGC,CACD;iBACA,GAAG,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;QAC1B,CAAC,CAAC;QAEF,sBAAiB,GAAG,CAAC,SAAiB,EAAE,EAAE;YACzC,OAAO,IAAI,CAAC,EAAE;iBACZ,OAAO,CACP;;;KAGC,CACD;iBACA,GAAG,CACH,SAAS,EACT,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,oBAAoB,CAO3D,CAAC;QACL,CAAC,CAAC;QAhGD,IAAI,CAAC,oBAAoB,GAAG,oBAAoB,CAAC;IAClD,CAAC;CAgGD"}
@@ -0,0 +1,35 @@
1
+ /// <reference types="node" resolution-mode="require"/>
2
+ import { Readable } from 'stream';
3
+ export interface FileInfo {
4
+ fileName: string;
5
+ id: string;
6
+ libraryId: string;
7
+ type: string;
8
+ }
9
+ /**
10
+ * The interface for implementing a file storage backend.
11
+ * verdant will supply file Blobs and metadata, and the storage backend
12
+ * must store them somewhere.
13
+ *
14
+ * The storage backend must also provide a way to get a URL for the file,
15
+ * even if the file is not yet uploaded, based on its metadata.
16
+ */
17
+ export interface FileStorage {
18
+ put(fileStream: Readable, data: FileInfo): Promise<void>;
19
+ getUrl(data: FileInfo): string | Promise<string>;
20
+ delete(data: FileInfo): Promise<void>;
21
+ }
22
+ export declare class LocalFileStorage implements FileStorage {
23
+ private readonly host;
24
+ private readonly rootDirectory;
25
+ constructor({ rootDirectory, host, }: {
26
+ rootDirectory: string;
27
+ host: string;
28
+ });
29
+ private prepareHost;
30
+ put(fileStream: Readable, data: FileInfo): Promise<void>;
31
+ getUrl(data: FileInfo): string;
32
+ delete(data: FileInfo): Promise<void>;
33
+ private getPath;
34
+ private getStorageLocation;
35
+ }
@@ -0,0 +1,45 @@
1
+ import * as fs from 'fs';
2
+ import * as path from 'path';
3
+ export class LocalFileStorage {
4
+ constructor({ rootDirectory, host, }) {
5
+ this.prepareHost = (host) => {
6
+ if (host.endsWith('/')) {
7
+ return host.slice(0, -1);
8
+ }
9
+ return host;
10
+ };
11
+ this.host = this.prepareHost(host);
12
+ this.rootDirectory = rootDirectory;
13
+ }
14
+ async put(fileStream, data) {
15
+ const filePath = this.getPath(data);
16
+ const containingDirectory = path.dirname(path.join(this.rootDirectory, filePath));
17
+ await fs.promises.mkdir(containingDirectory, {
18
+ recursive: true,
19
+ });
20
+ const dest = fs.createWriteStream(this.getStorageLocation(data));
21
+ fileStream.pipe(dest);
22
+ }
23
+ getUrl(data) {
24
+ return `${this.host}/${this.getPath(data)}`;
25
+ }
26
+ async delete(data) {
27
+ await fs.promises.unlink(this.getStorageLocation(data));
28
+ const containingDirectory = path.dirname(path.join(this.rootDirectory, this.getPath(data)));
29
+ // delete the containing folder if it's empty
30
+ try {
31
+ await fs.promises.rmdir(containingDirectory);
32
+ }
33
+ catch (e) {
34
+ // ignore
35
+ }
36
+ }
37
+ getPath(data) {
38
+ // retain the file extension
39
+ return `${data.libraryId}/${data.id}/${data.fileName}`;
40
+ }
41
+ getStorageLocation(data) {
42
+ return path.join(this.rootDirectory, this.getPath(data));
43
+ }
44
+ }
45
+ //# sourceMappingURL=FileStorage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FileStorage.js","sourceRoot":"","sources":["../../../src/files/FileStorage.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAwB7B,MAAM,OAAO,gBAAgB;IAI5B,YAAY,EACX,aAAa,EACb,IAAI,GAIJ;QAKO,gBAAW,GAAG,CAAC,IAAY,EAAE,EAAE;YACtC,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;gBACvB,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;aACzB;YACD,OAAO,IAAI,CAAC;QACb,CAAC,CAAC;QATD,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;QACnC,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;IACpC,CAAC;IASD,KAAK,CAAC,GAAG,CAAC,UAAoB,EAAE,IAAc;QAC7C,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACpC,MAAM,mBAAmB,GAAG,IAAI,CAAC,OAAO,CACvC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,QAAQ,CAAC,CACvC,CAAC;QACF,MAAM,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,mBAAmB,EAAE;YAC5C,SAAS,EAAE,IAAI;SACf,CAAC,CAAC;QACH,MAAM,IAAI,GAAG,EAAE,CAAC,iBAAiB,CAAC,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC;QACjE,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACvB,CAAC;IAED,MAAM,CAAC,IAAc;QACpB,OAAO,GAAG,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;IAC7C,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,IAAc;QAC1B,MAAM,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC;QAExD,MAAM,mBAAmB,GAAG,IAAI,CAAC,OAAO,CACvC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CACjD,CAAC;QAEF,6CAA6C;QAC7C,IAAI;YACH,MAAM,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC;SAC7C;QAAC,OAAO,CAAC,EAAE;YACX,SAAS;SACT;IACF,CAAC;IAEO,OAAO,CAAC,IAAc;QAC7B,4BAA4B;QAC5B,OAAO,GAAG,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,EAAE,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;IACxD,CAAC;IAEO,kBAAkB,CAAC,IAAc;QACxC,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;IAC1D,CAAC;CACD"}
@@ -0,0 +1,9 @@
1
+ export type { MessageSender } from './MessageSender.js';
2
+ export type { UserProfiles } from './Profiles.js';
3
+ export type { ClientMessage, ServerMessage } from '@verdant-web/common';
4
+ export { ReplicaType } from '@verdant-web/common';
5
+ export { Server } from './Server.js';
6
+ export { TokenProvider } from './TokenProvider.js';
7
+ export { LocalFileStorage } from './files/FileStorage.js';
8
+ export type { FileStorage, FileInfo } from './files/FileStorage.js';
9
+ export type { TokenInfo } from './TokenVerifier.js';
@@ -0,0 +1,5 @@
1
+ export { ReplicaType } from '@verdant-web/common';
2
+ export { Server } from './Server.js';
3
+ export { TokenProvider } from './TokenProvider.js';
4
+ export { LocalFileStorage } from './files/FileStorage.js';
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC"}
@@ -0,0 +1,2 @@
1
+ declare const _default: "\nCREATE TABLE IF NOT EXISTS ReplicaInfo (\n id TEXT PRIMARY KEY NOT NULL,\n libraryId TEXT NOT NULL,\n clientId TEXT NOT NULL,\n lastSeenWallClockTime INTEGER,\n ackedLogicalTime TEXT,\n type INTEGER NOT NULL DEFAULT 0\n);\n\nCREATE TABLE IF NOT EXISTS OperationHistory (\n libraryId TEXT NOT NULL,\n replicaId TEXT NOT NULL,\n oid TEXT NOT NULL,\n data TEXT NOT NULL,\n timestamp INTEGER NOT NULL,\n PRIMARY KEY (libraryId, replicaId, oid, timestamp)\n);\n\nCREATE TABLE IF NOT EXISTS DocumentBaseline (\n oid TEXT PRIMARY KEY NOT NULL,\n snapshot TEXT,\n timestamp TEXT NOT NULL,\n libraryId TEXT NOT NULL\n);\n";
2
+ export default _default;
@@ -0,0 +1,27 @@
1
+ export default `
2
+ CREATE TABLE IF NOT EXISTS ReplicaInfo (
3
+ id TEXT PRIMARY KEY NOT NULL,
4
+ libraryId TEXT NOT NULL,
5
+ clientId TEXT NOT NULL,
6
+ lastSeenWallClockTime INTEGER,
7
+ ackedLogicalTime TEXT,
8
+ type INTEGER NOT NULL DEFAULT 0
9
+ );
10
+
11
+ CREATE TABLE IF NOT EXISTS OperationHistory (
12
+ libraryId TEXT NOT NULL,
13
+ replicaId TEXT NOT NULL,
14
+ oid TEXT NOT NULL,
15
+ data TEXT NOT NULL,
16
+ timestamp INTEGER NOT NULL,
17
+ PRIMARY KEY (libraryId, replicaId, oid, timestamp)
18
+ );
19
+
20
+ CREATE TABLE IF NOT EXISTS DocumentBaseline (
21
+ oid TEXT PRIMARY KEY NOT NULL,
22
+ snapshot TEXT,
23
+ timestamp TEXT NOT NULL,
24
+ libraryId TEXT NOT NULL
25
+ );
26
+ `;
27
+ //# sourceMappingURL=v0.sql.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"v0.sql.js","sourceRoot":"","sources":["../../../src/migrations/v0.sql.ts"],"names":[],"mappings":"AAAA,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;CAyBd,CAAC"}
@@ -0,0 +1,2 @@
1
+ declare const _default: "\nALTER TABLE\n ReplicaInfo RENAME TO ReplicaInfoOld;\n\nCREATE TABLE ReplicaInfo (\n id TEXT NOT NULL,\n libraryId TEXT NOT NULL,\n clientId TEXT NOT NULL,\n lastSeenWallClockTime INTEGER,\n ackedLogicalTime TEXT,\n type INTEGER NOT NULL DEFAULT 0,\n PRIMARY KEY (id, libraryId)\n);\n\nINSERT INTO\n ReplicaInfo\nSELECT\n id,\n libraryId,\n clientId,\n lastSeenWallClockTime,\n ackedLogicalTime,\n type\nFROM\n ReplicaInfoOld;\n\nDROP TABLE ReplicaInfoOld;\n";
2
+ export default _default;
@@ -0,0 +1,29 @@
1
+ export default `
2
+ ALTER TABLE
3
+ ReplicaInfo RENAME TO ReplicaInfoOld;
4
+
5
+ CREATE TABLE ReplicaInfo (
6
+ id TEXT NOT NULL,
7
+ libraryId TEXT NOT NULL,
8
+ clientId TEXT NOT NULL,
9
+ lastSeenWallClockTime INTEGER,
10
+ ackedLogicalTime TEXT,
11
+ type INTEGER NOT NULL DEFAULT 0,
12
+ PRIMARY KEY (id, libraryId)
13
+ );
14
+
15
+ INSERT INTO
16
+ ReplicaInfo
17
+ SELECT
18
+ id,
19
+ libraryId,
20
+ clientId,
21
+ lastSeenWallClockTime,
22
+ ackedLogicalTime,
23
+ type
24
+ FROM
25
+ ReplicaInfoOld;
26
+
27
+ DROP TABLE ReplicaInfoOld;
28
+ `;
29
+ //# sourceMappingURL=v1.sql.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"v1.sql.js","sourceRoot":"","sources":["../../../src/migrations/v1.sql.ts"],"names":[],"mappings":"AAAA,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2Bd,CAAC"}
@@ -0,0 +1,2 @@
1
+ declare const _default: "\n ALTER TABLE\n DocumentBaseline RENAME TO DocumentBaselineOld;\n\n CREATE TABLE DocumentBaseline (\n oid TEXT NOT NULL,\n snapshot TEXT,\n timestamp TEXT NOT NULL,\n libraryId TEXT NOT NULL,\n PRIMARY KEY (libraryId, oid)\n );\n\n INSERT INTO\n DocumentBaseline\n SELECT\n oid,\n snapshot,\n timestamp,\n libraryId\n FROM\n DocumentBaselineOld;\n\n DROP TABLE DocumentBaselineOld;\n";
2
+ export default _default;
@@ -0,0 +1,26 @@
1
+ // fixes primary key for document baselines to include libraryId
2
+ export default `
3
+ ALTER TABLE
4
+ DocumentBaseline RENAME TO DocumentBaselineOld;
5
+
6
+ CREATE TABLE DocumentBaseline (
7
+ oid TEXT NOT NULL,
8
+ snapshot TEXT,
9
+ timestamp TEXT NOT NULL,
10
+ libraryId TEXT NOT NULL,
11
+ PRIMARY KEY (libraryId, oid)
12
+ );
13
+
14
+ INSERT INTO
15
+ DocumentBaseline
16
+ SELECT
17
+ oid,
18
+ snapshot,
19
+ timestamp,
20
+ libraryId
21
+ FROM
22
+ DocumentBaselineOld;
23
+
24
+ DROP TABLE DocumentBaselineOld;
25
+ `;
26
+ //# sourceMappingURL=v2.sql.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"v2.sql.js","sourceRoot":"","sources":["../../../src/migrations/v2.sql.ts"],"names":[],"mappings":"AAAA,gEAAgE;AAEhE,eAAe;;;;;;;;;;;;;;;;;;;;;;;CAuBd,CAAC"}
@@ -0,0 +1,2 @@
1
+ declare const _default: "\n CREATE TABLE IF NOT EXISTS FileMetadata (\n libraryId TEXT NOT NULL,\n fileId TEXT NOT NULL,\n name TEXT NOT NULL,\n type TEXT NOT NULL,\n pendingDeleteAt INTEGER,\n PRIMARY KEY (libraryId, fileId)\n );\n";
2
+ export default _default;
@@ -0,0 +1,12 @@
1
+ // add the FileMetadata table
2
+ export default `
3
+ CREATE TABLE IF NOT EXISTS FileMetadata (
4
+ libraryId TEXT NOT NULL,
5
+ fileId TEXT NOT NULL,
6
+ name TEXT NOT NULL,
7
+ type TEXT NOT NULL,
8
+ pendingDeleteAt INTEGER,
9
+ PRIMARY KEY (libraryId, fileId)
10
+ );
11
+ `;
12
+ //# sourceMappingURL=v3.sql.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"v3.sql.js","sourceRoot":"","sources":["../../../src/migrations/v3.sql.ts"],"names":[],"mappings":"AAAA,6BAA6B;AAE7B,eAAe;;;;;;;;;CASd,CAAC"}
@@ -0,0 +1,2 @@
1
+ declare const _default: "\n ALTER TABLE ReplicaInfo ADD COLUMN ackedServerOrder INTEGER DEFAULT 0 NOT NULL;\n ALTER TABLE OperationHistory ADD COLUMN serverOrder INTEGER DEFAULT 0 NOT NULL;\n";
2
+ export default _default;
@@ -0,0 +1,6 @@
1
+ // add server order to replicas and operations
2
+ export default `
3
+ ALTER TABLE ReplicaInfo ADD COLUMN ackedServerOrder INTEGER DEFAULT 0 NOT NULL;
4
+ ALTER TABLE OperationHistory ADD COLUMN serverOrder INTEGER DEFAULT 0 NOT NULL;
5
+ `;
6
+ //# sourceMappingURL=v4.sql.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"v4.sql.js","sourceRoot":"","sources":["../../../src/migrations/v4.sql.ts"],"names":[],"mappings":"AAAA,8CAA8C;AAE9C,eAAe;;;CAGd,CAAC"}
@@ -0,0 +1,2 @@
1
+ import type { Database } from 'better-sqlite3';
2
+ export declare function migrations(db: Database): void;
@@ -0,0 +1,34 @@
1
+ import v0Sql from './migrations/v0.sql.js';
2
+ import v1Sql from './migrations/v1.sql.js';
3
+ import v2Sql from './migrations/v2.sql.js';
4
+ import v3Sql from './migrations/v3.sql.js';
5
+ import v4Sql from './migrations/v4.sql.js';
6
+ const allMigrations = [v0Sql, v1Sql, v2Sql, v3Sql, v4Sql];
7
+ export function migrations(db) {
8
+ var _a;
9
+ // create the versions table if it doesn't exist
10
+ db.prepare(`
11
+ CREATE TABLE IF NOT EXISTS versions (
12
+ version INTEGER NOT NULL PRIMARY KEY
13
+ );
14
+ `).run();
15
+ // get the current version
16
+ const versionResult = db
17
+ .prepare(`
18
+ SELECT version FROM versions ORDER BY version DESC LIMIT 1;
19
+ `)
20
+ .get();
21
+ const version = (_a = versionResult === null || versionResult === void 0 ? void 0 : versionResult.version) !== null && _a !== void 0 ? _a : 0;
22
+ const sqlToRun = allMigrations.slice(version);
23
+ if (sqlToRun.length === 0)
24
+ return;
25
+ console.info('Running migrations from ', version, 'to', allMigrations.length - 1);
26
+ const run = db.transaction(() => {
27
+ sqlToRun.forEach((sql) => db.exec(sql));
28
+ db.prepare(`
29
+ INSERT INTO versions (version) VALUES (?);
30
+ `).run(allMigrations.length);
31
+ });
32
+ run();
33
+ }
34
+ //# sourceMappingURL=migrations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migrations.js","sourceRoot":"","sources":["../../src/migrations.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,wBAAwB,CAAC;AAC3C,OAAO,KAAK,MAAM,wBAAwB,CAAC;AAC3C,OAAO,KAAK,MAAM,wBAAwB,CAAC;AAC3C,OAAO,KAAK,MAAM,wBAAwB,CAAC;AAC3C,OAAO,KAAK,MAAM,wBAAwB,CAAC;AAE3C,MAAM,aAAa,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;AAE1D,MAAM,UAAU,UAAU,CAAC,EAAY;;IACtC,gDAAgD;IAChD,EAAE,CAAC,OAAO,CACT;;;;GAIC,CACD,CAAC,GAAG,EAAE,CAAC;IAER,0BAA0B;IAC1B,MAAM,aAAa,GAAG,EAAE;SACtB,OAAO,CACP;;GAEA,CACA;SACA,GAAG,EAAqC,CAAC;IAC3C,MAAM,OAAO,GAAG,MAAA,aAAa,aAAb,aAAa,uBAAb,aAAa,CAAE,OAAO,mCAAI,CAAC,CAAC;IAE5C,MAAM,QAAQ,GAAG,aAAa,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAE9C,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO;IAElC,OAAO,CAAC,IAAI,CACX,0BAA0B,EAC1B,OAAO,EACP,IAAI,EACJ,aAAa,CAAC,MAAM,GAAG,CAAC,CACxB,CAAC;IAEF,MAAM,GAAG,GAAG,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE;QAC/B,QAAQ,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QACxC,EAAE,CAAC,OAAO,CACT;;GAEA,CACA,CAAC,GAAG,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;IAC7B,CAAC,CAAC,CAAC;IAEH,GAAG,EAAE,CAAC;AACP,CAAC"}
@@ -0,0 +1,22 @@
1
+ import { DocumentBaseline, Operation, ReplicaInfo, ReplicaType } from '@verdant-web/common';
2
+ export interface OperationSpec extends Operation {
3
+ serverOrder: number;
4
+ replicaId: string;
5
+ }
6
+ export interface DocumentBaselineSpec extends Omit<DocumentBaseline<any>, 'snapshot'> {
7
+ snapshot: string;
8
+ libraryId: string;
9
+ }
10
+ export interface ReplicaInfoSpec extends ReplicaInfo {
11
+ libraryId: string;
12
+ clientId: string;
13
+ lastSeenWallClockTime: number | null;
14
+ type: ReplicaType;
15
+ ackedServerOrder: number;
16
+ }
17
+ declare global {
18
+ interface File {
19
+ readonly lastModified: number;
20
+ readonly name: string;
21
+ }
22
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":""}