sa2kit 1.6.30 → 1.6.32

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 (251) hide show
  1. package/dist/AliyunOSSProvider-4W47OFEK.mjs +6 -0
  2. package/dist/{AliyunOSSProvider-KJYRIZES.mjs.map → AliyunOSSProvider-4W47OFEK.mjs.map} +1 -1
  3. package/dist/AliyunOSSProvider-HCNGDJL7.js +15 -0
  4. package/dist/{AliyunOSSProvider-FWAKUB2T.js.map → AliyunOSSProvider-HCNGDJL7.js.map} +1 -1
  5. package/dist/ConfigService-3DIC6C3Q.js +21 -0
  6. package/dist/{ConfigService-7MEZXKJ5.js.map → ConfigService-3DIC6C3Q.js.map} +1 -1
  7. package/dist/ConfigService-V6ZK273Z.mjs +4 -0
  8. package/dist/{ConfigService-BV57YYFW.mjs.map → ConfigService-V6ZK273Z.mjs.map} +1 -1
  9. package/dist/LocalStorageProvider-3RVPCQB3.mjs +6 -0
  10. package/dist/{LocalStorageProvider-RTPMUOZ2.mjs.map → LocalStorageProvider-3RVPCQB3.mjs.map} +1 -1
  11. package/dist/LocalStorageProvider-PP7MA5OT.js +15 -0
  12. package/dist/{LocalStorageProvider-XSRCUXOU.js.map → LocalStorageProvider-PP7MA5OT.js.map} +1 -1
  13. package/dist/PMXParser-2VTA737I.js +13 -0
  14. package/dist/{PMXParser-YBS3B6HM.js.map → PMXParser-2VTA737I.js.map} +1 -1
  15. package/dist/PMXParser-RNVQL76A.mjs +4 -0
  16. package/dist/{PMXParser-L6IWHL4I.mjs.map → PMXParser-RNVQL76A.mjs.map} +1 -1
  17. package/dist/analytics/index.js +46 -45
  18. package/dist/analytics/index.js.map +1 -1
  19. package/dist/analytics/index.mjs +45 -44
  20. package/dist/analytics/index.mjs.map +1 -1
  21. package/dist/analytics/server/index.js +4 -4
  22. package/dist/analytics/server/index.js.map +1 -1
  23. package/dist/analytics/server/index.mjs +4 -4
  24. package/dist/analytics/server/index.mjs.map +1 -1
  25. package/dist/api/index.js +5 -5
  26. package/dist/api/index.js.map +1 -1
  27. package/dist/api/index.mjs +5 -5
  28. package/dist/api/index.mjs.map +1 -1
  29. package/dist/audioDetection/index.js +17 -16
  30. package/dist/audioDetection/index.js.map +1 -1
  31. package/dist/audioDetection/index.mjs +17 -16
  32. package/dist/audioDetection/index.mjs.map +1 -1
  33. package/dist/auth/client/index.js +4 -4
  34. package/dist/auth/client/index.mjs +1 -1
  35. package/dist/auth/components/index.js +3 -3
  36. package/dist/auth/components/index.js.map +1 -1
  37. package/dist/auth/components/index.mjs +3 -3
  38. package/dist/auth/components/index.mjs.map +1 -1
  39. package/dist/auth/index.js +29 -29
  40. package/dist/auth/index.mjs +5 -5
  41. package/dist/auth/middleware/index.js +3 -3
  42. package/dist/auth/middleware/index.mjs +2 -2
  43. package/dist/auth/routes/index.js +14 -14
  44. package/dist/auth/routes/index.mjs +2 -2
  45. package/dist/auth/services/index.js +7 -7
  46. package/dist/auth/services/index.mjs +1 -1
  47. package/dist/calendar/index.js +146 -182
  48. package/dist/calendar/index.js.map +1 -1
  49. package/dist/calendar/index.mjs +139 -175
  50. package/dist/calendar/index.mjs.map +1 -1
  51. package/dist/calendar/routes/index.js +1 -1
  52. package/dist/calendar/routes/index.js.map +1 -1
  53. package/dist/calendar/routes/index.mjs +1 -1
  54. package/dist/calendar/routes/index.mjs.map +1 -1
  55. package/dist/{chunk-5YQ5B7IZ.js → chunk-24HGREE6.js} +5 -5
  56. package/dist/{chunk-5YQ5B7IZ.js.map → chunk-24HGREE6.js.map} +1 -1
  57. package/dist/{chunk-6PRFP5EG.js → chunk-25OFOKNF.js} +6 -6
  58. package/dist/chunk-25OFOKNF.js.map +1 -0
  59. package/dist/{chunk-KQGP6BTS.mjs → chunk-3DXPQ4YV.mjs} +6 -6
  60. package/dist/chunk-3DXPQ4YV.mjs.map +1 -0
  61. package/dist/{chunk-3BGPZN4X.mjs → chunk-3NHAT7D4.mjs} +12 -12
  62. package/dist/chunk-3NHAT7D4.mjs.map +1 -0
  63. package/dist/{chunk-MW4BCIZC.mjs → chunk-4HC6M7FK.mjs} +3 -3
  64. package/dist/chunk-4HC6M7FK.mjs.map +1 -0
  65. package/dist/{chunk-ESRCX5TQ.mjs → chunk-52TN2QSS.mjs} +3 -3
  66. package/dist/{chunk-ESRCX5TQ.mjs.map → chunk-52TN2QSS.mjs.map} +1 -1
  67. package/dist/{chunk-CNTILN5J.mjs → chunk-5YQ62BKX.mjs} +20 -19
  68. package/dist/chunk-5YQ62BKX.mjs.map +1 -0
  69. package/dist/{chunk-6W5BMXJG.js → chunk-6OWNMJKG.js} +4 -4
  70. package/dist/{chunk-6W5BMXJG.js.map → chunk-6OWNMJKG.js.map} +1 -1
  71. package/dist/{chunk-DUHZ7VZP.js → chunk-7VRT55ZD.js} +3 -3
  72. package/dist/chunk-7VRT55ZD.js.map +1 -0
  73. package/dist/{chunk-3WOAPLEG.mjs → chunk-EB4NR623.mjs} +27 -26
  74. package/dist/chunk-EB4NR623.mjs.map +1 -0
  75. package/dist/chunk-EI27JKND.mjs +1988 -0
  76. package/dist/chunk-EI27JKND.mjs.map +1 -0
  77. package/dist/{chunk-CD77U7LZ.js → chunk-GBPLX42J.js} +9 -9
  78. package/dist/chunk-GBPLX42J.js.map +1 -0
  79. package/dist/{chunk-TFQF2HDO.mjs → chunk-HDEOCX2L.mjs} +12 -12
  80. package/dist/chunk-HDEOCX2L.mjs.map +1 -0
  81. package/dist/{chunk-TV3VKRJK.mjs → chunk-HDMIOOZY.mjs} +38 -68
  82. package/dist/chunk-HDMIOOZY.mjs.map +1 -0
  83. package/dist/{chunk-OPPF3326.js → chunk-HJ6MH7J7.js} +39 -69
  84. package/dist/chunk-HJ6MH7J7.js.map +1 -0
  85. package/dist/chunk-KO73EBUT.js +80 -0
  86. package/dist/chunk-KO73EBUT.js.map +1 -0
  87. package/dist/{chunk-6YKMCPQI.mjs → chunk-KZKIH4AS.mjs} +4 -4
  88. package/dist/chunk-KZKIH4AS.mjs.map +1 -0
  89. package/dist/{chunk-LX4XX6W7.js → chunk-L47ZOYHL.js} +15 -89
  90. package/dist/chunk-L47ZOYHL.js.map +1 -0
  91. package/dist/{chunk-6MQUBPKB.mjs → chunk-LJ4CCSSY.mjs} +3 -3
  92. package/dist/{chunk-6MQUBPKB.mjs.map → chunk-LJ4CCSSY.mjs.map} +1 -1
  93. package/dist/{chunk-TOC5FSHP.js → chunk-NJ2SNXBJ.js} +12 -12
  94. package/dist/chunk-NJ2SNXBJ.js.map +1 -0
  95. package/dist/{chunk-OCR5DS4C.mjs → chunk-PE5EAHZK.mjs} +3 -3
  96. package/dist/chunk-PE5EAHZK.mjs.map +1 -0
  97. package/dist/{chunk-LZHMNOED.js → chunk-Q5EDCKQA.js} +26 -26
  98. package/dist/chunk-Q5EDCKQA.js.map +1 -0
  99. package/dist/{chunk-CLKKZSPZ.js → chunk-RBKGYWME.js} +20 -19
  100. package/dist/chunk-RBKGYWME.js.map +1 -0
  101. package/dist/{chunk-VRTRSEEH.mjs → chunk-RSJSZ7QH.mjs} +11 -11
  102. package/dist/chunk-RSJSZ7QH.mjs.map +1 -0
  103. package/dist/{chunk-E7RGBAYJ.js → chunk-TDCDEBGP.js} +30 -29
  104. package/dist/chunk-TDCDEBGP.js.map +1 -0
  105. package/dist/{chunk-JZXJQMVE.js → chunk-UIFFDRTE.js} +11 -11
  106. package/dist/chunk-UIFFDRTE.js.map +1 -0
  107. package/dist/{chunk-T5OZHYVM.mjs → chunk-UKT3PLON.mjs} +13 -85
  108. package/dist/chunk-UKT3PLON.mjs.map +1 -0
  109. package/dist/{chunk-UOFTHYIH.js → chunk-UL6XJGUZ.js} +4 -4
  110. package/dist/chunk-UL6XJGUZ.js.map +1 -0
  111. package/dist/chunk-VVWQTO4Y.mjs +77 -0
  112. package/dist/chunk-VVWQTO4Y.mjs.map +1 -0
  113. package/dist/{chunk-A3UP56MS.js → chunk-WA67GZSZ.js} +3 -3
  114. package/dist/chunk-WA67GZSZ.js.map +1 -0
  115. package/dist/{chunk-OLHGZXN3.mjs → chunk-WEEXCPSE.mjs} +5 -5
  116. package/dist/chunk-WEEXCPSE.mjs.map +1 -0
  117. package/dist/chunk-XGBE4SUV.js +2093 -0
  118. package/dist/chunk-XGBE4SUV.js.map +1 -0
  119. package/dist/{chunk-QU5OT4DF.js → chunk-XJ7ZAGC5.js} +5 -5
  120. package/dist/chunk-XJ7ZAGC5.js.map +1 -0
  121. package/dist/{chunk-ZI25QCHD.mjs → chunk-YOTQG4NP.mjs} +25 -25
  122. package/dist/chunk-YOTQG4NP.mjs.map +1 -0
  123. package/dist/{chunk-QAT2RWAO.mjs → chunk-Z36R3P62.mjs} +7 -7
  124. package/dist/chunk-Z36R3P62.mjs.map +1 -0
  125. package/dist/{chunk-7Z5LLJ3A.js → chunk-ZWQJSZEY.js} +13 -13
  126. package/dist/chunk-ZWQJSZEY.js.map +1 -0
  127. package/dist/config/index.js +6 -6
  128. package/dist/config/index.js.map +1 -1
  129. package/dist/config/index.mjs +6 -6
  130. package/dist/config/index.mjs.map +1 -1
  131. package/dist/config/server/index.js +37 -37
  132. package/dist/config/server/index.js.map +1 -1
  133. package/dist/config/server/index.mjs +37 -37
  134. package/dist/config/server/index.mjs.map +1 -1
  135. package/dist/i18n/index.d.mts +2 -2
  136. package/dist/i18n/index.d.ts +2 -2
  137. package/dist/i18n/index.js +16 -17
  138. package/dist/i18n/index.js.map +1 -1
  139. package/dist/i18n/index.mjs +16 -17
  140. package/dist/i18n/index.mjs.map +1 -1
  141. package/dist/imageCrop/index.js +11 -10
  142. package/dist/imageCrop/index.js.map +1 -1
  143. package/dist/imageCrop/index.mjs +11 -10
  144. package/dist/imageCrop/index.mjs.map +1 -1
  145. package/dist/index.d.mts +185 -100
  146. package/dist/index.d.ts +185 -100
  147. package/dist/index.js +225 -249
  148. package/dist/index.js.map +1 -1
  149. package/dist/index.mjs +80 -104
  150. package/dist/index.mjs.map +1 -1
  151. package/dist/logger/index.js +6 -6
  152. package/dist/logger/index.mjs +1 -1
  153. package/dist/mikuFusionGame/index.d.mts +112 -0
  154. package/dist/mikuFusionGame/index.d.ts +112 -0
  155. package/dist/mikuFusionGame/index.js +680 -0
  156. package/dist/mikuFusionGame/index.js.map +1 -0
  157. package/dist/mikuFusionGame/index.mjs +667 -0
  158. package/dist/mikuFusionGame/index.mjs.map +1 -0
  159. package/dist/mmd/admin/index.js +11 -10
  160. package/dist/mmd/admin/index.js.map +1 -1
  161. package/dist/mmd/admin/index.mjs +11 -10
  162. package/dist/mmd/admin/index.mjs.map +1 -1
  163. package/dist/mmd/index.js +223 -241
  164. package/dist/mmd/index.js.map +1 -1
  165. package/dist/mmd/index.mjs +220 -238
  166. package/dist/mmd/index.mjs.map +1 -1
  167. package/dist/mmd/server/index.js +6 -6
  168. package/dist/mmd/server/index.js.map +1 -1
  169. package/dist/mmd/server/index.mjs +6 -6
  170. package/dist/mmd/server/index.mjs.map +1 -1
  171. package/dist/music/index.js +16 -16
  172. package/dist/music/index.mjs +2 -2
  173. package/dist/music/server/index.js +8 -8
  174. package/dist/music/server/index.mjs +1 -1
  175. package/dist/request/index.js +2 -2
  176. package/dist/request/index.js.map +1 -1
  177. package/dist/request/index.mjs +2 -2
  178. package/dist/request/index.mjs.map +1 -1
  179. package/dist/storage/index.js +15 -14
  180. package/dist/storage/index.mjs +3 -2
  181. package/dist/testYourself/admin/index.js +3 -3
  182. package/dist/testYourself/admin/index.mjs +1 -1
  183. package/dist/testYourself/index.js +22 -22
  184. package/dist/testYourself/index.js.map +1 -1
  185. package/dist/testYourself/index.mjs +14 -14
  186. package/dist/testYourself/index.mjs.map +1 -1
  187. package/dist/testYourself/server/index.js +4 -4
  188. package/dist/testYourself/server/index.mjs +1 -1
  189. package/dist/universalExport/index.d.mts +3 -3
  190. package/dist/universalExport/index.d.ts +3 -3
  191. package/dist/universalExport/index.js +48 -47
  192. package/dist/universalExport/index.js.map +1 -1
  193. package/dist/universalExport/index.mjs +48 -47
  194. package/dist/universalExport/index.mjs.map +1 -1
  195. package/dist/universalExport/server/index.js +29 -29
  196. package/dist/universalExport/server/index.js.map +1 -1
  197. package/dist/universalExport/server/index.mjs +28 -28
  198. package/dist/universalExport/server/index.mjs.map +1 -1
  199. package/dist/universalFile/index.d.mts +3 -3
  200. package/dist/universalFile/index.d.ts +3 -3
  201. package/dist/universalFile/index.js +73 -72
  202. package/dist/universalFile/index.js.map +1 -1
  203. package/dist/universalFile/index.mjs +73 -72
  204. package/dist/universalFile/index.mjs.map +1 -1
  205. package/dist/universalFile/server/index.js +258 -260
  206. package/dist/universalFile/server/index.js.map +1 -1
  207. package/dist/universalFile/server/index.mjs +244 -246
  208. package/dist/universalFile/server/index.mjs.map +1 -1
  209. package/dist/utils/index.js +11 -11
  210. package/dist/utils/index.mjs +2 -2
  211. package/package.json +25 -31
  212. package/dist/AliyunOSSProvider-FWAKUB2T.js +0 -15
  213. package/dist/AliyunOSSProvider-KJYRIZES.mjs +0 -6
  214. package/dist/ConfigService-7MEZXKJ5.js +0 -21
  215. package/dist/ConfigService-BV57YYFW.mjs +0 -4
  216. package/dist/LocalStorageProvider-RTPMUOZ2.mjs +0 -6
  217. package/dist/LocalStorageProvider-XSRCUXOU.js +0 -15
  218. package/dist/PMXParser-L6IWHL4I.mjs +0 -4
  219. package/dist/PMXParser-YBS3B6HM.js +0 -13
  220. package/dist/chunk-3BGPZN4X.mjs.map +0 -1
  221. package/dist/chunk-3WOAPLEG.mjs.map +0 -1
  222. package/dist/chunk-6PRFP5EG.js.map +0 -1
  223. package/dist/chunk-6YKMCPQI.mjs.map +0 -1
  224. package/dist/chunk-7Z5LLJ3A.js.map +0 -1
  225. package/dist/chunk-A3UP56MS.js.map +0 -1
  226. package/dist/chunk-CD77U7LZ.js.map +0 -1
  227. package/dist/chunk-CLKKZSPZ.js.map +0 -1
  228. package/dist/chunk-CNTILN5J.mjs.map +0 -1
  229. package/dist/chunk-DUHZ7VZP.js.map +0 -1
  230. package/dist/chunk-DW2ZTOCV.js +0 -1727
  231. package/dist/chunk-DW2ZTOCV.js.map +0 -1
  232. package/dist/chunk-E7RGBAYJ.js.map +0 -1
  233. package/dist/chunk-JZXJQMVE.js.map +0 -1
  234. package/dist/chunk-KQGP6BTS.mjs.map +0 -1
  235. package/dist/chunk-LFG6FPM5.mjs +0 -1597
  236. package/dist/chunk-LFG6FPM5.mjs.map +0 -1
  237. package/dist/chunk-LX4XX6W7.js.map +0 -1
  238. package/dist/chunk-LZHMNOED.js.map +0 -1
  239. package/dist/chunk-MW4BCIZC.mjs.map +0 -1
  240. package/dist/chunk-OCR5DS4C.mjs.map +0 -1
  241. package/dist/chunk-OLHGZXN3.mjs.map +0 -1
  242. package/dist/chunk-OPPF3326.js.map +0 -1
  243. package/dist/chunk-QAT2RWAO.mjs.map +0 -1
  244. package/dist/chunk-QU5OT4DF.js.map +0 -1
  245. package/dist/chunk-T5OZHYVM.mjs.map +0 -1
  246. package/dist/chunk-TFQF2HDO.mjs.map +0 -1
  247. package/dist/chunk-TOC5FSHP.js.map +0 -1
  248. package/dist/chunk-TV3VKRJK.mjs.map +0 -1
  249. package/dist/chunk-UOFTHYIH.js.map +0 -1
  250. package/dist/chunk-VRTRSEEH.mjs.map +0 -1
  251. package/dist/chunk-ZI25QCHD.mjs.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/mmd/pmx/parser/PMXParser.ts"],"names":[],"mappings":"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","file":"chunk-VRTRSEEH.mjs","sourcesContent":["/**\n * PMX模型文件解析器\n * 用于解析PMX格式的MMD模型文件,提取纹理映射关系\n */\n\nimport {\n PMXHeader,\n PMXModelInfo,\n PMXMaterial,\n PMXTexture,\n PMXParseResult,\n MaterialTextureMapping,\n} from '../types';\n\nexport class PMXParser {\n private view!: DataView;\n private offset: number = 0;\n private textEncoding: 'utf16le' | 'utf8' = 'utf16le';\n private textureIndexSize: number = 1;\n private additionalVec4Count: number = 0;\n private vertexIndexSize: number = 1;\n private boneIndexSize: number = 1;\n\n /**\n * 从URL加载并解析PMX文件\n */\n async loadAndParse(url: string): Promise<PMXParseResult> {\n const response = await fetch(url);\n if (!response.ok) {\n throw new Error(`Failed to load PMX file: ${response.statusText}`);\n }\n\n const buffer = await response.arrayBuffer();\n return this.parse(buffer);\n }\n\n /**\n * 解析PMX文件\n */\n parse(buffer: ArrayBuffer): PMXParseResult {\n this.view = new DataView(buffer);\n this.offset = 0;\n\n console.log('[PMXParser] Starting parse, file size:', buffer.byteLength);\n\n // 1. 解析头部\n const header = this.parseHeader();\n console.log('[PMXParser] Header parsed, offset:', this.offset);\n console.log('[PMXParser] Globals:', header.globals);\n\n // 2. 解析模型信息\n const modelInfo = this.parseModelInfo();\n console.log('[PMXParser] Model info parsed, offset:', this.offset);\n console.log('[PMXParser] Model name:', modelInfo.modelName);\n\n // 3. 解析顶点(只统计数量,不解析详细数据以提高性能)\n const vertexCount = this.skipVertices();\n console.log('[PMXParser] Vertices skipped, count:', vertexCount, 'offset:', this.offset);\n\n // 4. 解析面(只统计数量)\n const faceCount = this.skipFaces();\n console.log('[PMXParser] Faces skipped, count:', faceCount, 'offset:', this.offset);\n\n // 5. 解析纹理列表\n const textures = this.parseTextures();\n console.log('[PMXParser] Textures parsed, count:', textures.length, 'offset:', this.offset);\n\n // 6. 解析材质\n const materials = this.parseMaterials();\n console.log('[PMXParser] Materials parsed, count:', materials.length, 'offset:', this.offset);\n\n // 7. 生成材质纹理映射\n const materialTextureMappings = this.generateMaterialTextureMappings(\n materials,\n textures\n );\n\n return {\n header,\n modelInfo,\n textures,\n materials,\n materialTextureMappings,\n vertexCount,\n faceCount,\n };\n }\n\n /**\n * 解析文件头\n */\n private parseHeader(): PMXHeader {\n // 签名 \"PMX \" (4 bytes)\n const signature = this.readString(4);\n if (signature !== 'PMX ') {\n throw new Error(`Invalid PMX signature: ${signature}`);\n }\n\n // 版本号 (4 bytes float)\n const version = this.view.getFloat32(this.offset, true);\n this.offset += 4;\n\n // 全局设置数量 (1 byte)\n const globalsCount = this.view.getUint8(this.offset);\n this.offset += 1;\n\n if (globalsCount !== 8) {\n throw new Error(`Unexpected globals count: ${globalsCount}`);\n }\n\n // 读取全局设置\n const encoding = this.view.getUint8(this.offset);\n this.offset += 1;\n this.textEncoding = encoding === 0 ? 'utf16le' : 'utf8';\n\n const additionalVec4Count = this.view.getUint8(this.offset);\n this.offset += 1;\n this.additionalVec4Count = additionalVec4Count;\n\n const vertexIndexSize = this.view.getUint8(this.offset);\n this.offset += 1;\n this.vertexIndexSize = vertexIndexSize;\n\n const textureIndexSize = this.view.getUint8(this.offset);\n this.offset += 1;\n this.textureIndexSize = textureIndexSize;\n\n const materialIndexSize = this.view.getUint8(this.offset);\n this.offset += 1;\n\n const boneIndexSize = this.view.getUint8(this.offset);\n this.offset += 1;\n this.boneIndexSize = boneIndexSize;\n\n const morphIndexSize = this.view.getUint8(this.offset);\n this.offset += 1;\n\n const rigidBodyIndexSize = this.view.getUint8(this.offset);\n this.offset += 1;\n\n return {\n signature,\n version,\n globals: {\n encoding,\n additionalVec4Count,\n vertexIndexSize,\n textureIndexSize,\n materialIndexSize,\n boneIndexSize,\n morphIndexSize,\n rigidBodyIndexSize,\n },\n };\n }\n\n /**\n * 解析模型信息\n */\n private parseModelInfo(): PMXModelInfo {\n const modelName = this.readTextBuffer();\n const modelNameEnglish = this.readTextBuffer();\n const comment = this.readTextBuffer();\n const commentEnglish = this.readTextBuffer();\n\n return {\n modelName,\n modelNameEnglish,\n comment,\n commentEnglish,\n };\n }\n\n /**\n * 跳过顶点数据(只返回数量)\n */\n private skipVertices(): number {\n const count = this.view.getInt32(this.offset, true);\n this.offset += 4;\n\n // 跳过所有顶点数据\n // 每个顶点的大小是可变的,需要根据权重类型计算\n for (let i = 0; i < count; i++) {\n // Position (12 bytes)\n this.offset += 12;\n // Normal (12 bytes)\n this.offset += 12;\n // UV (8 bytes)\n this.offset += 8;\n\n // Additional UV (使用保存的additionalVec4Count)\n this.offset += this.additionalVec4Count * 16;\n\n // Weight type\n const weightType = this.view.getUint8(this.offset);\n this.offset += 1;\n\n // 根据权重类型跳过不同大小的数据\n this.skipVertexWeight(weightType);\n\n // Edge scale (4 bytes)\n this.offset += 4;\n }\n\n return count;\n }\n\n /**\n * 跳过顶点权重数据\n */\n private skipVertexWeight(weightType: number): void {\n switch (weightType) {\n case 0: // BDEF1\n this.offset += this.boneIndexSize;\n break;\n case 1: // BDEF2\n this.offset += this.boneIndexSize * 2 + 4;\n break;\n case 2: // BDEF4\n this.offset += this.boneIndexSize * 4 + 16;\n break;\n case 3: // SDEF\n this.offset += this.boneIndexSize * 2 + 4 + 36;\n break;\n case 4: // QDEF\n this.offset += this.boneIndexSize * 4 + 16;\n break;\n }\n }\n\n /**\n * 跳过面数据(只返回数量)\n */\n private skipFaces(): number {\n const count = this.view.getInt32(this.offset, true);\n this.offset += 4;\n\n this.offset += count * this.vertexIndexSize;\n\n return count / 3; // 返回面数(每个面3个顶点)\n }\n\n /**\n * 解析纹理列表\n */\n private parseTextures(): PMXTexture[] {\n const count = this.view.getInt32(this.offset, true);\n this.offset += 4;\n\n console.log('[PMXParser] Parsing textures, count:', count);\n\n if (count < 0 || count > 10000) {\n throw new Error(`Invalid texture count: ${count} at offset ${this.offset - 4}`);\n }\n\n const textures: PMXTexture[] = [];\n\n for (let i = 0; i < count; i++) {\n const path = this.readTextBuffer();\n textures.push({\n index: i,\n path,\n });\n console.log(`[PMXParser] Texture ${i}: ${path}`);\n }\n\n return textures;\n }\n\n /**\n * 解析材质列表\n */\n private parseMaterials(): PMXMaterial[] {\n const count = this.view.getInt32(this.offset, true);\n this.offset += 4;\n\n const materials: PMXMaterial[] = [];\n\n for (let i = 0; i < count; i++) {\n // 材质名称\n const name = this.readTextBuffer();\n const nameEnglish = this.readTextBuffer();\n\n // 颜色信息\n const diffuse: [number, number, number, number] = [\n this.view.getFloat32(this.offset, true),\n this.view.getFloat32(this.offset + 4, true),\n this.view.getFloat32(this.offset + 8, true),\n this.view.getFloat32(this.offset + 12, true),\n ];\n this.offset += 16;\n\n const specular: [number, number, number] = [\n this.view.getFloat32(this.offset, true),\n this.view.getFloat32(this.offset + 4, true),\n this.view.getFloat32(this.offset + 8, true),\n ];\n this.offset += 12;\n\n const specularStrength = this.view.getFloat32(this.offset, true);\n this.offset += 4;\n\n const ambient: [number, number, number] = [\n this.view.getFloat32(this.offset, true),\n this.view.getFloat32(this.offset + 4, true),\n this.view.getFloat32(this.offset + 8, true),\n ];\n this.offset += 12;\n\n // 绘制标志\n const drawingFlags = this.view.getUint8(this.offset);\n this.offset += 1;\n\n // 边缘信息\n const edgeColor: [number, number, number, number] = [\n this.view.getFloat32(this.offset, true),\n this.view.getFloat32(this.offset + 4, true),\n this.view.getFloat32(this.offset + 8, true),\n this.view.getFloat32(this.offset + 12, true),\n ];\n this.offset += 16;\n\n const edgeSize = this.view.getFloat32(this.offset, true);\n this.offset += 4;\n\n // 纹理信息\n const textureIndex = this.readIndex(this.textureIndexSize);\n const sphereTextureIndex = this.readIndex(this.textureIndexSize);\n const sphereMode = this.view.getUint8(this.offset);\n this.offset += 1;\n\n // Toon信息\n const isSharedToon = this.view.getUint8(this.offset) === 1;\n this.offset += 1;\n\n const toonTextureIndex = isSharedToon\n ? this.view.getUint8(this.offset++)\n : this.readIndex(this.textureIndexSize);\n\n // 备注\n const memo = this.readTextBuffer();\n\n // 面数\n const surfaceCount = this.view.getInt32(this.offset, true);\n this.offset += 4;\n\n materials.push({\n name,\n nameEnglish,\n diffuse,\n specular,\n specularStrength,\n ambient,\n drawingFlags,\n edgeColor,\n edgeSize,\n textureIndex,\n sphereTextureIndex,\n sphereMode,\n isSharedToon,\n toonTextureIndex,\n memo,\n surfaceCount,\n });\n }\n\n return materials;\n }\n\n /**\n * 生成材质纹理映射\n */\n private generateMaterialTextureMappings(\n materials: PMXMaterial[],\n textures: PMXTexture[]\n ): MaterialTextureMapping[] {\n const sphereModeMap = ['none', 'multiply', 'add', 'subTexture'] as const;\n\n return materials.map((material, index) => {\n const mapping: MaterialTextureMapping = {\n materialIndex: index,\n materialName: material.name,\n materialNameEnglish: material.nameEnglish,\n surfaceCount: material.surfaceCount,\n };\n\n // 主纹理\n if (material.textureIndex >= 0 && material.textureIndex < textures.length) {\n mapping.mainTexture = {\n index: material.textureIndex,\n path: textures[material.textureIndex]!.path,\n };\n }\n\n // Sphere纹理\n if (\n material.sphereTextureIndex >= 0 &&\n material.sphereTextureIndex < textures.length &&\n material.sphereMode > 0\n ) {\n mapping.sphereTexture = {\n index: material.sphereTextureIndex,\n path: textures[material.sphereTextureIndex]!.path,\n mode: sphereModeMap[material.sphereMode] as 'multiply' | 'add' | 'subTexture',\n };\n }\n\n // Toon纹理\n if (material.isSharedToon) {\n mapping.toonTexture = {\n index: material.toonTextureIndex,\n path: `toon${String(material.toonTextureIndex).padStart(2, '0')}.bmp`,\n isShared: true,\n };\n } else if (\n material.toonTextureIndex >= 0 &&\n material.toonTextureIndex < textures.length\n ) {\n mapping.toonTexture = {\n index: material.toonTextureIndex,\n path: textures[material.toonTextureIndex]!.path,\n isShared: false,\n };\n }\n\n return mapping;\n });\n }\n\n /**\n * 读取文本缓冲区\n */\n private readTextBuffer(): string {\n const length = this.view.getInt32(this.offset, true);\n this.offset += 4;\n\n if (length === 0) return '';\n\n // 添加边界检查\n if (length < 0 || length > 10000000) { // 10MB 限制\n throw new Error(`Invalid text buffer length: ${length} at offset ${this.offset - 4}`);\n }\n\n if (this.offset + length > this.view.buffer.byteLength) {\n throw new Error(`Text buffer extends beyond file boundary: offset=${this.offset}, length=${length}, fileSize=${this.view.buffer.byteLength}`);\n }\n\n const bytes = new Uint8Array(this.view.buffer, this.offset, length);\n this.offset += length;\n\n if (this.textEncoding === 'utf8') {\n return new TextDecoder('utf-8').decode(bytes);\n } else {\n return new TextDecoder('utf-16le').decode(bytes);\n }\n }\n\n /**\n * 读取固定长度字符串\n */\n private readString(length: number): string {\n const bytes = new Uint8Array(this.view.buffer, this.offset, length);\n this.offset += length;\n return new TextDecoder('ascii').decode(bytes);\n }\n\n /**\n * 读取索引\n */\n private readIndex(size: number): number {\n let value: number;\n\n switch (size) {\n case 1:\n value = this.view.getInt8(this.offset);\n break;\n case 2:\n value = this.view.getInt16(this.offset, true);\n break;\n case 4:\n value = this.view.getInt32(this.offset, true);\n break;\n default:\n throw new Error(`Invalid index size: ${size}`);\n }\n\n this.offset += size;\n return value;\n }\n}\n\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/universalFile/server/providers/LocalStorageProvider.ts"],"names":["fs","path"],"mappings":"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","file":"chunk-ZI25QCHD.mjs","sourcesContent":["/**\n * 本地存储提供者实现\n */\n\nimport { promises as fs } from 'fs';\nimport { existsSync, createReadStream, createWriteStream } from 'fs';\nimport * as path from 'path';\nimport { pipeline } from 'stream/promises';\nimport { createLogger } from '../../../logger';\n\nimport type {\n IStorageProvider,\n StorageConfig,\n LocalStorageConfig,\n StorageResult,\n UploadFileInfo,\n StorageType,\n} from '../types';\n\nimport { StorageProviderError } from '../types';\n\nconst logger = createLogger('LocalStorageProvider');\n\n/**\n * 本地文件系统存储提供者\n */\nexport class LocalStorageProvider implements IStorageProvider {\n readonly type: StorageType = 'local';\n\n private config: LocalStorageConfig | null = null;\n private isInitialized = false;\n\n /**\n * 初始化存储提供者\n */\n async initialize(config: StorageConfig): Promise<void> {\n if (config.type !== 'local') {\n throw new StorageProviderError('配置类型不匹配:期望 local');\n }\n\n this.config = config as LocalStorageConfig;\n\n logger.info(`📂 [LocalStorageProvider] 初始化本地存储,根目录: ${this.config.rootPath}`);\n\n try {\n // 确保根目录存在\n await this.ensureDirectoryExists(this.config.rootPath);\n\n // 验证目录访问权限\n await this.validateDirectoryAccess(this.config.rootPath);\n\n this.isInitialized = true;\n logger.info('✅ [LocalStorageProvider] 本地存储初始化完成');\n } catch (error) {\n logger.error('❌ [LocalStorageProvider] 本地存储初始化失败:', error);\n throw new StorageProviderError(`本地存储初始化失败`);\n }\n }\n\n /**\n * 上传文件\n */\n async upload(fileInfo: UploadFileInfo, filePath: string): Promise<StorageResult> {\n this.ensureInitialized();\n\n const startTime = Date.now();\n logger.info(`📤 [LocalStorageProvider] 开始上传文件: ${filePath}`);\n\n try {\n // 生成完整文件路径\n const fullPath = this.getFullPath(filePath);\n\n // 确保父目录存在\n await this.ensureDirectoryExists(path.dirname(fullPath));\n\n // 将File对象转换为Buffer\n const buffer = Buffer.from(await fileInfo.file.arrayBuffer());\n\n // 写入文件\n await fs.writeFile(fullPath, buffer);\n\n // 验证文件写入\n const stats = await fs.stat(fullPath);\n\n if (stats.size !== fileInfo.file.size) {\n throw new StorageProviderError(\n `文件大小不匹配: 期望 ${fileInfo.file.size}, 实际 ${stats.size}`\n );\n }\n\n // 生成访问URL\n const accessUrl = this.generateAccessUrl(filePath);\n\n const uploadTime = Date.now() - startTime;\n logger.info(`✅ [LocalStorageProvider] 文件上传完成: ${filePath}, 耗时: ${uploadTime}ms`);\n\n return {\n success: true,\n path: filePath,\n url: accessUrl,\n size: stats.size,\n data: {\n fullPath,\n uploadTime,\n },\n };\n } catch (error) {\n logger.error(`❌ [LocalStorageProvider] 文件上传失败: ${filePath}:`, error);\n\n return {\n success: false,\n error: error instanceof Error ? error.message : '上传失败',\n };\n }\n }\n\n /**\n * 下载文件\n */\n async download(path: string): Promise<Buffer> {\n this.ensureInitialized();\n\n logger.info(`📥 [LocalStorageProvider] 开始下载文件: ${path}`);\n\n try {\n const fullPath = this.getFullPath(path);\n\n // 检查文件是否存在\n if (!existsSync(fullPath)) {\n throw new StorageProviderError(`文件不存在: ${path}`);\n }\n\n // 读取文件\n const buffer = await fs.readFile(fullPath);\n\n logger.info(`✅ [LocalStorageProvider] 文件下载完成: ${path}, 大小: ${buffer.length}`);\n\n return buffer;\n } catch (error) {\n logger.error(`❌ [LocalStorageProvider] 文件下载失败: ${path}:`, error);\n throw new StorageProviderError(\n `文件下载失败: ${error instanceof Error ? error.message : '未知错误'}`\n );\n }\n }\n\n /**\n * 删除文件\n */\n async delete(path: string): Promise<StorageResult> {\n this.ensureInitialized();\n\n logger.info(`🗑️ [LocalStorageProvider] 开始删除文件: ${path}`);\n\n try {\n const fullPath = this.getFullPath(path);\n\n // 检查文件是否存在\n if (!existsSync(fullPath)) {\n logger.warn(`⚠️ [LocalStorageProvider] 文件不存在: ${path}`);\n return {\n success: true, // 文件不存在也视为删除成功\n data: { reason: 'file_not_exists' },\n };\n }\n\n // 删除文件\n await fs.unlink(fullPath);\n\n logger.info(`✅ [LocalStorageProvider] 文件删除完成: ${path}`);\n\n return {\n success: true,\n data: { deletedPath: fullPath },\n };\n } catch (error) {\n logger.error(`❌ [LocalStorageProvider] 文件删除失败: ${path}:`, error);\n\n return {\n success: false,\n error: error instanceof Error ? error.message : '删除失败',\n };\n }\n }\n\n /**\n * 获取文件信息\n */\n async getFileInfo(path: string): Promise<StorageResult> {\n this.ensureInitialized();\n\n try {\n const fullPath = this.getFullPath(path);\n\n if (!existsSync(fullPath)) {\n return {\n success: false,\n error: '文件不存在',\n };\n }\n\n const stats = await fs.stat(fullPath);\n\n return {\n success: true,\n size: stats.size,\n data: {\n fullPath,\n size: stats.size,\n mtime: stats.mtime,\n ctime: stats.ctime,\n isFile: stats.isFile(),\n isDirectory: stats.isDirectory(),\n },\n };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : '获取文件信息失败',\n };\n }\n }\n\n /**\n * 生成访问URL\n */\n async getAccessUrl(path: string, _expiresIn?: number): Promise<string> {\n this.ensureInitialized();\n\n // 本地存储不支持过期时间,忽略expiresIn参数\n return this.generateAccessUrl(path);\n }\n\n /**\n * 生成预签名上传URL\n */\n async getUploadUrl(path: string, _expiresIn?: number): Promise<string> {\n this.ensureInitialized();\n\n // 本地存储不支持预签名上传,返回普通访问URL\n logger.warn(`⚠️ [LocalStorageProvider] 本地存储不支持预签名上传URL`);\n return this.generateAccessUrl(path);\n }\n\n /**\n * 检查文件是否存在\n */\n async exists(path: string): Promise<boolean> {\n this.ensureInitialized();\n\n try {\n const fullPath = this.getFullPath(path);\n return existsSync(fullPath);\n } catch {\n return false;\n }\n }\n\n /**\n * 列出文件\n */\n async list(prefix: string, maxKeys?: number): Promise<string[]> {\n this.ensureInitialized();\n\n try {\n const fullPrefix = this.getFullPath(prefix);\n const baseDir = path.dirname(fullPrefix);\n const filePattern = path.basename(fullPrefix);\n\n if (!existsSync(baseDir)) {\n return [];\n }\n\n const entries = await fs.readdir(baseDir, { withFileTypes: true });\n let files = entries\n .filter((entry) => entry.isFile())\n .map((entry) => entry.name)\n .filter((name) => name.startsWith(filePattern))\n .map((name) => path.join(path.dirname(prefix), name));\n\n // 限制返回数量\n if (maxKeys && maxKeys > 0) {\n files = files.slice(0, maxKeys);\n }\n\n return files;\n } catch (error) {\n logger.error(`❌ [LocalStorageProvider] 列出文件失败: ${prefix}:`, error);\n return [];\n }\n }\n\n // ============= 私有方法 =============\n\n /**\n * 确保已初始化\n */\n private ensureInitialized(): void {\n if (!this.isInitialized || !this.config) {\n throw new StorageProviderError('存储提供者未初始化');\n }\n }\n\n /**\n * 获取完整文件路径\n */\n private getFullPath(relativePath: string): string {\n if (!this.config) {\n throw new StorageProviderError('存储提供者未初始化');\n }\n\n // 防止路径遍历攻击\n const normalizedPath = path.normalize(relativePath);\n if (normalizedPath.includes('..')) {\n throw new StorageProviderError('非法路径:不允许使用父目录引用');\n }\n\n return path.join(this.config.rootPath, normalizedPath);\n }\n\n /**\n * 生成访问URL\n */\n private generateAccessUrl(relativePath: string): string {\n if (!this.config) {\n throw new StorageProviderError('存储提供者未初始化');\n }\n\n // 规范化路径分隔符为URL格式\n const urlPath = relativePath.replace(/\\\\/g, '/');\n\n // 确保URL路径以/开头\n const normalizedUrlPath = urlPath.startsWith('/') ? urlPath : `/${urlPath}`;\n\n return `${this.config.baseUrl}${normalizedUrlPath}`;\n }\n\n /**\n * 确保目录存在\n */\n private async ensureDirectoryExists(dirPath: string): Promise<void> {\n try {\n await fs.mkdir(dirPath, { recursive: true });\n } catch (error) {\n // 如果目录已存在,忽略错误\n if (error instanceof Error && 'code' in error && error.code !== 'EEXIST') {\n throw error;\n }\n }\n }\n\n /**\n * 验证目录访问权限\n */\n private async validateDirectoryAccess(dirPath: string): Promise<void> {\n try {\n // 检查读写权限\n await fs.access(dirPath, fs.constants.R_OK | fs.constants.W_OK);\n } catch (error) {\n throw new StorageProviderError(\n `目录访问权限不足: ${dirPath}, ${error instanceof Error ? error.message : '未知错误'}`\n );\n }\n }\n\n /**\n * 流式上传大文件(可选实现)\n */\n async uploadStream(\n readableStream: NodeJS.ReadableStream,\n filePath: string\n ): Promise<StorageResult> {\n this.ensureInitialized();\n\n const startTime = Date.now();\n logger.info(`📤 [LocalStorageProvider] 开始流式上传文件: ${filePath}`);\n\n try {\n const fullPath = this.getFullPath(filePath);\n\n // 确保父目录存在\n await this.ensureDirectoryExists(path.dirname(fullPath));\n\n // 创建写入流\n const writeStream = createWriteStream(fullPath);\n\n // 使用pipeline进行流式传输\n await pipeline(readableStream, writeStream);\n\n // 获取文件信息\n const stats = await fs.stat(fullPath);\n\n // 生成访问URL\n const accessUrl = this.generateAccessUrl(filePath);\n\n const uploadTime = Date.now() - startTime;\n logger.info(\n `✅ [LocalStorageProvider] 流式上传完成: ${filePath}, 大小: ${stats.size}, 耗时: ${uploadTime}ms`\n );\n\n return {\n success: true,\n path: filePath,\n url: accessUrl,\n size: stats.size,\n data: {\n fullPath,\n uploadTime,\n },\n };\n } catch (error) {\n logger.error(`❌ [LocalStorageProvider] 流式上传失败: ${filePath}:`, error);\n\n return {\n success: false,\n error: error instanceof Error ? error.message : '流式上传失败',\n };\n }\n }\n\n /**\n * 流式下载大文件(可选实现)\n */\n createDownloadStream(path: string): NodeJS.ReadableStream {\n this.ensureInitialized();\n\n const fullPath = this.getFullPath(path);\n\n if (!existsSync(fullPath)) {\n throw new StorageProviderError(`文件不存在: ${path}`);\n }\n\n return createReadStream(fullPath);\n }\n}\n\n"]}