@ttmg/cli 0.3.5-beta.1 → 0.3.5
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/CHANGELOG.md +4 -1
- package/dist/index.js +125 -237
- package/dist/index.js.map +1 -1
- package/dist/package.json +2 -2
- package/dist/public/assets/baseForm-CiVp-bI-.js +10 -0
- package/dist/public/assets/baseForm-CiVp-bI-.js.br +0 -0
- package/dist/public/assets/baseForm-DzWBZ1nI.css +1 -0
- package/dist/public/assets/baseForm-DzWBZ1nI.css.br +0 -0
- package/dist/public/assets/index-BFPQPvSA.css +1 -0
- package/dist/public/assets/index-B_Ivowka.js +1 -0
- package/dist/public/assets/index-B_Ivowka.js.br +0 -0
- package/dist/public/assets/index-BedicqfR.css +1 -0
- package/dist/public/assets/{index-EpYlOZ81.js → index-BexDbE8c.js} +1 -1
- package/dist/public/assets/index-BhOuEHVF.js +1 -0
- package/dist/public/assets/index-BhOuEHVF.js.br +0 -0
- package/dist/public/assets/index-Bkv8C1YM.js +1 -0
- package/dist/public/assets/index-Bkv8C1YM.js.br +0 -0
- package/dist/public/assets/index-BtJZs04X.js +1 -0
- package/dist/public/assets/index-C7C5ulLg.css +1 -0
- package/dist/public/assets/index-CRWaaDVs.js +14 -0
- package/dist/public/assets/index-CRWaaDVs.js.br +0 -0
- package/dist/public/assets/index-CoSJHl5r.js +1 -0
- package/dist/public/assets/index-CsuNwmbg.js +1 -0
- package/dist/public/assets/index-CsuNwmbg.js.br +0 -0
- package/dist/public/assets/index-D-FtjFjD.js +1 -0
- package/dist/public/assets/index-DOuHeHYY.js +1 -0
- package/dist/public/assets/index-DhmPFuxl.css +1 -0
- package/dist/public/assets/index-Dxp0kSQH.js +1 -0
- package/dist/public/assets/index-EPgyQeeR.js +1 -0
- package/dist/public/assets/index-SRmdMrn7.js +1 -0
- package/dist/public/assets/index-UihZn1LL.css +1 -0
- package/dist/public/assets/index-UihZn1LL.css.br +0 -0
- package/dist/public/assets/index-X0E7Y6e7.js +1 -0
- package/dist/public/assets/{index-D7wHfGqp.js → index-f98Kwcg1.js} +1 -1
- package/dist/public/assets/index-llUyinRO.js +1 -0
- package/dist/public/assets/isPlainObject-Cb2zGMtI.js +1 -0
- package/dist/public/assets/times-B65MF4Rf.js +1 -0
- package/dist/public/index.html +2 -2
- package/package.json +2 -2
- package/dist/public/assets/index-BRMID64m.js +0 -1
- package/dist/public/assets/index-Ba0pzb2a.js +0 -1
- package/dist/public/assets/index-Ba0pzb2a.js.br +0 -0
- package/dist/public/assets/index-BgPufU68.js +0 -1
- package/dist/public/assets/index-Bup0y3Y0.js +0 -1
- package/dist/public/assets/index-BvQYQ3nw.js +0 -23
- package/dist/public/assets/index-BvQYQ3nw.js.br +0 -0
- package/dist/public/assets/index-CUbWSY4M.js +0 -1
- package/dist/public/assets/index-DH6jmQlu.js +0 -1
- package/dist/public/assets/index-DNiiCmLA.js +0 -1
- package/dist/public/assets/index-DNiiCmLA.js.br +0 -0
- package/dist/public/assets/index-D_5oU4mJ.css +0 -1
- package/dist/public/assets/index-D_5oU4mJ.css.br +0 -0
- package/dist/public/assets/index-HAU2X1j9.js +0 -1
- package/dist/public/assets/index-HAU2X1j9.js.br +0 -0
- package/dist/public/assets/index-xb5uiTXk.js +0 -1
package/CHANGELOG.md
CHANGED
package/dist/index.js
CHANGED
|
@@ -38,7 +38,6 @@ var FormData$1 = require('form-data');
|
|
|
38
38
|
var ttmgPack = require('ttmg-pack');
|
|
39
39
|
var expressStaticGzip = require('express-static-gzip');
|
|
40
40
|
var fileUpload = require('express-fileupload');
|
|
41
|
-
var async_hooks = require('async_hooks');
|
|
42
41
|
var fs$1 = require('node:fs');
|
|
43
42
|
var path$1 = require('node:path');
|
|
44
43
|
var zlib = require('zlib');
|
|
@@ -6533,7 +6532,7 @@ function getAxiosProxyConfig() {
|
|
|
6533
6532
|
}
|
|
6534
6533
|
return {};
|
|
6535
6534
|
}
|
|
6536
|
-
async function request
|
|
6535
|
+
async function request({ url, method, data, headers, params, }) {
|
|
6537
6536
|
const config = getTTMGRC();
|
|
6538
6537
|
const cookie = config?.cookie;
|
|
6539
6538
|
const proxyConfig = getAxiosProxyConfig();
|
|
@@ -6573,20 +6572,7 @@ async function request$1({ url, method, data, headers, params, }) {
|
|
|
6573
6572
|
};
|
|
6574
6573
|
}
|
|
6575
6574
|
}
|
|
6576
|
-
|
|
6577
|
-
const DOWNLOAD_TIMEOUT_MS = 10 * 60 * 1000; // 10 分钟
|
|
6578
|
-
function formatBytes(n) {
|
|
6579
|
-
if (n >= 1024 * 1024)
|
|
6580
|
-
return `${(n / 1024 / 1024).toFixed(2)}MB`;
|
|
6581
|
-
if (n >= 1024)
|
|
6582
|
-
return `${(n / 1024).toFixed(2)}KB`;
|
|
6583
|
-
return `${n}B`;
|
|
6584
|
-
}
|
|
6585
|
-
async function download$1(url, filePath, headers) {
|
|
6586
|
-
const t0 = Date.now();
|
|
6587
|
-
const baseName = filePath.split(/[/\\]/).pop() ?? filePath;
|
|
6588
|
-
const urlShort = url.length > 120 ? url.slice(0, 100) + '...' + url.slice(-20) : url;
|
|
6589
|
-
console.log(`[download] start out=${baseName} url=${urlShort}`);
|
|
6575
|
+
async function download(url, filePath) {
|
|
6590
6576
|
// 清理旧文件
|
|
6591
6577
|
if (fs.existsSync(filePath)) {
|
|
6592
6578
|
try {
|
|
@@ -6598,88 +6584,40 @@ async function download$1(url, filePath, headers) {
|
|
|
6598
6584
|
try {
|
|
6599
6585
|
const res = await axios.get(url, {
|
|
6600
6586
|
responseType: 'stream',
|
|
6587
|
+
// 让非 2xx 进入 catch
|
|
6601
6588
|
validateStatus: s => s >= 200 && s < 300,
|
|
6602
|
-
headers: headers || {},
|
|
6603
|
-
timeout: DOWNLOAD_TIMEOUT_MS,
|
|
6604
6589
|
...proxyConfig,
|
|
6605
6590
|
});
|
|
6606
|
-
|
|
6607
|
-
|
|
6608
|
-
console.log(`[download] response ok out=${baseName} content-length=${expectedSize != null ? formatBytes(expectedSize) : 'unknown'} elapsed=${Date.now() - t0}ms`);
|
|
6609
|
-
// 流写入 + 超时保护,防止 pipe 卡死
|
|
6610
|
-
const pipePromise = new Promise((resolve, reject) => {
|
|
6591
|
+
// 关键:把“流事件”封装为 Promise,并 await 它
|
|
6592
|
+
await new Promise((resolve, reject) => {
|
|
6611
6593
|
const writer = fs.createWriteStream(filePath);
|
|
6612
|
-
let settled = false;
|
|
6613
|
-
let receivedBytes = 0;
|
|
6614
|
-
let lastLogBytes = 0;
|
|
6615
|
-
const LOG_INTERVAL = 1024 * 1024; // 每 1MB 打一次日志
|
|
6616
|
-
const settle = (fn) => {
|
|
6617
|
-
if (settled)
|
|
6618
|
-
return;
|
|
6619
|
-
settled = true;
|
|
6620
|
-
fn();
|
|
6621
|
-
};
|
|
6622
6594
|
const onError = (e) => {
|
|
6623
6595
|
cleanup();
|
|
6624
|
-
|
|
6625
|
-
|
|
6626
|
-
|
|
6627
|
-
|
|
6628
|
-
|
|
6629
|
-
|
|
6630
|
-
catch { }
|
|
6631
|
-
reject(e);
|
|
6632
|
-
});
|
|
6596
|
+
try {
|
|
6597
|
+
if (fs.existsSync(filePath))
|
|
6598
|
+
fs.unlinkSync(filePath);
|
|
6599
|
+
}
|
|
6600
|
+
catch { }
|
|
6601
|
+
reject(e);
|
|
6633
6602
|
};
|
|
6634
6603
|
const onClose = () => {
|
|
6635
6604
|
cleanup();
|
|
6636
|
-
|
|
6637
|
-
const speed = elapsed > 0 ? (receivedBytes / 1024 / elapsed).toFixed(1) : '?';
|
|
6638
|
-
console.log(`[download] pipe done out=${baseName} size=${formatBytes(receivedBytes)} elapsed=${elapsed}ms speed=${speed}KB/s`);
|
|
6639
|
-
settle(resolve);
|
|
6605
|
+
resolve();
|
|
6640
6606
|
};
|
|
6641
6607
|
const cleanup = () => {
|
|
6642
|
-
res.data.off('data', onData);
|
|
6643
6608
|
writer.off('error', onError);
|
|
6644
6609
|
writer.off('close', onClose);
|
|
6645
6610
|
res.data.off('error', onError);
|
|
6646
|
-
if (timeoutId)
|
|
6647
|
-
clearTimeout(timeoutId);
|
|
6648
6611
|
};
|
|
6649
|
-
const onData = (chunk) => {
|
|
6650
|
-
receivedBytes += Buffer.isBuffer(chunk) ? chunk.length : Buffer.byteLength(chunk);
|
|
6651
|
-
if (receivedBytes - lastLogBytes >= LOG_INTERVAL) {
|
|
6652
|
-
lastLogBytes = receivedBytes;
|
|
6653
|
-
const elapsed = Date.now() - t0;
|
|
6654
|
-
const speed = elapsed > 0 ? (receivedBytes / 1024 / elapsed).toFixed(1) : '?';
|
|
6655
|
-
console.log(`[download] progress out=${baseName} received=${formatBytes(receivedBytes)} elapsed=${elapsed}ms speed=${speed}KB/s`);
|
|
6656
|
-
}
|
|
6657
|
-
};
|
|
6658
|
-
const timeoutId = setTimeout(() => {
|
|
6659
|
-
cleanup();
|
|
6660
|
-
console.error(`[download] timeout out=${baseName} received=${formatBytes(receivedBytes)} expected=${expectedSize != null ? formatBytes(expectedSize) : 'unknown'}`);
|
|
6661
|
-
settle(() => {
|
|
6662
|
-
try {
|
|
6663
|
-
if (fs.existsSync(filePath))
|
|
6664
|
-
fs.unlinkSync(filePath);
|
|
6665
|
-
}
|
|
6666
|
-
catch { }
|
|
6667
|
-
res.data?.destroy();
|
|
6668
|
-
reject(new Error(`下载超时(${DOWNLOAD_TIMEOUT_MS / 60000} 分钟),请检查网络后重试`));
|
|
6669
|
-
});
|
|
6670
|
-
}, DOWNLOAD_TIMEOUT_MS);
|
|
6671
|
-
res.data.on('data', onData);
|
|
6672
6612
|
res.data.on('error', onError);
|
|
6673
6613
|
writer.on('error', onError);
|
|
6674
6614
|
writer.on('close', onClose);
|
|
6675
6615
|
res.data.pipe(writer);
|
|
6676
6616
|
});
|
|
6677
|
-
|
|
6617
|
+
// 成功
|
|
6678
6618
|
return { ok: true };
|
|
6679
6619
|
}
|
|
6680
6620
|
catch (err) {
|
|
6681
|
-
const elapsed = Date.now() - t0;
|
|
6682
|
-
console.error(`[download] failed out=${baseName} elapsed=${elapsed}ms err=`, err);
|
|
6683
6621
|
// 403 等受控处理
|
|
6684
6622
|
if (isAxiosError(err) && err.response?.status === 403) {
|
|
6685
6623
|
// 不抛出,让上层自行决定
|
|
@@ -6695,7 +6633,7 @@ function isAxiosError(e) {
|
|
|
6695
6633
|
|
|
6696
6634
|
async function fetchGameInfo(clientKey) {
|
|
6697
6635
|
// 访问 V4 接口
|
|
6698
|
-
const response = await request
|
|
6636
|
+
const response = await request({
|
|
6699
6637
|
url: `https://developers.tiktok.com/tiktok/v4/devportal/mini_game/devtool/info`,
|
|
6700
6638
|
method: 'GET',
|
|
6701
6639
|
params: {
|
|
@@ -6752,7 +6690,7 @@ async function uploadGameToPlatform({ data, name, clientKey, note = '--', appId,
|
|
|
6752
6690
|
formData.append('file', new Blob([data], { type: 'application/zip' }), sanitized);
|
|
6753
6691
|
formData.append('client_key', clientKey);
|
|
6754
6692
|
formData.append('note', note);
|
|
6755
|
-
const response = await request
|
|
6693
|
+
const response = await request({
|
|
6756
6694
|
method: 'POST',
|
|
6757
6695
|
url: 'https://developers.tiktok.com/tiktok/v4/devportal/mini_game/devtool/upload',
|
|
6758
6696
|
data: formData,
|
|
@@ -6904,9 +6842,9 @@ const messages = {
|
|
|
6904
6842
|
'login.error.withCode': 'Login failed: {message}, error_code: {code}',
|
|
6905
6843
|
'login.error.withMessage': 'Login failed: {message}',
|
|
6906
6844
|
'login.error.noUserId': 'Login failed. No user_id in response.',
|
|
6907
|
-
'login.warning.proxyIssue': '
|
|
6845
|
+
'login.warning.proxyIssue': 'Login failed. Please refer to the proxy setup doc:\nhttps://bytedance.larkoffice.com/wiki/PeIawT4M4ia9R8kYyLMcjwHknOg',
|
|
6908
6846
|
'login.error.connectService': 'Failed to connect to login service',
|
|
6909
|
-
'login.error.networkBlocked':
|
|
6847
|
+
'login.error.networkBlocked': 'Network connection failed. Please refer to the proxy setup doc:\nhttps://bytedance.larkoffice.com/wiki/PeIawT4M4ia9R8kYyLMcjwHknOg',
|
|
6910
6848
|
'logout.spinner.loggingOut': 'Logging out...',
|
|
6911
6849
|
'logout.success': 'Logged out successfully!',
|
|
6912
6850
|
'logout.fail': 'Logout failed: {error}',
|
|
@@ -7035,9 +6973,9 @@ const messages = {
|
|
|
7035
6973
|
'login.error.withCode': '登录失败:{message},错误码:{code}',
|
|
7036
6974
|
'login.error.withMessage': '登录失败:{message}',
|
|
7037
6975
|
'login.error.noUserId': '登录失败,响应中未返回 user_id。',
|
|
7038
|
-
'login.warning.proxyIssue': '
|
|
6976
|
+
'login.warning.proxyIssue': '登录失败,请参考代理设置文档:\nhttps://bytedance.larkoffice.com/wiki/PeIawT4M4ia9R8kYyLMcjwHknOg',
|
|
7039
6977
|
'login.error.connectService': '连接登录服务失败',
|
|
7040
|
-
'login.error.networkBlocked': '
|
|
6978
|
+
'login.error.networkBlocked': '网络连接失败,请参考代理设置文档:\nhttps://bytedance.larkoffice.com/wiki/PeIawT4M4ia9R8kYyLMcjwHknOg',
|
|
7041
6979
|
'logout.spinner.loggingOut': '正在退出登录...',
|
|
7042
6980
|
'logout.success': '退出登录成功!',
|
|
7043
6981
|
'logout.fail': '退出登录失败:{error}',
|
|
@@ -8404,13 +8342,15 @@ function getLocalIPs() {
|
|
|
8404
8342
|
}
|
|
8405
8343
|
// 去重(同名+同地址)
|
|
8406
8344
|
const unique = dedupe(results);
|
|
8407
|
-
//
|
|
8345
|
+
// 稳定排序:优先无线,再有线,再其他。
|
|
8346
|
+
// 说明:扫码调试场景下,手机通常在 Wi-Fi,优先选择无线网卡的 IP 更不容易踩到
|
|
8347
|
+
// “有线网段不可达/企业网络隔离”的坑。
|
|
8408
8348
|
unique.sort((a, b) => {
|
|
8409
8349
|
const rank = (n) => {
|
|
8410
8350
|
const lower = n.toLowerCase();
|
|
8411
|
-
if (WIRED_KEYWORDS.some(k => lower.includes(k)))
|
|
8412
|
-
return 0;
|
|
8413
8351
|
if (WIRELESS_KEYWORDS.some(k => lower.includes(k)))
|
|
8352
|
+
return 0;
|
|
8353
|
+
if (WIRED_KEYWORDS.some(k => lower.includes(k)))
|
|
8414
8354
|
return 1;
|
|
8415
8355
|
return 2;
|
|
8416
8356
|
};
|
|
@@ -8451,6 +8391,11 @@ function getLocalIPs() {
|
|
|
8451
8391
|
}
|
|
8452
8392
|
|
|
8453
8393
|
function getLocalIP() {
|
|
8394
|
+
// 优先使用 getLocalIPs 的过滤 + 排序结果(更适合扫码调试场景)
|
|
8395
|
+
const preferred = getLocalIPs()[0];
|
|
8396
|
+
if (preferred) {
|
|
8397
|
+
return preferred;
|
|
8398
|
+
}
|
|
8454
8399
|
const networkInterfaces = os.networkInterfaces();
|
|
8455
8400
|
for (const interfaceName in networkInterfaces) {
|
|
8456
8401
|
const interfaceInfo = networkInterfaces[interfaceName];
|
|
@@ -8462,6 +8407,8 @@ function getLocalIP() {
|
|
|
8462
8407
|
}
|
|
8463
8408
|
}
|
|
8464
8409
|
}
|
|
8410
|
+
// 极端场景:无可用 IPv4(例如仅有回环/无网络)。避免返回 undefined 破坏 schema。
|
|
8411
|
+
return '127.0.0.1';
|
|
8465
8412
|
}
|
|
8466
8413
|
|
|
8467
8414
|
async function init() {
|
|
@@ -8742,34 +8689,8 @@ async function listen(app, options) {
|
|
|
8742
8689
|
return { server, port, url, version };
|
|
8743
8690
|
}
|
|
8744
8691
|
|
|
8745
|
-
const asyncLocalStorage = new async_hooks.AsyncLocalStorage();
|
|
8746
|
-
/** 在请求作用域内运行,供 middleware 调用 */
|
|
8747
|
-
function runWithRequest(req, fn) {
|
|
8748
|
-
return asyncLocalStorage.run({ req }, fn);
|
|
8749
|
-
}
|
|
8750
|
-
/** Express 中间件:将 req 注入 AsyncLocalStorage,供 api.request/download 内部读取 ppeHeaders */
|
|
8751
|
-
function requestContextMiddleware(req, res, next) {
|
|
8752
|
-
runWithRequest(req, () => next());
|
|
8753
|
-
}
|
|
8754
|
-
/** 从当前请求中提取 x-use-ppe、x-tt-env,仅当浏览器有传时才返回 */
|
|
8755
|
-
function getPpeHeaders() {
|
|
8756
|
-
const store = asyncLocalStorage.getStore();
|
|
8757
|
-
if (!store?.req?.headers)
|
|
8758
|
-
return {};
|
|
8759
|
-
const h = store.req.headers;
|
|
8760
|
-
const result = {};
|
|
8761
|
-
const v1 = h['x-use-ppe'];
|
|
8762
|
-
const v2 = h['x-tt-env'];
|
|
8763
|
-
if (typeof v1 === 'string')
|
|
8764
|
-
result['x-use-ppe'] = v1;
|
|
8765
|
-
if (typeof v2 === 'string')
|
|
8766
|
-
result['x-tt-env'] = v2;
|
|
8767
|
-
return result;
|
|
8768
|
-
}
|
|
8769
|
-
|
|
8770
8692
|
function setupMiddlewares(app, options) {
|
|
8771
8693
|
const { publicPath, outputDir } = options;
|
|
8772
|
-
app.use(requestContextMiddleware);
|
|
8773
8694
|
app.use(fileUpload());
|
|
8774
8695
|
app.use(expressStaticGzip(publicPath, {
|
|
8775
8696
|
enableBrotli: true,
|
|
@@ -8971,8 +8892,6 @@ const UNITY_WASM_SPLIT_CONFIG_FIELD_SCHEME = {
|
|
|
8971
8892
|
IOS_CODE_FILE_MD5: `$IOS_CODE_FILE_MD5`,
|
|
8972
8893
|
ANDROID_CODE_FILE_MD5: `$ANDROID_CODE_FILE_MD5`,
|
|
8973
8894
|
ANDROID_SUB_CODE_FILE_MD5: `$SUB_CODE_FILE_MD5`,
|
|
8974
|
-
ARCHIVE_CODE_FILE_MD5: `$ARCHIVE_CODE_FILE_MD5`,
|
|
8975
|
-
enableArchiveMode: `"$ENABLEARCHIVEMODE"`,
|
|
8976
8895
|
WASMSPLITVERSION: `"$WASMSPLITVERSION"`,
|
|
8977
8896
|
ENABLEWASMSPLIT: `"$ENABLEWASMSPLIT"`,
|
|
8978
8897
|
IOS_SUB_JS_FILE_CONFIG: `"$IOS_SUB_JS_FILE_CONFIG"`,
|
|
@@ -8992,11 +8911,9 @@ const WASM_SPLIT_SUBPACKAGE_CONFIG = {
|
|
|
8992
8911
|
name: 'wasmcode1-android',
|
|
8993
8912
|
root: 'wasmcode1-android/',
|
|
8994
8913
|
},
|
|
8995
|
-
|
|
8996
|
-
|
|
8997
|
-
root: 'wasmcode-archive/',
|
|
8914
|
+
ios: {
|
|
8915
|
+
root: 'wasmcode-ios/',
|
|
8998
8916
|
},
|
|
8999
|
-
/** iOS 与 archive 互斥:有 archive 时 iOS URL 为空,反之亦然 */
|
|
9000
8917
|
iosMain: {
|
|
9001
8918
|
name: 'wasmcode-ios',
|
|
9002
8919
|
root: 'wasmcode-ios/',
|
|
@@ -9007,7 +8924,6 @@ const WASM_SPLIT_SUBPACKAGE_CONFIG = {
|
|
|
9007
8924
|
},
|
|
9008
8925
|
};
|
|
9009
8926
|
const WASM_FILENAME_SUFFIX = '.webgl.wasm.code.unityweb.wasm';
|
|
9010
|
-
const WASM_ARCHIVE_FILENAME_SUFFIX = '.webgl.wasm.code.unityweb.bin';
|
|
9011
8927
|
const BR_SUFFIX = '.br';
|
|
9012
8928
|
// 输出 JSON 格式
|
|
9013
8929
|
const JSON_INDENT = 2;
|
|
@@ -9017,21 +8933,6 @@ const CONCURRENCY_LIMIT = 2;
|
|
|
9017
8933
|
const DOWNLOAD_RETRY = 3;
|
|
9018
8934
|
const WASM_SPLIT_CONFIG_FILE_NAME = 'webgl-wasm-split.js';
|
|
9019
8935
|
|
|
9020
|
-
/**
|
|
9021
|
-
* Unity 模块统一的 HTTP 请求封装
|
|
9022
|
-
* DEV_HEADERS 与 ppeHeaders(从当前请求 AsyncLocalStorage 读取)的合并逻辑集中在此处
|
|
9023
|
-
*/
|
|
9024
|
-
const request = (opts) => {
|
|
9025
|
-
const ppeHeaders = getPpeHeaders();
|
|
9026
|
-
const headers = { ...DEV_HEADERS, ...ppeHeaders, ...opts.headers };
|
|
9027
|
-
return request$1({ ...opts, headers });
|
|
9028
|
-
};
|
|
9029
|
-
const download = (url, filePath) => {
|
|
9030
|
-
const ppeHeaders = getPpeHeaders();
|
|
9031
|
-
const headers = ppeHeaders && Object.keys(ppeHeaders).length > 0 ? ppeHeaders : undefined;
|
|
9032
|
-
return download$1(url, filePath, headers);
|
|
9033
|
-
};
|
|
9034
|
-
|
|
9035
8936
|
// prepare.ts
|
|
9036
8937
|
// 若你的 request 是 axios:你可以添加 maxBodyLength/ maxContentLength 等参数
|
|
9037
8938
|
// 若是 got:可直接传 form 实例
|
|
@@ -9082,9 +8983,16 @@ async function startPrepare(params) {
|
|
|
9082
8983
|
return request({
|
|
9083
8984
|
url: `${BASE_URL}/api/stark_wasm/v4/post/prepare`,
|
|
9084
8985
|
method: 'POST',
|
|
9085
|
-
headers:
|
|
9086
|
-
|
|
8986
|
+
headers: {
|
|
8987
|
+
...DEV_HEADERS,
|
|
8988
|
+
...formHeaders, // 包含正确的 multipart/form-data; boundary=...
|
|
8989
|
+
},
|
|
8990
|
+
params: {
|
|
8991
|
+
client_key: params.client_key,
|
|
8992
|
+
with_ios: true,
|
|
8993
|
+
},
|
|
9087
8994
|
data: form,
|
|
8995
|
+
// 若 request 基于 axios,建议加上以下两项以支持大文件:
|
|
9088
8996
|
});
|
|
9089
8997
|
}
|
|
9090
8998
|
|
|
@@ -9170,6 +9078,7 @@ async function downloadPrepared(data) {
|
|
|
9170
9078
|
const res = await request({
|
|
9171
9079
|
url: `${BASE_URL}/api/stark_wasm/v4/post/download_prepared`,
|
|
9172
9080
|
method: 'POST',
|
|
9081
|
+
headers: DEV_HEADERS,
|
|
9173
9082
|
data,
|
|
9174
9083
|
});
|
|
9175
9084
|
wsServer.sendUnitySplitStatus({
|
|
@@ -9191,6 +9100,9 @@ async function downloadPrepared(data) {
|
|
|
9191
9100
|
url: downloadUrl,
|
|
9192
9101
|
});
|
|
9193
9102
|
await download(downloadUrl, tempWasmPath);
|
|
9103
|
+
/**
|
|
9104
|
+
* 下载完成后需要进行 br 并替换 codePath 对应的文件后再返回成功
|
|
9105
|
+
*/
|
|
9194
9106
|
fs$1.copyFileSync(tempWasmPath, willReplaceWasmPath);
|
|
9195
9107
|
wsServer.sendUnitySplitStatus({
|
|
9196
9108
|
status: 'download_prepared_wasm_done',
|
|
@@ -9267,7 +9179,11 @@ async function getCollectedFuncIds({ client_key, wasm_md5, }) {
|
|
|
9267
9179
|
return request({
|
|
9268
9180
|
url: `${BASE_URL}/api/stark_wasm/v4/get/collectedfuncids`,
|
|
9269
9181
|
method: 'GET',
|
|
9270
|
-
|
|
9182
|
+
headers: DEV_HEADERS,
|
|
9183
|
+
params: {
|
|
9184
|
+
client_key,
|
|
9185
|
+
wasm_md5,
|
|
9186
|
+
},
|
|
9271
9187
|
});
|
|
9272
9188
|
}
|
|
9273
9189
|
|
|
@@ -9275,7 +9191,11 @@ async function setCollect({ client_key, wasm_md5, }) {
|
|
|
9275
9191
|
return request({
|
|
9276
9192
|
url: `${BASE_URL}/api/stark_wasm/v4/post/set_collecting`,
|
|
9277
9193
|
method: 'POST',
|
|
9278
|
-
data: {
|
|
9194
|
+
data: {
|
|
9195
|
+
client_key,
|
|
9196
|
+
wasm_md5,
|
|
9197
|
+
},
|
|
9198
|
+
headers: DEV_HEADERS,
|
|
9279
9199
|
});
|
|
9280
9200
|
}
|
|
9281
9201
|
|
|
@@ -9283,15 +9203,26 @@ async function getCollecttingInfo({ client_key, wasm_md5, }) {
|
|
|
9283
9203
|
return request({
|
|
9284
9204
|
url: `${BASE_URL}/api/stark_wasm/v4/get/funccollect`,
|
|
9285
9205
|
method: 'GET',
|
|
9286
|
-
|
|
9206
|
+
headers: DEV_HEADERS,
|
|
9207
|
+
params: {
|
|
9208
|
+
client_key,
|
|
9209
|
+
wasm_md5,
|
|
9210
|
+
},
|
|
9287
9211
|
});
|
|
9288
9212
|
}
|
|
9289
9213
|
|
|
9214
|
+
// /api/stark_wasm/v4/post/split
|
|
9290
9215
|
async function startSplit({ client_key, wasm_md5, }) {
|
|
9291
9216
|
return request({
|
|
9292
9217
|
url: `${BASE_URL}/api/stark_wasm/v4/post/split`,
|
|
9293
9218
|
method: 'POST',
|
|
9294
|
-
|
|
9219
|
+
headers: {
|
|
9220
|
+
...DEV_HEADERS,
|
|
9221
|
+
},
|
|
9222
|
+
data: {
|
|
9223
|
+
client_key,
|
|
9224
|
+
wasm_md5,
|
|
9225
|
+
},
|
|
9295
9226
|
});
|
|
9296
9227
|
}
|
|
9297
9228
|
|
|
@@ -9461,8 +9392,7 @@ function pLimit(concurrency) {
|
|
|
9461
9392
|
return generator;
|
|
9462
9393
|
}
|
|
9463
9394
|
|
|
9464
|
-
|
|
9465
|
-
function updateSubpackageConfigSync(options) {
|
|
9395
|
+
function updateSubpackageConfigSync() {
|
|
9466
9396
|
const gameJsonPath = path__namespace.join(process.cwd(), SUBPACKAGE_CONFIG_FILE_NAME);
|
|
9467
9397
|
const raw = fs__namespace.readFileSync(gameJsonPath, 'utf-8');
|
|
9468
9398
|
const gameJson = JSON.parse(raw);
|
|
@@ -9475,17 +9405,11 @@ function updateSubpackageConfigSync(options) {
|
|
|
9475
9405
|
const filtered = subpackages.filter(s => s.name !== WASM_SPLIT_SUBPACKAGE_CONFIG.origin.name);
|
|
9476
9406
|
/**
|
|
9477
9407
|
* 基于 SUBPACKAGE_CONFIG_FILE_NAME 更新 subpackages
|
|
9478
|
-
* iOS 与 archive 互斥:有 archive 加 archive,否则有 iOS 加 iosMain+iosSub
|
|
9479
9408
|
*/
|
|
9480
9409
|
filtered.push(WASM_SPLIT_SUBPACKAGE_CONFIG.androidMain);
|
|
9481
9410
|
filtered.push(WASM_SPLIT_SUBPACKAGE_CONFIG.androidSub);
|
|
9482
|
-
|
|
9483
|
-
|
|
9484
|
-
}
|
|
9485
|
-
else if (options?.hasIos) {
|
|
9486
|
-
filtered.push(WASM_SPLIT_SUBPACKAGE_CONFIG.iosMain);
|
|
9487
|
-
filtered.push(WASM_SPLIT_SUBPACKAGE_CONFIG.iosSub);
|
|
9488
|
-
}
|
|
9411
|
+
filtered.push(WASM_SPLIT_SUBPACKAGE_CONFIG.iosMain);
|
|
9412
|
+
filtered.push(WASM_SPLIT_SUBPACKAGE_CONFIG.iosSub);
|
|
9489
9413
|
// 合并去重:存在则更新 root,不存在则新增
|
|
9490
9414
|
const map = new Map(filtered.map(s => [s.name, s]));
|
|
9491
9415
|
gameJson[fieldName] = Array.from(map.values());
|
|
@@ -9537,28 +9461,12 @@ async function downloadSplited(context) {
|
|
|
9537
9461
|
ensureDirSync(splitTempDir);
|
|
9538
9462
|
const mainAndroidDir = path.join(splitTempDir, WASM_SPLIT_SUBPACKAGE_CONFIG.androidMain.root);
|
|
9539
9463
|
const subAndroidDir = path.join(splitTempDir, WASM_SPLIT_SUBPACKAGE_CONFIG.androidSub.root);
|
|
9540
|
-
|
|
9541
|
-
const
|
|
9542
|
-
|
|
9543
|
-
const archiveDir = hasArchive
|
|
9544
|
-
? path.join(splitTempDir, WASM_SPLIT_SUBPACKAGE_CONFIG.archive.root)
|
|
9545
|
-
: null;
|
|
9546
|
-
const mainIosDir = hasIos
|
|
9547
|
-
? path.join(splitTempDir, WASM_SPLIT_SUBPACKAGE_CONFIG.iosMain.root)
|
|
9548
|
-
: null;
|
|
9549
|
-
const subIosDir = hasIos
|
|
9550
|
-
? path.join(splitTempDir, WASM_SPLIT_SUBPACKAGE_CONFIG.iosSub.root)
|
|
9551
|
-
: null;
|
|
9552
|
-
const dirsToEnsure = [
|
|
9553
|
-
mainAndroidDir,
|
|
9554
|
-
subAndroidDir,
|
|
9555
|
-
...(archiveDir ? [archiveDir] : []),
|
|
9556
|
-
...(mainIosDir ? [mainIosDir] : []),
|
|
9557
|
-
...(subIosDir ? [subIosDir] : []),
|
|
9558
|
-
];
|
|
9559
|
-
dirsToEnsure.forEach(ensureDirSync);
|
|
9464
|
+
const mainIosDir = path.join(splitTempDir, WASM_SPLIT_SUBPACKAGE_CONFIG.iosMain.root);
|
|
9465
|
+
const subIosDir = path.join(splitTempDir, WASM_SPLIT_SUBPACKAGE_CONFIG.iosSub.root);
|
|
9466
|
+
[mainAndroidDir, subAndroidDir, mainIosDir, subIosDir].forEach(ensureDirSync);
|
|
9560
9467
|
const mainAndroidWasmCodeTempPath = path.join(mainAndroidDir, `${context.main_wasm_md5}${WASM_FILENAME_SUFFIX}`);
|
|
9561
9468
|
const subAndroidWasmCodeTempPath = path.join(subAndroidDir, `${context.sub_wasm_md5}${WASM_FILENAME_SUFFIX}`);
|
|
9469
|
+
const mainIosWasmCodeTempPath = path.join(mainIosDir, `${context.main_wasm_h5_md5}${WASM_FILENAME_SUFFIX}`);
|
|
9562
9470
|
const limit = pLimit(CONCURRENCY_LIMIT);
|
|
9563
9471
|
try {
|
|
9564
9472
|
console.log('downloadWasmSplit', context);
|
|
@@ -9569,6 +9477,7 @@ async function downloadSplited(context) {
|
|
|
9569
9477
|
wsServer.sendUnitySplitStatus({
|
|
9570
9478
|
status: 'start_download_android_sub_wasm_code',
|
|
9571
9479
|
});
|
|
9480
|
+
wsServer.sendUnitySplitStatus({ status: 'start_download_ios_main_wasm' });
|
|
9572
9481
|
/**
|
|
9573
9482
|
* 需要做个保护,只有 有 URL 时才下载
|
|
9574
9483
|
*/
|
|
@@ -9590,41 +9499,28 @@ async function downloadSplited(context) {
|
|
|
9590
9499
|
url: context.sub_wasm_download_url,
|
|
9591
9500
|
out: subAndroidWasmCodeTempPath,
|
|
9592
9501
|
})),
|
|
9593
|
-
|
|
9594
|
-
|
|
9595
|
-
|
|
9596
|
-
|
|
9597
|
-
|
|
9598
|
-
|
|
9599
|
-
|
|
9600
|
-
|
|
9601
|
-
|
|
9602
|
-
|
|
9603
|
-
|
|
9604
|
-
|
|
9605
|
-
|
|
9606
|
-
|
|
9607
|
-
|
|
9608
|
-
|
|
9609
|
-
|
|
9610
|
-
|
|
9611
|
-
|
|
9612
|
-
|
|
9613
|
-
|
|
9614
|
-
|
|
9615
|
-
startDownloadStatus: 'start_download_ios_range_json',
|
|
9616
|
-
downloadDoneStatus: 'download_ios_range_json_done',
|
|
9617
|
-
url: context.sub_js_range_download_url,
|
|
9618
|
-
out: path.join(subIosDir, 'func_bytes_range.json'),
|
|
9619
|
-
})),
|
|
9620
|
-
limit(() => downloadAndCompress({
|
|
9621
|
-
startDownloadStatus: 'start_download_ios_js_data_br',
|
|
9622
|
-
downloadDoneStatus: 'download_ios_js_data_br_done',
|
|
9623
|
-
url: context.sub_js_data_download_url,
|
|
9624
|
-
out: path.join(subIosDir, 'subjs.data'),
|
|
9625
|
-
})),
|
|
9626
|
-
]
|
|
9627
|
-
: []),
|
|
9502
|
+
limit(() => downloadAndCompress({
|
|
9503
|
+
startDownloadStatus: 'start_download_ios_main_wasm',
|
|
9504
|
+
downloadDoneStatus: 'download_ios_main_wasm_done',
|
|
9505
|
+
startCompressStatus: 'start_compress_ios_main_wasm',
|
|
9506
|
+
compressDoneStatus: 'compress_ios_main_wasm_done',
|
|
9507
|
+
url: context.main_wasm_h5_download_url,
|
|
9508
|
+
out: mainIosWasmCodeTempPath,
|
|
9509
|
+
})),
|
|
9510
|
+
// 下载 ios sub js range json
|
|
9511
|
+
limit(() => downloadAndCompress({
|
|
9512
|
+
startDownloadStatus: 'start_download_ios_range_json',
|
|
9513
|
+
downloadDoneStatus: 'download_ios_range_json_done',
|
|
9514
|
+
url: context.sub_js_range_download_url,
|
|
9515
|
+
out: path.join(subIosDir, 'func_bytes_range.json'),
|
|
9516
|
+
})),
|
|
9517
|
+
// 下载 ios sub js data br
|
|
9518
|
+
limit(() => downloadAndCompress({
|
|
9519
|
+
startDownloadStatus: 'start_download_ios_js_data_br',
|
|
9520
|
+
downloadDoneStatus: 'download_ios_js_data_br_done',
|
|
9521
|
+
url: context.sub_js_data_download_url,
|
|
9522
|
+
out: path.join(subIosDir, 'subjs.data'),
|
|
9523
|
+
})),
|
|
9628
9524
|
]);
|
|
9629
9525
|
// 复制 split/* 到项目根目录(递归、覆盖)——避免 EISDIR
|
|
9630
9526
|
console.log('copy splitTempDir to root start');
|
|
@@ -9642,35 +9538,25 @@ async function downloadSplited(context) {
|
|
|
9642
9538
|
console.log('copy splitTempDir to root end');
|
|
9643
9539
|
// 更新分包配置(幂等)
|
|
9644
9540
|
console.log('updateSubpackageConfigSync start');
|
|
9645
|
-
updateSubpackageConfigSync(
|
|
9646
|
-
hasArchive,
|
|
9647
|
-
hasIos,
|
|
9648
|
-
});
|
|
9541
|
+
updateSubpackageConfigSync();
|
|
9649
9542
|
console.log('updateSubpackageConfigSync end');
|
|
9650
9543
|
// 更新 wasm split 配置(保持原始状态文案)
|
|
9651
9544
|
console.log('updateWasmSplitConfig start');
|
|
9652
9545
|
wsServer.sendUnitySplitStatus({ status: 'start_update_wasm_split_config' });
|
|
9653
|
-
|
|
9546
|
+
updateWasmSplitConfig({
|
|
9654
9547
|
ENABLEWASMCOLLECT: true,
|
|
9655
9548
|
ORIGINALWASMMD5: `${context.original_wasm_md5}`,
|
|
9656
9549
|
WASMTABLESIZE: context.table_size,
|
|
9657
9550
|
GLOBALVARLIST: JSON.stringify(context.global_var_list ?? []),
|
|
9551
|
+
SUBJSURL: `${context.sub_js_download_url}`,
|
|
9552
|
+
IOS_CODE_FILE_MD5: `${context.main_wasm_h5_md5}`,
|
|
9658
9553
|
ANDROID_CODE_FILE_MD5: `${context.main_wasm_md5}`,
|
|
9659
9554
|
ANDROID_SUB_CODE_FILE_MD5: `${context.sub_wasm_md5}`,
|
|
9660
9555
|
WASMSPLITVERSION: `${context.version}`,
|
|
9556
|
+
USINGWASMH5: Boolean(context.main_wasm_h5_md5),
|
|
9661
9557
|
ENABLEWASMSPLIT: true,
|
|
9662
|
-
|
|
9663
|
-
|
|
9664
|
-
if (hasIos) {
|
|
9665
|
-
wasmSplitConfigFields.IOS_CODE_FILE_MD5 = `${context.main_wasm_h5_md5}`;
|
|
9666
|
-
wasmSplitConfigFields.USINGWASMH5 = true;
|
|
9667
|
-
wasmSplitConfigFields.SUBJSURL = `${context.sub_js_download_url ?? ''}`;
|
|
9668
|
-
}
|
|
9669
|
-
if (hasArchive && context.wasm_archive_md5) {
|
|
9670
|
-
wasmSplitConfigFields.ARCHIVE_CODE_FILE_MD5 = `${context.wasm_archive_md5}`;
|
|
9671
|
-
wasmSplitConfigFields.enableArchiveMode = true;
|
|
9672
|
-
}
|
|
9673
|
-
updateWasmSplitConfig(wasmSplitConfigFields);
|
|
9558
|
+
// IOS_SUB_JS_FILE_CONFIG: JSON.stringify(context.merged_js ?? {}),
|
|
9559
|
+
});
|
|
9674
9560
|
wsServer.sendUnitySplitStatus({ status: 'update_wasm_split_config_done' });
|
|
9675
9561
|
console.log('updateWasmSplitConfig end');
|
|
9676
9562
|
return {
|
|
@@ -9713,6 +9599,7 @@ async function getSplitResult({ client_key, wasm_md5, wasm_path, }) {
|
|
|
9713
9599
|
return request({
|
|
9714
9600
|
url: `${BASE_URL}/api/stark_wasm/v4/post/download`,
|
|
9715
9601
|
method: 'POST',
|
|
9602
|
+
headers: { ...DEV_HEADERS },
|
|
9716
9603
|
data: { client_key, wasm_md5, wasm_path },
|
|
9717
9604
|
});
|
|
9718
9605
|
}
|
|
@@ -9758,7 +9645,13 @@ async function resetWasmSplit(data) {
|
|
|
9758
9645
|
const res = await request({
|
|
9759
9646
|
url: `${BASE_URL}/api/stark_wasm/v4/post/reset`,
|
|
9760
9647
|
method: 'POST',
|
|
9761
|
-
|
|
9648
|
+
headers: {
|
|
9649
|
+
...DEV_HEADERS,
|
|
9650
|
+
},
|
|
9651
|
+
data: {
|
|
9652
|
+
client_key: data.clientkey,
|
|
9653
|
+
wasm_md5: data.wasmMd5,
|
|
9654
|
+
},
|
|
9762
9655
|
});
|
|
9763
9656
|
/**
|
|
9764
9657
|
* 把— __TTMG_TEMP__/wasmcode/ 目录下的所有文件恢复到原本的位置,进行重置
|
|
@@ -9810,17 +9703,9 @@ async function resetWasmSplit(data) {
|
|
|
9810
9703
|
if (fs.existsSync(androidSubpackageSubDir)) {
|
|
9811
9704
|
fs.rmSync(androidSubpackageSubDir, { recursive: true });
|
|
9812
9705
|
}
|
|
9813
|
-
const
|
|
9814
|
-
if (fs.existsSync(
|
|
9815
|
-
fs.rmSync(
|
|
9816
|
-
}
|
|
9817
|
-
const iosMainDir = path.join(process.cwd(), WASM_SPLIT_SUBPACKAGE_CONFIG.iosMain.root);
|
|
9818
|
-
if (fs.existsSync(iosMainDir)) {
|
|
9819
|
-
fs.rmSync(iosMainDir, { recursive: true });
|
|
9820
|
-
}
|
|
9821
|
-
const iosSubDir = path.join(process.cwd(), WASM_SPLIT_SUBPACKAGE_CONFIG.iosSub.root);
|
|
9822
|
-
if (fs.existsSync(iosSubDir)) {
|
|
9823
|
-
fs.rmSync(iosSubDir, { recursive: true });
|
|
9706
|
+
const iosSubpackageDir = path.join(process.cwd(), WASM_SPLIT_SUBPACKAGE_CONFIG.ios.root);
|
|
9707
|
+
if (fs.existsSync(iosSubpackageDir)) {
|
|
9708
|
+
fs.rmSync(iosSubpackageDir, { recursive: true });
|
|
9824
9709
|
}
|
|
9825
9710
|
return res;
|
|
9826
9711
|
}
|
|
@@ -9861,6 +9746,7 @@ const getTaskStatus = (params) => {
|
|
|
9861
9746
|
return request({
|
|
9862
9747
|
url: `${BASE_URL}/api/stark_wasm/v4/get/status`,
|
|
9863
9748
|
method: 'GET',
|
|
9749
|
+
headers: DEV_HEADERS,
|
|
9864
9750
|
params,
|
|
9865
9751
|
});
|
|
9866
9752
|
};
|
|
@@ -9869,6 +9755,7 @@ const getTaskInfo = async (params) => {
|
|
|
9869
9755
|
return request({
|
|
9870
9756
|
url: `${BASE_URL}/api/stark_wasm/v4/get/taskinfo`,
|
|
9871
9757
|
method: 'GET',
|
|
9758
|
+
headers: DEV_HEADERS,
|
|
9872
9759
|
params,
|
|
9873
9760
|
});
|
|
9874
9761
|
};
|
|
@@ -10085,12 +9972,13 @@ const gameWasmSplitDownloadResultRoute = {
|
|
|
10085
9972
|
}
|
|
10086
9973
|
else {
|
|
10087
9974
|
const splitResult = (response.data?.result || {});
|
|
10088
|
-
// iOS 与 archive 互斥:有 archive 时校验 archive 字段,否则校验 iOS 字段
|
|
10089
|
-
const hasArchive = typeof splitResult.archive_wasm_download_url === 'string' && String(splitResult.archive_wasm_download_url).trim() !== '';
|
|
10090
9975
|
const requiredDownloadFields = [
|
|
10091
9976
|
'main_wasm_download_url',
|
|
10092
|
-
'
|
|
10093
|
-
|
|
9977
|
+
'main_wasm_h5_download_url',
|
|
9978
|
+
// 'sub_wasm_download_url',
|
|
9979
|
+
// 'sub_js_download_url',
|
|
9980
|
+
// 'sub_js_data_download_url',
|
|
9981
|
+
// 'sub_js_range_download_url',
|
|
10094
9982
|
];
|
|
10095
9983
|
const missingFields = requiredDownloadFields.filter(field => {
|
|
10096
9984
|
const value = splitResult[field];
|
|
@@ -10764,7 +10652,7 @@ async function upload({ clientKey, note = '--', dir, }) {
|
|
|
10764
10652
|
}
|
|
10765
10653
|
}
|
|
10766
10654
|
|
|
10767
|
-
var version = "0.3.5
|
|
10655
|
+
var version = "0.3.5";
|
|
10768
10656
|
var pkg = {
|
|
10769
10657
|
version: version};
|
|
10770
10658
|
|