-
Notifications
You must be signed in to change notification settings - Fork 57
/
save-serializer.worker.ts
66 lines (57 loc) · 1.52 KB
/
save-serializer.worker.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
import {
parseSaveGame,
writeSaveGame,
progressReporter
} from "oni-save-parser";
import {
SaveParserCommandEvent,
ParseSaveCommand,
WriteSaveCommand,
parseSaveError,
parseSaveSuccess,
writeSaveError,
writeSaveSuccess,
sendProgress
} from "./worker-messages";
addEventListener("message", handleMessage);
function handleMessage(message: SaveParserCommandEvent) {
const { data: command } = message;
if (!command || !command.type) {
return;
}
switch (command.type) {
case "parse-save":
return parseSave(command);
case "write-save":
return writeSave(command);
}
}
function parseSave(command: ParseSaveCommand) {
const injector = progressReporter(onProgress);
try {
const save = parseSaveGame(command.data, injector);
postMessage(parseSaveSuccess(save));
} catch (e) {
postMessage(parseSaveError(e));
}
}
function writeSave(command: WriteSaveCommand) {
const injector = progressReporter(onProgress);
try {
const data = writeSaveGame(command.saveGame, injector);
postMessage(writeSaveSuccess(data));
} catch (e) {
postMessage(writeSaveError(e));
}
}
let lastProgress: number = 0;
function onProgress(message: string) {
// This reports lethargically and hangs on messages that are not
// the object which is slowing us down.
// TODO: Move elapse timer to progressReporter() logic queue
// up the last message to send when elapsed.
const elapsed = Date.now() - lastProgress;
if (elapsed > 200) {
postMessage(sendProgress(message));
}
}