@lix-js/sdk 0.0.1 → 0.1.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.
- package/LICENSE +21 -0
- package/dist/change/apply-changes.js +9 -9
- package/dist/change/apply-changes.js.map +1 -1
- package/dist/change/apply-changes.test.js +5 -5
- package/dist/change/apply-changes.test.js.map +1 -1
- package/dist/database/apply-schema.d.ts.map +1 -1
- package/dist/database/apply-schema.js +20 -72
- package/dist/database/apply-schema.js.map +1 -1
- package/dist/database/execute-sync.test.js +3 -3
- package/dist/database/execute-sync.test.js.map +1 -1
- package/dist/database/init-db.d.ts.map +1 -1
- package/dist/database/init-db.js +18 -3
- package/dist/database/init-db.js.map +1 -1
- package/dist/database/init-db.test.js +128 -17
- package/dist/database/init-db.test.js.map +1 -1
- package/dist/database/kysely-plugin/parse-jsonb-plugin-v1.d.ts.map +1 -1
- package/dist/database/kysely-plugin/parse-jsonb-plugin-v1.js +5 -2
- package/dist/database/kysely-plugin/parse-jsonb-plugin-v1.js.map +1 -1
- package/dist/database/mutation-log/database-schema.d.ts.map +1 -1
- package/dist/database/mutation-log/database-schema.js +1 -3
- package/dist/database/mutation-log/database-schema.js.map +1 -1
- package/dist/database/nano-id.d.ts +21 -0
- package/dist/database/nano-id.d.ts.map +1 -0
- package/dist/database/nano-id.js +58 -0
- package/dist/database/nano-id.js.map +1 -0
- package/dist/database/nano-id.test.d.ts +2 -0
- package/dist/database/nano-id.test.d.ts.map +1 -0
- package/dist/database/nano-id.test.js +13 -0
- package/dist/database/nano-id.test.js.map +1 -0
- package/dist/database/schema.d.ts +15 -23
- package/dist/database/schema.d.ts.map +1 -1
- package/dist/discussion/create-comment.d.ts +0 -2
- package/dist/discussion/create-comment.d.ts.map +1 -1
- package/dist/discussion/create-comment.js +0 -1
- package/dist/discussion/create-comment.js.map +1 -1
- package/dist/discussion/create-discussion.d.ts +3 -5
- package/dist/discussion/create-discussion.d.ts.map +1 -1
- package/dist/discussion/create-discussion.js +4 -5
- package/dist/discussion/create-discussion.js.map +1 -1
- package/dist/discussion/create-discussion.test.js +8 -34
- package/dist/discussion/create-discussion.test.js.map +1 -1
- package/dist/file-queue/file-handlers.d.ts +24 -0
- package/dist/file-queue/file-handlers.d.ts.map +1 -0
- package/dist/file-queue/file-handlers.js +209 -0
- package/dist/file-queue/file-handlers.js.map +1 -0
- package/dist/file-queue/file-queue-process.d.ts +5 -0
- package/dist/file-queue/file-queue-process.d.ts.map +1 -0
- package/dist/file-queue/file-queue-process.js +85 -0
- package/dist/file-queue/file-queue-process.js.map +1 -0
- package/dist/file-queue/file-queue-process.test.d.ts +2 -0
- package/dist/file-queue/file-queue-process.test.d.ts.map +1 -0
- package/dist/file-queue/file-queue-process.test.js +373 -0
- package/dist/file-queue/file-queue-process.test.js.map +1 -0
- package/dist/file-queue/file-queue-settled.d.ts +13 -0
- package/dist/file-queue/file-queue-settled.d.ts.map +1 -0
- package/dist/file-queue/file-queue-settled.js +25 -0
- package/dist/file-queue/file-queue-settled.js.map +1 -0
- package/dist/file-queue/file-queue-settled.test.d.ts +2 -0
- package/dist/file-queue/file-queue-settled.test.d.ts.map +1 -0
- package/dist/file-queue/file-queue-settled.test.js +47 -0
- package/dist/file-queue/file-queue-settled.test.js.map +1 -0
- package/dist/file-queue/index.d.ts +2 -0
- package/dist/file-queue/index.d.ts.map +1 -0
- package/dist/file-queue/index.js +2 -0
- package/dist/file-queue/index.js.map +1 -0
- package/dist/file-queue/with-skip-file-queue.d.ts +3 -0
- package/dist/file-queue/with-skip-file-queue.d.ts.map +1 -0
- package/dist/file-queue/with-skip-file-queue.js +26 -0
- package/dist/file-queue/with-skip-file-queue.js.map +1 -0
- package/dist/file-queue/with-skip-file-queue.test.d.ts +2 -0
- package/dist/file-queue/with-skip-file-queue.test.d.ts.map +1 -0
- package/dist/file-queue/with-skip-file-queue.test.js +138 -0
- package/dist/file-queue/with-skip-file-queue.test.js.map +1 -0
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/key-value/database-schema.d.ts +11 -2
- package/dist/key-value/database-schema.d.ts.map +1 -1
- package/dist/key-value/database-schema.js +7 -4
- package/dist/key-value/database-schema.js.map +1 -1
- package/dist/key-value/database-schema.test.js +21 -5
- package/dist/key-value/database-schema.test.js.map +1 -1
- package/dist/lix/close-lix.d.ts +8 -0
- package/dist/lix/close-lix.d.ts.map +1 -0
- package/dist/lix/close-lix.js +7 -0
- package/dist/lix/close-lix.js.map +1 -0
- package/dist/lix/index.d.ts +1 -0
- package/dist/lix/index.d.ts.map +1 -1
- package/dist/lix/index.js +1 -0
- package/dist/lix/index.js.map +1 -1
- package/dist/lix/merge.js +3 -3
- package/dist/lix/merge.js.map +1 -1
- package/dist/lix/merge.test.js +7 -18
- package/dist/lix/merge.test.js.map +1 -1
- package/dist/lix/new-lix.d.ts.map +1 -1
- package/dist/lix/new-lix.js +2 -3
- package/dist/lix/new-lix.js.map +1 -1
- package/dist/lix/open-lix-in-memory.test.js +2 -1
- package/dist/lix/open-lix-in-memory.test.js.map +1 -1
- package/dist/lix/open-lix.d.ts +3 -5
- package/dist/lix/open-lix.d.ts.map +1 -1
- package/dist/lix/open-lix.js +4 -18
- package/dist/lix/open-lix.js.map +1 -1
- package/dist/lix/open-lix.test.js +16 -7
- package/dist/lix/open-lix.test.js.map +1 -1
- package/dist/lix/to-blob.d.ts +11 -0
- package/dist/lix/to-blob.d.ts.map +1 -0
- package/dist/lix/to-blob.js +11 -0
- package/dist/lix/to-blob.js.map +1 -0
- package/dist/own-change-control/apply-own-change.d.ts +10 -0
- package/dist/own-change-control/apply-own-change.d.ts.map +1 -0
- package/dist/own-change-control/apply-own-change.js +69 -0
- package/dist/own-change-control/apply-own-change.js.map +1 -0
- package/dist/own-change-control/apply-own-change.test.d.ts +2 -0
- package/dist/own-change-control/apply-own-change.test.d.ts.map +1 -0
- package/dist/own-change-control/apply-own-change.test.js +297 -0
- package/dist/own-change-control/apply-own-change.test.js.map +1 -0
- package/dist/own-change-control/change-controlled-tables.d.ts +60 -0
- package/dist/own-change-control/change-controlled-tables.d.ts.map +1 -0
- package/dist/own-change-control/change-controlled-tables.js +70 -0
- package/dist/own-change-control/change-controlled-tables.js.map +1 -0
- package/dist/own-change-control/change-controlled-tables.test.d.ts +2 -0
- package/dist/own-change-control/change-controlled-tables.test.d.ts.map +1 -0
- package/dist/own-change-control/change-controlled-tables.test.js +48 -0
- package/dist/own-change-control/change-controlled-tables.test.js.map +1 -0
- package/dist/own-change-control/database-triggers.d.ts +5 -0
- package/dist/own-change-control/database-triggers.d.ts.map +1 -0
- package/dist/own-change-control/database-triggers.js +135 -0
- package/dist/own-change-control/database-triggers.js.map +1 -0
- package/dist/own-change-control/database-triggers.test.d.ts +2 -0
- package/dist/own-change-control/database-triggers.test.d.ts.map +1 -0
- package/dist/own-change-control/database-triggers.test.js +214 -0
- package/dist/own-change-control/database-triggers.test.js.map +1 -0
- package/dist/own-change-control/index.d.ts +2 -0
- package/dist/own-change-control/index.d.ts.map +1 -0
- package/dist/own-change-control/index.js +2 -0
- package/dist/own-change-control/index.js.map +1 -0
- package/dist/own-change-control/with-skip-own-change-control.d.ts +3 -0
- package/dist/own-change-control/with-skip-own-change-control.d.ts.map +1 -0
- package/dist/own-change-control/with-skip-own-change-control.js +28 -0
- package/dist/own-change-control/with-skip-own-change-control.js.map +1 -0
- package/dist/own-change-control/with-skip-own-change-control.test.d.ts +2 -0
- package/dist/own-change-control/with-skip-own-change-control.test.d.ts.map +1 -0
- package/dist/own-change-control/with-skip-own-change-control.test.js +49 -0
- package/dist/own-change-control/with-skip-own-change-control.test.js.map +1 -0
- package/dist/own-entity-change-control/apply-own-entity-change.js +2 -2
- package/dist/own-entity-change-control/apply-own-entity-change.js.map +1 -1
- package/dist/own-entity-change-control/apply-own-entity-change.test.js +9 -9
- package/dist/own-entity-change-control/apply-own-entity-change.test.js.map +1 -1
- package/dist/own-entity-change-control/database-triggers.js +6 -6
- package/dist/own-entity-change-control/database-triggers.js.map +1 -1
- package/dist/own-entity-change-control/database-triggers.test.js +1 -1
- package/dist/own-entity-change-control/database-triggers.test.js.map +1 -1
- package/dist/query-filter/version-change-in-difference.test.js +37 -29
- package/dist/query-filter/version-change-in-difference.test.js.map +1 -1
- package/dist/query-filter/version-change-in-symmetric-difference.test.js +37 -39
- package/dist/query-filter/version-change-in-symmetric-difference.test.js.map +1 -1
- package/dist/server-api-handler/environment/create-in-memory-environment.d.ts.map +1 -1
- package/dist/server-api-handler/environment/create-in-memory-environment.js +7 -3
- package/dist/server-api-handler/environment/create-in-memory-environment.js.map +1 -1
- package/dist/server-api-handler/environment/create-in-memory-environment.test.js +8 -7
- package/dist/server-api-handler/environment/create-in-memory-environment.test.js.map +1 -1
- package/dist/server-api-handler/routes/get-v1.d.ts.map +1 -1
- package/dist/server-api-handler/routes/get-v1.js +1 -2
- package/dist/server-api-handler/routes/get-v1.js.map +1 -1
- package/dist/server-api-handler/routes/get-v1.test.js +6 -5
- package/dist/server-api-handler/routes/get-v1.test.js.map +1 -1
- package/dist/server-api-handler/routes/new-v1.d.ts.map +1 -1
- package/dist/server-api-handler/routes/new-v1.js +3 -1
- package/dist/server-api-handler/routes/new-v1.js.map +1 -1
- package/dist/server-api-handler/routes/new-v1.test.js +2 -1
- package/dist/server-api-handler/routes/new-v1.test.js.map +1 -1
- package/dist/server-api-handler/routes/pull-v1.test.js +4 -3
- package/dist/server-api-handler/routes/pull-v1.test.js.map +1 -1
- package/dist/server-api-handler/routes/push-v1.test.js +5 -4
- package/dist/server-api-handler/routes/push-v1.test.js.map +1 -1
- package/dist/sync/pull-from-server.d.ts.map +1 -1
- package/dist/sync/pull-from-server.js +0 -2
- package/dist/sync/pull-from-server.js.map +1 -1
- package/dist/sync/pull-from-server.test.js +29 -14
- package/dist/sync/pull-from-server.test.js.map +1 -1
- package/dist/sync/push-to-server.test.js +17 -13
- package/dist/sync/push-to-server.test.js.map +1 -1
- package/dist/sync/sync-process.d.ts +2 -4
- package/dist/sync/sync-process.d.ts.map +1 -1
- package/dist/sync/sync-process.js +4 -9
- package/dist/sync/sync-process.js.map +1 -1
- package/dist/sync/sync-process.test.js +26 -38
- package/dist/sync/sync-process.test.js.map +1 -1
- package/dist/version/create-version.d.ts +5 -5
- package/dist/version/create-version.d.ts.map +1 -1
- package/dist/version/create-version.js +23 -11
- package/dist/version/create-version.js.map +1 -1
- package/dist/version/create-version.test.js +2 -2
- package/dist/version/create-version.test.js.map +1 -1
- package/dist/version/merge-version.d.ts.map +1 -1
- package/dist/version/merge-version.js +16 -26
- package/dist/version/merge-version.js.map +1 -1
- package/dist/version/switch-version.js +3 -3
- package/dist/version/switch-version.js.map +1 -1
- package/dist/version/switch-version.test.js +12 -15
- package/dist/version/switch-version.test.js.map +1 -1
- package/dist/version/update-changes-in-version.d.ts.map +1 -1
- package/dist/version/update-changes-in-version.js +11 -31
- package/dist/version/update-changes-in-version.js.map +1 -1
- package/node_modules/@lix-js/server-api-schema/CHANGELOG.md +9 -0
- package/node_modules/@lix-js/server-api-schema/LICENSE +21 -0
- package/node_modules/@lix-js/server-api-schema/dist/schema.js +0 -0
- package/node_modules/@lix-js/server-api-schema/package.json +2 -2
- package/node_modules/sqlite-wasm-kysely/LICENSE +21 -0
- package/package.json +4 -4
- package/src/change/apply-changes.test.ts +7 -7
- package/src/change/apply-changes.ts +9 -9
- package/src/database/apply-schema.ts +20 -73
- package/src/database/execute-sync.test.ts +3 -3
- package/src/database/init-db.test.ts +163 -19
- package/src/database/init-db.ts +20 -3
- package/src/database/kysely-plugin/parse-jsonb-plugin-v1.ts +9 -2
- package/src/database/mutation-log/database-schema.ts +1 -3
- package/src/database/nano-id.test.ts +15 -0
- package/src/database/nano-id.ts +72 -0
- package/src/database/schema.ts +15 -24
- package/src/discussion/create-comment.ts +0 -3
- package/src/discussion/create-discussion.test.ts +8 -39
- package/src/discussion/create-discussion.ts +6 -9
- package/src/{change-queue → file-queue}/file-handlers.ts +27 -27
- package/src/{change-queue/init-change-queue.test.ts → file-queue/file-queue-process.test.ts} +24 -24
- package/src/{change-queue/init-change-queue.ts → file-queue/file-queue-process.ts} +18 -16
- package/src/{change-queue/change-queue-settled.test.ts → file-queue/file-queue-settled.test.ts} +12 -12
- package/src/{change-queue/change-queue-settled.ts → file-queue/file-queue-settled.ts} +4 -4
- package/src/file-queue/index.ts +1 -0
- package/src/{change-queue/with-skip-change-queue.test.ts → file-queue/with-skip-file-queue.test.ts} +9 -9
- package/src/{change-queue/with-skip-change-queue.ts → file-queue/with-skip-file-queue.ts} +3 -3
- package/src/index.ts +2 -2
- package/src/key-value/database-schema.test.ts +26 -5
- package/src/key-value/database-schema.ts +18 -6
- package/src/lix/close-lix.ts +8 -0
- package/src/lix/index.ts +1 -0
- package/src/lix/merge.test.ts +7 -19
- package/src/lix/merge.ts +4 -4
- package/src/lix/new-lix.ts +2 -3
- package/src/lix/open-lix-in-memory.test.ts +5 -1
- package/src/lix/open-lix.test.ts +19 -7
- package/src/lix/open-lix.ts +7 -24
- package/src/lix/to-blob.ts +14 -0
- package/src/{own-entity-change-control/apply-own-entity-change.test.ts → own-change-control/apply-own-change.test.ts} +27 -31
- package/src/{own-entity-change-control/apply-own-entity-change.ts → own-change-control/apply-own-change.ts} +3 -3
- package/src/{own-entity-change-control → own-change-control}/change-controlled-tables.ts +0 -1
- package/src/{own-entity-change-control → own-change-control}/database-triggers.test.ts +7 -7
- package/src/{own-entity-change-control → own-change-control}/database-triggers.ts +11 -11
- package/src/{own-entity-change-control → own-change-control}/with-skip-own-change-control.ts +6 -2
- package/src/query-filter/version-change-in-difference.test.ts +41 -32
- package/src/query-filter/version-change-in-symmetric-difference.test.ts +41 -42
- package/src/server-api-handler/environment/create-in-memory-environment.test.ts +8 -7
- package/src/server-api-handler/environment/create-in-memory-environment.ts +7 -3
- package/src/server-api-handler/routes/get-v1.test.ts +6 -5
- package/src/server-api-handler/routes/get-v1.ts +1 -3
- package/src/server-api-handler/routes/new-v1.test.ts +2 -1
- package/src/server-api-handler/routes/new-v1.ts +3 -1
- package/src/server-api-handler/routes/pull-v1.test.ts +4 -3
- package/src/server-api-handler/routes/push-v1.test.ts +5 -4
- package/src/sync/pull-from-server.test.ts +29 -14
- package/src/sync/pull-from-server.ts +0 -2
- package/src/sync/push-to-server.test.ts +19 -15
- package/src/sync/sync-process.test.ts +37 -43
- package/src/sync/sync-process.ts +6 -18
- package/src/version/create-version.test.ts +2 -2
- package/src/version/create-version.ts +24 -12
- package/src/version/merge-version.ts +18 -26
- package/src/version/switch-version.test.ts +12 -15
- package/src/version/switch-version.ts +3 -3
- package/src/version/update-changes-in-version.ts +11 -30
- package/node_modules/@lix-js/server-api-schema/dist/schema.d.ts +0 -384
- package/src/change-queue/index.ts +0 -1
- /package/src/{own-entity-change-control → own-change-control}/change-controlled-tables.test.ts +0 -0
- /package/src/{own-entity-change-control → own-change-control}/index.ts +0 -0
- /package/src/{own-entity-change-control → own-change-control}/with-skip-own-change-control.test.ts +0 -0
package/src/database/schema.ts
CHANGED
|
@@ -17,7 +17,7 @@ export type LixDatabaseSchema = {
|
|
|
17
17
|
|
|
18
18
|
// file
|
|
19
19
|
file: LixFileTable;
|
|
20
|
-
|
|
20
|
+
file_queue: FileQueueTable;
|
|
21
21
|
|
|
22
22
|
// change
|
|
23
23
|
change: ChangeTable;
|
|
@@ -28,7 +28,6 @@ export type LixDatabaseSchema = {
|
|
|
28
28
|
change_set: ChangeSetTable;
|
|
29
29
|
change_set_element: ChangeSetElementTable;
|
|
30
30
|
change_set_label: ChangeSetLabelTable;
|
|
31
|
-
change_set_label_author: ChangeSetLabelAuthorTable;
|
|
32
31
|
|
|
33
32
|
// key value
|
|
34
33
|
key_value: KeyValueTable;
|
|
@@ -50,16 +49,16 @@ export type LixDatabaseSchema = {
|
|
|
50
49
|
mutation_log: MutationLogTable;
|
|
51
50
|
};
|
|
52
51
|
|
|
53
|
-
export type
|
|
54
|
-
export type
|
|
55
|
-
export type
|
|
56
|
-
type
|
|
52
|
+
export type FileQueueEntry = Selectable<FileQueueTable>;
|
|
53
|
+
export type NewFileQueueEntry = Insertable<FileQueueTable>;
|
|
54
|
+
export type FileQueueEntryUpdate = Updateable<FileQueueTable>;
|
|
55
|
+
type FileQueueTable = {
|
|
57
56
|
id: Generated<number>;
|
|
58
57
|
file_id: string;
|
|
59
58
|
path_before: string | null;
|
|
60
59
|
path_after: string | null;
|
|
61
|
-
data_before:
|
|
62
|
-
data_after:
|
|
60
|
+
data_before: Uint8Array | null;
|
|
61
|
+
data_after: Uint8Array | null;
|
|
63
62
|
metadata_before: Record<string, any> | null;
|
|
64
63
|
metadata_after: Record<string, any> | null;
|
|
65
64
|
};
|
|
@@ -80,7 +79,7 @@ type LixFileTable = {
|
|
|
80
79
|
* - `/path/to/file.txt`
|
|
81
80
|
*/
|
|
82
81
|
path: string;
|
|
83
|
-
data:
|
|
82
|
+
data: Uint8Array;
|
|
84
83
|
metadata: Record<string, any> | null;
|
|
85
84
|
};
|
|
86
85
|
|
|
@@ -175,8 +174,6 @@ type CommentTable = {
|
|
|
175
174
|
id: Generated<string>;
|
|
176
175
|
parent_id: string | null;
|
|
177
176
|
discussion_id: string;
|
|
178
|
-
created_at: Generated<string>;
|
|
179
|
-
created_by: string;
|
|
180
177
|
content: string;
|
|
181
178
|
};
|
|
182
179
|
|
|
@@ -198,15 +195,6 @@ type ChangeSetLabelTable = {
|
|
|
198
195
|
label_id: string;
|
|
199
196
|
};
|
|
200
197
|
|
|
201
|
-
export type ChangeSetLabelAuthor = Selectable<ChangeSetLabelAuthorTable>;
|
|
202
|
-
export type NewChangeSetLabelAuthor = Insertable<ChangeSetLabelAuthorTable>;
|
|
203
|
-
export type ChangeSetLabelAuthorUpdate = Updateable<ChangeSetLabelAuthorTable>;
|
|
204
|
-
type ChangeSetLabelAuthorTable = {
|
|
205
|
-
change_set_id: string;
|
|
206
|
-
label_id: string;
|
|
207
|
-
account_id: string;
|
|
208
|
-
};
|
|
209
|
-
|
|
210
198
|
// ------ versiones ------
|
|
211
199
|
|
|
212
200
|
export type Version = Selectable<VersionTable>;
|
|
@@ -214,7 +202,7 @@ export type Newversion = Insertable<VersionTable>;
|
|
|
214
202
|
export type VersionUpdate = Updateable<VersionTable>;
|
|
215
203
|
type VersionTable = {
|
|
216
204
|
id: Generated<string>;
|
|
217
|
-
name: string
|
|
205
|
+
name: Generated<string>;
|
|
218
206
|
};
|
|
219
207
|
|
|
220
208
|
export type VersionChange = Selectable<VersionChangeTable>;
|
|
@@ -223,6 +211,9 @@ export type VersionChangeUpdate = Updateable<VersionChangeTable>;
|
|
|
223
211
|
type VersionChangeTable = {
|
|
224
212
|
version_id: string;
|
|
225
213
|
change_id: string;
|
|
214
|
+
entity_id: string;
|
|
215
|
+
file_id: string;
|
|
216
|
+
schema_key: string;
|
|
226
217
|
};
|
|
227
218
|
|
|
228
219
|
export type VersionChangeConflict = Selectable<VersionChangeConflictTable>;
|
|
@@ -234,9 +225,9 @@ type VersionChangeConflictTable = {
|
|
|
234
225
|
change_conflict_id: string;
|
|
235
226
|
};
|
|
236
227
|
|
|
237
|
-
export type
|
|
238
|
-
export type
|
|
239
|
-
export type
|
|
228
|
+
export type CurrentVersion = Selectable<CurrentVersionTable>;
|
|
229
|
+
export type NewCurrentVersion = Insertable<CurrentVersionTable>;
|
|
230
|
+
export type CurrentVersionUpdate = Updateable<CurrentVersionTable>;
|
|
240
231
|
type CurrentVersionTable = {
|
|
241
232
|
id: string;
|
|
242
233
|
};
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import type { Account } from "../account/database-schema.js";
|
|
2
1
|
import type { Comment } from "../database/schema.js";
|
|
3
2
|
import type { Lix } from "../lix/open-lix.js";
|
|
4
3
|
|
|
@@ -6,7 +5,6 @@ export async function createComment(args: {
|
|
|
6
5
|
lix: Pick<Lix, "db">;
|
|
7
6
|
parentComment: Pick<Comment, "id" | "discussion_id">;
|
|
8
7
|
content: string;
|
|
9
|
-
createdBy: Pick<Account, "id">;
|
|
10
8
|
}): Promise<Comment> {
|
|
11
9
|
return args.lix.db
|
|
12
10
|
.insertInto("comment")
|
|
@@ -14,7 +12,6 @@ export async function createComment(args: {
|
|
|
14
12
|
discussion_id: args.parentComment.discussion_id,
|
|
15
13
|
parent_id: args.parentComment.id,
|
|
16
14
|
content: args.content,
|
|
17
|
-
created_by: args.createdBy.id,
|
|
18
15
|
})
|
|
19
16
|
.returningAll()
|
|
20
17
|
.executeTakeFirstOrThrow();
|
|
@@ -1,50 +1,20 @@
|
|
|
1
1
|
import { expect, test } from "vitest";
|
|
2
2
|
import { openLixInMemory } from "../lix/open-lix-in-memory.js";
|
|
3
|
-
import { newLixFile } from "../lix/new-lix.js";
|
|
4
|
-
import type { DetectedChange, LixPlugin } from "../plugin/lix-plugin.js";
|
|
5
3
|
import { createDiscussion } from "./create-discussion.js";
|
|
6
4
|
import { createChangeSet } from "../change-set/create-change-set.js";
|
|
7
|
-
import { changeQueueSettled } from "../change-queue/change-queue-settled.js";
|
|
8
|
-
|
|
9
|
-
const mockPlugin: LixPlugin = {
|
|
10
|
-
key: "mock-plugin",
|
|
11
|
-
detectChangesGlob: "*",
|
|
12
|
-
detectChanges: async ({ after }) => {
|
|
13
|
-
return [
|
|
14
|
-
{
|
|
15
|
-
schema: {
|
|
16
|
-
key: "text",
|
|
17
|
-
type: "json",
|
|
18
|
-
},
|
|
19
|
-
entity_id: "test",
|
|
20
|
-
snapshot: {
|
|
21
|
-
text: after ? new TextDecoder().decode(after.data) : undefined,
|
|
22
|
-
},
|
|
23
|
-
} satisfies DetectedChange,
|
|
24
|
-
];
|
|
25
|
-
},
|
|
26
|
-
};
|
|
27
5
|
|
|
28
6
|
test("should be able to start a discussion on changes", async () => {
|
|
29
|
-
const lix = await openLixInMemory({
|
|
30
|
-
blob: await newLixFile(),
|
|
31
|
-
providePlugins: [mockPlugin],
|
|
32
|
-
});
|
|
33
|
-
|
|
34
|
-
const enc = new TextEncoder();
|
|
7
|
+
const lix = await openLixInMemory({});
|
|
35
8
|
|
|
9
|
+
// produce a change
|
|
36
10
|
await lix.db
|
|
37
|
-
.insertInto("
|
|
38
|
-
.values({
|
|
11
|
+
.insertInto("key_value")
|
|
12
|
+
.values({
|
|
13
|
+
key: "mock_key",
|
|
14
|
+
value: "mock_value",
|
|
15
|
+
})
|
|
39
16
|
.execute();
|
|
40
17
|
|
|
41
|
-
await changeQueueSettled({ lix });
|
|
42
|
-
|
|
43
|
-
const current_author = await lix.db
|
|
44
|
-
.selectFrom("active_account")
|
|
45
|
-
.selectAll()
|
|
46
|
-
.executeTakeFirstOrThrow();
|
|
47
|
-
|
|
48
18
|
const changes = await lix.db
|
|
49
19
|
.selectFrom("change")
|
|
50
20
|
.selectAll("change")
|
|
@@ -53,9 +23,8 @@ test("should be able to start a discussion on changes", async () => {
|
|
|
53
23
|
await lix.db.transaction().execute(async (trx) => {
|
|
54
24
|
await createDiscussion({
|
|
55
25
|
lix: { db: trx },
|
|
26
|
+
firstComment: { content: "Hello, world!" },
|
|
56
27
|
changeSet: await createChangeSet({ lix: { db: trx }, changes }),
|
|
57
|
-
content: "comment on a change",
|
|
58
|
-
createdBy: { id: current_author.id },
|
|
59
28
|
});
|
|
60
29
|
});
|
|
61
30
|
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import type { Account } from "../account/database-schema.js";
|
|
2
1
|
import type { ChangeSet, Comment, Discussion } from "../database/schema.js";
|
|
3
2
|
import type { Lix } from "../lix/open-lix.js";
|
|
4
3
|
|
|
@@ -8,7 +7,7 @@ import type { Lix } from "../lix/open-lix.js";
|
|
|
8
7
|
* @example
|
|
9
8
|
* ```ts
|
|
10
9
|
* const changeSet = await createChangeSet({ lix, changes: ["change1", "change2"] });
|
|
11
|
-
* const discussion = await createDiscussion({ lix, changeSet,
|
|
10
|
+
* const discussion = await createDiscussion({ lix, changeSet, firstComment: { content: "first comment" } });
|
|
12
11
|
* ```
|
|
13
12
|
*
|
|
14
13
|
* @returns the created discussion
|
|
@@ -16,9 +15,8 @@ import type { Lix } from "../lix/open-lix.js";
|
|
|
16
15
|
export async function createDiscussion(args: {
|
|
17
16
|
lix: Pick<Lix, "db">;
|
|
18
17
|
changeSet: Pick<ChangeSet, "id">;
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
}): Promise<Discussion & { comment: Comment }> {
|
|
18
|
+
firstComment: Pick<Comment, "content">;
|
|
19
|
+
}): Promise<Discussion & { firstComment: Comment }> {
|
|
22
20
|
const executeInTransaction = async (trx: Lix["db"]) => {
|
|
23
21
|
const discussion = await trx
|
|
24
22
|
.insertInto("discussion")
|
|
@@ -28,18 +26,17 @@ export async function createDiscussion(args: {
|
|
|
28
26
|
.returningAll()
|
|
29
27
|
.executeTakeFirstOrThrow();
|
|
30
28
|
|
|
31
|
-
const
|
|
29
|
+
const firstComment = await trx
|
|
32
30
|
.insertInto("comment")
|
|
33
31
|
.values({
|
|
34
32
|
parent_id: null,
|
|
35
33
|
discussion_id: discussion.id,
|
|
36
|
-
content: args.content,
|
|
37
|
-
created_by: args.createdBy.id,
|
|
34
|
+
content: args.firstComment.content,
|
|
38
35
|
})
|
|
39
36
|
.returningAll()
|
|
40
37
|
.executeTakeFirstOrThrow();
|
|
41
38
|
|
|
42
|
-
return { ...discussion,
|
|
39
|
+
return { ...discussion, firstComment };
|
|
43
40
|
};
|
|
44
41
|
|
|
45
42
|
// user provided an open transaction
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { FileQueueEntry } from "../database/schema.js";
|
|
2
2
|
import type { DetectedChange } from "../plugin/lix-plugin.js";
|
|
3
3
|
import type { Lix } from "../lix/open-lix.js";
|
|
4
4
|
import { sql } from "kysely";
|
|
@@ -31,7 +31,7 @@ async function glob(args: {
|
|
|
31
31
|
// creates initial changes for new files
|
|
32
32
|
export async function handleFileInsert(args: {
|
|
33
33
|
lix: Pick<Lix, "db" | "plugin" | "sqlite">;
|
|
34
|
-
|
|
34
|
+
fileQueueEntry: FileQueueEntry;
|
|
35
35
|
}): Promise<void> {
|
|
36
36
|
const detectedChanges: Array<DetectedChange & { pluginKey: string }> = [];
|
|
37
37
|
|
|
@@ -40,7 +40,7 @@ export async function handleFileInsert(args: {
|
|
|
40
40
|
// the path of the file is either the after path or the before path
|
|
41
41
|
// depending on whether the file was deleted, updated, or created
|
|
42
42
|
const path =
|
|
43
|
-
args.
|
|
43
|
+
args.fileQueueEntry.path_after ?? args.fileQueueEntry.path_before;
|
|
44
44
|
|
|
45
45
|
if (path === null) {
|
|
46
46
|
throw new Error("Both before and after paths are null");
|
|
@@ -67,7 +67,7 @@ export async function handleFileInsert(args: {
|
|
|
67
67
|
throw error;
|
|
68
68
|
}
|
|
69
69
|
|
|
70
|
-
if (args.
|
|
70
|
+
if (args.fileQueueEntry.data_after === null) {
|
|
71
71
|
throw new Error("Data after is null");
|
|
72
72
|
}
|
|
73
73
|
|
|
@@ -75,10 +75,10 @@ export async function handleFileInsert(args: {
|
|
|
75
75
|
lix: args.lix,
|
|
76
76
|
before: undefined,
|
|
77
77
|
after: {
|
|
78
|
-
id: args.
|
|
78
|
+
id: args.fileQueueEntry.file_id,
|
|
79
79
|
path,
|
|
80
|
-
metadata: args.
|
|
81
|
-
data: args.
|
|
80
|
+
metadata: args.fileQueueEntry.metadata_after,
|
|
81
|
+
data: args.fileQueueEntry.data_after,
|
|
82
82
|
},
|
|
83
83
|
})) {
|
|
84
84
|
detectedChanges.push({
|
|
@@ -107,7 +107,7 @@ export async function handleFileInsert(args: {
|
|
|
107
107
|
authors: currentAuthors,
|
|
108
108
|
version: currentVersion,
|
|
109
109
|
entityId: detectedChange.entity_id,
|
|
110
|
-
fileId: args.
|
|
110
|
+
fileId: args.fileQueueEntry.file_id,
|
|
111
111
|
pluginKey: detectedChange.pluginKey,
|
|
112
112
|
schemaKey: detectedChange.schema.key,
|
|
113
113
|
snapshotContent: detectedChange.snapshot,
|
|
@@ -116,15 +116,15 @@ export async function handleFileInsert(args: {
|
|
|
116
116
|
);
|
|
117
117
|
|
|
118
118
|
await trx
|
|
119
|
-
.deleteFrom("
|
|
120
|
-
.where("id", "=", args.
|
|
119
|
+
.deleteFrom("file_queue")
|
|
120
|
+
.where("id", "=", args.fileQueueEntry.id)
|
|
121
121
|
.execute();
|
|
122
122
|
});
|
|
123
123
|
}
|
|
124
124
|
|
|
125
125
|
export async function handleFileUpdate(args: {
|
|
126
126
|
lix: Pick<Lix, "db" | "plugin" | "sqlite">;
|
|
127
|
-
|
|
127
|
+
fileQueueEntry: FileQueueEntry;
|
|
128
128
|
}): Promise<void> {
|
|
129
129
|
const detectedChanges: Array<DetectedChange & { pluginKey: string }> = [];
|
|
130
130
|
|
|
@@ -133,7 +133,7 @@ export async function handleFileUpdate(args: {
|
|
|
133
133
|
// the path of the file is either the after path or the before path
|
|
134
134
|
// depending on whether the file was deleted, updated, or created
|
|
135
135
|
const path =
|
|
136
|
-
args.
|
|
136
|
+
args.fileQueueEntry.path_after ?? args.fileQueueEntry.path_before;
|
|
137
137
|
|
|
138
138
|
if (path === null) {
|
|
139
139
|
throw new Error("Both before and after paths are null");
|
|
@@ -160,19 +160,19 @@ export async function handleFileUpdate(args: {
|
|
|
160
160
|
}
|
|
161
161
|
for (const change of await plugin.detectChanges({
|
|
162
162
|
lix: args.lix,
|
|
163
|
-
before: args.
|
|
163
|
+
before: args.fileQueueEntry.data_before
|
|
164
164
|
? {
|
|
165
|
-
id: args.
|
|
165
|
+
id: args.fileQueueEntry.file_id,
|
|
166
166
|
path: path,
|
|
167
|
-
metadata: args.
|
|
168
|
-
data: args.
|
|
167
|
+
metadata: args.fileQueueEntry.metadata_before,
|
|
168
|
+
data: args.fileQueueEntry.data_before,
|
|
169
169
|
}
|
|
170
170
|
: undefined,
|
|
171
171
|
after: {
|
|
172
|
-
id: args.
|
|
172
|
+
id: args.fileQueueEntry.file_id,
|
|
173
173
|
path,
|
|
174
|
-
metadata: args.
|
|
175
|
-
data: args.
|
|
174
|
+
metadata: args.fileQueueEntry.metadata_after,
|
|
175
|
+
data: args.fileQueueEntry.data_after!,
|
|
176
176
|
},
|
|
177
177
|
})) {
|
|
178
178
|
detectedChanges.push({
|
|
@@ -201,7 +201,7 @@ export async function handleFileUpdate(args: {
|
|
|
201
201
|
authors: currentAuthors,
|
|
202
202
|
version: currentVersion,
|
|
203
203
|
entityId: detectedChange.entity_id,
|
|
204
|
-
fileId: args.
|
|
204
|
+
fileId: args.fileQueueEntry.file_id,
|
|
205
205
|
pluginKey: detectedChange.pluginKey,
|
|
206
206
|
schemaKey: detectedChange.schema.key,
|
|
207
207
|
snapshotContent: detectedChange.snapshot,
|
|
@@ -210,8 +210,8 @@ export async function handleFileUpdate(args: {
|
|
|
210
210
|
);
|
|
211
211
|
|
|
212
212
|
await trx
|
|
213
|
-
.deleteFrom("
|
|
214
|
-
.where("id", "=", args.
|
|
213
|
+
.deleteFrom("file_queue")
|
|
214
|
+
.where("id", "=", args.fileQueueEntry.id)
|
|
215
215
|
.execute();
|
|
216
216
|
});
|
|
217
217
|
}
|
|
@@ -227,7 +227,7 @@ export async function handleFileUpdate(args: {
|
|
|
227
227
|
*/
|
|
228
228
|
export async function handleFileDelete(args: {
|
|
229
229
|
lix: Pick<Lix, "db" | "plugin" | "sqlite">;
|
|
230
|
-
|
|
230
|
+
fileQueueEntry: FileQueueEntry;
|
|
231
231
|
}): Promise<void> {
|
|
232
232
|
await args.lix.db.transaction().execute(async (trx) => {
|
|
233
233
|
const currentVersion = await trx
|
|
@@ -238,7 +238,7 @@ export async function handleFileDelete(args: {
|
|
|
238
238
|
|
|
239
239
|
const toBeDeletedEntities = await trx
|
|
240
240
|
.selectFrom("change")
|
|
241
|
-
.where("file_id", "=", args.
|
|
241
|
+
.where("file_id", "=", args.fileQueueEntry.file_id)
|
|
242
242
|
.where(changeIsLeafInVersion(currentVersion))
|
|
243
243
|
.select("entity_id")
|
|
244
244
|
.select("schema_key")
|
|
@@ -257,7 +257,7 @@ export async function handleFileDelete(args: {
|
|
|
257
257
|
authors: currentAuthors,
|
|
258
258
|
version: currentVersion,
|
|
259
259
|
entityId: change.entity_id,
|
|
260
|
-
fileId: args.
|
|
260
|
+
fileId: args.fileQueueEntry.file_id,
|
|
261
261
|
pluginKey: change.plugin_key,
|
|
262
262
|
schemaKey: change.schema_key,
|
|
263
263
|
snapshotContent: null, // Snapshot is null for deletions
|
|
@@ -266,8 +266,8 @@ export async function handleFileDelete(args: {
|
|
|
266
266
|
);
|
|
267
267
|
|
|
268
268
|
await trx
|
|
269
|
-
.deleteFrom("
|
|
270
|
-
.where("id", "=", args.
|
|
269
|
+
.deleteFrom("file_queue")
|
|
270
|
+
.where("id", "=", args.fileQueueEntry.id)
|
|
271
271
|
.execute();
|
|
272
272
|
});
|
|
273
273
|
}
|
package/src/{change-queue/init-change-queue.test.ts → file-queue/file-queue-process.test.ts}
RENAMED
|
@@ -2,8 +2,8 @@ import { expect, test, vi } from "vitest";
|
|
|
2
2
|
import { openLixInMemory } from "../lix/open-lix-in-memory.js";
|
|
3
3
|
import { newLixFile } from "../lix/new-lix.js";
|
|
4
4
|
import type { DetectedChange, LixPlugin } from "../plugin/lix-plugin.js";
|
|
5
|
-
import type {
|
|
6
|
-
import {
|
|
5
|
+
import type { FileQueueEntry, LixFile } from "../database/schema.js";
|
|
6
|
+
import { fileQueueSettled } from "./file-queue-settled.js";
|
|
7
7
|
|
|
8
8
|
test("should use queue and settled correctly", async () => {
|
|
9
9
|
const mockPlugin: LixPlugin = {
|
|
@@ -52,7 +52,7 @@ test("should use queue and settled correctly", async () => {
|
|
|
52
52
|
.values({ id: "test", path: "/test.txt", data: dataInitial })
|
|
53
53
|
.execute();
|
|
54
54
|
|
|
55
|
-
const queue = await lix.db.selectFrom("
|
|
55
|
+
const queue = await lix.db.selectFrom("file_queue").selectAll().execute();
|
|
56
56
|
|
|
57
57
|
expect(queue).toEqual([
|
|
58
58
|
expect.objectContaining({
|
|
@@ -61,13 +61,13 @@ test("should use queue and settled correctly", async () => {
|
|
|
61
61
|
path_after: "/test.txt",
|
|
62
62
|
data_after: dataInitial,
|
|
63
63
|
data_before: null,
|
|
64
|
-
} satisfies Partial<
|
|
64
|
+
} satisfies Partial<FileQueueEntry>),
|
|
65
65
|
]);
|
|
66
66
|
|
|
67
|
-
await
|
|
67
|
+
await fileQueueSettled({ lix });
|
|
68
68
|
|
|
69
69
|
expect(
|
|
70
|
-
(await lix.db.selectFrom("
|
|
70
|
+
(await lix.db.selectFrom("file_queue").selectAll().execute()).length
|
|
71
71
|
).toBe(0);
|
|
72
72
|
|
|
73
73
|
// TODO QUEUE check if the replacement of file_internal was expected
|
|
@@ -118,14 +118,14 @@ test("should use queue and settled correctly", async () => {
|
|
|
118
118
|
.execute();
|
|
119
119
|
|
|
120
120
|
// const beforeQueueTick = await lix.db
|
|
121
|
-
// .selectFrom("
|
|
121
|
+
// .selectFrom("file_queue")
|
|
122
122
|
// .selectAll()
|
|
123
123
|
// .execute();
|
|
124
124
|
|
|
125
125
|
// expect(beforeQueueTick.length).toBe(1);
|
|
126
126
|
|
|
127
127
|
// const afterQueueTick = await lix.db
|
|
128
|
-
// .selectFrom("
|
|
128
|
+
// .selectFrom("file_queue")
|
|
129
129
|
// .selectAll()
|
|
130
130
|
// .execute();
|
|
131
131
|
|
|
@@ -149,11 +149,11 @@ test("should use queue and settled correctly", async () => {
|
|
|
149
149
|
.where("id", "=", "test")
|
|
150
150
|
.execute();
|
|
151
151
|
|
|
152
|
-
const queue2 = await lix.db.selectFrom("
|
|
152
|
+
const queue2 = await lix.db.selectFrom("file_queue").selectAll().execute();
|
|
153
153
|
|
|
154
154
|
expect(queue2).toEqual([
|
|
155
155
|
// change update 1 is the same as change update 2
|
|
156
|
-
// hence, only 2
|
|
156
|
+
// hence, only 2 fil queue entries are expected
|
|
157
157
|
expect.objectContaining({
|
|
158
158
|
id: 3,
|
|
159
159
|
file_id: "test",
|
|
@@ -161,7 +161,7 @@ test("should use queue and settled correctly", async () => {
|
|
|
161
161
|
metadata_after: null,
|
|
162
162
|
data_before: dataUpdate1,
|
|
163
163
|
data_after: dataUpdate2,
|
|
164
|
-
} satisfies Partial<
|
|
164
|
+
} satisfies Partial<FileQueueEntry>),
|
|
165
165
|
expect.objectContaining({
|
|
166
166
|
id: 4,
|
|
167
167
|
file_id: "test",
|
|
@@ -169,13 +169,13 @@ test("should use queue and settled correctly", async () => {
|
|
|
169
169
|
metadata_after: null,
|
|
170
170
|
data_before: dataUpdate2,
|
|
171
171
|
data_after: dataUpdate3,
|
|
172
|
-
} satisfies Partial<
|
|
172
|
+
} satisfies Partial<FileQueueEntry>),
|
|
173
173
|
]);
|
|
174
174
|
|
|
175
|
-
await
|
|
175
|
+
await fileQueueSettled({ lix });
|
|
176
176
|
|
|
177
177
|
expect(
|
|
178
|
-
(await lix.db.selectFrom("
|
|
178
|
+
(await lix.db.selectFrom("file_queue").selectAll().execute()).length
|
|
179
179
|
).toBe(0);
|
|
180
180
|
|
|
181
181
|
const updatedChanges = await lix.db
|
|
@@ -303,7 +303,7 @@ test.todo("changes should contain the author", async () => {
|
|
|
303
303
|
})
|
|
304
304
|
.execute();
|
|
305
305
|
|
|
306
|
-
await
|
|
306
|
+
await fileQueueSettled({ lix });
|
|
307
307
|
|
|
308
308
|
// const changes1 = await lix.db.selectFrom("change").selectAll().execute();
|
|
309
309
|
|
|
@@ -319,7 +319,7 @@ test.todo("changes should contain the author", async () => {
|
|
|
319
319
|
.where("id", "=", "mock")
|
|
320
320
|
.execute();
|
|
321
321
|
|
|
322
|
-
await
|
|
322
|
+
await fileQueueSettled({ lix });
|
|
323
323
|
|
|
324
324
|
// const changes2 = await lix.db.selectFrom("change").selectAll().execute();
|
|
325
325
|
|
|
@@ -333,7 +333,7 @@ test.todo("changes should contain the author", async () => {
|
|
|
333
333
|
.where("id", "=", "mock")
|
|
334
334
|
.execute();
|
|
335
335
|
|
|
336
|
-
await
|
|
336
|
+
await fileQueueSettled({ lix });
|
|
337
337
|
|
|
338
338
|
// const changes3 = await lix.db.selectFrom("change").selectAll().execute();
|
|
339
339
|
|
|
@@ -378,7 +378,7 @@ test("should handle file deletions correctly", async () => {
|
|
|
378
378
|
.execute();
|
|
379
379
|
|
|
380
380
|
// Queue deletion
|
|
381
|
-
await
|
|
381
|
+
await fileQueueSettled({ lix });
|
|
382
382
|
|
|
383
383
|
const changesAfterInsert = await lix.db
|
|
384
384
|
.selectFrom("change")
|
|
@@ -404,7 +404,7 @@ test("should handle file deletions correctly", async () => {
|
|
|
404
404
|
await lix.db.deleteFrom("file").where("id", "=", "file0").execute();
|
|
405
405
|
|
|
406
406
|
// Ensure the queue reflects the deletion entry
|
|
407
|
-
const queue = await lix.db.selectFrom("
|
|
407
|
+
const queue = await lix.db.selectFrom("file_queue").selectAll().execute();
|
|
408
408
|
|
|
409
409
|
expect(queue).toEqual([
|
|
410
410
|
expect.objectContaining({
|
|
@@ -413,15 +413,15 @@ test("should handle file deletions correctly", async () => {
|
|
|
413
413
|
data_before: null,
|
|
414
414
|
path_after: null,
|
|
415
415
|
data_after: null,
|
|
416
|
-
} satisfies Partial<
|
|
416
|
+
} satisfies Partial<FileQueueEntry>),
|
|
417
417
|
]);
|
|
418
418
|
|
|
419
|
-
// Run the
|
|
420
|
-
await
|
|
419
|
+
// Run the fil queue settlement process
|
|
420
|
+
await fileQueueSettled({ lix });
|
|
421
421
|
|
|
422
|
-
// Verify the
|
|
422
|
+
// Verify the fil queue is empty
|
|
423
423
|
expect(
|
|
424
|
-
(await lix.db.selectFrom("
|
|
424
|
+
(await lix.db.selectFrom("file_queue").selectAll().execute()).length
|
|
425
425
|
).toBe(0);
|
|
426
426
|
|
|
427
427
|
// Verify the changes reflect the deletion
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import type { SqliteDatabase } from "sqlite-wasm-kysely";
|
|
2
1
|
import {
|
|
3
2
|
handleFileUpdate,
|
|
4
3
|
handleFileInsert,
|
|
@@ -6,12 +5,11 @@ import {
|
|
|
6
5
|
} from "./file-handlers.js";
|
|
7
6
|
import type { Lix } from "../lix/open-lix.js";
|
|
8
7
|
|
|
9
|
-
export async function
|
|
8
|
+
export async function initFileQueueProcess(args: {
|
|
10
9
|
lix: Pick<Lix, "db" | "plugin" | "sqlite">;
|
|
11
|
-
rawDatabase: SqliteDatabase;
|
|
12
10
|
}): Promise<void> {
|
|
13
|
-
args.
|
|
14
|
-
name: "
|
|
11
|
+
args.lix.sqlite.createFunction({
|
|
12
|
+
name: "triggerFileQueue",
|
|
15
13
|
arity: 0,
|
|
16
14
|
// @ts-expect-error - dynamic function
|
|
17
15
|
xFunc: () => {
|
|
@@ -29,6 +27,11 @@ export async function initChangeQueue(args: {
|
|
|
29
27
|
let hasMoreEntriesSince: number | undefined = undefined;
|
|
30
28
|
|
|
31
29
|
async function queueWorker(trail = false) {
|
|
30
|
+
if (args.lix.sqlite.isOpen() === false) {
|
|
31
|
+
console.log("sqlite is closed");
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
|
|
32
35
|
try {
|
|
33
36
|
if (pending && !trail) {
|
|
34
37
|
hasMoreEntriesSince = runNumber;
|
|
@@ -43,7 +46,7 @@ export async function initChangeQueue(args: {
|
|
|
43
46
|
}
|
|
44
47
|
|
|
45
48
|
const entry = await args.lix.db
|
|
46
|
-
.selectFrom("
|
|
49
|
+
.selectFrom("file_queue")
|
|
47
50
|
.selectAll()
|
|
48
51
|
.orderBy("id asc")
|
|
49
52
|
.limit(1)
|
|
@@ -52,17 +55,17 @@ export async function initChangeQueue(args: {
|
|
|
52
55
|
if (entry) {
|
|
53
56
|
if (entry.data_before && entry.data_after) {
|
|
54
57
|
await handleFileUpdate({
|
|
55
|
-
|
|
58
|
+
fileQueueEntry: entry,
|
|
56
59
|
lix: args.lix,
|
|
57
60
|
});
|
|
58
61
|
} else if (!entry.data_before && entry.data_after) {
|
|
59
62
|
await handleFileInsert({
|
|
60
|
-
|
|
63
|
+
fileQueueEntry: entry,
|
|
61
64
|
lix: args.lix,
|
|
62
65
|
});
|
|
63
66
|
} else {
|
|
64
67
|
await handleFileDelete({
|
|
65
|
-
|
|
68
|
+
fileQueueEntry: entry,
|
|
66
69
|
lix: args.lix,
|
|
67
70
|
});
|
|
68
71
|
}
|
|
@@ -71,7 +74,7 @@ export async function initChangeQueue(args: {
|
|
|
71
74
|
// console.log("getrting { numEntries }");
|
|
72
75
|
|
|
73
76
|
const { numEntries } = await args.lix.db
|
|
74
|
-
.selectFrom("
|
|
77
|
+
.selectFrom("file_queue")
|
|
75
78
|
.select((eb) => eb.fn.count<number>("id").as("numEntries"))
|
|
76
79
|
.executeTakeFirstOrThrow();
|
|
77
80
|
|
|
@@ -81,17 +84,16 @@ export async function initChangeQueue(args: {
|
|
|
81
84
|
!hasMoreEntriesSince ||
|
|
82
85
|
(numEntries === 0 && hasMoreEntriesSince < runNumber)
|
|
83
86
|
) {
|
|
84
|
-
resolve!();
|
|
87
|
+
resolve!();
|
|
85
88
|
hasMoreEntriesSince = undefined;
|
|
86
89
|
pending = undefined;
|
|
87
90
|
// console.log("resolving");
|
|
91
|
+
} else {
|
|
92
|
+
// there are more entries to process
|
|
93
|
+
queueWorker(true);
|
|
88
94
|
}
|
|
89
|
-
|
|
90
|
-
// TODO: handle endless tries on failing quee entries
|
|
91
|
-
// we either execute the queue immediately if we know there is more work or fall back to polling
|
|
92
|
-
setTimeout(() => queueWorker(true), hasMoreEntriesSince ? 0 : 1000);
|
|
93
95
|
} catch (e) {
|
|
94
|
-
console.error("
|
|
96
|
+
console.error("file queue failed ", e);
|
|
95
97
|
}
|
|
96
98
|
}
|
|
97
99
|
// start a worker in case there are entries
|