UNPKG

5.96 kBJavaScriptView Raw
1"use strict";
2
3Object.defineProperty(exports, "__esModule", {
4 value: true
5});
6exports.readAsarJson = exports.readAsar = exports.AsarFilesystem = exports.Node = void 0;
7
8function _bluebirdLst() {
9 const data = require("bluebird-lst");
10
11 _bluebirdLst = function () {
12 return data;
13 };
14
15 return data;
16}
17
18function _chromiumPickleJs() {
19 const data = require("chromium-pickle-js");
20
21 _chromiumPickleJs = function () {
22 return data;
23 };
24
25 return data;
26}
27
28function _fsExtraP() {
29 const data = require("fs-extra-p");
30
31 _fsExtraP = function () {
32 return data;
33 };
34
35 return data;
36}
37
38var path = _interopRequireWildcard(require("path"));
39
40let 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/** @internal */
71class Node {}
72/** @internal */
73
74
75exports.Node = Node;
76
77class 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 // electron expects string
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); // if followLinks is false we don't resolve symlinks
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
196exports.AsarFilesystem = AsarFilesystem;
197
198let 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
232exports.readAsar = readAsar;
233
234let 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
245exports.readAsarJson = readAsarJson;
246//# sourceMappingURL=asar.js.map
\No newline at end of file