@roster-lock/match-agent 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.
Files changed (174) hide show
  1. package/LICENSE.md +11 -0
  2. package/dist/authentication.js +53 -0
  3. package/dist/authentication.js.map +1 -0
  4. package/dist/config/constants.js +12 -0
  5. package/dist/config/constants.js.map +1 -0
  6. package/dist/config/findFile.js +32 -0
  7. package/dist/config/findFile.js.map +1 -0
  8. package/dist/config/index.js +29 -0
  9. package/dist/config/index.js.map +1 -0
  10. package/dist/config/manage.js +41 -0
  11. package/dist/config/manage.js.map +1 -0
  12. package/dist/cors.js +20 -0
  13. package/dist/cors.js.map +1 -0
  14. package/dist/editor-support/index.js +247 -0
  15. package/dist/editor-support/index.js.map +1 -0
  16. package/dist/handle-room/version-1/file-routes.js +53 -0
  17. package/dist/handle-room/version-1/file-routes.js.map +1 -0
  18. package/dist/handle-room/version-1/globals/FolderDB/SQLFolderDB/MultiAbort.js +76 -0
  19. package/dist/handle-room/version-1/globals/FolderDB/SQLFolderDB/MultiAbort.js.map +1 -0
  20. package/dist/handle-room/version-1/globals/FolderDB/SQLFolderDB/ensurePieceExists.js +218 -0
  21. package/dist/handle-room/version-1/globals/FolderDB/SQLFolderDB/ensurePieceExists.js.map +1 -0
  22. package/dist/handle-room/version-1/globals/FolderDB/SQLFolderDB/getVersions.js +18 -0
  23. package/dist/handle-room/version-1/globals/FolderDB/SQLFolderDB/getVersions.js.map +1 -0
  24. package/dist/handle-room/version-1/globals/FolderDB/SQLFolderDB/index.js +16 -0
  25. package/dist/handle-room/version-1/globals/FolderDB/SQLFolderDB/index.js.map +1 -0
  26. package/dist/handle-room/version-1/globals/FolderDB/SQLFolderDB/schema.js +370 -0
  27. package/dist/handle-room/version-1/globals/FolderDB/SQLFolderDB/schema.js.map +1 -0
  28. package/dist/handle-room/version-1/globals/FolderDB/index.js +18 -0
  29. package/dist/handle-room/version-1/globals/FolderDB/index.js.map +1 -0
  30. package/dist/handle-room/version-1/globals/FolderDB/types.js +3 -0
  31. package/dist/handle-room/version-1/globals/FolderDB/types.js.map +1 -0
  32. package/dist/handle-room/version-1/globals/Room/WebsocketRoom.js +95 -0
  33. package/dist/handle-room/version-1/globals/Room/WebsocketRoom.js.map +1 -0
  34. package/dist/handle-room/version-1/globals/Room/index.js +18 -0
  35. package/dist/handle-room/version-1/globals/Room/index.js.map +1 -0
  36. package/dist/handle-room/version-1/globals/Room/room.js +3 -0
  37. package/dist/handle-room/version-1/globals/Room/room.js.map +1 -0
  38. package/dist/handle-room/version-1/globals/index.js +20 -0
  39. package/dist/handle-room/version-1/globals/index.js.map +1 -0
  40. package/dist/handle-room/version-1/globals/types.js +3 -0
  41. package/dist/handle-room/version-1/globals/types.js.map +1 -0
  42. package/dist/handle-room/version-1/handleDownloads/DownloadTracker.js +83 -0
  43. package/dist/handle-room/version-1/handleDownloads/DownloadTracker.js.map +1 -0
  44. package/dist/handle-room/version-1/handleDownloads/index.js +35 -0
  45. package/dist/handle-room/version-1/handleDownloads/index.js.map +1 -0
  46. package/dist/handle-room/version-1/handleDownloads/types.js +3 -0
  47. package/dist/handle-room/version-1/handleDownloads/types.js.map +1 -0
  48. package/dist/handle-room/version-1/handleRoomSelections/encryption.js +21 -0
  49. package/dist/handle-room/version-1/handleRoomSelections/encryption.js.map +1 -0
  50. package/dist/handle-room/version-1/handleRoomSelections/random.js +12 -0
  51. package/dist/handle-room/version-1/handleRoomSelections/random.js.map +1 -0
  52. package/dist/handle-room/version-1/index.js +28 -0
  53. package/dist/handle-room/version-1/index.js.map +1 -0
  54. package/dist/handle-room/version-1/piece-sort.js +71 -0
  55. package/dist/handle-room/version-1/piece-sort.js.map +1 -0
  56. package/dist/handle-room/version-1/room-handler-bridge/exchange-and-download-selections.js +89 -0
  57. package/dist/handle-room/version-1/room-handler-bridge/exchange-and-download-selections.js.map +1 -0
  58. package/dist/handle-room/version-1/room-handler-bridge/http-handler.js +19 -0
  59. package/dist/handle-room/version-1/room-handler-bridge/http-handler.js.map +1 -0
  60. package/dist/handle-room/version-1/room-handler-bridge/steps.js +170 -0
  61. package/dist/handle-room/version-1/room-handler-bridge/steps.js.map +1 -0
  62. package/dist/handle-room/version-1/room-handler-bridge/ws-handler.js +28 -0
  63. package/dist/handle-room/version-1/room-handler-bridge/ws-handler.js.map +1 -0
  64. package/dist/handle-room/version-1/schema/count.js +16 -0
  65. package/dist/handle-room/version-1/schema/count.js.map +1 -0
  66. package/dist/handle-room/version-1/schema/lock.js +46 -0
  67. package/dist/handle-room/version-1/schema/lock.js.map +1 -0
  68. package/dist/handle-room/version-1/schema/selected.js +13 -0
  69. package/dist/handle-room/version-1/schema/selected.js.map +1 -0
  70. package/dist/handle-room/version-1/select.js +94 -0
  71. package/dist/handle-room/version-1/select.js.map +1 -0
  72. package/dist/index.js +180 -0
  73. package/dist/index.js.map +1 -0
  74. package/dist/server.js +88 -0
  75. package/dist/server.js.map +1 -0
  76. package/dist/utils/fs.js +32 -0
  77. package/dist/utils/fs.js.map +1 -0
  78. package/dist/utils/http-router.js +49 -0
  79. package/dist/utils/http-router.js.map +1 -0
  80. package/dist/utils/pagination.js +23 -0
  81. package/dist/utils/pagination.js.map +1 -0
  82. package/dist/utils/websocket-router.js +15 -0
  83. package/dist/utils/websocket-router.js.map +1 -0
  84. package/package.json +66 -0
  85. package/src/authentication.ts +48 -0
  86. package/src/config/constants.ts +7 -0
  87. package/src/config/findFile.ts +34 -0
  88. package/src/config/index.ts +17 -0
  89. package/src/config/manage.ts +48 -0
  90. package/src/cors.ts +23 -0
  91. package/src/editor-support/index.ts +289 -0
  92. package/src/handle-room/version-0/piece-download/availableGamePiece/index.ts +109 -0
  93. package/src/handle-room/version-0/piece-download/availableGamePiece/isUpToDate.ts +78 -0
  94. package/src/handle-room/version-0/piece-download/downloadPieceAssets/downloadSingleAsset.ts +129 -0
  95. package/src/handle-room/version-0/piece-download/downloadPieceAssets/example.ts +116 -0
  96. package/src/handle-room/version-0/piece-download/downloadPieceAssets/index.ts +144 -0
  97. package/src/handle-room/version-0/piece-download/downloadPieceAssets/types.ts +32 -0
  98. package/src/handle-room/version-0/piece-download/downloadPieceAssets/validateAssetFile.ts +54 -0
  99. package/src/handle-room/version-0/piece-download/index.ts +5 -0
  100. package/src/handle-room/version-0/piece-selection/constants.ts +39 -0
  101. package/src/handle-room/version-0/piece-selection/handleRoomSelections.ts +202 -0
  102. package/src/handle-room/version-0/piece-selection/index.ts +31 -0
  103. package/src/handle-room/version-0/piece-selection/roomErrors.ts +25 -0
  104. package/src/handle-room/version-0/piece-selection/steps/encrypton.ts +70 -0
  105. package/src/handle-room/version-0/piece-selection/steps/final-selection.ts +72 -0
  106. package/src/handle-room/version-0/piece-selection/steps/player-selection.ts +100 -0
  107. package/src/handle-room/version-1/constants.ts +44 -0
  108. package/src/handle-room/version-1/file-routes.ts +68 -0
  109. package/src/handle-room/version-1/globals/FolderDB/SQLFolderDB/MultiAbort.ts +83 -0
  110. package/src/handle-room/version-1/globals/FolderDB/SQLFolderDB/ensurePieceExists.ts +317 -0
  111. package/src/handle-room/version-1/globals/FolderDB/SQLFolderDB/getVersions.ts +31 -0
  112. package/src/handle-room/version-1/globals/FolderDB/SQLFolderDB/index.ts +13 -0
  113. package/src/handle-room/version-1/globals/FolderDB/SQLFolderDB/schema.ts +547 -0
  114. package/src/handle-room/version-1/globals/FolderDB/SQLFolderDB/types.ts +6 -0
  115. package/src/handle-room/version-1/globals/FolderDB/index.ts +3 -0
  116. package/src/handle-room/version-1/globals/FolderDB/types.ts +72 -0
  117. package/src/handle-room/version-1/globals/Room/WebsocketRoom.ts +118 -0
  118. package/src/handle-room/version-1/globals/Room/index.ts +3 -0
  119. package/src/handle-room/version-1/globals/Room/room.ts +8 -0
  120. package/src/handle-room/version-1/globals/index.ts +4 -0
  121. package/src/handle-room/version-1/globals/types.ts +7 -0
  122. package/src/handle-room/version-1/handleDownloads/DownloadTracker.ts +98 -0
  123. package/src/handle-room/version-1/handleDownloads/index.ts +41 -0
  124. package/src/handle-room/version-1/handleDownloads/types.ts +9 -0
  125. package/src/handle-room/version-1/handleRoomSelections/encryption.ts +29 -0
  126. package/src/handle-room/version-1/handleRoomSelections/random.ts +9 -0
  127. package/src/handle-room/version-1/index.ts +33 -0
  128. package/src/handle-room/version-1/piece-sort.ts +96 -0
  129. package/src/handle-room/version-1/room-handler-bridge/exchange-and-download-selections.ts +125 -0
  130. package/src/handle-room/version-1/room-handler-bridge/http-handler.ts +16 -0
  131. package/src/handle-room/version-1/room-handler-bridge/server.pseudo.ts +85 -0
  132. package/src/handle-room/version-1/room-handler-bridge/steps.ts +255 -0
  133. package/src/handle-room/version-1/room-handler-bridge/ws-handler.ts +30 -0
  134. package/src/handle-room/version-1/room-handler-state/RoomState.ts +132 -0
  135. package/src/handle-room/version-1/room-handler-state/bind-to-websocket.ts +93 -0
  136. package/src/handle-room/version-1/room-handler-state/handleRoomSelections.ts +71 -0
  137. package/src/handle-room/version-1/room-handler-state/handleRoomWithErrors.ts +55 -0
  138. package/src/handle-room/version-1/room-handler-state/roomErrors.ts +35 -0
  139. package/src/handle-room/version-1/room-handler-state/user-selection.ts +98 -0
  140. package/src/handle-room/version-1/schema/count.ts +13 -0
  141. package/src/handle-room/version-1/schema/lock.ts +47 -0
  142. package/src/handle-room/version-1/schema/selected.ts +14 -0
  143. package/src/handle-room/version-1/select.ts +130 -0
  144. package/src/handle-room/version-1/validateUnknown.ts +11 -0
  145. package/src/index.old.ts +71 -0
  146. package/src/index.ts +231 -0
  147. package/src/server.ts +85 -0
  148. package/src/utils/fs.ts +43 -0
  149. package/src/utils/http-router.ts +55 -0
  150. package/src/utils/pagination.ts +17 -0
  151. package/src/utils/websocket-router.ts +23 -0
  152. package/tests/integration/editor-pieces-search.test.ts +147 -0
  153. package/tests/integration/game-complete.test.ts +72 -0
  154. package/tests/integration/handle-full-selection.test.ts +143 -0
  155. package/tests/integration/helpers/bridge.ts +22 -0
  156. package/tests/integration/helpers/fakeFolderDB.ts +37 -0
  157. package/tests/integration/helpers/fakePluginRuntime.ts +46 -0
  158. package/tests/integration/helpers/lockConfig.ts +71 -0
  159. package/tests/integration/helpers/make-tar-gz.ts +41 -0
  160. package/tests/integration/helpers/piece.ts +98 -0
  161. package/tests/integration/helpers/plugin-dir.ts +26 -0
  162. package/tests/integration/helpers/room.ts +42 -0
  163. package/tests/integration/helpers/server.ts +51 -0
  164. package/tests/integration/helpers/validLockConfig.ts +80 -0
  165. package/tests/integration/piece-download-and-list.test.ts +194 -0
  166. package/tests/integration/piece-ensure-ws.test.ts +256 -0
  167. package/tests/integration/piece-files.test.ts +139 -0
  168. package/tests/integration/piece-sort-list.test.ts +113 -0
  169. package/tests/integration/protocol.test.ts +129 -0
  170. package/tests/integration/root-and-auth.test.ts +100 -0
  171. package/tests/integration/sync-dl.test.ts +62 -0
  172. package/tests/tsconfig.json +14 -0
  173. package/tsconfig.json +22 -0
  174. package/vitest.config.ts +10 -0
@@ -0,0 +1,218 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SQLite3FolderDB = void 0;
4
+ const types_1 = require("@roster-lock/types");
5
+ const node_fs_1 = require("node:fs");
6
+ const promises_1 = require("node:fs/promises");
7
+ const node_path_1 = require("node:path");
8
+ const getVersions_1 = require("./getVersions");
9
+ const schema_1 = require("./schema");
10
+ const MultiAbort_1 = require("./MultiAbort");
11
+ const ulid_1 = require("ulid");
12
+ const http_router_1 = require("../../../../../utils/http-router");
13
+ const shared_1 = require("@roster-lock/shared");
14
+ const fs_1 = require("../../../../../utils/fs");
15
+ function pieceIndexOf(engine, pieceType, piece) {
16
+ return {
17
+ engineName: engine.name,
18
+ pieceType,
19
+ logic: piece.version.logic,
20
+ media: piece.version.media,
21
+ };
22
+ }
23
+ class SQLite3FolderDB {
24
+ folder;
25
+ pluginRuntime;
26
+ db;
27
+ activeDownloads = new Map();
28
+ constructor(folder, pluginRuntime) {
29
+ this.folder = folder;
30
+ this.pluginRuntime = pluginRuntime;
31
+ if (!(0, node_path_1.isAbsolute)(folder)) {
32
+ throw new Error("Folder must be an absolute path");
33
+ }
34
+ if (!(0, node_fs_1.existsSync)(folder)) {
35
+ throw new Error("Folder does not exist");
36
+ }
37
+ this.db = (0, schema_1.prepareDatabase)((0, node_path_1.join)(folder, "rosterlock.sqlite3.db"));
38
+ }
39
+ close() {
40
+ this.db.close();
41
+ }
42
+ pieceFolder(engine, pieceType, folderName) {
43
+ return (0, node_path_1.join)(this.folder, engine.name, pieceType, folderName);
44
+ }
45
+ async listPieces(enginename, pieceType, logicIds, pagination) {
46
+ const pieces = this.db.listPieces(enginename, pieceType, logicIds, pagination);
47
+ return pieces;
48
+ }
49
+ async searchPieces(query) {
50
+ const { total, items } = this.db.searchPieces(query);
51
+ const pieceKeys = items.map((item) => ({
52
+ pieceType: item.pieceType, logic: item.version.logic, media: item.version.media,
53
+ }));
54
+ const sourcesByPiece = this.db.getDownloadSourcesFor(query.engineName, pieceKeys);
55
+ const statesByPiece = this.db.getPieceStatesFor(query.engineName, pieceKeys);
56
+ return {
57
+ total,
58
+ items: items.map((item) => {
59
+ const key = `${item.pieceType}\x00${item.version.logic}\x00${item.version.media}`;
60
+ const state = statesByPiece.get(key);
61
+ return {
62
+ piece: {
63
+ ...item,
64
+ downloadSources: (sourcesByPiece.get(key) ?? []).map((source) => ({
65
+ source: source.source,
66
+ lastTest: source.last_test === null ? null : source.last_test * 1000,
67
+ success: source.success === null ? null : source.success === 1,
68
+ ...(source.error === null ? {} : { error: source.error }),
69
+ })),
70
+ },
71
+ completedAt: state?.completedAt ? state.completedAt * 1000 : null,
72
+ };
73
+ }),
74
+ };
75
+ }
76
+ async *getFilesofAsset(engineConfig, pieceType, piece, assetName) {
77
+ const state = this.db.getPieceState(pieceIndexOf(engineConfig, pieceType, piece));
78
+ if (!state)
79
+ throw new http_router_1.HTTPError(404, "Piece Doesn't exist");
80
+ if (state.status !== "complete")
81
+ throw new http_router_1.HTTPError(409, "Piece not finished");
82
+ const folder = this.pieceFolder(engineConfig, pieceType, state.folderName);
83
+ for await (const path of (0, fs_1.getFilesFromFolder)(folder)) {
84
+ const assets = (0, shared_1.getMatchingAssetsForFile)(engineConfig.pieceDefinitions[pieceType], piece.pathVariables, path);
85
+ if (assets[0]?.name === assetName)
86
+ yield path;
87
+ }
88
+ }
89
+ async getPieceFileContents(engineConfig, pieceType, piece, filePath) {
90
+ const state = this.db.getPieceState(pieceIndexOf(engineConfig, pieceType, piece));
91
+ if (!state)
92
+ throw new http_router_1.HTTPError(404, "Piece doesn't exist");
93
+ if (state.status !== "complete")
94
+ throw new http_router_1.HTTPError(409, "Piece not finished");
95
+ const folder = this.pieceFolder(engineConfig, pieceType, state.folderName);
96
+ const fullPath = (0, node_path_1.join)(folder, filePath);
97
+ const rel = (0, node_path_1.relative)(folder, fullPath);
98
+ if (rel.startsWith("..") || (0, node_path_1.isAbsolute)(rel))
99
+ throw new http_router_1.HTTPError(400, "Can't back out of folder");
100
+ if (!(0, node_fs_1.existsSync)(fullPath))
101
+ throw new http_router_1.HTTPError(404, "File doesn't exist");
102
+ return (0, node_fs_1.createReadStream)(fullPath);
103
+ }
104
+ async ensurePieceExists(lockConfigEngine, pieceType, selectedPiece, progressHandlers) {
105
+ const pieceIndex = pieceIndexOf(lockConfigEngine, pieceType, selectedPiece);
106
+ const state = this.db.getPieceState(pieceIndex);
107
+ if (state && state.status === "complete")
108
+ return this.pieceFolder(lockConfigEngine, pieceType, state.folderName);
109
+ const key = pieceToKey(pieceIndex);
110
+ const activePromise = this.activeDownloads.get(key);
111
+ if (activePromise) {
112
+ activePromise.multiSignal.addSignal(progressHandlers);
113
+ try {
114
+ return await (0, MultiAbort_1.raceWithAbort)(activePromise.result, progressHandlers.abortSignal);
115
+ }
116
+ catch (e) {
117
+ activePromise.multiSignal.removeSignal(progressHandlers);
118
+ throw e;
119
+ }
120
+ }
121
+ if (state && state.status === "pending") {
122
+ this.db.resetPieceStatus(pieceIndex);
123
+ }
124
+ const multiSignal = new MultiAbort_1.MultiAbortSignal([progressHandlers]);
125
+ const promise = this.addNewPiece(lockConfigEngine, pieceType, selectedPiece, multiSignal.abortSignal);
126
+ this.activeDownloads.set(key, {
127
+ multiSignal,
128
+ result: promise,
129
+ });
130
+ promise.finally(() => {
131
+ multiSignal.clear();
132
+ this.activeDownloads.delete(key);
133
+ }).catch(() => { });
134
+ try {
135
+ return await (0, MultiAbort_1.raceWithAbort)(promise, progressHandlers.abortSignal);
136
+ }
137
+ catch (e) {
138
+ multiSignal.removeSignal(progressHandlers);
139
+ throw e;
140
+ }
141
+ }
142
+ async addNewPiece(lockConfigEngine, pieceType, newPiece, abortSignal) {
143
+ const pieceIndex = pieceIndexOf(lockConfigEngine, pieceType, newPiece);
144
+ const { folderName } = await (async () => {
145
+ const existingState = this.db.getPieceState(pieceIndex);
146
+ if (existingState) {
147
+ await (0, promises_1.rm)(this.pieceFolder(lockConfigEngine, pieceType, existingState.folderName), { recursive: true, force: true });
148
+ return { folderName: existingState.folderName };
149
+ }
150
+ const pieceFolder = (0, ulid_1.ulid)().toLowerCase();
151
+ this.db.insertNewPiece({
152
+ engineName: lockConfigEngine.name,
153
+ pieceType,
154
+ version: newPiece.version,
155
+ humanInfo: newPiece.humanInfo,
156
+ pathVariables: newPiece.pathVariables,
157
+ downloadSources: newPiece.downloadSources,
158
+ }, pieceFolder);
159
+ return { folderName: pieceFolder };
160
+ })();
161
+ const fullPath = this.pieceFolder(lockConfigEngine, pieceType, folderName);
162
+ for (const downloadLocation of newPiece.downloadSources) {
163
+ try {
164
+ await (0, promises_1.mkdir)(fullPath, { recursive: true });
165
+ const { finishPromise } = await this.pluginRuntime.downloadToFolder({
166
+ url: downloadLocation,
167
+ destinationFolder: fullPath,
168
+ processHandlers: {
169
+ onProgress: (progress) => {
170
+ this.emitProgress(pieceIndex, {
171
+ type: types_1.ROSTERLOCK_DOWNLOAD_STATE.downloadProgress,
172
+ pieceType: pieceType,
173
+ pieceVersions: { logic: pieceIndex.logic, media: pieceIndex.media },
174
+ progress,
175
+ });
176
+ },
177
+ abortSignal,
178
+ }
179
+ });
180
+ await finishPromise;
181
+ this.emitProgress(pieceIndex, {
182
+ type: types_1.ROSTERLOCK_DOWNLOAD_STATE.downloadValidation,
183
+ pieceType: pieceIndex.pieceType,
184
+ pieceVersions: { logic: pieceIndex.logic, media: pieceIndex.media },
185
+ });
186
+ const downloadedVersions = await (0, getVersions_1.getDownloadSourceVersion)(fullPath, newPiece.pathVariables, lockConfigEngine.pieceDefinitions[pieceType]);
187
+ if (downloadedVersions.logic !== pieceIndex.logic || downloadedVersions.media !== pieceIndex.media) {
188
+ throw new Error("Version Mismatch");
189
+ }
190
+ this.db.pieceSuccessfullyDownloaded(pieceIndex, downloadLocation);
191
+ return fullPath;
192
+ }
193
+ catch (e) {
194
+ this.db.pieceFailedToDownload(pieceIndex, downloadLocation, e.message);
195
+ await (0, promises_1.rm)(fullPath, { recursive: true, force: true });
196
+ this.emitProgress(pieceIndex, {
197
+ type: types_1.ROSTERLOCK_DOWNLOAD_STATE.downloadFailure,
198
+ pieceType,
199
+ pieceVersions: { logic: pieceIndex.logic, media: pieceIndex.media },
200
+ error: e.message,
201
+ });
202
+ }
203
+ }
204
+ throw new Error("Failed To Download");
205
+ }
206
+ emitProgress(pieceIndex, event) {
207
+ const key = pieceToKey(pieceIndex);
208
+ const multiSignal = this.activeDownloads.get(key)?.multiSignal;
209
+ if (!multiSignal)
210
+ return;
211
+ multiSignal.emitEvent(event);
212
+ }
213
+ }
214
+ exports.SQLite3FolderDB = SQLite3FolderDB;
215
+ function pieceToKey(piece) {
216
+ return `${piece.engineName}-${piece.pieceType}-${piece.logic}-${piece.media}`;
217
+ }
218
+ //# sourceMappingURL=ensurePieceExists.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ensurePieceExists.js","sourceRoot":"","sources":["../../../../../../src/handle-room/version-1/globals/FolderDB/SQLFolderDB/ensurePieceExists.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getDownloadSourceVersion = getDownloadSourceVersion;
4
+ const shared_1 = require("@roster-lock/shared");
5
+ const fs_1 = require("../../../../../utils/fs");
6
+ async function getDownloadSourceVersion(folder, pathVariables, pieceDefinition) {
7
+ const { filesWithAssets } = await (0, shared_1.getAssetsOfFiles)((0, fs_1.getFilesFromFolder)(folder), pathVariables, pieceDefinition);
8
+ return (0, shared_1.calculatePieceVersion)(filesWithAssets, (relativePath) => getFileFromRoot(folder, relativePath));
9
+ }
10
+ const node_path_1 = require("node:path");
11
+ const promises_1 = require("node:fs/promises");
12
+ const node_fs_1 = require("node:fs");
13
+ async function getFileFromRoot(root, relativePath) {
14
+ const filePath = (0, node_path_1.join)(root, relativePath);
15
+ const stats = await (0, promises_1.stat)(filePath);
16
+ return { byteSize: stats.size, stream: (0, node_fs_1.createReadStream)(filePath) };
17
+ }
18
+ //# sourceMappingURL=getVersions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getVersions.js","sourceRoot":"","sources":["../../../../../../src/handle-room/version-1/globals/FolderDB/SQLFolderDB/getVersions.ts"],"names":[],"mappings":";;;AAEA,gDAA8E;AAC9E,gDAA6D;AAItD,KAAK,mCACV,MAAc,EACd,aAAqC,EACrC,eAAgC;IAEhC,MAAM,EAAE,eAAe,EAAE,GAAG,MAAM,IAAA,yBAAgB,EAChD,IAAA,uBAAkB,EAAC,MAAM,CAAC,EAAE,aAAa,EAAE,eAAe,CAC3D,CAAC;IACF,OAAO,IAAA,8BAAqB,EAC1B,eAAe,EAAE,CAAC,YAAY,EAAE,EAAE,CAAC,eAAe,CAAC,MAAM,EAAE,YAAY,CAAC,CACzE,CAAC;AACJ,CAAC;AAED,yCAAuF;AAEvF,+CAAkD;AAClD,qCAA2C;AAC3C,KAAK,UAAU,eAAe,CAC5B,IAAY,EAAE,YAAoB;IAElC,MAAM,QAAQ,GAAG,IAAA,gBAAQ,EAAC,IAAI,EAAE,YAAY,CAAC,CAAC;IAC9C,MAAM,KAAK,GAAG,MAAM,IAAA,eAAM,EAAC,QAAQ,CAAC,CAAC;IACrC,OAAO,EAAE,QAAQ,EAAE,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,IAAA,0BAAgB,EAAC,QAAQ,CAAC,EAAE,CAAE;AACvE,CAAC"}
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SQLite3FolderDB = void 0;
4
+ exports.getSQLite3FolderDB = getSQLite3FolderDB;
5
+ const ensurePieceExists_1 = require("./ensurePieceExists");
6
+ Object.defineProperty(exports, "SQLite3FolderDB", { enumerable: true, get: function () { return ensurePieceExists_1.SQLite3FolderDB; } });
7
+ const dbCache = new Map();
8
+ function getSQLite3FolderDB(folder, pluginRuntime) {
9
+ const existing = dbCache.get(folder);
10
+ if (existing)
11
+ return existing;
12
+ const newDB = new ensurePieceExists_1.SQLite3FolderDB(folder, pluginRuntime);
13
+ dbCache.set(folder, newDB);
14
+ return newDB;
15
+ }
16
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../src/handle-room/version-1/globals/FolderDB/SQLFolderDB/index.ts"],"names":[],"mappings":";;;;AAEA,2DAAsD;gGAA7C,mCAAe;AAGxB,MAAM,OAAO,GAAG,IAAI,GAAG,EAA2B,CAAC;AACnD,4BAAmC,MAAc,EAAE,aAA4B;IAC7E,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACrC,IAAG,QAAQ;QAAE,OAAO,QAAQ,CAAC;IAC7B,MAAM,KAAK,GAAG,IAAI,mCAAe,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IACzD,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IAC3B,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -0,0 +1,370 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SCHEMA = void 0;
4
+ exports.prepareDatabase = prepareDatabase;
5
+ const node_sqlite_1 = require("node:sqlite");
6
+ exports.SCHEMA = `
7
+ CREATE TABLE IF NOT EXISTS pieces (
8
+ engine_name TEXT NOT NULL,
9
+ piece_type TEXT NOT NULL,
10
+ logic_hash TEXT NOT NULL,
11
+ media_hash TEXT NOT NULL,
12
+ docs_hash TEXT NOT NULL,
13
+ human_info TEXT NOT NULL,
14
+ path_variables TEXT,
15
+ folder_name TEXT NOT NULL,
16
+ status TEXT NOT NULL CHECK(status IN ('pending', 'complete', 'error')),
17
+ created_at INTEGER NOT NULL DEFAULT (unixepoch()),
18
+ completed_at INTEGER,
19
+ PRIMARY KEY (engine_name, piece_type, logic_hash, media_hash)
20
+ );
21
+
22
+ CREATE INDEX IF NOT EXISTS idx_status ON pieces(status);
23
+ CREATE INDEX IF NOT EXISTS idx_folder ON pieces(folder_name);
24
+
25
+ CREATE TABLE IF NOT EXISTS download_sources (
26
+ engine_name TEXT NOT NULL,
27
+ piece_type TEXT NOT NULL,
28
+ logic_hash TEXT NOT NULL,
29
+ media_hash TEXT NOT NULL,
30
+ source TEXT NOT NULL,
31
+ last_test INTEGER,
32
+ success INTEGER,
33
+ error TEXT,
34
+ PRIMARY KEY (engine_name, piece_type, logic_hash, media_hash, source),
35
+ FOREIGN KEY (engine_name, piece_type, logic_hash, media_hash)
36
+ REFERENCES pieces(engine_name, piece_type, logic_hash, media_hash)
37
+ );
38
+ `;
39
+ const PIECE_WHERE = `
40
+ WHERE engine_name = @engineName
41
+ AND piece_type = @pieceType
42
+ AND logic_hash = @logic
43
+ AND media_hash = @media
44
+ `;
45
+ function parsePieceRow(row, sources) {
46
+ return {
47
+ engineName: row.engine_name,
48
+ pieceType: row.piece_type,
49
+ version: {
50
+ logic: row.logic_hash,
51
+ media: row.media_hash,
52
+ docs: row.docs_hash
53
+ },
54
+ humanInfo: JSON.parse(row.human_info),
55
+ pathVariables: JSON.parse(row.path_variables),
56
+ downloadSources: sources.map(({ source }) => (source))
57
+ };
58
+ }
59
+ function prepareDatabase(dbLocation) {
60
+ const db = new node_sqlite_1.DatabaseSync(dbLocation);
61
+ db.exec("PRAGMA journal_mode = WAL;");
62
+ db.exec(exports.SCHEMA);
63
+ migrateLegacyDatabase(db);
64
+ return {
65
+ db,
66
+ close() {
67
+ db.close();
68
+ },
69
+ getPiece(pieceInfo) {
70
+ const item = db.prepare(`SELECT * FROM pieces ${PIECE_WHERE}`).get(pieceInfo);
71
+ if (!item)
72
+ return undefined;
73
+ const sources = db.prepare(`SELECT * FROM download_sources ${PIECE_WHERE}`).all(pieceInfo);
74
+ return parsePieceRow(item, sources);
75
+ },
76
+ getPieceState(pieceInfo) {
77
+ const item = db.prepare(`SELECT status, folder_name, completed_at FROM pieces ${PIECE_WHERE}`).get(pieceInfo);
78
+ if (!item)
79
+ return undefined;
80
+ return {
81
+ status: item.status,
82
+ folderName: item.folder_name,
83
+ completedAt: item.completed_at,
84
+ };
85
+ },
86
+ getDownloadSources(pieceInfo) {
87
+ return db.prepare(`
88
+ SELECT source, last_test, success, error FROM download_sources
89
+ ${PIECE_WHERE}
90
+ ORDER BY rowid ASC
91
+ `).all(pieceInfo);
92
+ },
93
+ getPieceStatesFor(engineName, pieces) {
94
+ const result = new Map();
95
+ if (pieces.length === 0)
96
+ return result;
97
+ const values = pieces.map((_, i) => `(@pieceType${i}, @logic${i}, @media${i})`).join(", ");
98
+ const params = { engineName };
99
+ pieces.forEach((piece, i) => {
100
+ params[`pieceType${i}`] = piece.pieceType;
101
+ params[`logic${i}`] = piece.logic;
102
+ params[`media${i}`] = piece.media;
103
+ });
104
+ const rows = db.prepare(`
105
+ SELECT piece_type, logic_hash, media_hash, status, folder_name, completed_at
106
+ FROM pieces
107
+ WHERE engine_name = @engineName
108
+ AND (piece_type, logic_hash, media_hash) IN (VALUES ${values})
109
+ `).all(params);
110
+ for (const row of rows) {
111
+ const key = `${row.piece_type}\x00${row.logic_hash}\x00${row.media_hash}`;
112
+ result.set(key, {
113
+ status: row.status, folderName: row.folder_name, completedAt: row.completed_at,
114
+ });
115
+ }
116
+ return result;
117
+ },
118
+ getDownloadSourcesFor(engineName, pieces) {
119
+ const result = new Map();
120
+ if (pieces.length === 0)
121
+ return result;
122
+ const values = pieces.map((_, i) => `(@pieceType${i}, @logic${i}, @media${i})`).join(", ");
123
+ const params = { engineName };
124
+ pieces.forEach((piece, i) => {
125
+ params[`pieceType${i}`] = piece.pieceType;
126
+ params[`logic${i}`] = piece.logic;
127
+ params[`media${i}`] = piece.media;
128
+ });
129
+ const rows = db.prepare(`
130
+ SELECT piece_type, logic_hash, media_hash, source, last_test, success, error
131
+ FROM download_sources
132
+ WHERE engine_name = @engineName
133
+ AND (piece_type, logic_hash, media_hash) IN (VALUES ${values})
134
+ ORDER BY rowid ASC
135
+ `).all(params);
136
+ for (const row of rows) {
137
+ const key = `${row.piece_type}\x00${row.logic_hash}\x00${row.media_hash}`;
138
+ const existing = result.get(key);
139
+ if (existing)
140
+ existing.push(row);
141
+ else
142
+ result.set(key, [row]);
143
+ }
144
+ return result;
145
+ },
146
+ insertNewPiece(piece, folderName) {
147
+ const pieceInfo = {
148
+ engineName: piece.engineName,
149
+ pieceType: piece.pieceType,
150
+ logic: piece.version.logic,
151
+ media: piece.version.media
152
+ };
153
+ const result = db.prepare(`INSERT INTO pieces (
154
+ engine_name, piece_type, logic_hash, media_hash,
155
+ docs_hash,
156
+ human_info,
157
+ path_variables,
158
+ folder_name,
159
+ status
160
+ ) VALUES (
161
+ @engineName, @pieceType, @logic, @media,
162
+ @docsHash,
163
+ @humanInfo,
164
+ @pathVariables,
165
+ @folderName,
166
+ 'pending'
167
+ )`).run({
168
+ ...pieceInfo,
169
+ docsHash: piece.version.docs,
170
+ humanInfo: JSON.stringify(piece.humanInfo),
171
+ pathVariables: JSON.stringify(piece.pathVariables),
172
+ folderName,
173
+ });
174
+ const insertSource = db.prepare(`INSERT OR IGNORE INTO download_sources (
175
+ engine_name, piece_type, logic_hash, media_hash, source
176
+ ) VALUES (@engineName, @pieceType, @logic, @media, @source)`);
177
+ for (const source of piece.downloadSources) {
178
+ insertSource.run({ ...pieceInfo, source });
179
+ }
180
+ return result;
181
+ },
182
+ recordSourceTest(pieceInfo, source, result) {
183
+ return db.prepare(`INSERT INTO download_sources (
184
+ engine_name, piece_type, logic_hash, media_hash, source,
185
+ last_test, success, error
186
+ ) VALUES (
187
+ @engineName, @pieceType, @logic, @media, @source,
188
+ unixepoch(), @success, @error
189
+ )
190
+ ON CONFLICT (engine_name, piece_type, logic_hash, media_hash, source)
191
+ DO UPDATE SET
192
+ last_test = excluded.last_test,
193
+ success = excluded.success,
194
+ error = excluded.error`).run({
195
+ ...pieceInfo,
196
+ source,
197
+ success: result.success ? 1 : 0,
198
+ error: result.error ?? null,
199
+ });
200
+ },
201
+ resetPieceStatus(pieceInfo) {
202
+ db.prepare(`UPDATE pieces SET status = 'error' ${PIECE_WHERE}`).run(pieceInfo);
203
+ },
204
+ pieceSuccessfullyDownloaded(pieceInfo, downloadSource) {
205
+ this.recordSourceTest(pieceInfo, downloadSource, { success: true });
206
+ return db.prepare(`UPDATE pieces SET status = 'complete', completed_at = unixepoch() ${PIECE_WHERE}`).run(pieceInfo);
207
+ },
208
+ pieceFailedToDownload(pieceInfo, downloadSource, error) {
209
+ this.recordSourceTest(pieceInfo, downloadSource, { success: false, error });
210
+ db.prepare(`UPDATE pieces SET status = 'error' ${PIECE_WHERE}`).run(pieceInfo);
211
+ },
212
+ listPieces(engineName, pieceType, logicIds, { page, limit }) {
213
+ if (logicIds.length === 0)
214
+ return [];
215
+ const logicParams = logicIds.map((_, i) => `@logic${i}`).join(", ");
216
+ const stmt = db.prepare(`
217
+ SELECT * FROM pieces
218
+ WHERE engine_name = @engineName
219
+ AND piece_type = @pieceType
220
+ AND status = 'complete'
221
+ AND logic_hash IN (${logicParams})
222
+ ORDER BY completed_at ASC
223
+ LIMIT @limit OFFSET @offset
224
+ `);
225
+ const params = {
226
+ engineName,
227
+ pieceType,
228
+ limit,
229
+ offset: page * limit,
230
+ };
231
+ logicIds.forEach((logicId, i) => { params[`logic${i}`] = logicId; });
232
+ const items = stmt.all(params);
233
+ const sourcesByPiece = this.getDownloadSourcesFor(engineName, items.map((item) => ({
234
+ pieceType: item.piece_type, logic: item.logic_hash, media: item.media_hash,
235
+ })));
236
+ return items.map((piece) => {
237
+ const key = `${piece.piece_type}\x00${piece.logic_hash}\x00${piece.media_hash}`;
238
+ return parsePieceRow(piece, sourcesByPiece.get(key) ?? []);
239
+ });
240
+ },
241
+ searchPieces({ engineName, pieceType, search, page, limit }) {
242
+ const where = `
243
+ WHERE engine_name = @engineName
244
+ AND status = 'complete'
245
+ AND (@pieceType IS NULL OR piece_type = @pieceType)
246
+ AND (
247
+ @search IS NULL
248
+ OR human_info LIKE '%' || @search || '%'
249
+ OR logic_hash LIKE @search || '%'
250
+ OR EXISTS (
251
+ SELECT 1 FROM download_sources ds
252
+ WHERE ds.engine_name = pieces.engine_name
253
+ AND ds.piece_type = pieces.piece_type
254
+ AND ds.logic_hash = pieces.logic_hash
255
+ AND ds.media_hash = pieces.media_hash
256
+ AND ds.source LIKE '%' || @search || '%'
257
+ )
258
+ )
259
+ `;
260
+ const params = {
261
+ engineName,
262
+ pieceType: pieceType ?? null,
263
+ search: search || null,
264
+ };
265
+ const { total } = db.prepare(`SELECT COUNT(*) as total FROM pieces ${where}`).get(params);
266
+ const items = db.prepare(`SELECT * FROM pieces ${where}
267
+ ORDER BY completed_at DESC
268
+ LIMIT @limit OFFSET @offset`).all({ ...params, limit, offset: page * limit });
269
+ const sourcesByPiece = this.getDownloadSourcesFor(engineName, items.map((item) => ({
270
+ pieceType: item.piece_type, logic: item.logic_hash, media: item.media_hash,
271
+ })));
272
+ return {
273
+ total,
274
+ items: items.map((piece) => {
275
+ const key = `${piece.piece_type}\x00${piece.logic_hash}\x00${piece.media_hash}`;
276
+ return parsePieceRow(piece, sourcesByPiece.get(key) ?? []);
277
+ }),
278
+ };
279
+ }
280
+ };
281
+ }
282
+ function migrateLegacyDatabase(db) {
283
+ const pieceColumns = db.prepare("SELECT name FROM pragma_table_info('pieces')").all().map((column) => column.name);
284
+ const hasErrorsTable = !!db.prepare("SELECT name FROM sqlite_master WHERE type = 'table' AND name = 'download_errors'").get();
285
+ const needsMigration = (!pieceColumns.includes("docs_hash")
286
+ || !pieceColumns.includes("human_info")
287
+ || pieceColumns.includes("piece_json")
288
+ || pieceColumns.includes("download_source")
289
+ || hasErrorsTable);
290
+ if (!needsMigration)
291
+ return;
292
+ db.exec("BEGIN");
293
+ try {
294
+ if (!pieceColumns.includes("docs_hash")) {
295
+ db.exec("ALTER TABLE pieces ADD COLUMN docs_hash TEXT NOT NULL DEFAULT ''");
296
+ }
297
+ if (!pieceColumns.includes("human_info")) {
298
+ db.exec(`ALTER TABLE pieces ADD COLUMN human_info TEXT NOT NULL DEFAULT '{"name":"","author":"","url":""}'`);
299
+ }
300
+ if (pieceColumns.includes("piece_json")) {
301
+ db.exec(`
302
+ UPDATE pieces SET
303
+ docs_hash = COALESCE(json_extract(piece_json, '$.version.docs'), docs_hash),
304
+ human_info = COALESCE(json_extract(piece_json, '$.humanInfo'), human_info)
305
+ WHERE piece_json IS NOT NULL;
306
+ `);
307
+ db.exec(`
308
+ INSERT OR IGNORE INTO download_sources
309
+ (engine_name, piece_type, logic_hash, media_hash, source)
310
+ SELECT p.engine_name, p.piece_type, p.logic_hash, p.media_hash, je.value
311
+ FROM pieces p, json_each(p.piece_json, '$.downloadSources') je
312
+ WHERE p.piece_json IS NOT NULL;
313
+ `);
314
+ db.exec("ALTER TABLE pieces DROP COLUMN piece_json");
315
+ }
316
+ if (pieceColumns.includes("download_source")) {
317
+ db.exec(`
318
+ INSERT OR IGNORE INTO download_sources
319
+ (engine_name, piece_type, logic_hash, media_hash, source)
320
+ SELECT engine_name, piece_type, logic_hash, media_hash, download_source
321
+ FROM pieces WHERE download_source != '';
322
+ `);
323
+ db.exec(`
324
+ UPDATE download_sources
325
+ SET success = 1, last_test = COALESCE(p.completed_at, unixepoch())
326
+ FROM pieces p
327
+ WHERE p.status = 'complete'
328
+ AND p.engine_name = download_sources.engine_name
329
+ AND p.piece_type = download_sources.piece_type
330
+ AND p.logic_hash = download_sources.logic_hash
331
+ AND p.media_hash = download_sources.media_hash
332
+ AND p.download_source = download_sources.source
333
+ AND download_sources.success IS NULL;
334
+ `);
335
+ db.exec("ALTER TABLE pieces DROP COLUMN download_source");
336
+ }
337
+ if (hasErrorsTable) {
338
+ db.exec(`
339
+ INSERT OR IGNORE INTO download_sources
340
+ (engine_name, piece_type, logic_hash, media_hash, source)
341
+ SELECT DISTINCT engine_name, piece_type, logic_hash, media_hash, download_source
342
+ FROM download_errors;
343
+ `);
344
+ db.exec(`
345
+ UPDATE download_sources
346
+ SET success = 0, last_test = e.timestamp, error = e.error_message
347
+ FROM (
348
+ SELECT *, ROW_NUMBER() OVER (
349
+ PARTITION BY engine_name, piece_type, logic_hash, media_hash, download_source
350
+ ORDER BY timestamp DESC
351
+ ) AS rn FROM download_errors
352
+ ) e
353
+ WHERE e.rn = 1
354
+ AND e.engine_name = download_sources.engine_name
355
+ AND e.piece_type = download_sources.piece_type
356
+ AND e.logic_hash = download_sources.logic_hash
357
+ AND e.media_hash = download_sources.media_hash
358
+ AND e.download_source = download_sources.source
359
+ AND (download_sources.last_test IS NULL OR e.timestamp > download_sources.last_test);
360
+ `);
361
+ db.exec("DROP TABLE download_errors");
362
+ }
363
+ db.exec("COMMIT");
364
+ }
365
+ catch (e) {
366
+ db.exec("ROLLBACK");
367
+ throw e;
368
+ }
369
+ }
370
+ //# sourceMappingURL=schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../../../../../src/handle-room/version-1/globals/FolderDB/SQLFolderDB/schema.ts"],"names":[],"mappings":"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"}