1 | "use strict";
|
2 |
|
3 | Object.defineProperty(exports, "__esModule", {
|
4 | value: true
|
5 | });
|
6 | exports.readAsarJson = exports.readAsar = exports.AsarFilesystem = exports.Node = void 0;
|
7 |
|
8 | function _bluebirdLst() {
|
9 | const data = require("bluebird-lst");
|
10 |
|
11 | _bluebirdLst = function () {
|
12 | return data;
|
13 | };
|
14 |
|
15 | return data;
|
16 | }
|
17 |
|
18 | function _chromiumPickleJs() {
|
19 | const data = require("chromium-pickle-js");
|
20 |
|
21 | _chromiumPickleJs = function () {
|
22 | return data;
|
23 | };
|
24 |
|
25 | return data;
|
26 | }
|
27 |
|
28 | function _fsExtraP() {
|
29 | const data = require("fs-extra-p");
|
30 |
|
31 | _fsExtraP = function () {
|
32 | return data;
|
33 | };
|
34 |
|
35 | return data;
|
36 | }
|
37 |
|
38 | var path = _interopRequireWildcard(require("path"));
|
39 |
|
40 | let readFileFromAsar = (() => {
|
41 | var _ref3 = (0, _bluebirdLst().coroutine)(function* (filesystem, filename, info) {
|
42 | const size = info.size;
|
43 | const buffer = Buffer.allocUnsafe(size);
|
44 |
|
45 | if (size <= 0) {
|
46 | return buffer;
|
47 | }
|
48 |
|
49 | if (info.unpacked) {
|
50 | return yield (0, _fsExtraP().readFile)(path.join(`${filesystem.src}.unpacked`, filename));
|
51 | }
|
52 |
|
53 | const fd = yield (0, _fsExtraP().open)(filesystem.src, "r");
|
54 |
|
55 | try {
|
56 | const offset = 8 + filesystem.headerSize + parseInt(info.offset, 10);
|
57 | yield (0, _fsExtraP().read)(fd, buffer, 0, size, offset);
|
58 | } finally {
|
59 | yield (0, _fsExtraP().close)(fd);
|
60 | }
|
61 |
|
62 | return buffer;
|
63 | });
|
64 |
|
65 | return function readFileFromAsar(_x4, _x5, _x6) {
|
66 | return _ref3.apply(this, arguments);
|
67 | };
|
68 | })(); function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } }
|
69 |
|
70 |
|
71 | class Node {}
|
72 |
|
73 |
|
74 |
|
75 | exports.Node = Node;
|
76 |
|
77 | class AsarFilesystem {
|
78 | constructor(src, header = new Node(), headerSize = -1) {
|
79 | this.src = src;
|
80 | this.header = header;
|
81 | this.headerSize = headerSize;
|
82 | this.offset = 0;
|
83 |
|
84 | if (this.header.files == null) {
|
85 | this.header.files = {};
|
86 | }
|
87 | }
|
88 |
|
89 | searchNodeFromDirectory(p, isCreate) {
|
90 | let node = this.header;
|
91 |
|
92 | for (const dir of p.split(path.sep)) {
|
93 | if (dir !== ".") {
|
94 | let child = node.files[dir];
|
95 |
|
96 | if (child == null) {
|
97 | if (!isCreate) {
|
98 | return null;
|
99 | }
|
100 |
|
101 | child = new Node();
|
102 | child.files = {};
|
103 | node.files[dir] = child;
|
104 | }
|
105 |
|
106 | node = child;
|
107 | }
|
108 | }
|
109 |
|
110 | return node;
|
111 | }
|
112 |
|
113 | getOrCreateNode(p) {
|
114 | if (p == null || p.length === 0) {
|
115 | return this.header;
|
116 | }
|
117 |
|
118 | const name = path.basename(p);
|
119 | const dirNode = this.searchNodeFromDirectory(path.dirname(p), true);
|
120 |
|
121 | if (dirNode.files == null) {
|
122 | dirNode.files = {};
|
123 | }
|
124 |
|
125 | let result = dirNode.files[name];
|
126 |
|
127 | if (result == null) {
|
128 | result = new Node();
|
129 | dirNode.files[name] = result;
|
130 | }
|
131 |
|
132 | return result;
|
133 | }
|
134 |
|
135 | addFileNode(file, dirNode, size, unpacked, stat) {
|
136 | if (size > 4294967295) {
|
137 | throw new Error(`${file}: file size cannot be larger than 4.2GB`);
|
138 | }
|
139 |
|
140 | const node = new Node();
|
141 | node.size = size;
|
142 |
|
143 | if (unpacked) {
|
144 | node.unpacked = true;
|
145 | } else {
|
146 |
|
147 | node.offset = this.offset.toString();
|
148 |
|
149 | if (process.platform !== "win32" && stat.mode & 0o100) {
|
150 | node.executable = true;
|
151 | }
|
152 |
|
153 | this.offset += node.size;
|
154 | }
|
155 |
|
156 | let children = dirNode.files;
|
157 |
|
158 | if (children == null) {
|
159 | children = {};
|
160 | dirNode.files = children;
|
161 | }
|
162 |
|
163 | children[path.basename(file)] = node;
|
164 | return node;
|
165 | }
|
166 |
|
167 | getNode(p) {
|
168 | const node = this.searchNodeFromDirectory(path.dirname(p), false);
|
169 | return node.files[path.basename(p)];
|
170 | }
|
171 |
|
172 | getFile(p, followLinks = true) {
|
173 | const info = this.getNode(p);
|
174 |
|
175 | return followLinks && info.link != null ? this.getFile(info.link) : info;
|
176 | }
|
177 |
|
178 | readJson(file) {
|
179 | var _this = this;
|
180 |
|
181 | return (0, _bluebirdLst().coroutine)(function* () {
|
182 | return JSON.parse((yield _this.readFile(file)).toString());
|
183 | })();
|
184 | }
|
185 |
|
186 | readFile(file) {
|
187 | var _this2 = this;
|
188 |
|
189 | return (0, _bluebirdLst().coroutine)(function* () {
|
190 | return yield readFileFromAsar(_this2, file, _this2.getFile(file));
|
191 | })();
|
192 | }
|
193 |
|
194 | }
|
195 |
|
196 | exports.AsarFilesystem = AsarFilesystem;
|
197 |
|
198 | let readAsar = (() => {
|
199 | var _ref = (0, _bluebirdLst().coroutine)(function* (archive) {
|
200 | const fd = yield (0, _fsExtraP().open)(archive, "r");
|
201 | let size;
|
202 | let headerBuf;
|
203 |
|
204 | try {
|
205 | const sizeBuf = Buffer.allocUnsafe(8);
|
206 |
|
207 | if ((yield (0, _fsExtraP().read)(fd, sizeBuf, 0, 8, null)) !== 8) {
|
208 | throw new Error("Unable to read header size");
|
209 | }
|
210 |
|
211 | const sizePickle = (0, _chromiumPickleJs().createFromBuffer)(sizeBuf);
|
212 | size = sizePickle.createIterator().readUInt32();
|
213 | headerBuf = Buffer.allocUnsafe(size);
|
214 |
|
215 | if ((yield (0, _fsExtraP().read)(fd, headerBuf, 0, size, null)) !== size) {
|
216 | throw new Error("Unable to read header");
|
217 | }
|
218 | } finally {
|
219 | yield (0, _fsExtraP().close)(fd);
|
220 | }
|
221 |
|
222 | const headerPickle = (0, _chromiumPickleJs().createFromBuffer)(headerBuf);
|
223 | const header = headerPickle.createIterator().readString();
|
224 | return new AsarFilesystem(archive, JSON.parse(header), size);
|
225 | });
|
226 |
|
227 | return function readAsar(_x) {
|
228 | return _ref.apply(this, arguments);
|
229 | };
|
230 | })();
|
231 |
|
232 | exports.readAsar = readAsar;
|
233 |
|
234 | let readAsarJson = (() => {
|
235 | var _ref2 = (0, _bluebirdLst().coroutine)(function* (archive, file) {
|
236 | const fs = yield readAsar(archive);
|
237 | return yield fs.readJson(file);
|
238 | });
|
239 |
|
240 | return function readAsarJson(_x2, _x3) {
|
241 | return _ref2.apply(this, arguments);
|
242 | };
|
243 | })();
|
244 |
|
245 | exports.readAsarJson = readAsarJson;
|
246 |
|
\ | No newline at end of file |