@alwaysmeticulous/downloading-helpers 2.109.0 → 2.110.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/dist/scripts/replays.js +47 -22
- package/dist/scripts/replays.js.map +1 -1
- package/package.json +5 -5
package/dist/scripts/replays.js
CHANGED
|
@@ -4,6 +4,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
exports.getReplayDir = exports.getOrFetchReplayArchive = exports.getOrFetchReplay = void 0;
|
|
7
|
+
const fs_1 = require("fs");
|
|
7
8
|
const promises_1 = require("fs/promises");
|
|
8
9
|
const path_1 = require("path");
|
|
9
10
|
const client_1 = require("@alwaysmeticulous/client");
|
|
@@ -28,26 +29,48 @@ const getOrFetchReplay = async (client, replayId) => {
|
|
|
28
29
|
return { fileName: replayFile };
|
|
29
30
|
};
|
|
30
31
|
exports.getOrFetchReplay = getOrFetchReplay;
|
|
32
|
+
const REPLAY_PREVIOUSLY_DOWNLOADED_FILE_NAME = "previously-downloaded.txt";
|
|
31
33
|
const getOrFetchReplayArchive = async (client, replayId, downloadScope = "everything") => {
|
|
32
34
|
const logger = loglevel_1.default.getLogger(common_1.METICULOUS_LOGGER_NAME);
|
|
33
35
|
const replayDir = (0, exports.getReplayDir)(replayId);
|
|
34
36
|
await (0, promises_1.mkdir)(replayDir, { recursive: true });
|
|
35
37
|
const releaseLock = await (0, local_data_utils_1.waitToAcquireLockOnDirectory)(replayDir);
|
|
36
38
|
try {
|
|
37
|
-
const
|
|
38
|
-
// Check
|
|
39
|
-
//
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
39
|
+
const previouslyDownloadedFile = (0, path_1.join)(replayDir, REPLAY_PREVIOUSLY_DOWNLOADED_FILE_NAME);
|
|
40
|
+
// Check what we have already downloaded. This is passed to the downloading function
|
|
41
|
+
// to avoid downloading the same thing twice. This is particularly important because
|
|
42
|
+
// a concurrent process might be using the previously downloaded data, so we don't
|
|
43
|
+
// want to overwrite it while it's being read.
|
|
44
|
+
let previouslyDownloadedScope = undefined;
|
|
45
|
+
if (await (0, local_data_utils_1.fileExists)(previouslyDownloadedFile)) {
|
|
46
|
+
const fileContents = (0, fs_1.readFileSync)(previouslyDownloadedFile, "utf-8");
|
|
47
|
+
if (fileContents === "everything" ||
|
|
48
|
+
fileContents === "screenshots-only") {
|
|
49
|
+
previouslyDownloadedScope = fileContents;
|
|
50
|
+
if (previouslyDownloadedScope === downloadScope ||
|
|
51
|
+
previouslyDownloadedScope === "everything") {
|
|
52
|
+
logger.debug(`Replay archive already downloaded at ${replayDir}`);
|
|
53
|
+
return { fileName: replayDir };
|
|
54
|
+
}
|
|
55
|
+
else {
|
|
56
|
+
// Instead of trying to reason about how to combine the two scopes, let's bump
|
|
57
|
+
// to downloading everything which is guaranteed to be a superset.
|
|
58
|
+
logger.debug(`Replay archive is partially downloaded at ${replayDir}, will now download everything`);
|
|
59
|
+
downloadScope = "everything";
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
else {
|
|
63
|
+
throw new Error(`Error: Unknown previously download scope "${fileContents}"`);
|
|
64
|
+
}
|
|
43
65
|
}
|
|
44
66
|
const replay = await (0, client_1.getReplay)(client, replayId);
|
|
45
67
|
if (replay.version === "v3") {
|
|
46
|
-
await downloadReplayV3Files(client, replayId, replayDir, downloadScope);
|
|
68
|
+
await downloadReplayV3Files(client, replayId, replayDir, downloadScope, previouslyDownloadedScope);
|
|
47
69
|
}
|
|
48
70
|
else {
|
|
49
71
|
throw new Error(`Error: Unknown replay version "${replay.version}". This may be an invalid replay`);
|
|
50
72
|
}
|
|
73
|
+
(0, fs_1.writeFileSync)(previouslyDownloadedFile, downloadScope, "utf-8");
|
|
51
74
|
logger.debug(`Extracted replay archive in ${replayDir}`);
|
|
52
75
|
return { fileName: replayDir };
|
|
53
76
|
}
|
|
@@ -56,7 +79,7 @@ const getOrFetchReplayArchive = async (client, replayId, downloadScope = "everyt
|
|
|
56
79
|
}
|
|
57
80
|
};
|
|
58
81
|
exports.getOrFetchReplayArchive = getOrFetchReplayArchive;
|
|
59
|
-
const downloadReplayV3Files = async (client, replayId, replayDir, downloadScope) => {
|
|
82
|
+
const downloadReplayV3Files = async (client, replayId, replayDir, downloadScope, previouslyDownloadedScope) => {
|
|
60
83
|
const downloadUrls = await (0, client_1.getReplayV3DownloadUrls)(client, replayId);
|
|
61
84
|
if (!downloadUrls) {
|
|
62
85
|
throw new Error("Error: Could not retrieve replay download URLs. This may be an invalid replay");
|
|
@@ -69,20 +92,22 @@ const downloadReplayV3Files = async (client, replayId, replayDir, downloadScope)
|
|
|
69
92
|
return () => (0, download_file_1.downloadAndExtractFile)(data.signedUrl, filePath, replayDir);
|
|
70
93
|
})
|
|
71
94
|
: [];
|
|
72
|
-
const screenshotPromises =
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
95
|
+
const screenshotPromises = previouslyDownloadedScope === "screenshots-only"
|
|
96
|
+
? []
|
|
97
|
+
: Object.values(screenshots).flatMap((data) => {
|
|
98
|
+
const imageFilePath = (0, path_1.join)(replayDir, data.image.filePath);
|
|
99
|
+
const metadata = data.metadata;
|
|
100
|
+
if ((metadata === null || metadata === void 0 ? void 0 : metadata.filePath) == null) {
|
|
101
|
+
return [() => (0, download_file_1.downloadFile)(data.image.signedUrl, imageFilePath)];
|
|
102
|
+
}
|
|
103
|
+
const metadataFilePath = (0, path_1.join)(replayDir, metadata.filePath);
|
|
104
|
+
return [
|
|
105
|
+
() => (0, download_file_1.downloadFile)(data.image.signedUrl, imageFilePath),
|
|
106
|
+
async () => {
|
|
107
|
+
await (0, download_file_1.downloadAndExtractFile)(metadata.signedUrl, metadataFilePath, (0, path_1.join)(replayDir, (0, path_1.dirname)(metadata.filePath)));
|
|
108
|
+
},
|
|
109
|
+
];
|
|
110
|
+
});
|
|
86
111
|
const diffsFolder = (0, path_1.join)(replayDir, "diffs");
|
|
87
112
|
await Promise.all(Object.keys(diffs !== null && diffs !== void 0 ? diffs : {}).map((baseReplayId) => (0, promises_1.mkdir)((0, path_1.join)(diffsFolder, baseReplayId), { recursive: true })));
|
|
88
113
|
const diffsPromises = downloadScope === "everything"
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"replays.js","sourceRoot":"","sources":["../../src/scripts/replays.ts"],"names":[],"mappings":";;;;;;AAAA,0CAAwC;AACxC,+BAAqC;AACrC,qDAIkC;AAClC,qDAGkC;AAGlC,wDAA2B;AAC3B,sDAA6B;AAC7B,mEAGyC;AACzC,yEAI4C;AAE5C,MAAM,wBAAwB,GAAG,EAAE,CAAC;AAE7B,MAAM,gBAAgB,GAAG,KAAK,EACnC,MAAqB,EACrB,QAAgB,EACe,EAAE;IACjC,MAAM,MAAM,GAAG,kBAAG,CAAC,SAAS,CAAC,+BAAsB,CAAC,CAAC;IAErD,MAAM,UAAU,GAAG,IAAA,WAAI,EAAC,IAAA,oBAAY,EAAC,QAAQ,CAAC,EAAE,GAAG,QAAQ,OAAO,CAAC,CAAC;IAEpE,MAAM,MAAM,GAAG,MAAM,IAAA,wCAAqB,EAAC;QACzC,QAAQ,EAAE,UAAU;QACpB,eAAe,EAAE,QAAQ;QACzB,YAAY,EAAE,GAAG,EAAE,CAAC,IAAA,kBAAS,EAAC,MAAM,EAAE,QAAQ,CAAC;KAChD,CAAC,CAAC;IAEH,IAAI,CAAC,MAAM,EAAE;QACX,MAAM,CAAC,KAAK,CACV,6CAA6C,QAAQ,8BAA8B,CACpF,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;KACjB;IAED,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC;AAClC,CAAC,CAAC;AAtBW,QAAA,gBAAgB,oBAsB3B;
|
|
1
|
+
{"version":3,"file":"replays.js","sourceRoot":"","sources":["../../src/scripts/replays.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@alwaysmeticulous/downloading-helpers",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.110.0",
|
|
4
4
|
"description": "Helper utilities for downloading files & scripts required to execute replays",
|
|
5
5
|
"license": "ISC",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -19,9 +19,9 @@
|
|
|
19
19
|
"depcheck": "depcheck --ignore-patterns=dist"
|
|
20
20
|
},
|
|
21
21
|
"dependencies": {
|
|
22
|
-
"@alwaysmeticulous/api": "^2.
|
|
23
|
-
"@alwaysmeticulous/client": "^2.
|
|
24
|
-
"@alwaysmeticulous/common": "^2.
|
|
22
|
+
"@alwaysmeticulous/api": "^2.110.0",
|
|
23
|
+
"@alwaysmeticulous/client": "^2.110.0",
|
|
24
|
+
"@alwaysmeticulous/common": "^2.110.0",
|
|
25
25
|
"axios": "^1.2.6",
|
|
26
26
|
"axios-retry": "^3.5.0",
|
|
27
27
|
"extract-zip": "^2.0.1",
|
|
@@ -51,5 +51,5 @@
|
|
|
51
51
|
"bugs": {
|
|
52
52
|
"url": "https://github.com/alwaysmeticulous/meticulous-sdk/issues"
|
|
53
53
|
},
|
|
54
|
-
"gitHead": "
|
|
54
|
+
"gitHead": "40503f160d772a272af67e2a615c2cea990b8c9d"
|
|
55
55
|
}
|