@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.
Files changed (55) hide show
  1. package/CHANGELOG.md +4 -1
  2. package/dist/index.js +125 -237
  3. package/dist/index.js.map +1 -1
  4. package/dist/package.json +2 -2
  5. package/dist/public/assets/baseForm-CiVp-bI-.js +10 -0
  6. package/dist/public/assets/baseForm-CiVp-bI-.js.br +0 -0
  7. package/dist/public/assets/baseForm-DzWBZ1nI.css +1 -0
  8. package/dist/public/assets/baseForm-DzWBZ1nI.css.br +0 -0
  9. package/dist/public/assets/index-BFPQPvSA.css +1 -0
  10. package/dist/public/assets/index-B_Ivowka.js +1 -0
  11. package/dist/public/assets/index-B_Ivowka.js.br +0 -0
  12. package/dist/public/assets/index-BedicqfR.css +1 -0
  13. package/dist/public/assets/{index-EpYlOZ81.js → index-BexDbE8c.js} +1 -1
  14. package/dist/public/assets/index-BhOuEHVF.js +1 -0
  15. package/dist/public/assets/index-BhOuEHVF.js.br +0 -0
  16. package/dist/public/assets/index-Bkv8C1YM.js +1 -0
  17. package/dist/public/assets/index-Bkv8C1YM.js.br +0 -0
  18. package/dist/public/assets/index-BtJZs04X.js +1 -0
  19. package/dist/public/assets/index-C7C5ulLg.css +1 -0
  20. package/dist/public/assets/index-CRWaaDVs.js +14 -0
  21. package/dist/public/assets/index-CRWaaDVs.js.br +0 -0
  22. package/dist/public/assets/index-CoSJHl5r.js +1 -0
  23. package/dist/public/assets/index-CsuNwmbg.js +1 -0
  24. package/dist/public/assets/index-CsuNwmbg.js.br +0 -0
  25. package/dist/public/assets/index-D-FtjFjD.js +1 -0
  26. package/dist/public/assets/index-DOuHeHYY.js +1 -0
  27. package/dist/public/assets/index-DhmPFuxl.css +1 -0
  28. package/dist/public/assets/index-Dxp0kSQH.js +1 -0
  29. package/dist/public/assets/index-EPgyQeeR.js +1 -0
  30. package/dist/public/assets/index-SRmdMrn7.js +1 -0
  31. package/dist/public/assets/index-UihZn1LL.css +1 -0
  32. package/dist/public/assets/index-UihZn1LL.css.br +0 -0
  33. package/dist/public/assets/index-X0E7Y6e7.js +1 -0
  34. package/dist/public/assets/{index-D7wHfGqp.js → index-f98Kwcg1.js} +1 -1
  35. package/dist/public/assets/index-llUyinRO.js +1 -0
  36. package/dist/public/assets/isPlainObject-Cb2zGMtI.js +1 -0
  37. package/dist/public/assets/times-B65MF4Rf.js +1 -0
  38. package/dist/public/index.html +2 -2
  39. package/package.json +2 -2
  40. package/dist/public/assets/index-BRMID64m.js +0 -1
  41. package/dist/public/assets/index-Ba0pzb2a.js +0 -1
  42. package/dist/public/assets/index-Ba0pzb2a.js.br +0 -0
  43. package/dist/public/assets/index-BgPufU68.js +0 -1
  44. package/dist/public/assets/index-Bup0y3Y0.js +0 -1
  45. package/dist/public/assets/index-BvQYQ3nw.js +0 -23
  46. package/dist/public/assets/index-BvQYQ3nw.js.br +0 -0
  47. package/dist/public/assets/index-CUbWSY4M.js +0 -1
  48. package/dist/public/assets/index-DH6jmQlu.js +0 -1
  49. package/dist/public/assets/index-DNiiCmLA.js +0 -1
  50. package/dist/public/assets/index-DNiiCmLA.js.br +0 -0
  51. package/dist/public/assets/index-D_5oU4mJ.css +0 -1
  52. package/dist/public/assets/index-D_5oU4mJ.css.br +0 -0
  53. package/dist/public/assets/index-HAU2X1j9.js +0 -1
  54. package/dist/public/assets/index-HAU2X1j9.js.br +0 -0
  55. package/dist/public/assets/index-xb5uiTXk.js +0 -1
package/CHANGELOG.md CHANGED
@@ -204,4 +204,7 @@ API 预检建议文案统一收敛,避免重复提示,阅读更清晰
204
204
  升级 ttmg-pack 到 0.4.5,解决安卓无法调试 unity 项目问题
205
205
 
206
206
  ## 0.3.4
207
- 优化校验逻辑,给出提示
207
+ 优化校验逻辑,给出提示
208
+
209
+ ## 0.3.5
210
+ 优化连接和代理,帮助开发者自助解决问题
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$1({ url, method, data, headers, params, }) {
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
- /** wasm/archive 大文件下载超时(毫秒),防止无限卡住 */
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
- const contentLength = res.headers['content-length'];
6607
- const expectedSize = contentLength ? parseInt(contentLength, 10) : null;
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
- console.error(`[download] stream error out=${baseName} received=${formatBytes(receivedBytes)} err=`, e);
6625
- settle(() => {
6626
- try {
6627
- if (fs.existsSync(filePath))
6628
- fs.unlinkSync(filePath);
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
- const elapsed = Date.now() - t0;
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
- await pipePromise;
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$1({
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$1({
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': 'The response does not look like the login API (e.g. proxy returned "Connection established" instead of forwarding the real response).\n\nThe API is not reachable from mainland without proxy. Please ensure your proxy correctly forwards HTTPS to developers.tiktok.com: try another proxy node, or configure the CLI internal proxy using `ttmg config set proxy socks5://...`.\n\nProxy troubleshooting doc:\nhttps://bytedance.larkoffice.com/wiki/PeIawT4M4ia9R8kYyLMcjwHknOg',
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': "Network connection failed. This is usually caused by advanced proxy settings (e.g., fake-ip mode) or incorrect terminal proxy environment variables.\n\nWe strongly recommend turning off global proxy mode and configuring the CLI internal proxy using:\n ttmg config set proxy socks5://127.0.0.1:<your_socks_port>\n\nFor detailed solutions, please refer to the proxy troubleshooting doc:\nhttps://bytedance.larkoffice.com/wiki/PeIawT4M4ia9R8kYyLMcjwHknOg",
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': '当前响应看起来不是登录接口返回(例如代理返回了 "Connection established",而不是转发真实响应)。\n\n该接口在大陆网络通常需要代理。请确认代理可正确转发 developers.tiktok.com 的 HTTPS 请求:尝试切换节点,或者使用 `ttmg config set proxy socks5://...` 配置 CLI 内置代理。\n\n代理排查文档:\nhttps://bytedance.larkoffice.com/wiki/PeIawT4M4ia9R8kYyLMcjwHknOg',
6976
+ 'login.warning.proxyIssue': '登录失败,请参考代理设置文档:\nhttps://bytedance.larkoffice.com/wiki/PeIawT4M4ia9R8kYyLMcjwHknOg',
7039
6977
  'login.error.connectService': '连接登录服务失败',
7040
- 'login.error.networkBlocked': '网络连接失败。这通常是由于代理软件的高级设置(如 fake-ip 模式)或终端残留了错误的代理环境变量导致的。\n\n我们强烈建议你关闭全局代理,并为 CLI 配置内置 SOCKS5 代理:\n ttmg config set proxy socks5://127.0.0.1:<你的socks端口>\n\n详细排查方案请参考最新代理设置文档:\nhttps://bytedance.larkoffice.com/wiki/PeIawT4M4ia9R8kYyLMcjwHknOg',
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
- // 稳定排序:无线优先 or 有线优先按需定。这里有线优先,再无线,再其他。
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
- archive: {
8996
- name: 'wasmcode-archive',
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: formHeaders,
9086
- params: { client_key: params.client_key, with_ios: true },
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
- params: { client_key, wasm_md5 },
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: { client_key, wasm_md5 },
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
- params: { client_key, wasm_md5 },
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
- data: { client_key, wasm_md5 },
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
- /** iOS 与 archive 互斥,二者只会存在其一 */
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
- if (options?.hasArchive) {
9483
- filtered.push(WASM_SPLIT_SUBPACKAGE_CONFIG.archive);
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
- /** iOS archive 互斥:有 archive 时 iOS URL 为空,反之亦然 */
9541
- const hasArchive = Boolean(context.archive_wasm_download_url);
9542
- const hasIos = !hasArchive && Boolean(context.main_wasm_h5_download_url);
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
- ...(hasArchive && archiveDir && context.wasm_archive_md5
9594
- ? [
9595
- limit(() => downloadAndCompress({
9596
- startDownloadStatus: 'start_download_archive_wasm',
9597
- downloadDoneStatus: 'download_archive_wasm_done',
9598
- url: context.archive_wasm_download_url,
9599
- out: path.join(archiveDir, `${context.wasm_archive_md5}${WASM_ARCHIVE_FILENAME_SUFFIX}`),
9600
- })),
9601
- ]
9602
- : []),
9603
- // iOS 子包(与 archive 互斥,仅当 hasIos 时下载)
9604
- ...(hasIos && mainIosDir && subIosDir
9605
- ? [
9606
- limit(() => downloadAndCompress({
9607
- startDownloadStatus: 'start_download_ios_main_wasm',
9608
- downloadDoneStatus: 'download_ios_main_wasm_done',
9609
- startCompressStatus: 'start_compress_ios_main_wasm',
9610
- compressDoneStatus: 'compress_ios_main_wasm_done',
9611
- url: context.main_wasm_h5_download_url,
9612
- out: path.join(mainIosDir, `${context.main_wasm_h5_md5}${WASM_FILENAME_SUFFIX}`),
9613
- })),
9614
- limit(() => downloadAndCompress({
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
- const wasmSplitConfigFields = {
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
- // iOS 与 archive 互斥:走 iOS 时写入 iOS 相关字段,走 archive 时写入 archive 相关字段
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
- data: { client_key: data.clientkey, wasm_md5: data.wasmMd5 },
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 archiveSubpackageDir = path.join(process.cwd(), WASM_SPLIT_SUBPACKAGE_CONFIG.archive.root);
9814
- if (fs.existsSync(archiveSubpackageDir)) {
9815
- fs.rmSync(archiveSubpackageDir, { recursive: true });
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
- 'sub_wasm_download_url',
10093
- ...(hasArchive ? ['archive_wasm_download_url'] : ['main_wasm_h5_download_url']),
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-beta.1";
10655
+ var version = "0.3.5";
10768
10656
  var pkg = {
10769
10657
  version: version};
10770
10658