@etothepii/satisfactory-file-parser 0.1.24 → 0.1.26

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 (48) hide show
  1. package/build/index.d.ts +1 -0
  2. package/build/index.js +25 -58
  3. package/build/parser/byte/alignment.enum.js +2 -5
  4. package/build/parser/byte/binary-operable.interface.js +1 -2
  5. package/build/parser/byte/binary-readable.interface.js +1 -2
  6. package/build/parser/byte/byte-reader.class.js +10 -14
  7. package/build/parser/byte/byte-writer.class.js +10 -13
  8. package/build/parser/error/parser.error.js +6 -15
  9. package/build/parser/file.types.js +2 -5
  10. package/build/parser/parser.d.ts +1 -1
  11. package/build/parser/parser.js +24 -27
  12. package/build/parser/satisfactory/blueprint/blueprint-reader.js +28 -36
  13. package/build/parser/satisfactory/blueprint/blueprint-writer.js +20 -25
  14. package/build/parser/satisfactory/blueprint/blueprint.types.js +1 -2
  15. package/build/parser/satisfactory/objects/DataFields.js +79 -83
  16. package/build/parser/satisfactory/objects/GUIDInfo.js +5 -8
  17. package/build/parser/satisfactory/objects/ObjectReference.js +2 -5
  18. package/build/parser/satisfactory/objects/Property.js +91 -120
  19. package/build/parser/satisfactory/objects/SaveComponent.js +7 -11
  20. package/build/parser/satisfactory/objects/SaveEntity.js +13 -17
  21. package/build/parser/satisfactory/objects/SaveObject.js +4 -8
  22. package/build/parser/satisfactory/objects/ue/GUID.js +2 -5
  23. package/build/parser/satisfactory/objects/ue/MD5Hash.js +2 -5
  24. package/build/parser/satisfactory/save/asynchronous-level.class.js +12 -16
  25. package/build/parser/satisfactory/save/level.class.js +26 -30
  26. package/build/parser/satisfactory/save/satisfactory-save.d.ts +2 -1
  27. package/build/parser/satisfactory/save/satisfactory-save.js +3 -6
  28. package/build/parser/satisfactory/save/save-reader.js +31 -34
  29. package/build/parser/satisfactory/save/save-writer.js +34 -40
  30. package/build/parser/satisfactory/save/save.types.js +1 -2
  31. package/build/parser/satisfactory/structs/util.types.js +37 -63
  32. package/build/parser/stream/byte-stream-reader.class.js +17 -21
  33. package/build/parser/stream/json-stream-state-writer.js +2 -6
  34. package/build/parser/stream/json-stream-writable.js +1 -5
  35. package/build/parser/stream/json-stream-writer.js +2 -6
  36. package/build/parser/stream/reworked/readable-stream-parser.d.ts +12 -0
  37. package/build/parser/stream/reworked/readable-stream-parser.js +201 -0
  38. package/build/parser/stream/reworked/stream-parser.d.ts +3 -1
  39. package/build/parser/stream/reworked/stream-parser.js +86 -11
  40. package/build/parser/stream/save-stream-json-stringifier.js +3 -7
  41. package/build/parser/stream/save-stream-reader.class.js +18 -24
  42. package/build/parser/stream/save-stream-writer.class.d.ts +15 -13
  43. package/build/parser/stream/save-stream-writer.class.js +71 -108
  44. package/build/parser/stream/stream-level.class.js +11 -15
  45. package/build/parser/stream/stream-parser.js +11 -15
  46. package/package.json +4 -2
  47. package/build/parser/satisfactory/objects/ue/FMD5Hash.d.ts +0 -7
  48. package/build/parser/satisfactory/objects/ue/FMD5Hash.js +0 -19
@@ -0,0 +1,201 @@
1
+ var _a;
2
+ import { SatisfactorySave } from "../../satisfactory/save/satisfactory-save";
3
+ import { SaveReader } from "../../satisfactory/save/save-reader";
4
+ import { ReadableStream } from 'web-streams-polyfill';
5
+ import { SaveComponent, isSaveComponent } from "../../satisfactory/objects/SaveComponent";
6
+ import { SaveEntity, isSaveEntity } from "../../satisfactory/objects/SaveEntity";
7
+ import { Level } from "../../satisfactory/save/level.class";
8
+ const DEFAULT_BYTE_HIGHWATERMARK = 1024 * 1024 * 200;
9
+ const createStringLengthQueuingStrategy = (highWaterMark = DEFAULT_BYTE_HIGHWATERMARK / 4) => ({
10
+ highWaterMark,
11
+ size: (chunk) => {
12
+ if (chunk === undefined) {
13
+ return 0;
14
+ }
15
+ return chunk.length;
16
+ }
17
+ });
18
+ class SimpleWaitForConsumerLock {
19
+ constructor() {
20
+ this.locked = false;
21
+ this.unlockWasCalledInTheMeantime = false;
22
+ this.executionFn = undefined;
23
+ }
24
+ lock(executionFn) {
25
+ this.executionFn = executionFn;
26
+ this.locked = true;
27
+ if (this.unlockWasCalledInTheMeantime) {
28
+ this.unlock();
29
+ }
30
+ }
31
+ unlock() {
32
+ this.locked = false;
33
+ if (this.executionFn) {
34
+ this.executionFn();
35
+ this.executionFn = undefined;
36
+ }
37
+ else {
38
+ this.unlockWasCalledInTheMeantime = true;
39
+ }
40
+ }
41
+ }
42
+ ;
43
+ class ReadableStreamParser {
44
+ static async WriteLevels(write, reader, mapName, buildVersion) {
45
+ const batchingSizeOfObjects = 1000;
46
+ const thresholdOfWrittenObjectsUntilWaitingForConsumerAgain = 3 * batchingSizeOfObjects;
47
+ const levelCount = reader.readInt32();
48
+ reader.onProgressCallback(reader.getBufferProgress(), `reading pack of ${levelCount + 1} levels.`);
49
+ let writtenTotalObjectsSinceConsumerSync = 0;
50
+ for (let j = 0; j <= levelCount; j++) {
51
+ let levelName = (j === levelCount) ? '' + mapName : reader.readString();
52
+ if (j % 500 === 0) {
53
+ reader.onProgressCallback(reader.getBufferProgress(), `reading level [${(j + 1)}/${(levelCount + 1)}] ${levelName}`);
54
+ }
55
+ await write(`${j > 0 ? ', ' : ''}{"name": "${levelName}", "objects": [`, false);
56
+ const headersBinLen = reader.readInt32();
57
+ const unk = reader.readInt32();
58
+ const posBeforeHeaders = reader.getBufferPosition();
59
+ const afterAllHeaders = posBeforeHeaders + headersBinLen;
60
+ let countObjectHeaders = reader.readInt32();
61
+ let totalReadObjectsInLevel = 0;
62
+ let writtenObjectsInLevel = 0;
63
+ let afterHeadersOfBatch = reader.getBufferPosition();
64
+ let afterObjectsOfBatch = -1;
65
+ do {
66
+ reader.skipBytes(afterHeadersOfBatch - reader.getBufferPosition());
67
+ const objectCountToRead = Math.min(countObjectHeaders - totalReadObjectsInLevel, batchingSizeOfObjects);
68
+ const objects = ReadableStreamParser.ReadNObjectHeaders(reader, objectCountToRead);
69
+ afterHeadersOfBatch = reader.getBufferPosition();
70
+ if (totalReadObjectsInLevel === 0) {
71
+ reader.skipBytes(afterAllHeaders - reader.getBufferPosition());
72
+ const objectContentsBinLen = reader.readInt32();
73
+ const unk2 = reader.readInt32();
74
+ const posBeforeContents = reader.getBufferPosition();
75
+ const countEntities = reader.readInt32();
76
+ afterObjectsOfBatch = reader.getBufferPosition();
77
+ }
78
+ else {
79
+ reader.skipBytes(afterObjectsOfBatch - reader.getBufferPosition());
80
+ }
81
+ ReadableStreamParser.ReadNObjects(reader, objectCountToRead, objects, buildVersion);
82
+ afterObjectsOfBatch = reader.getBufferPosition();
83
+ totalReadObjectsInLevel += objectCountToRead;
84
+ if (countObjectHeaders > 10000 && totalReadObjectsInLevel % 10000 === 0) {
85
+ reader.onProgressCallback(reader.getBufferProgress(), `read object count [${(totalReadObjectsInLevel + 1)}/${(countObjectHeaders + 1)}] in level ${levelName}`);
86
+ }
87
+ let shouldWait = false;
88
+ if (writtenTotalObjectsSinceConsumerSync >= thresholdOfWrittenObjectsUntilWaitingForConsumerAgain) {
89
+ shouldWait = true;
90
+ writtenTotalObjectsSinceConsumerSync = 0;
91
+ }
92
+ await write(`${writtenObjectsInLevel > 0 ? ', ' : ''}${objects.map(obj => JSON.stringify(obj)).join(', ')}`, shouldWait);
93
+ writtenTotalObjectsSinceConsumerSync += objectCountToRead;
94
+ writtenObjectsInLevel += objectCountToRead;
95
+ } while (totalReadObjectsInLevel < countObjectHeaders);
96
+ await write('], "collectables": [', false);
97
+ const collectables = Level.ReadCollectablesList(reader);
98
+ await write(`${collectables.map(obj => JSON.stringify(obj)).join(', ')}`, true);
99
+ await write(']', false);
100
+ await write('}', false);
101
+ }
102
+ }
103
+ }
104
+ _a = ReadableStreamParser;
105
+ ReadableStreamParser.CreateReadableStreamForParsingSave = (onStart, onCancel, onPullRequest, highWaterMark = DEFAULT_BYTE_HIGHWATERMARK / 4) => {
106
+ let ourController = null;
107
+ const stream = new ReadableStream({
108
+ start: (controller) => {
109
+ ourController = controller;
110
+ onStart(ourController);
111
+ },
112
+ pull: (controller) => {
113
+ onPullRequest(ourController.desiredSize ?? 1);
114
+ },
115
+ cancel: (reason) => {
116
+ console.warn('parsing stream was canceled!', reason);
117
+ if (ourController !== null) {
118
+ ourController.close();
119
+ }
120
+ onCancel(reason);
121
+ }
122
+ }, createStringLengthQueuingStrategy(highWaterMark));
123
+ const finish = () => {
124
+ if (ourController !== null) {
125
+ ourController?.close();
126
+ }
127
+ };
128
+ return { stream, controller: ourController, finish };
129
+ };
130
+ ReadableStreamParser.CreateReadableStreamFromSaveToJson = (name, bytes, onDecompressedSaveBody = () => { }, onProgress = () => { }) => {
131
+ const waitForConsumerLock = new SimpleWaitForConsumerLock();
132
+ const waitForConsumer = async () => {
133
+ return new Promise((resolve, reject) => {
134
+ waitForConsumerLock.lock(resolve);
135
+ });
136
+ };
137
+ const { stream, controller, finish } = ReadableStreamParser.CreateReadableStreamForParsingSave((controller) => {
138
+ }, (reason) => { }, (desiredSize) => {
139
+ waitForConsumerLock.unlock();
140
+ });
141
+ const write = async (value, waitForConsumerToBeReady = true) => {
142
+ if (waitForConsumerToBeReady) {
143
+ await waitForConsumer();
144
+ }
145
+ controller.enqueue(value);
146
+ };
147
+ const startStreaming = async () => {
148
+ const reader = new SaveReader(bytes.buffer, onProgress);
149
+ const header = reader.readHeader();
150
+ const save = new SatisfactorySave(name, header);
151
+ const inflateResult = reader.inflateChunks();
152
+ onDecompressedSaveBody(reader.getBuffer());
153
+ const gridHash = reader.readSaveBodyHash();
154
+ const grids = reader.readGrids();
155
+ await ReadableStreamParser.WriteHeaderAndGrids(write, reader.compressionInfo, header, grids, gridHash);
156
+ await ReadableStreamParser.WriteLevels(write, reader, save.header.mapName, save.header.buildVersion);
157
+ await write(`]}`);
158
+ finish();
159
+ };
160
+ return { stream, startStreaming };
161
+ };
162
+ ReadableStreamParser.WriteHeaderAndGrids = async (write, compressionInfo, header, grids, gridHash) => {
163
+ return write(`{"header": ${JSON.stringify(header)}, "compressionInfo": ${JSON.stringify(compressionInfo)}, "gridHash": ${JSON.stringify(gridHash)}, "grids": ${JSON.stringify(grids)}, "levels": [`, false);
164
+ };
165
+ ReadableStreamParser.ReadNObjectHeaders = (reader, count) => {
166
+ let objects = [];
167
+ let objectsRead = 0;
168
+ for (; objectsRead < count; objectsRead++) {
169
+ let obj;
170
+ let objectType = reader.readInt32();
171
+ switch (objectType) {
172
+ case SaveEntity.TypeID:
173
+ obj = new SaveEntity('', '', '', '');
174
+ SaveEntity.ParseHeader(reader, obj);
175
+ break;
176
+ case SaveComponent.TypeID:
177
+ obj = new SaveComponent('', '', '', '');
178
+ SaveComponent.ParseHeader(reader, obj);
179
+ break;
180
+ default:
181
+ throw new Error('Unknown object type' + objectType);
182
+ }
183
+ objects.push(obj);
184
+ }
185
+ return objects;
186
+ };
187
+ ReadableStreamParser.ReadNObjects = (reader, count, objects, buildVersion) => {
188
+ for (let i = 0; i < count; i++) {
189
+ objects[i].saveOrBlueprintIndicator = reader.readInt32();
190
+ objects[i].unknownType2 = reader.readInt32();
191
+ const binarySize = reader.readInt32();
192
+ const before = reader.getBufferPosition();
193
+ if (isSaveEntity(objects[i])) {
194
+ SaveEntity.ParseData(objects[i], binarySize, reader, buildVersion, objects[i].typePath);
195
+ }
196
+ else if (isSaveComponent(objects[i])) {
197
+ SaveComponent.ParseData(objects[i], binarySize, reader, buildVersion, objects[i].typePath);
198
+ }
199
+ }
200
+ };
201
+ export { ReadableStreamParser };
@@ -1,6 +1,8 @@
1
1
  /// <reference types="node" />
2
2
  import { WritableStream } from 'stream/web';
3
3
  export declare class StreamParser {
4
- static ParseSaveFileAsynchronousToOutput(bytes: Uint8Array, outputJson: WritableStream<string>, onDecompressedSaveBody?: (buffer: ArrayBuffer) => void, onProgress?: (progress: number, message?: string) => void): Promise<void>;
4
+ static ParseSaveFileToJsonStream(name: string, bytes: Uint8Array, outputJson: WritableStream<string>, onDecompressedSaveBody?: (buffer: ArrayBuffer) => void, onProgress?: (progress: number, message?: string) => void): Promise<void>;
5
5
  private static readLevelsAsync;
6
+ private static ReadNObjectHeaders;
7
+ private static ReadNObjects;
6
8
  }
@@ -1,31 +1,106 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.StreamParser = void 0;
4
- const __1 = require("../../..");
1
+ import { Level, SatisfactorySave, SaveComponent, SaveEntity, SaveReader } from '../../..';
2
+ import { isSaveComponent } from '../../satisfactory/objects/SaveComponent';
3
+ import { isSaveEntity } from '../../satisfactory/objects/SaveEntity';
5
4
  class StreamParser {
6
- static async ParseSaveFileAsynchronousToOutput(bytes, outputJson, onDecompressedSaveBody = () => { }, onProgress = () => { }) {
7
- const reader = new __1.SaveReader(bytes.buffer, onProgress);
5
+ static async ParseSaveFileToJsonStream(name, bytes, outputJson, onDecompressedSaveBody = () => { }, onProgress = () => { }) {
6
+ const reader = new SaveReader(bytes.buffer, onProgress);
8
7
  const writer = outputJson.getWriter();
9
8
  const header = reader.readHeader();
10
- const save = new __1.SatisfactorySave(header);
9
+ const save = new SatisfactorySave(name, header);
11
10
  const inflateResult = reader.inflateChunks();
12
11
  onDecompressedSaveBody(reader.getBuffer());
13
12
  const gridHash = reader.readSaveBodyHash();
14
13
  const grids = reader.readGrids();
15
- await writer.write(`{"header:" ${JSON.stringify(header)}, "compressionInfo": {}, "gridHash": ${JSON.stringify(gridHash)}, "grids": ${JSON.stringify(grids)}, levels: [`);
14
+ await writer.write(`{"header": ${JSON.stringify(header)}, "compressionInfo": ${JSON.stringify(reader.compressionInfo)}, "gridHash": ${JSON.stringify(gridHash)}, "grids": ${JSON.stringify(grids)}, "levels": [`);
16
15
  await StreamParser.readLevelsAsync(reader, writer, save.header.mapName, save.header.buildVersion);
17
16
  await writer.write(`]}`);
17
+ await writer.ready;
18
18
  await writer.close();
19
19
  }
20
20
  static async readLevelsAsync(reader, writer, mapName, buildVersion) {
21
21
  const levelCount = reader.readInt32();
22
- reader.onProgressCallback(reader.getBufferProgress(), `reading pack of ${levelCount} levels.`);
22
+ reader.onProgressCallback(reader.getBufferProgress(), `reading pack of ${levelCount + 1} levels.`);
23
+ const batchingSizeOfObjects = 1000;
23
24
  for (let j = 0; j <= levelCount; j++) {
24
25
  let levelName = (j === levelCount) ? '' + mapName : reader.readString();
25
- if (j % 300 === 0) {
26
+ if (j % 500 === 0) {
26
27
  reader.onProgressCallback(reader.getBufferProgress(), `reading level [${(j + 1)}/${(levelCount + 1)}] ${levelName}`);
27
28
  }
29
+ await writer.write(`${j > 0 ? ', ' : ''}{"name": "${levelName}", "objects": [`);
30
+ const headersBinLen = reader.readInt32();
31
+ const unk = reader.readInt32();
32
+ const posBeforeHeaders = reader.getBufferPosition();
33
+ const afterAllHeaders = posBeforeHeaders + headersBinLen;
34
+ let countObjectHeaders = reader.readInt32();
35
+ let totalReadObjects = 0;
36
+ let afterHeadersOfBatch = reader.getBufferPosition();
37
+ let afterObjectsOfBatch = -1;
38
+ do {
39
+ reader.skipBytes(afterHeadersOfBatch - reader.getBufferPosition());
40
+ const objectCountToRead = Math.min(countObjectHeaders - totalReadObjects, batchingSizeOfObjects);
41
+ const objects = StreamParser.ReadNObjectHeaders(reader, objectCountToRead);
42
+ afterHeadersOfBatch = reader.getBufferPosition();
43
+ if (totalReadObjects === 0) {
44
+ reader.skipBytes(afterAllHeaders - reader.getBufferPosition());
45
+ const objectContentsBinLen = reader.readInt32();
46
+ const unk2 = reader.readInt32();
47
+ const posBeforeContents = reader.getBufferPosition();
48
+ const countEntities = reader.readInt32();
49
+ afterObjectsOfBatch = reader.getBufferPosition();
50
+ }
51
+ else {
52
+ reader.skipBytes(afterObjectsOfBatch - reader.getBufferPosition());
53
+ }
54
+ StreamParser.ReadNObjects(reader, objectCountToRead, objects, buildVersion);
55
+ afterObjectsOfBatch = reader.getBufferPosition();
56
+ totalReadObjects += objectCountToRead;
57
+ if (countObjectHeaders > 10000 && totalReadObjects % 10000 === 0) {
58
+ reader.onProgressCallback(reader.getBufferProgress(), `read object count [${(totalReadObjects + 1)}/${(countObjectHeaders + 1)}] in level ${levelName}`);
59
+ }
60
+ await writer.write(`${objects.map(obj => JSON.stringify(obj)).join(', ')}`);
61
+ } while (totalReadObjects < countObjectHeaders);
62
+ await writer.write('], "collectables": [');
63
+ const collectables = Level.ReadCollectablesList(reader);
64
+ await writer.write(`${collectables.map(obj => JSON.stringify(obj)).join(', ')}`);
65
+ await writer.write(']');
66
+ await writer.write('}');
28
67
  }
29
68
  }
30
69
  }
31
- exports.StreamParser = StreamParser;
70
+ StreamParser.ReadNObjectHeaders = (reader, count) => {
71
+ let objects = [];
72
+ let objectsRead = 0;
73
+ for (; objectsRead < count; objectsRead++) {
74
+ let obj;
75
+ let objectType = reader.readInt32();
76
+ switch (objectType) {
77
+ case SaveEntity.TypeID:
78
+ obj = new SaveEntity('', '', '', '');
79
+ SaveEntity.ParseHeader(reader, obj);
80
+ break;
81
+ case SaveComponent.TypeID:
82
+ obj = new SaveComponent('', '', '', '');
83
+ SaveComponent.ParseHeader(reader, obj);
84
+ break;
85
+ default:
86
+ throw new Error('Unknown object type' + objectType);
87
+ }
88
+ objects.push(obj);
89
+ }
90
+ return objects;
91
+ };
92
+ StreamParser.ReadNObjects = (reader, count, objects, buildVersion) => {
93
+ for (let i = 0; i < count; i++) {
94
+ objects[i].saveOrBlueprintIndicator = reader.readInt32();
95
+ objects[i].unknownType2 = reader.readInt32();
96
+ const binarySize = reader.readInt32();
97
+ const before = reader.getBufferPosition();
98
+ if (isSaveEntity(objects[i])) {
99
+ SaveEntity.ParseData(objects[i], binarySize, reader, buildVersion, objects[i].typePath);
100
+ }
101
+ else if (isSaveComponent(objects[i])) {
102
+ SaveComponent.ParseData(objects[i], binarySize, reader, buildVersion, objects[i].typePath);
103
+ }
104
+ }
105
+ };
106
+ export { StreamParser };
@@ -1,10 +1,7 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.SaveStreamJsonStringifier = void 0;
4
- const save_stream_writer_class_1 = require("./save-stream-writer.class");
5
- class SaveStreamJsonStringifier {
1
+ import { SaveStreamWriter } from "./save-stream-writer.class";
2
+ export class SaveStreamJsonStringifier {
6
3
  static async StreamStringifySave(save, output) {
7
- const writer = new save_stream_writer_class_1.SaveStreamWriter(output.getWriter());
4
+ const writer = new SaveStreamWriter(output.getWriter());
8
5
  await writer.beginSave();
9
6
  await writer.writeHeader(save.header);
10
7
  if (save.compressionInfo) {
@@ -32,4 +29,3 @@ class SaveStreamJsonStringifier {
32
29
  await writer.close();
33
30
  }
34
31
  }
35
- exports.SaveStreamJsonStringifier = SaveStreamJsonStringifier;
@@ -1,17 +1,11 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.SaveStreamReader = void 0;
7
- const pako_1 = __importDefault(require("pako"));
8
- const __1 = require("../..");
9
- const alignment_enum_1 = require("../byte/alignment.enum");
10
- const byte_stream_reader_class_1 = require("./byte-stream-reader.class");
11
- const stream_level_class_1 = require("./stream-level.class");
12
- class SaveStreamReader extends byte_stream_reader_class_1.ByteStreamReader {
1
+ import Pako from "pako";
2
+ import { CompressionLibraryError, CorruptSaveError, UnsupportedVersionError } from "../..";
3
+ import { Alignment } from "../byte/alignment.enum";
4
+ import { ByteStreamReader } from "./byte-stream-reader.class";
5
+ import { StreamLevel } from "./stream-level.class";
6
+ class SaveStreamReader extends ByteStreamReader {
13
7
  constructor(reader, maxBufferThreshold, onCloseCallback = async () => { }) {
14
- super(reader, onCloseCallback, 30000, maxBufferThreshold, alignment_enum_1.Alignment.LITTLE_ENDIAN);
8
+ super(reader, onCloseCallback, 30000, maxBufferThreshold, Alignment.LITTLE_ENDIAN);
15
9
  this.compressionInfo = {
16
10
  packageFileTag: 0,
17
11
  maxUncompressedChunkContentSize: 0,
@@ -61,7 +55,7 @@ class SaveStreamReader extends byte_stream_reader_class_1.ByteStreamReader {
61
55
  if (header.saveVersion >= 21) {
62
56
  }
63
57
  else {
64
- throw new __1.UnsupportedVersionError("The save version is too old to support encoding currently. Save in newer game version.");
58
+ throw new UnsupportedVersionError("The save version is too old to support encoding currently. Save in newer game version.");
65
59
  }
66
60
  return header;
67
61
  }
@@ -71,22 +65,22 @@ class SaveStreamReader extends byte_stream_reader_class_1.ByteStreamReader {
71
65
  this.operatingDataView = new DataView(this.operatingStreamBuffer.buffer);
72
66
  this.currentByte = 0;
73
67
  if (this.compressionInfo.packageFileTag <= 0) {
74
- this.compressionInfo.packageFileTag = this.operatingDataView.getInt32(0, this.alignment === alignment_enum_1.Alignment.LITTLE_ENDIAN);
68
+ this.compressionInfo.packageFileTag = this.operatingDataView.getInt32(0, this.alignment === Alignment.LITTLE_ENDIAN);
75
69
  }
76
70
  if (this.compressionInfo.maxUncompressedChunkContentSize <= 0) {
77
- this.compressionInfo.maxUncompressedChunkContentSize = this.operatingDataView.getInt32(8, this.alignment === alignment_enum_1.Alignment.LITTLE_ENDIAN);
71
+ this.compressionInfo.maxUncompressedChunkContentSize = this.operatingDataView.getInt32(8, this.alignment === Alignment.LITTLE_ENDIAN);
78
72
  }
79
- const chunkCompressedLength = this.operatingDataView.getInt32(32, this.alignment === alignment_enum_1.Alignment.LITTLE_ENDIAN);
80
- const chunkUncompressedLength = this.operatingDataView.getInt32(40, this.alignment === alignment_enum_1.Alignment.LITTLE_ENDIAN);
73
+ const chunkCompressedLength = this.operatingDataView.getInt32(32, this.alignment === Alignment.LITTLE_ENDIAN);
74
+ const chunkUncompressedLength = this.operatingDataView.getInt32(40, this.alignment === Alignment.LITTLE_ENDIAN);
81
75
  this.currentByte = this.compressionInfo.chunkHeaderSize;
82
76
  await this.allocate(chunkCompressedLength);
83
77
  let currentChunk = this.operatingStreamBuffer.slice(this.currentByte, this.currentByte + chunkCompressedLength);
84
78
  this.currentByte += chunkCompressedLength;
85
79
  this.totalNumberOfBytesRead += chunkUncompressedLength;
86
80
  try {
87
- const uncompressedChunk = pako_1.default.inflate(currentChunk);
81
+ const uncompressedChunk = Pako.inflate(currentChunk);
88
82
  if (uncompressedChunk.byteLength !== chunkUncompressedLength) {
89
- throw new __1.CorruptSaveError('indicated save body chunk size does not match the inflated result. Save is possibly corrupt.');
83
+ throw new CorruptSaveError('indicated save body chunk size does not match the inflated result. Save is possibly corrupt.');
90
84
  }
91
85
  if (this.debug) {
92
86
  console.log(`${new Date().toString()}: decompressed a chunk from ${currentChunk.byteLength} to ${uncompressedChunk.byteLength} bytes.`);
@@ -94,7 +88,7 @@ class SaveStreamReader extends byte_stream_reader_class_1.ByteStreamReader {
94
88
  return uncompressedChunk;
95
89
  }
96
90
  catch (err) {
97
- throw new __1.CompressionLibraryError("Failed to inflate compressed save data. " + err);
91
+ throw new CompressionLibraryError("Failed to inflate compressed save data. " + err);
98
92
  }
99
93
  }
100
94
  debugInfo() {
@@ -102,7 +96,7 @@ class SaveStreamReader extends byte_stream_reader_class_1.ByteStreamReader {
102
96
  }
103
97
  async streamLevelsToOutput(writer, header) {
104
98
  if (header.saveVersion < 29) {
105
- throw new __1.UnsupportedVersionError('Support for < U6 is not yet implemented.');
99
+ throw new UnsupportedVersionError('Support for < U6 is not yet implemented.');
106
100
  }
107
101
  await this.allocate(100);
108
102
  const numSubLevels = this.readInt32();
@@ -111,11 +105,11 @@ class SaveStreamReader extends byte_stream_reader_class_1.ByteStreamReader {
111
105
  if (this.debug) {
112
106
  console.log(`${new Date().toString()}: reading level [${(j)}/${numSubLevels}] ${levelName}`);
113
107
  }
114
- await stream_level_class_1.StreamLevel.ReadLevelAsync(this, writer, levelName, header.buildVersion);
108
+ await StreamLevel.ReadLevelAsync(this, writer, levelName, header.buildVersion);
115
109
  }
116
110
  return;
117
111
  }
118
112
  }
119
113
  SaveStreamReader.EPOCH_TICKS = 621355968000000000n;
120
114
  SaveStreamReader.DEFAULT_SATISFACTORY_CHUNK_HEADER_SIZE = 48;
121
- exports.SaveStreamReader = SaveStreamReader;
115
+ export { SaveStreamReader };
@@ -6,20 +6,22 @@ import { ByteArray4, Grids } from '../satisfactory/save/save-reader';
6
6
  export declare class SaveStreamWriter {
7
7
  private writer;
8
8
  private mode;
9
+ private tracker;
9
10
  private formatTracker;
10
11
  constructor(writer: WritableStreamDefaultWriter<string>);
11
- beginSave(): Promise<void>;
12
- writeHeader(header: SatisfactorySaveHeader): Promise<void>;
13
- writeCompressionInfo(compressionInfo: ChunkCompressionInfo): Promise<void>;
14
- writeGridHash(gridHash: ByteArray4): Promise<void>;
15
- writeGrids(grids: Grids): Promise<void>;
16
- openLevels(): Promise<void>;
17
- openLevel(levelName: string): Promise<void>;
18
- writeObjects(...objects: SaveObject[]): Promise<void>;
19
- switchInLevelToCollectables(): Promise<void>;
20
- writeCollectables(...collectables: ObjectReference[]): Promise<void>;
21
- endLevel(): Promise<void>;
22
- endLevels(): Promise<void>;
23
- endSave(): Promise<void>;
12
+ private createExecutionFunction;
13
+ beginSave: () => Promise<void>;
14
+ writeHeader: (header: SatisfactorySaveHeader) => Promise<void>;
15
+ writeCompressionInfo: (compressionInfo: ChunkCompressionInfo) => Promise<void>;
16
+ writeGridHash: (gridHash: ByteArray4) => Promise<void>;
17
+ writeGrids: (grids: Grids) => Promise<void>;
18
+ openLevels: () => Promise<void>;
19
+ openLevel: (levelName: string) => Promise<void>;
20
+ writeObjects: (...objects: SaveObject[]) => Promise<void>;
21
+ switchInLevelToCollectables: (...objects: SaveObject[]) => Promise<void>;
22
+ writeCollectables: (...collectables: ObjectReference[]) => Promise<void>;
23
+ endLevel: () => Promise<void>;
24
+ endLevels: () => Promise<void>;
25
+ endSave: () => Promise<void>;
24
26
  close(): Promise<void>;
25
27
  }