omegga 1.2.8 → 1.3.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/README.md +20 -1
- package/dist/brickadia/config.js +26 -90
- package/dist/brickadia/config.js.map +1 -1
- package/dist/brickadia/server.js +294 -293
- package/dist/brickadia/server.js.map +1 -1
- package/dist/cli/auth.js +149 -177
- package/dist/cli/auth.js.map +1 -1
- package/dist/cli/config.js +64 -66
- package/dist/cli/config.js.map +1 -1
- package/dist/cli/index.js +14 -14
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/installer.js +37 -43
- package/dist/cli/installer.js.map +1 -1
- package/dist/cli/plugin.js +651 -682
- package/dist/cli/plugin.js.map +1 -1
- package/dist/cli/terminal.js +811 -733
- package/dist/cli/terminal.js.map +1 -1
- package/dist/config/formats/format_js.js +6 -6
- package/dist/config/formats/format_js.js.map +1 -1
- package/dist/config/formats/format_yml.js +7 -10
- package/dist/config/formats/format_yml.js.map +1 -1
- package/dist/config/index.js +46 -68
- package/dist/config/index.js.map +1 -1
- package/dist/config/reader.js +16 -27
- package/dist/config/reader.js.map +1 -1
- package/dist/config/validator.js +23 -25
- package/dist/config/validator.js.map +1 -1
- package/dist/config/writer.js +11 -21
- package/dist/config/writer.js.map +1 -1
- package/dist/index.js +18 -64
- package/dist/index.js.map +1 -1
- package/dist/info/default_commands.json.js +39 -0
- package/dist/info/default_commands.json.js.map +1 -0
- package/dist/logger.js +61 -60
- package/dist/logger.js.map +1 -1
- package/dist/main.js +424 -471
- package/dist/main.js.map +1 -1
- package/dist/omegga/auth.js +101 -148
- package/dist/omegga/auth.js.map +1 -1
- package/dist/omegga/commandInjector.js +261 -251
- package/dist/omegga/commandInjector.js.map +1 -1
- package/dist/omegga/index.js +14 -52
- package/dist/omegga/index.js.map +1 -1
- package/dist/omegga/logWrangler.js +224 -275
- package/dist/omegga/logWrangler.js.map +1 -1
- package/dist/omegga/matchers/auth.js +36 -50
- package/dist/omegga/matchers/auth.js.map +1 -1
- package/dist/omegga/matchers/chat.js +49 -71
- package/dist/omegga/matchers/chat.js.map +1 -1
- package/dist/omegga/matchers/command.js +25 -36
- package/dist/omegga/matchers/command.js.map +1 -1
- package/dist/omegga/matchers/exit.js +15 -18
- package/dist/omegga/matchers/exit.js.map +1 -1
- package/dist/omegga/matchers/index.js +26 -40
- package/dist/omegga/matchers/index.js.map +1 -1
- package/dist/omegga/matchers/init.js +20 -23
- package/dist/omegga/matchers/init.js.map +1 -1
- package/dist/omegga/matchers/interact.js +58 -64
- package/dist/omegga/matchers/interact.js.map +1 -1
- package/dist/omegga/matchers/join.js +74 -95
- package/dist/omegga/matchers/join.js.map +1 -1
- package/dist/omegga/matchers/leave.js +43 -56
- package/dist/omegga/matchers/leave.js.map +1 -1
- package/dist/omegga/matchers/mapChange.js +26 -35
- package/dist/omegga/matchers/mapChange.js.map +1 -1
- package/dist/omegga/matchers/minigameJoin.js +24 -31
- package/dist/omegga/matchers/minigameJoin.js.map +1 -1
- package/dist/omegga/matchers/version.js +42 -49
- package/dist/omegga/matchers/version.js.map +1 -1
- package/dist/omegga/player.js +527 -527
- package/dist/omegga/player.js.map +1 -1
- package/dist/omegga/plugin/interface.js +91 -98
- package/dist/omegga/plugin/interface.js.map +1 -1
- package/dist/omegga/plugin/plugin_jsonrpc_stdio.js +524 -429
- package/dist/omegga/plugin/plugin_jsonrpc_stdio.js.map +1 -1
- package/dist/omegga/plugin/plugin_node_safe/proxyOmegga.js +282 -294
- package/dist/omegga/plugin/plugin_node_safe/proxyOmegga.js.map +1 -1
- package/dist/omegga/plugin/plugin_node_safe.js +365 -393
- package/dist/omegga/plugin/plugin_node_safe.js.map +1 -1
- package/dist/omegga/plugin/plugin_node_unsafe.js +119 -179
- package/dist/omegga/plugin/plugin_node_unsafe.js.map +1 -1
- package/dist/omegga/plugin.js +402 -347
- package/dist/omegga/plugin.js.map +1 -1
- package/dist/omegga/server.js +742 -774
- package/dist/omegga/server.js.map +1 -1
- package/dist/omegga/wrapper.js +64 -91
- package/dist/omegga/wrapper.js.map +1 -1
- package/dist/plugin.js +11 -31
- package/dist/plugin.js.map +1 -1
- package/dist/softconfig.js +121 -100
- package/dist/softconfig.js.map +1 -1
- package/dist/updater/steam.js +97 -112
- package/dist/updater/steam.js.map +1 -1
- package/dist/util/brdb.js +496 -528
- package/dist/util/brdb.js.map +1 -1
- package/dist/util/brick/checkBounds.js +11 -15
- package/dist/util/brick/checkBounds.js.map +1 -1
- package/dist/util/brick/constants.js +723 -174
- package/dist/util/brick/constants.js.map +1 -1
- package/dist/util/brick/displayName.js +204 -211
- package/dist/util/brick/displayName.js.map +1 -1
- package/dist/util/brick/getBounds.js +29 -41
- package/dist/util/brick/getBounds.js.map +1 -1
- package/dist/util/brick/getBrickSize.js +6 -7
- package/dist/util/brick/getBrickSize.js.map +1 -1
- package/dist/util/brick/getScaleAxis.js +24 -30
- package/dist/util/brick/getScaleAxis.js.map +1 -1
- package/dist/util/brick/index.js +8 -29
- package/dist/util/brick/index.js.map +1 -1
- package/dist/util/brick/rotate.js +29 -34
- package/dist/util/brick/rotate.js.map +1 -1
- package/dist/util/brick/setOwnership.js +13 -19
- package/dist/util/brick/setOwnership.js.map +1 -1
- package/dist/util/chat.js +53 -44
- package/dist/util/chat.js.map +1 -1
- package/dist/util/color.js +112 -124
- package/dist/util/color.js.map +1 -1
- package/dist/util/file.js +54 -98
- package/dist/util/file.js.map +1 -1
- package/dist/util/index.js +84 -106
- package/dist/util/index.js.map +1 -1
- package/dist/util/map.js +18 -20
- package/dist/util/map.js.map +1 -1
- package/dist/util/pattern.js +6 -9
- package/dist/util/pattern.js.map +1 -1
- package/dist/util/time.js +31 -34
- package/dist/util/time.js.map +1 -1
- package/dist/util/uuid.js +10 -8
- package/dist/util/uuid.js.map +1 -1
- package/dist/util/wsl.js +19 -25
- package/dist/util/wsl.js.map +1 -1
- package/dist/version.js +7 -9
- package/dist/version.js.map +1 -1
- package/dist/webserver/backend/api.js +784 -874
- package/dist/webserver/backend/api.js.map +1 -1
- package/dist/webserver/backend/calendar.js +14 -17
- package/dist/webserver/backend/calendar.js.map +1 -1
- package/dist/webserver/backend/database.js +563 -613
- package/dist/webserver/backend/database.js.map +1 -1
- package/dist/webserver/backend/index.js +153 -191
- package/dist/webserver/backend/index.js.map +1 -1
- package/dist/webserver/backend/metrics.js +219 -248
- package/dist/webserver/backend/metrics.js.map +1 -1
- package/dist/webserver/backend/util.js +47 -68
- package/dist/webserver/backend/util.js.map +1 -1
- package/dist/worker.js +322 -0
- package/dist/worker.js.map +1 -0
- package/package.json +14 -10
- package/templates/safe-ts/omegga.d.ts +2 -2
- package/vite.backend.config.mts +46 -0
- package/vite.frontend.config.mts +58 -0
- package/vitest.backend.config.mts +7 -0
- package/dist/brickadia/config.d.ts +0 -3
- package/dist/brickadia/presets.d.ts +0 -65
- package/dist/brickadia/presets.js +0 -3
- package/dist/brickadia/presets.js.map +0 -1
- package/dist/brickadia/server.d.ts +0 -36
- package/dist/brickadia/types.d.ts +0 -45
- package/dist/brickadia/types.js +0 -3
- package/dist/brickadia/types.js.map +0 -1
- package/dist/cli/auth.d.ts +0 -26
- package/dist/cli/config.d.ts +0 -10
- package/dist/cli/index.d.ts +0 -30
- package/dist/cli/installer.d.ts +0 -1
- package/dist/cli/plugin.d.ts +0 -22
- package/dist/cli/terminal.d.ts +0 -25
- package/dist/config/authorizer.d.ts +0 -2
- package/dist/config/authorizer.js +0 -38
- package/dist/config/authorizer.js.map +0 -1
- package/dist/config/formats/format_js.d.ts +0 -3
- package/dist/config/formats/format_yml.d.ts +0 -3
- package/dist/config/index.d.ts +0 -18
- package/dist/config/reader.d.ts +0 -3
- package/dist/config/types.d.ts +0 -50
- package/dist/config/types.js +0 -3
- package/dist/config/types.js.map +0 -1
- package/dist/config/validator.d.ts +0 -6
- package/dist/config/writer.d.ts +0 -3
- package/dist/index.d.ts +0 -22
- package/dist/info/default_commands.json +0 -29
- package/dist/logger.d.ts +0 -41
- package/dist/main.d.ts +0 -1
- package/dist/omegga/auth.d.ts +0 -9
- package/dist/omegga/commandInjector.d.ts +0 -35
- package/dist/omegga/index.d.ts +0 -7
- package/dist/omegga/logWrangler.d.ts +0 -32
- package/dist/omegga/matchers/auth.d.ts +0 -10
- package/dist/omegga/matchers/chat.d.ts +0 -10
- package/dist/omegga/matchers/command.d.ts +0 -7
- package/dist/omegga/matchers/exit.d.ts +0 -3
- package/dist/omegga/matchers/index.d.ts +0 -3
- package/dist/omegga/matchers/init.d.ts +0 -3
- package/dist/omegga/matchers/interact.d.ts +0 -4
- package/dist/omegga/matchers/join.d.ts +0 -4
- package/dist/omegga/matchers/leave.d.ts +0 -4
- package/dist/omegga/matchers/mapChange.d.ts +0 -3
- package/dist/omegga/matchers/minigameJoin.d.ts +0 -9
- package/dist/omegga/matchers/types.d.ts +0 -5
- package/dist/omegga/matchers/types.js +0 -3
- package/dist/omegga/matchers/types.js.map +0 -1
- package/dist/omegga/matchers/version.d.ts +0 -3
- package/dist/omegga/player.d.ts +0 -81
- package/dist/omegga/plugin/interface.d.ts +0 -30
- package/dist/omegga/plugin/plugin_jsonrpc_stdio.d.ts +0 -23
- package/dist/omegga/plugin/plugin_node_safe/proxyOmegga.d.ts +0 -145
- package/dist/omegga/plugin/plugin_node_safe/worker.d.ts +0 -1
- package/dist/omegga/plugin/plugin_node_safe/worker.js +0 -367
- package/dist/omegga/plugin/plugin_node_safe/worker.js.map +0 -1
- package/dist/omegga/plugin/plugin_node_safe.d.ts +0 -23
- package/dist/omegga/plugin/plugin_node_unsafe.d.ts +0 -13
- package/dist/omegga/plugin.d.ts +0 -63
- package/dist/omegga/server.d.ts +0 -166
- package/dist/omegga/types.d.ts +0 -49
- package/dist/omegga/types.js +0 -3
- package/dist/omegga/types.js.map +0 -1
- package/dist/omegga/wrapper.d.ts +0 -32
- package/dist/plugin.d.ts +0 -916
- package/dist/softconfig.d.ts +0 -67
- package/dist/tsconfig.tsbuildinfo +0 -1
- package/dist/updater/index.d.ts +0 -1
- package/dist/updater/index.js +0 -10
- package/dist/updater/index.js.map +0 -1
- package/dist/updater/steam.d.ts +0 -52
- package/dist/util/brdb.d.ts +0 -31
- package/dist/util/brick/checkBounds.d.ts +0 -8
- package/dist/util/brick/constants.d.ts +0 -18
- package/dist/util/brick/displayName.d.ts +0 -7
- package/dist/util/brick/getBounds.d.ts +0 -5
- package/dist/util/brick/getBrickSize.d.ts +0 -3
- package/dist/util/brick/getScaleAxis.d.ts +0 -3
- package/dist/util/brick/index.d.ts +0 -14
- package/dist/util/brick/rotate.d.ts +0 -16
- package/dist/util/brick/setOwnership.d.ts +0 -12
- package/dist/util/chat.d.ts +0 -23
- package/dist/util/color.d.ts +0 -13
- package/dist/util/file.d.ts +0 -5
- package/dist/util/index.d.ts +0 -183
- package/dist/util/map.d.ts +0 -6
- package/dist/util/pattern.d.ts +0 -1
- package/dist/util/time.d.ts +0 -39
- package/dist/util/uuid.d.ts +0 -3
- package/dist/util/wsl.d.ts +0 -2
- package/dist/version.d.ts +0 -2
- package/dist/webserver/backend/api.d.ts +0 -115
- package/dist/webserver/backend/calendar.d.ts +0 -5
- package/dist/webserver/backend/database.d.ts +0 -150
- package/dist/webserver/backend/index.d.ts +0 -30
- package/dist/webserver/backend/metrics.d.ts +0 -3
- package/dist/webserver/backend/types.d.ts +0 -114
- package/dist/webserver/backend/types.js +0 -3
- package/dist/webserver/backend/types.js.map +0 -1
- package/dist/webserver/backend/util.d.ts +0 -2
- package/dist/webserver/index.d.ts +0 -2
- package/dist/webserver/index.js +0 -9
- package/dist/webserver/index.js.map +0 -1
package/dist/util/brdb.js
CHANGED
|
@@ -1,567 +1,535 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
exports.readBrdbMeta = readBrdbMeta;
|
|
7
|
-
exports.readBrdbScreenshot = readBrdbScreenshot;
|
|
8
|
-
const better_sqlite3_1 = __importDefault(require("better-sqlite3"));
|
|
9
|
-
const fs_1 = require("fs");
|
|
10
|
-
const zlib_1 = require("zlib");
|
|
11
|
-
/** Open a brdb file if it exists */
|
|
2
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
+
const BetterSqlite3 = require("better-sqlite3");
|
|
4
|
+
const fs = require("node:fs");
|
|
5
|
+
const zlib = require("zlib");
|
|
12
6
|
function openBrdb(path) {
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
return null;
|
|
21
|
-
}
|
|
7
|
+
if (!fs.existsSync(path)) return null;
|
|
8
|
+
try {
|
|
9
|
+
return new BetterSqlite3(path, { readonly: true, fileMustExist: true });
|
|
10
|
+
} catch (err) {
|
|
11
|
+
console.error(`Error reading BRDB metadata from ${path}:`, err);
|
|
12
|
+
return null;
|
|
13
|
+
}
|
|
22
14
|
}
|
|
23
|
-
/** Unsafely read a file from the BRDB database */
|
|
24
15
|
function readFile(db, name) {
|
|
25
|
-
|
|
26
|
-
|
|
16
|
+
const row = db.prepare(
|
|
17
|
+
`SELECT compression, size_uncompressed, size_compressed, content
|
|
27
18
|
FROM files
|
|
28
19
|
LEFT JOIN blobs ON files.content_id = blobs.blob_id
|
|
29
|
-
WHERE name = ? AND deleted_at IS NULL;`
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
params: {},
|
|
40
|
-
});
|
|
20
|
+
WHERE name = ? AND deleted_at IS NULL;`
|
|
21
|
+
).get(name);
|
|
22
|
+
if (!row) return null;
|
|
23
|
+
if (row.content === null) return null;
|
|
24
|
+
if (!row.compression || row.size_compressed >= row.size_uncompressed)
|
|
25
|
+
return row.content;
|
|
26
|
+
return zlib.zstdDecompressSync(row.content, {
|
|
27
|
+
maxOutputLength: row.size_uncompressed,
|
|
28
|
+
params: {}
|
|
29
|
+
});
|
|
41
30
|
}
|
|
42
|
-
/** read the meta and owner data from a brdb file */
|
|
43
|
-
// TODO: specify a create/delete time range for the reading the owner data to allow "browsing" of revisions
|
|
44
31
|
function readBrdbMeta(path) {
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
owners,
|
|
82
|
-
};
|
|
83
|
-
}
|
|
84
|
-
catch (err) {
|
|
85
|
-
console.error(`Error reading BRDB metadata from ${path}:`, err);
|
|
86
|
-
db.close();
|
|
87
|
-
return null;
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
/** read the screenshot from a brdb file */
|
|
91
|
-
function readBrdbScreenshot(path) {
|
|
92
|
-
const db = openBrdb(path);
|
|
93
|
-
if (!db)
|
|
94
|
-
return null;
|
|
95
|
-
try {
|
|
96
|
-
const file = readFile(db, 'Screenshot.jpg');
|
|
97
|
-
db.close();
|
|
98
|
-
return file;
|
|
99
|
-
}
|
|
100
|
-
catch (err) {
|
|
101
|
-
console.error(`Error reading BRDB screenshot from ${path}:`, err);
|
|
102
|
-
db.close();
|
|
32
|
+
const db = openBrdb(path);
|
|
33
|
+
if (!db) return null;
|
|
34
|
+
try {
|
|
35
|
+
const worldJson = JSON.parse(
|
|
36
|
+
readFile(db, "World.json").toString("utf8")
|
|
37
|
+
);
|
|
38
|
+
const bundleJson = JSON.parse(readFile(db, "Bundle.json").toString("utf8"));
|
|
39
|
+
const ownersSchemaBuf = readFile(db, "Owners.schema");
|
|
40
|
+
const ownersBuf = readFile(db, "Owners.mps");
|
|
41
|
+
const owners = [];
|
|
42
|
+
if (ownersBuf && ownersSchemaBuf) {
|
|
43
|
+
const ownersSchema = readBrdbSchema(ownersSchemaBuf);
|
|
44
|
+
const { value: ownersMps } = readBrdbType(
|
|
45
|
+
ownersBuf,
|
|
46
|
+
0,
|
|
47
|
+
ownersSchema,
|
|
48
|
+
"BRSavedOwnerTableSoA"
|
|
49
|
+
);
|
|
50
|
+
for (let i = 0; i < ownersMps["UserIds"].length; i++) {
|
|
51
|
+
const id = guidToUuid(ownersMps["UserIds"][i]);
|
|
52
|
+
const name = ownersMps["UserNames"][i];
|
|
53
|
+
const display_name = ownersMps["DisplayNames"][i];
|
|
54
|
+
const entity_count = ownersMps["EntityCounts"][i];
|
|
55
|
+
const brick_count = ownersMps["BrickCounts"][i];
|
|
56
|
+
const component_count = ownersMps["ComponentCounts"][i];
|
|
57
|
+
const wire_count = ownersMps["WireCounts"][i];
|
|
58
|
+
owners.push({
|
|
59
|
+
id,
|
|
60
|
+
name,
|
|
61
|
+
display_name,
|
|
62
|
+
entity_count,
|
|
63
|
+
brick_count,
|
|
64
|
+
component_count,
|
|
65
|
+
wire_count
|
|
66
|
+
});
|
|
67
|
+
}
|
|
103
68
|
}
|
|
69
|
+
db.close();
|
|
70
|
+
return {
|
|
71
|
+
meta: { world: worldJson, bundle: bundleJson },
|
|
72
|
+
owners
|
|
73
|
+
};
|
|
74
|
+
} catch (err) {
|
|
75
|
+
console.error(`Error reading BRDB metadata from ${path}:`, err);
|
|
76
|
+
db.close();
|
|
77
|
+
return null;
|
|
78
|
+
}
|
|
104
79
|
}
|
|
105
|
-
/** get the msgpack format from a byte */
|
|
106
80
|
function mpMarker(byte) {
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
}
|
|
81
|
+
if ((byte & 128) === 0) return ["fixpos", byte & 63];
|
|
82
|
+
if ((byte & 240) === 128)
|
|
83
|
+
return ["fixmap", byte & 15];
|
|
84
|
+
if ((byte & 240) === 144)
|
|
85
|
+
return ["fixarray", byte & 15];
|
|
86
|
+
if ((byte & 224) === 160)
|
|
87
|
+
return ["fixstr", byte & 31];
|
|
88
|
+
if ((byte & 224) === 224)
|
|
89
|
+
return ["fixneg", -(byte & 31)];
|
|
90
|
+
switch (byte) {
|
|
91
|
+
case 192:
|
|
92
|
+
return ["nil", null];
|
|
93
|
+
case 194:
|
|
94
|
+
return ["false", null];
|
|
95
|
+
case 195:
|
|
96
|
+
return ["true", null];
|
|
97
|
+
case 196:
|
|
98
|
+
return ["bin8", null];
|
|
99
|
+
case 197:
|
|
100
|
+
return ["bin16", null];
|
|
101
|
+
case 198:
|
|
102
|
+
return ["bin32", null];
|
|
103
|
+
case 199:
|
|
104
|
+
return ["ext8", null];
|
|
105
|
+
case 200:
|
|
106
|
+
return ["ext16", null];
|
|
107
|
+
case 201:
|
|
108
|
+
return ["ext32", null];
|
|
109
|
+
case 202:
|
|
110
|
+
return ["float32", null];
|
|
111
|
+
case 203:
|
|
112
|
+
return ["float64", null];
|
|
113
|
+
case 204:
|
|
114
|
+
return ["uint8", null];
|
|
115
|
+
case 205:
|
|
116
|
+
return ["uint16", null];
|
|
117
|
+
case 206:
|
|
118
|
+
return ["uint32", null];
|
|
119
|
+
case 207:
|
|
120
|
+
return ["uint64", null];
|
|
121
|
+
case 208:
|
|
122
|
+
return ["int8", null];
|
|
123
|
+
case 209:
|
|
124
|
+
return ["int16", null];
|
|
125
|
+
case 210:
|
|
126
|
+
return ["int32", null];
|
|
127
|
+
case 211:
|
|
128
|
+
return ["int64", null];
|
|
129
|
+
case 212:
|
|
130
|
+
return ["fixext1", null];
|
|
131
|
+
case 213:
|
|
132
|
+
return ["fixext2", null];
|
|
133
|
+
case 214:
|
|
134
|
+
return ["fixext4", null];
|
|
135
|
+
case 215:
|
|
136
|
+
return ["fixext8", null];
|
|
137
|
+
case 216:
|
|
138
|
+
return ["fixext16", null];
|
|
139
|
+
case 217:
|
|
140
|
+
return ["str8", null];
|
|
141
|
+
case 218:
|
|
142
|
+
return ["str16", null];
|
|
143
|
+
case 219:
|
|
144
|
+
return ["str32", null];
|
|
145
|
+
case 220:
|
|
146
|
+
return ["array16", null];
|
|
147
|
+
case 221:
|
|
148
|
+
return ["array32", null];
|
|
149
|
+
case 222:
|
|
150
|
+
return ["map16", null];
|
|
151
|
+
case 223:
|
|
152
|
+
return ["map32", null];
|
|
153
|
+
default:
|
|
154
|
+
return null;
|
|
155
|
+
}
|
|
183
156
|
}
|
|
184
157
|
function mpString(buf, offset) {
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
158
|
+
const byte = buf[offset];
|
|
159
|
+
const marker = mpMarker(byte);
|
|
160
|
+
if (!marker) {
|
|
161
|
+
throw new Error(`Invalid msgpack format byte: ${byte.toString(16)}`);
|
|
162
|
+
}
|
|
163
|
+
return mpStringContent(buf, marker, offset + 1);
|
|
191
164
|
}
|
|
192
165
|
function mpStringContent(buf, marker, offset) {
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
return { str: '', offset };
|
|
215
|
-
const str = buf.toString('utf8', offset, offset + strSize);
|
|
216
|
-
offset += strSize;
|
|
217
|
-
return { str, offset };
|
|
166
|
+
const [m, size] = marker;
|
|
167
|
+
if (m !== "fixstr" && m !== "str8" && m !== "str16" && m !== "str32") {
|
|
168
|
+
throw new Error(`Expected string format, got ${m}`);
|
|
169
|
+
}
|
|
170
|
+
let strSize = 0;
|
|
171
|
+
if (m === "fixstr") {
|
|
172
|
+
strSize = size;
|
|
173
|
+
} else if (m === "str8") {
|
|
174
|
+
strSize = buf[offset];
|
|
175
|
+
offset++;
|
|
176
|
+
} else if (m === "str16") {
|
|
177
|
+
strSize = buf.readUInt16BE(offset);
|
|
178
|
+
offset += 2;
|
|
179
|
+
} else if (m === "str32") {
|
|
180
|
+
strSize = buf.readUInt32BE(offset);
|
|
181
|
+
offset += 4;
|
|
182
|
+
}
|
|
183
|
+
if (!strSize) return { str: "", offset };
|
|
184
|
+
const str = buf.toString("utf8", offset, offset + strSize);
|
|
185
|
+
offset += strSize;
|
|
186
|
+
return { str, offset };
|
|
218
187
|
}
|
|
219
188
|
function mpInt(buf, offset) {
|
|
220
|
-
|
|
189
|
+
const [marker, num] = mpMarker(buf[offset]);
|
|
190
|
+
offset++;
|
|
191
|
+
if (!marker)
|
|
192
|
+
throw new Error(
|
|
193
|
+
`Invalid msgpack format byte: ${buf[offset - 1].toString(16)}`
|
|
194
|
+
);
|
|
195
|
+
if (marker === "fixpos") return { num, offset };
|
|
196
|
+
if (marker === "fixneg") return { num, offset };
|
|
197
|
+
if (marker === "uint8")
|
|
198
|
+
return {
|
|
199
|
+
num: buf.readUInt8(offset++),
|
|
200
|
+
offset
|
|
201
|
+
};
|
|
202
|
+
if (marker === "uint16") {
|
|
203
|
+
const num2 = buf.readUInt16BE(offset);
|
|
204
|
+
offset += 2;
|
|
205
|
+
return { num: num2, offset };
|
|
206
|
+
}
|
|
207
|
+
if (marker === "uint32") {
|
|
208
|
+
const num2 = buf.readUInt32BE(offset);
|
|
209
|
+
offset += 4;
|
|
210
|
+
return { num: num2, offset };
|
|
211
|
+
}
|
|
212
|
+
if (marker === "uint64") {
|
|
213
|
+
const num2 = BigInt.asUintN(64, BigInt(buf.readBigUInt64BE(offset)));
|
|
214
|
+
offset += 8;
|
|
215
|
+
return { num: Number(num2), offset };
|
|
216
|
+
}
|
|
217
|
+
if (marker === "int8") {
|
|
218
|
+
const num2 = buf.readInt8(offset);
|
|
221
219
|
offset++;
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
}
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
220
|
+
return { num: num2, offset };
|
|
221
|
+
}
|
|
222
|
+
if (marker === "int16") {
|
|
223
|
+
const num2 = buf.readInt16BE(offset);
|
|
224
|
+
offset += 2;
|
|
225
|
+
return { num: num2, offset };
|
|
226
|
+
}
|
|
227
|
+
if (marker === "int32") {
|
|
228
|
+
const num2 = buf.readInt32BE(offset);
|
|
229
|
+
offset += 4;
|
|
230
|
+
return { num: num2, offset };
|
|
231
|
+
}
|
|
232
|
+
if (marker === "int64") {
|
|
233
|
+
const num2 = BigInt.asIntN(64, BigInt(buf.readBigInt64BE(offset)));
|
|
234
|
+
offset += 8;
|
|
235
|
+
return { num: Number(num2), offset };
|
|
236
|
+
}
|
|
237
|
+
throw new Error(`Expected integer format, got ${marker}`);
|
|
238
|
+
}
|
|
239
|
+
function readBrdbSchema(buf) {
|
|
240
|
+
const enums = {};
|
|
241
|
+
const structs = {};
|
|
242
|
+
let offset = 0;
|
|
243
|
+
const next = () => {
|
|
244
|
+
const byte = buf[offset];
|
|
245
|
+
offset++;
|
|
246
|
+
return byte;
|
|
247
|
+
};
|
|
248
|
+
const nextMarker = () => {
|
|
249
|
+
const byte = next();
|
|
250
|
+
const kind = mpMarker(byte);
|
|
251
|
+
if (!kind) {
|
|
252
|
+
throw new Error(`Invalid msgpack format byte: ${byte.toString(16)}`);
|
|
252
253
|
}
|
|
253
|
-
|
|
254
|
-
|
|
254
|
+
return kind;
|
|
255
|
+
};
|
|
256
|
+
const mapLen = (name) => {
|
|
257
|
+
const [kind, val] = nextMarker();
|
|
258
|
+
let len = 0;
|
|
259
|
+
switch (kind) {
|
|
260
|
+
case "fixmap":
|
|
261
|
+
len = val;
|
|
262
|
+
break;
|
|
263
|
+
case "map16":
|
|
264
|
+
len = buf.readUInt16BE(offset);
|
|
255
265
|
offset += 2;
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
const num = buf.readInt32BE(offset);
|
|
266
|
+
break;
|
|
267
|
+
case "map32":
|
|
268
|
+
len = buf.readUInt32BE(offset);
|
|
260
269
|
offset += 4;
|
|
261
|
-
|
|
270
|
+
break;
|
|
271
|
+
default:
|
|
272
|
+
throw new Error(`Expected ${name ?? "unknown"} map len, got ${kind}`);
|
|
262
273
|
}
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
274
|
+
return len;
|
|
275
|
+
};
|
|
276
|
+
const header = nextMarker();
|
|
277
|
+
if (header[0] !== "fixarray" && header[1] !== 2) {
|
|
278
|
+
throw new Error(
|
|
279
|
+
`Expected schema header to be fixarray of length 2, got ${header[0]} ${header[1]}`
|
|
280
|
+
);
|
|
281
|
+
}
|
|
282
|
+
const numEnums = mapLen("enums");
|
|
283
|
+
for (let i = 0; i < numEnums; i++) {
|
|
284
|
+
let name;
|
|
285
|
+
({ str: name, offset } = mpString(buf, offset));
|
|
286
|
+
enums[name] = {};
|
|
287
|
+
const values = mapLen(`enum ${name} values`);
|
|
288
|
+
for (let j = 0; j < values; j++) {
|
|
289
|
+
let key;
|
|
290
|
+
({ str: key, offset } = mpString(buf, offset));
|
|
291
|
+
let value;
|
|
292
|
+
({ num: value, offset } = mpInt(buf, offset));
|
|
293
|
+
enums[name][key] = value;
|
|
294
|
+
enums[name][value] = key;
|
|
267
295
|
}
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
const
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
}
|
|
305
|
-
return len;
|
|
306
|
-
};
|
|
307
|
-
const header = nextMarker();
|
|
308
|
-
if (header[0] !== 'fixarray' && header[1] !== 2) {
|
|
309
|
-
throw new Error(`Expected schema header to be fixarray of length 2, got ${header[0]} ${header[1]}`);
|
|
296
|
+
}
|
|
297
|
+
const numStructs = mapLen("structs");
|
|
298
|
+
for (let i = 0; i < numStructs; i++) {
|
|
299
|
+
let name;
|
|
300
|
+
({ str: name, offset } = mpString(buf, offset));
|
|
301
|
+
const props = {};
|
|
302
|
+
const numProps = mapLen(`struct ${name} properties`);
|
|
303
|
+
for (let j = 0; j < numProps; j++) {
|
|
304
|
+
let propName;
|
|
305
|
+
({ str: propName, offset } = mpString(buf, offset));
|
|
306
|
+
const [kind, val] = nextMarker();
|
|
307
|
+
if (kind === "fixstr" || kind === "str8" || kind === "str16") {
|
|
308
|
+
let ty;
|
|
309
|
+
({ str: ty, offset } = mpStringContent(buf, [kind, val], offset));
|
|
310
|
+
props[propName] = { kind: "literal", ty };
|
|
311
|
+
} else if (kind === "fixarray" && val == 1) {
|
|
312
|
+
let ty;
|
|
313
|
+
({ str: ty, offset } = mpString(buf, offset));
|
|
314
|
+
props[propName] = { kind: "array", ty };
|
|
315
|
+
} else if (kind === "fixarray" && val == 2) {
|
|
316
|
+
let ty;
|
|
317
|
+
({ str: ty, offset } = mpString(buf, offset));
|
|
318
|
+
if (nextMarker()[0] !== "nil")
|
|
319
|
+
throw new Error(`Expected nil after flatarray type`);
|
|
320
|
+
props[propName] = { kind: "flatarray", ty };
|
|
321
|
+
} else if (kind === "fixmap" && val == 1) {
|
|
322
|
+
let key_ty;
|
|
323
|
+
let val_ty;
|
|
324
|
+
({ str: key_ty, offset } = mpString(buf, offset));
|
|
325
|
+
({ str: val_ty, offset } = mpString(buf, offset));
|
|
326
|
+
props[propName] = { kind: "map", key: key_ty, value: val_ty };
|
|
327
|
+
} else {
|
|
328
|
+
throw new Error(
|
|
329
|
+
`Expected property type for ${name}.${propName}, got ${kind}`
|
|
330
|
+
);
|
|
331
|
+
}
|
|
310
332
|
}
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
({ str: name, offset } = mpString(buf, offset));
|
|
315
|
-
enums[name] = {};
|
|
316
|
-
const values = mapLen(`enum ${name} values`);
|
|
317
|
-
for (let j = 0; j < values; j++) {
|
|
318
|
-
let key;
|
|
319
|
-
({ str: key, offset } = mpString(buf, offset));
|
|
320
|
-
let value;
|
|
321
|
-
({ num: value, offset } = mpInt(buf, offset));
|
|
322
|
-
enums[name][key] = value;
|
|
323
|
-
enums[name][value] = key;
|
|
324
|
-
}
|
|
325
|
-
}
|
|
326
|
-
const numStructs = mapLen('structs');
|
|
327
|
-
for (let i = 0; i < numStructs; i++) {
|
|
328
|
-
let name;
|
|
329
|
-
({ str: name, offset } = mpString(buf, offset));
|
|
330
|
-
const props = {};
|
|
331
|
-
const numProps = mapLen(`struct ${name} properties`);
|
|
332
|
-
for (let j = 0; j < numProps; j++) {
|
|
333
|
-
let propName;
|
|
334
|
-
({ str: propName, offset } = mpString(buf, offset));
|
|
335
|
-
const [kind, val] = nextMarker();
|
|
336
|
-
// Basic types
|
|
337
|
-
if (kind === 'fixstr' || kind === 'str8' || kind === 'str16') {
|
|
338
|
-
let ty;
|
|
339
|
-
({ str: ty, offset } = mpStringContent(buf, [kind, val], offset));
|
|
340
|
-
props[propName] = { kind: 'literal', ty };
|
|
341
|
-
}
|
|
342
|
-
else if (kind === 'fixarray' && val == 1) {
|
|
343
|
-
let ty;
|
|
344
|
-
({ str: ty, offset } = mpString(buf, offset));
|
|
345
|
-
props[propName] = { kind: 'array', ty };
|
|
346
|
-
}
|
|
347
|
-
else if (kind === 'fixarray' && val == 2) {
|
|
348
|
-
let ty;
|
|
349
|
-
({ str: ty, offset } = mpString(buf, offset));
|
|
350
|
-
if (nextMarker()[0] !== 'nil')
|
|
351
|
-
throw new Error(`Expected nil after flatarray type`);
|
|
352
|
-
props[propName] = { kind: 'flatarray', ty };
|
|
353
|
-
}
|
|
354
|
-
else if (kind === 'fixmap' && val == 1) {
|
|
355
|
-
let key_ty;
|
|
356
|
-
let val_ty;
|
|
357
|
-
({ str: key_ty, offset } = mpString(buf, offset));
|
|
358
|
-
({ str: val_ty, offset } = mpString(buf, offset));
|
|
359
|
-
props[propName] = { kind: 'map', key: key_ty, value: val_ty };
|
|
360
|
-
}
|
|
361
|
-
else {
|
|
362
|
-
throw new Error(`Expected property type for ${name}.${propName}, got ${kind}`);
|
|
363
|
-
}
|
|
364
|
-
}
|
|
365
|
-
structs[name] = { name, props };
|
|
366
|
-
}
|
|
367
|
-
return { enums, structs };
|
|
333
|
+
structs[name] = { name, props };
|
|
334
|
+
}
|
|
335
|
+
return { enums, structs };
|
|
368
336
|
}
|
|
369
337
|
function mpArrayLen(buf, offset) {
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
338
|
+
const [kind, val] = mpMarker(buf[offset]);
|
|
339
|
+
offset++;
|
|
340
|
+
let len = 0;
|
|
341
|
+
switch (kind) {
|
|
342
|
+
case "fixarray":
|
|
343
|
+
len = val;
|
|
344
|
+
break;
|
|
345
|
+
case "array16":
|
|
346
|
+
len = buf.readUInt16BE(offset);
|
|
347
|
+
offset += 2;
|
|
348
|
+
break;
|
|
349
|
+
case "array32":
|
|
350
|
+
len = buf.readUInt32BE(offset);
|
|
351
|
+
offset += 4;
|
|
352
|
+
break;
|
|
353
|
+
default:
|
|
354
|
+
throw new Error(`Expected array length, got ${kind}`);
|
|
355
|
+
}
|
|
356
|
+
return { len, offset };
|
|
389
357
|
}
|
|
390
358
|
function mpBinLen(buf, offset) {
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
359
|
+
const [kind, _] = mpMarker(buf[offset]);
|
|
360
|
+
offset++;
|
|
361
|
+
let len = 0;
|
|
362
|
+
switch (kind) {
|
|
363
|
+
case "bin8":
|
|
364
|
+
len = buf.readUInt8(offset);
|
|
365
|
+
offset++;
|
|
366
|
+
break;
|
|
367
|
+
case "bin16":
|
|
368
|
+
len = buf.readUInt16BE(offset);
|
|
369
|
+
offset += 2;
|
|
370
|
+
break;
|
|
371
|
+
case "bin32":
|
|
372
|
+
len = buf.readUInt32BE(offset);
|
|
373
|
+
offset += 4;
|
|
374
|
+
break;
|
|
375
|
+
default:
|
|
376
|
+
throw new Error(`Expected binary length, got ${kind}`);
|
|
377
|
+
}
|
|
378
|
+
return { len, offset };
|
|
411
379
|
}
|
|
412
|
-
// this is not a full brdb impl so I'm only implementing what is required
|
|
413
|
-
// to read the owner data
|
|
414
380
|
function readBrdbType(buf, offset, schema, ty) {
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
381
|
+
switch (ty) {
|
|
382
|
+
case "u32":
|
|
383
|
+
let num;
|
|
384
|
+
({ num, offset } = mpInt(buf, offset));
|
|
385
|
+
return { value: num, offset };
|
|
386
|
+
case "str":
|
|
387
|
+
let str;
|
|
388
|
+
({ str, offset } = mpString(buf, offset));
|
|
389
|
+
return { value: str, offset };
|
|
390
|
+
default:
|
|
391
|
+
if (!(ty in schema.structs)) {
|
|
392
|
+
throw new Error(`Unknown type ${ty} in schema`);
|
|
393
|
+
}
|
|
394
|
+
const struct = schema.structs[ty];
|
|
395
|
+
const value = {};
|
|
396
|
+
for (const [propName, propType] of Object.entries(struct.props)) {
|
|
397
|
+
switch (propType.kind) {
|
|
398
|
+
// other soa fields
|
|
399
|
+
case "array":
|
|
400
|
+
let arrLen;
|
|
401
|
+
({ len: arrLen, offset } = mpArrayLen(buf, offset));
|
|
402
|
+
const arr = [];
|
|
403
|
+
for (let i = 0; i < arrLen; i++) {
|
|
404
|
+
const item = readBrdbType(buf, offset, schema, propType.ty);
|
|
405
|
+
arr.push(item.value);
|
|
406
|
+
offset = item.offset;
|
|
427
407
|
}
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
}
|
|
442
|
-
value[propName] = arr;
|
|
443
|
-
break;
|
|
444
|
-
// userids
|
|
445
|
-
case 'flatarray':
|
|
446
|
-
let flatBinSize;
|
|
447
|
-
({ len: flatBinSize, offset } = mpBinLen(buf, offset));
|
|
448
|
-
const flatTySize = flatTypeSize(schema, propType.ty);
|
|
449
|
-
const numItems = flatBinSize / flatTySize;
|
|
450
|
-
const flatArr = [];
|
|
451
|
-
for (let i = 0; i < numItems; i++) {
|
|
452
|
-
const item = readFlatBrdbType(buf, offset, schema, propType.ty);
|
|
453
|
-
flatArr.push(item.value);
|
|
454
|
-
offset = item.offset;
|
|
455
|
-
}
|
|
456
|
-
value[propName] = flatArr;
|
|
457
|
-
break;
|
|
458
|
-
}
|
|
408
|
+
value[propName] = arr;
|
|
409
|
+
break;
|
|
410
|
+
// userids
|
|
411
|
+
case "flatarray":
|
|
412
|
+
let flatBinSize;
|
|
413
|
+
({ len: flatBinSize, offset } = mpBinLen(buf, offset));
|
|
414
|
+
const flatTySize = flatTypeSize(schema, propType.ty);
|
|
415
|
+
const numItems = flatBinSize / flatTySize;
|
|
416
|
+
const flatArr = [];
|
|
417
|
+
for (let i = 0; i < numItems; i++) {
|
|
418
|
+
const item = readFlatBrdbType(buf, offset, schema, propType.ty);
|
|
419
|
+
flatArr.push(item.value);
|
|
420
|
+
offset = item.offset;
|
|
459
421
|
}
|
|
460
|
-
|
|
461
|
-
|
|
422
|
+
value[propName] = flatArr;
|
|
423
|
+
break;
|
|
424
|
+
}
|
|
425
|
+
}
|
|
426
|
+
return { value, offset };
|
|
427
|
+
}
|
|
462
428
|
}
|
|
463
429
|
function readFlatBrdbType(buf, offset, schema, ty) {
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
430
|
+
switch (ty) {
|
|
431
|
+
case "u8":
|
|
432
|
+
const u8 = buf.readUInt8(offset);
|
|
433
|
+
offset++;
|
|
434
|
+
return { value: u8, offset };
|
|
435
|
+
case "u16":
|
|
436
|
+
const u16 = buf.readUInt16LE(offset);
|
|
437
|
+
offset += 2;
|
|
438
|
+
return { value: u16, offset };
|
|
439
|
+
case "u32":
|
|
440
|
+
const u32 = buf.readUInt32LE(offset);
|
|
441
|
+
offset += 4;
|
|
442
|
+
return { value: u32, offset };
|
|
443
|
+
case "u64":
|
|
444
|
+
const u64 = BigInt.asUintN(64, BigInt(buf.readBigUInt64LE(offset)));
|
|
445
|
+
offset += 8;
|
|
446
|
+
return { value: Number(u64), offset };
|
|
447
|
+
case "i8":
|
|
448
|
+
const i8 = buf.readInt8(offset);
|
|
449
|
+
offset++;
|
|
450
|
+
return { value: i8, offset };
|
|
451
|
+
case "i16":
|
|
452
|
+
const i16 = buf.readInt16LE(offset);
|
|
453
|
+
offset += 2;
|
|
454
|
+
return { value: i16, offset };
|
|
455
|
+
case "i32":
|
|
456
|
+
const i32 = buf.readInt32LE(offset);
|
|
457
|
+
offset += 4;
|
|
458
|
+
return { value: i32, offset };
|
|
459
|
+
case "i64":
|
|
460
|
+
const i64 = BigInt.asIntN(64, BigInt(buf.readBigInt64LE(offset)));
|
|
461
|
+
offset += 8;
|
|
462
|
+
return { value: Number(i64), offset };
|
|
463
|
+
case "f32":
|
|
464
|
+
const f32 = buf.readFloatLE(offset);
|
|
465
|
+
offset += 4;
|
|
466
|
+
return { value: f32, offset };
|
|
467
|
+
case "f64":
|
|
468
|
+
const f64 = buf.readDoubleLE(offset);
|
|
469
|
+
offset += 8;
|
|
470
|
+
return { value: f64, offset };
|
|
471
|
+
default:
|
|
472
|
+
if (!(ty in schema.structs)) {
|
|
473
|
+
throw new Error(`Unknown type ${ty} in schema`);
|
|
474
|
+
}
|
|
475
|
+
const struct = schema.structs[ty];
|
|
476
|
+
const value = {};
|
|
477
|
+
for (const [propName, propType] of Object.entries(struct.props)) {
|
|
478
|
+
if (propType.kind !== "literal") {
|
|
479
|
+
throw new Error(
|
|
480
|
+
`Expected literal type for ${ty} property, got ${propType.kind}`
|
|
481
|
+
);
|
|
482
|
+
}
|
|
483
|
+
const item = readFlatBrdbType(buf, offset, schema, propType.ty);
|
|
484
|
+
value[propName] = item.value;
|
|
485
|
+
offset = item.offset;
|
|
486
|
+
}
|
|
487
|
+
return { value, offset };
|
|
488
|
+
}
|
|
521
489
|
}
|
|
522
490
|
function flatTypeSize(schema, ty) {
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
491
|
+
switch (ty) {
|
|
492
|
+
case "u8":
|
|
493
|
+
return 1;
|
|
494
|
+
case "u16":
|
|
495
|
+
return 2;
|
|
496
|
+
case "u32":
|
|
497
|
+
return 4;
|
|
498
|
+
case "u64":
|
|
499
|
+
return 8;
|
|
500
|
+
case "i8":
|
|
501
|
+
return 1;
|
|
502
|
+
case "i16":
|
|
503
|
+
return 2;
|
|
504
|
+
case "i32":
|
|
505
|
+
return 4;
|
|
506
|
+
case "i64":
|
|
507
|
+
return 8;
|
|
508
|
+
case "f32":
|
|
509
|
+
return 4;
|
|
510
|
+
case "f64":
|
|
511
|
+
return 8;
|
|
512
|
+
default:
|
|
513
|
+
if (!(ty in schema.structs)) {
|
|
514
|
+
throw new Error(`Unknown type ${ty} in schema`);
|
|
515
|
+
}
|
|
516
|
+
const struct = schema.structs[ty];
|
|
517
|
+
let size = 0;
|
|
518
|
+
for (const propType of Object.values(struct.props)) {
|
|
519
|
+
if (propType.kind !== "literal") {
|
|
520
|
+
throw new Error(
|
|
521
|
+
`Expected literal type for ${ty} property, got ${propType.kind}`
|
|
522
|
+
);
|
|
523
|
+
}
|
|
524
|
+
size += flatTypeSize(schema, propType.ty);
|
|
525
|
+
}
|
|
526
|
+
return size;
|
|
527
|
+
}
|
|
558
528
|
}
|
|
559
|
-
/** convert a set of 4 u32s into a uuidv4 */
|
|
560
529
|
function guidToUuid(guid) {
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
// format as uuidv4
|
|
565
|
-
return `${joined.slice(0, 8)}-${joined.slice(8, 12)}-${joined.slice(12, 16)}-${joined.slice(16, 20)}-${joined.slice(20)}`;
|
|
530
|
+
const hex = (num) => num.toString(16).padStart(8, "0");
|
|
531
|
+
const joined = `${hex(guid.A)}${hex(guid.B)}${hex(guid.C)}${hex(guid.D)}`;
|
|
532
|
+
return `${joined.slice(0, 8)}-${joined.slice(8, 12)}-${joined.slice(12, 16)}-${joined.slice(16, 20)}-${joined.slice(20)}`;
|
|
566
533
|
}
|
|
567
|
-
|
|
534
|
+
exports.readBrdbMeta = readBrdbMeta;
|
|
535
|
+
//# sourceMappingURL=brdb.js.map
|