@futpib/parser 1.0.1 → 1.0.3

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 (425) hide show
  1. package/.github/copilot-instructions.md +149 -0
  2. package/.github/workflows/copilot-setup-steps.yml +18 -0
  3. package/.github/workflows/main.yml +29 -8
  4. package/.yarn/releases/yarn-4.9.4.cjs +942 -0
  5. package/.yarnrc.yml +1 -1
  6. package/build/allSettledStream.js +32 -14
  7. package/build/allSettledStream.test.js +32 -0
  8. package/build/androidPackage.d.ts +39 -0
  9. package/build/androidPackageParser.d.ts +17 -0
  10. package/build/androidPackageParser.js +185 -0
  11. package/build/androidPackageParser.test.js +22 -0
  12. package/build/androidPackageUnparser.d.ts +4 -0
  13. package/build/androidPackageUnparser.js +94 -0
  14. package/build/androidPackageUnparser.test.js +26 -0
  15. package/build/arbitrarilySlicedAsyncInterable.d.ts +3 -1
  16. package/build/arbitrarilySlicedAsyncInterable.js +3 -3
  17. package/build/arbitrarilySlicedAsyncInterator.js +2 -1
  18. package/build/arbitraryDalvikBytecode.d.ts +4 -0
  19. package/build/arbitraryDalvikBytecode.js +640 -0
  20. package/build/arbitraryDalvikExecutable.d.ts +3 -0
  21. package/build/arbitraryDalvikExecutable.js +282 -0
  22. package/build/arbitraryDosDateTime.js +1 -0
  23. package/build/arbitraryZipStream.js +1 -1
  24. package/build/arrayParser.js +2 -2
  25. package/build/arrayParser.test.js +3 -3
  26. package/build/arrayUnparser.d.ts +1 -1
  27. package/build/backsmali.d.ts +3 -0
  28. package/build/backsmali.js +50 -0
  29. package/build/bsonParser.js +6 -2
  30. package/build/customInvariant.d.ts +2 -1
  31. package/build/customInvariant.js +4 -6
  32. package/build/dalvikBytecodeParser/formatParsers.d.ts +171 -0
  33. package/build/dalvikBytecodeParser/formatParsers.js +304 -0
  34. package/build/dalvikBytecodeParser/formatSizes.d.ts +34 -0
  35. package/build/dalvikBytecodeParser/formatSizes.js +34 -0
  36. package/build/dalvikBytecodeParser/operationFormats.d.ts +225 -0
  37. package/build/dalvikBytecodeParser/operationFormats.js +225 -0
  38. package/build/dalvikBytecodeParser.d.ts +1207 -0
  39. package/build/dalvikBytecodeParser.js +1289 -0
  40. package/build/dalvikBytecodeUnparser/formatUnparsers.d.ts +152 -0
  41. package/build/dalvikBytecodeUnparser/formatUnparsers.js +225 -0
  42. package/build/dalvikBytecodeUnparser.d.ts +3 -0
  43. package/build/dalvikBytecodeUnparser.js +642 -0
  44. package/build/dalvikBytecodeUnparser.test.js +25 -0
  45. package/build/dalvikExecutable.d.ts +215 -0
  46. package/build/dalvikExecutable.js +56 -0
  47. package/build/dalvikExecutableParser/stringSyntaxParser.d.ts +4 -0
  48. package/build/dalvikExecutableParser/stringSyntaxParser.js +76 -0
  49. package/build/dalvikExecutableParser/typeParsers.d.ts +11 -0
  50. package/build/dalvikExecutableParser/typeParsers.js +39 -0
  51. package/build/dalvikExecutableParser/typedNumbers.d.ts +106 -0
  52. package/build/dalvikExecutableParser/typedNumbers.js +18 -0
  53. package/build/dalvikExecutableParser.d.ts +5 -0
  54. package/build/dalvikExecutableParser.js +1757 -0
  55. package/build/dalvikExecutableParser.test.js +72 -0
  56. package/build/dalvikExecutableParserAgainstSmaliParser.test.js +275 -0
  57. package/build/dalvikExecutableUnparser/annotationUnparsers.d.ts +14 -0
  58. package/build/dalvikExecutableUnparser/annotationUnparsers.js +97 -0
  59. package/build/dalvikExecutableUnparser/poolBuilders.d.ts +49 -0
  60. package/build/dalvikExecutableUnparser/poolBuilders.js +140 -0
  61. package/build/dalvikExecutableUnparser/poolScanners.d.ts +4 -0
  62. package/build/dalvikExecutableUnparser/poolScanners.js +220 -0
  63. package/build/dalvikExecutableUnparser/sectionUnparsers.d.ts +25 -0
  64. package/build/dalvikExecutableUnparser/sectionUnparsers.js +581 -0
  65. package/build/dalvikExecutableUnparser/utils.d.ts +10 -0
  66. package/build/dalvikExecutableUnparser/utils.js +108 -0
  67. package/build/dalvikExecutableUnparser.d.ts +4 -0
  68. package/build/dalvikExecutableUnparser.js +406 -0
  69. package/build/dalvikExecutableUnparser.test.js +31 -0
  70. package/build/debugLogInputParser.d.ts +4 -0
  71. package/build/debugLogInputParser.js +16 -0
  72. package/build/debugLogParser.js +14 -3
  73. package/build/disjunctionParser.d.ts +2 -1
  74. package/build/disjunctionParser.js +6 -4
  75. package/build/elementTerminatedArrayParser.d.ts +3 -0
  76. package/build/elementTerminatedArrayParser.js +18 -0
  77. package/build/elementTerminatedArrayParser.test.js +52 -0
  78. package/build/elementTerminatedSequenceArrayParser.d.ts +3 -0
  79. package/build/elementTerminatedSequenceArrayParser.js +32 -0
  80. package/build/elementTerminatedSequenceArrayParser.test.js +34 -0
  81. package/build/elementTerminatedSequenceParser.d.ts +3 -0
  82. package/build/elementTerminatedSequenceParser.js +27 -0
  83. package/build/elementTerminatedSequenceParser.test.js +34 -0
  84. package/build/endOfInputParser.d.ts +1 -1
  85. package/build/exactElementParser.js +10 -5
  86. package/build/exactElementSwitchParser.d.ts +3 -0
  87. package/build/exactElementSwitchParser.js +22 -0
  88. package/build/exactSequenceParser.d.ts +2 -1
  89. package/build/exactSequenceParser.js +12 -2
  90. package/build/fetchCid.d.ts +1 -0
  91. package/build/fetchCid.js +103 -0
  92. package/build/fetchCid.test.js +16 -0
  93. package/build/fixedLengthSequenceParser.d.ts +1 -0
  94. package/build/fixedLengthSequenceParser.js +18 -1
  95. package/build/fixedLengthSequenceParser.test.js +41 -0
  96. package/build/hasExecutable.d.ts +1 -0
  97. package/build/hasExecutable.js +8 -0
  98. package/build/highResolutionTimer.d.ts +16 -0
  99. package/build/highResolutionTimer.js +42 -0
  100. package/build/inputReader.d.ts +11 -0
  101. package/build/inputReader.js +37 -0
  102. package/build/inputReader.test.js +161 -8
  103. package/build/inputReaderState.d.ts +10 -0
  104. package/build/inputReaderState.js +16 -0
  105. package/build/inspect.d.ts +1 -0
  106. package/build/inspect.js +7 -0
  107. package/build/javaKeyStoreParser.test.js +8 -8
  108. package/build/jsonParser.d.ts +2 -0
  109. package/build/jsonParser.js +19 -22
  110. package/build/lazyMessageError.d.ts +48 -0
  111. package/build/lazyMessageError.js +53 -0
  112. package/build/lazyMessageError.test.d.ts +1 -0
  113. package/build/lazyMessageError.test.js +15 -0
  114. package/build/leb128Parser.d.ts +7 -0
  115. package/build/leb128Parser.js +82 -0
  116. package/build/leb128Parser.test.d.ts +1 -0
  117. package/build/leb128Parser.test.js +107 -0
  118. package/build/lookaheadParser.d.ts +2 -0
  119. package/build/lookaheadParser.js +14 -0
  120. package/build/negativeLookaheadParser.js +22 -16
  121. package/build/negativeLookaheadParser.test.d.ts +1 -0
  122. package/build/negativeLookaheadParser.test.js +30 -0
  123. package/build/noStackCaptureOverheadError.d.ts +4 -0
  124. package/build/noStackCaptureOverheadError.js +9 -0
  125. package/build/noStackCaptureOverheadError.test.d.ts +1 -0
  126. package/build/noStackCaptureOverheadError.test.js +15 -0
  127. package/build/nonEmptyArrayParser.d.ts +2 -0
  128. package/build/nonEmptyArrayParser.js +32 -0
  129. package/build/nonEmptyArrayParser.test.d.ts +1 -0
  130. package/build/nonEmptyArrayParser.test.js +17 -0
  131. package/build/optionalParser.js +2 -2
  132. package/build/parser.d.ts +11 -1
  133. package/build/parser.js +82 -32
  134. package/build/parser.test.js +141 -25
  135. package/build/parserAccessorParser.js +9 -1
  136. package/build/parserConsumedSequenceParser.d.ts +1 -1
  137. package/build/parserConsumedSequenceParser.js +21 -16
  138. package/build/parserContext.d.ts +22 -6
  139. package/build/parserContext.js +113 -57
  140. package/build/parserContext.test.js +33 -2
  141. package/build/parserCreatorCompose.d.ts +1 -0
  142. package/build/parserCreatorCompose.js +8 -2
  143. package/build/parserError.d.ts +605 -40
  144. package/build/parserError.js +98 -53
  145. package/build/parserImplementationInvariant.d.ts +1 -1
  146. package/build/parserImplementationInvariant.js +2 -2
  147. package/build/parserInputCompanion.d.ts +15 -0
  148. package/build/parserInputCompanion.js +38 -0
  149. package/build/promiseCompose.d.ts +1 -1
  150. package/build/promiseCompose.js +11 -1
  151. package/build/promiseSettled.d.ts +1 -0
  152. package/build/promiseSettled.js +4 -0
  153. package/build/separatedArrayParser.d.ts +2 -0
  154. package/build/separatedArrayParser.js +39 -0
  155. package/build/separatedArrayParser.test.d.ts +1 -0
  156. package/build/separatedArrayParser.test.js +21 -0
  157. package/build/separatedNonEmptyArrayParser.d.ts +2 -0
  158. package/build/separatedNonEmptyArrayParser.js +40 -0
  159. package/build/separatedNonEmptyArrayParser.test.d.ts +1 -0
  160. package/build/separatedNonEmptyArrayParser.test.js +66 -0
  161. package/build/sequenceBuffer.d.ts +10 -0
  162. package/build/sequenceBuffer.js +54 -2
  163. package/build/sequenceBuffer.test.js +57 -0
  164. package/build/sequenceTerminatedSequenceParser.d.ts +5 -0
  165. package/build/sequenceTerminatedSequenceParser.js +32 -0
  166. package/build/sequenceTerminatedSequenceParser.test.d.ts +1 -0
  167. package/build/sequenceTerminatedSequenceParser.test.js +37 -0
  168. package/build/sequenceUnparser.d.ts +1 -1
  169. package/build/skipParser.d.ts +1 -1
  170. package/build/skipParser.js +4 -2
  171. package/build/skipToParser.d.ts +2 -0
  172. package/build/skipToParser.js +11 -0
  173. package/build/sliceBoundedParser.d.ts +1 -1
  174. package/build/sliceBoundedParser.js +7 -2
  175. package/build/sliceBoundedParser.test.js +30 -1
  176. package/build/smali.d.ts +1 -0
  177. package/build/smali.js +21 -0
  178. package/build/smaliParser.d.ts +68 -0
  179. package/build/smaliParser.js +2081 -0
  180. package/build/smaliParser.test.d.ts +1 -0
  181. package/build/smaliParser.test.js +410 -0
  182. package/build/stringFromAsyncIterable.d.ts +1 -0
  183. package/build/stringFromAsyncIterable.js +7 -0
  184. package/build/terminatedArrayParser.d.ts +3 -1
  185. package/build/terminatedArrayParser.js +79 -2
  186. package/build/terminatedArrayParser.test.d.ts +1 -0
  187. package/build/terminatedArrayParser.test.js +131 -0
  188. package/build/toAsyncIterable.d.ts +1 -0
  189. package/build/toAsyncIterable.js +7 -0
  190. package/build/toAsyncIterator.d.ts +1 -0
  191. package/build/toAsyncIterator.js +33 -0
  192. package/build/tupleParser.d.ts +4 -0
  193. package/build/tupleParser.js +1 -5
  194. package/build/unionParser.d.ts +2 -1
  195. package/build/unionParser.js +29 -14
  196. package/build/unionParser.test.d.ts +1 -0
  197. package/build/unionParser.test.js +60 -0
  198. package/build/unparser.d.ts +3 -3
  199. package/build/unparser.js +6 -4
  200. package/build/unparser.test.js +7 -19
  201. package/build/unparserContext.d.ts +2 -2
  202. package/build/unparserContext.js +2 -3
  203. package/build/unparserError.d.ts +2 -1
  204. package/build/unparserError.js +2 -1
  205. package/build/unparserImplementationInvariant.d.ts +1 -1
  206. package/build/unparserOutputCompanion.d.ts +1 -1
  207. package/build/unparserOutputCompanion.js +1 -1
  208. package/build/zipParser.d.ts +7 -2
  209. package/build/zipParser.js +36 -12
  210. package/build/zipUnparser.d.ts +7 -4
  211. package/build/zipUnparser.js +64 -45
  212. package/build/zipUnparser.test.js +15 -15
  213. package/package.json +33 -24
  214. package/src/allSettledStream.test.ts +40 -0
  215. package/src/allSettledStream.ts +47 -15
  216. package/src/androidPackage.ts +48 -0
  217. package/src/androidPackageParser.test.ts +27 -0
  218. package/src/{apkParser.test.ts.md → androidPackageParser.test.ts.md} +4 -4
  219. package/src/androidPackageParser.test.ts.snap +0 -0
  220. package/src/androidPackageParser.ts +398 -0
  221. package/src/androidPackageUnparser.test.ts +34 -0
  222. package/src/androidPackageUnparser.ts +126 -0
  223. package/src/arbitrarilySlicedAsyncInterable.ts +7 -2
  224. package/src/arbitrarilySlicedAsyncInterator.ts +4 -4
  225. package/src/arbitraryDalvikBytecode.ts +992 -0
  226. package/src/arbitraryDalvikExecutable.ts +434 -0
  227. package/src/arbitraryDosDateTime.ts +1 -0
  228. package/src/arbitraryZipStream.ts +1 -1
  229. package/src/arrayParser.test.ts +3 -3
  230. package/src/arrayParser.ts +2 -2
  231. package/src/arrayUnparser.ts +2 -2
  232. package/src/backsmali.ts +74 -0
  233. package/src/bsonParser.test.ts +12 -14
  234. package/src/bsonParser.ts +13 -2
  235. package/src/customInvariant.ts +8 -12
  236. package/src/dalvikBytecodeParser/formatParsers.ts +780 -0
  237. package/src/dalvikBytecodeParser/formatSizes.ts +35 -0
  238. package/src/dalvikBytecodeParser/operationFormats.ts +226 -0
  239. package/src/dalvikBytecodeParser.ts +2873 -0
  240. package/src/dalvikBytecodeUnparser/formatUnparsers.ts +442 -0
  241. package/src/dalvikBytecodeUnparser.test.ts +44 -0
  242. package/src/dalvikBytecodeUnparser.ts +758 -0
  243. package/src/dalvikExecutable.ts +282 -0
  244. package/src/dalvikExecutableParser/stringSyntaxParser.ts +145 -0
  245. package/src/dalvikExecutableParser/typeParsers.ts +74 -0
  246. package/src/dalvikExecutableParser/typedNumbers.ts +57 -0
  247. package/src/dalvikExecutableParser.test.ts +89 -0
  248. package/src/dalvikExecutableParser.test.ts.md +634 -0
  249. package/src/dalvikExecutableParser.test.ts.snap +0 -0
  250. package/src/dalvikExecutableParser.ts +3245 -0
  251. package/src/dalvikExecutableParserAgainstSmaliParser.test.ts +363 -0
  252. package/src/dalvikExecutableUnparser/annotationUnparsers.ts +135 -0
  253. package/src/dalvikExecutableUnparser/poolBuilders.ts +189 -0
  254. package/src/dalvikExecutableUnparser/poolScanners.ts +297 -0
  255. package/src/dalvikExecutableUnparser/sectionUnparsers.ts +683 -0
  256. package/src/dalvikExecutableUnparser/utils.ts +149 -0
  257. package/src/dalvikExecutableUnparser.test.ts +57 -0
  258. package/src/dalvikExecutableUnparser.ts +581 -0
  259. package/src/debugLogInputParser.ts +28 -0
  260. package/src/debugLogParser.ts +19 -3
  261. package/src/disjunctionParser.ts +12 -7
  262. package/src/elementTerminatedArrayParser.test.ts +99 -0
  263. package/src/elementTerminatedArrayParser.ts +31 -0
  264. package/src/elementTerminatedSequenceArrayParser.test.ts +52 -0
  265. package/src/elementTerminatedSequenceArrayParser.ts +52 -0
  266. package/src/elementTerminatedSequenceParser.test.ts +52 -0
  267. package/src/elementTerminatedSequenceParser.ts +43 -0
  268. package/src/endOfInputParser.ts +1 -1
  269. package/src/exactElementParser.ts +17 -11
  270. package/src/exactElementSwitchParser.ts +41 -0
  271. package/src/exactSequenceParser.ts +23 -2
  272. package/src/fetchCid.test.ts +20 -0
  273. package/src/fetchCid.ts +121 -0
  274. package/src/fixedLengthSequenceParser.test.ts +75 -0
  275. package/src/fixedLengthSequenceParser.ts +28 -1
  276. package/src/hasExecutable.ts +11 -0
  277. package/src/highResolutionTimer.ts +49 -0
  278. package/src/inputReader.test.ts +204 -8
  279. package/src/inputReader.ts +76 -3
  280. package/src/inputReaderState.ts +33 -0
  281. package/src/inspect.ts +9 -0
  282. package/src/javaKeyStoreParser.test.ts +12 -15
  283. package/src/javaKeyStoreParser.ts +2 -6
  284. package/src/jsonParser.test.ts +2 -4
  285. package/src/jsonParser.ts +46 -62
  286. package/src/lazyMessageError.test.ts +21 -0
  287. package/src/lazyMessageError.ts +88 -0
  288. package/src/leb128Parser.test.ts +173 -0
  289. package/src/leb128Parser.ts +125 -0
  290. package/src/lookaheadParser.ts +19 -0
  291. package/src/negativeLookaheadParser.test.ts +49 -0
  292. package/src/negativeLookaheadParser.ts +27 -15
  293. package/src/noStackCaptureOverheadError.test.ts +17 -0
  294. package/src/noStackCaptureOverheadError.ts +12 -0
  295. package/src/nonEmptyArrayParser.test.ts +21 -0
  296. package/src/nonEmptyArrayParser.ts +44 -0
  297. package/src/optionalParser.ts +3 -2
  298. package/src/parser.test.ts +203 -31
  299. package/src/parser.test.ts.md +34 -27
  300. package/src/parser.test.ts.snap +0 -0
  301. package/src/parser.ts +172 -45
  302. package/src/parserAccessorParser.ts +12 -2
  303. package/src/parserConsumedSequenceParser.ts +26 -17
  304. package/src/parserContext.test.ts +37 -2
  305. package/src/parserContext.ts +185 -79
  306. package/src/parserCreatorCompose.ts +20 -2
  307. package/src/parserError.ts +144 -61
  308. package/src/parserImplementationInvariant.ts +3 -3
  309. package/src/parserInputCompanion.ts +55 -0
  310. package/src/promiseCompose.ts +17 -3
  311. package/src/promiseSettled.ts +6 -0
  312. package/src/separatedArrayParser.test.ts +34 -0
  313. package/src/separatedArrayParser.ts +55 -0
  314. package/src/separatedNonEmptyArrayParser.test.ts +117 -0
  315. package/src/separatedNonEmptyArrayParser.ts +61 -0
  316. package/src/sequenceBuffer.test.ts +70 -0
  317. package/src/sequenceBuffer.ts +88 -2
  318. package/src/sequenceTerminatedSequenceParser.test.ts +58 -0
  319. package/src/sequenceTerminatedSequenceParser.ts +62 -0
  320. package/src/sequenceUnparser.ts +2 -2
  321. package/src/skipParser.ts +7 -5
  322. package/src/skipToParser.ts +16 -0
  323. package/src/sliceBoundedParser.test.ts +35 -1
  324. package/src/sliceBoundedParser.ts +19 -1
  325. package/src/smali.ts +29 -0
  326. package/src/smaliParser.test.ts +443 -0
  327. package/src/smaliParser.test.ts.md +3907 -0
  328. package/src/smaliParser.test.ts.snap +0 -0
  329. package/src/smaliParser.ts +3348 -0
  330. package/src/stringFromAsyncIterable.ts +9 -0
  331. package/src/terminatedArrayParser.test.ts +258 -0
  332. package/src/terminatedArrayParser.ts +109 -6
  333. package/src/toAsyncIterable.ts +7 -0
  334. package/src/toAsyncIterator.ts +48 -0
  335. package/src/tupleParser.ts +8 -5
  336. package/src/uint8Array.ts +2 -3
  337. package/src/unionParser.test.ts +78 -0
  338. package/src/unionParser.ts +47 -21
  339. package/src/unparser.test.ts +18 -34
  340. package/src/unparser.ts +13 -9
  341. package/src/unparserContext.ts +9 -13
  342. package/src/unparserError.ts +2 -1
  343. package/src/unparserImplementationInvariant.ts +1 -1
  344. package/src/unparserOutputCompanion.ts +1 -1
  345. package/src/zip.ts +2 -6
  346. package/src/zipParser.ts +71 -20
  347. package/src/zipUnparser.test.ts +19 -19
  348. package/src/zipUnparser.ts +139 -90
  349. package/tsconfig.json +7 -1
  350. package/xo.config.ts +15 -0
  351. package/.yarn/releases/yarn-4.5.3.cjs +0 -934
  352. package/build/apk.d.ts +0 -39
  353. package/build/apkParser.d.ts +0 -16
  354. package/build/apkParser.js +0 -164
  355. package/build/apkParser.test.js +0 -22
  356. package/build/apkUnparser.d.ts +0 -4
  357. package/build/apkUnparser.js +0 -90
  358. package/build/apkUnparser.test.js +0 -26
  359. package/build/arbitraryDosDate.d.ts +0 -2
  360. package/build/arbitraryDosDate.js +0 -8
  361. package/build/arbitraryZipEntry.d.ts +0 -3
  362. package/build/arbitraryZipEntry.js +0 -26
  363. package/build/createDisjunctionParser.d.ts +0 -2
  364. package/build/createDisjunctionParser.js +0 -47
  365. package/build/createExactParser.d.ts +0 -2
  366. package/build/createExactParser.js +0 -12
  367. package/build/createSequentialUnionParser.d.ts +0 -2
  368. package/build/createSequentialUnionParser.js +0 -69
  369. package/build/fixedLengthChunkParser.d.ts +0 -2
  370. package/build/fixedLengthChunkParser.js +0 -12
  371. package/build/fixedLengthParser.d.ts +0 -2
  372. package/build/fixedLengthParser.js +0 -12
  373. package/build/inputChunkBuffer.d.ts +0 -15
  374. package/build/inputChunkBuffer.js +0 -40
  375. package/build/inputChunkBuffer.test.js +0 -34
  376. package/build/inputCompanion.d.ts +0 -18
  377. package/build/inputCompanion.js +0 -28
  378. package/build/invariantDefined.d.ts +0 -1
  379. package/build/invariantDefined.js +0 -5
  380. package/build/invariantIdentity.d.ts +0 -3
  381. package/build/invariantIdentity.js +0 -5
  382. package/build/javaKeystoreParser.d.ts +0 -2
  383. package/build/javaKeystoreParser.js +0 -7
  384. package/build/jsonParser2.d.ts +0 -3
  385. package/build/jsonParser2.js +0 -52
  386. package/build/jsonParser2.test.js +0 -22
  387. package/build/negativeLookahead.d.ts +0 -2
  388. package/build/negativeLookahead.js +0 -18
  389. package/build/parserCompose.d.ts +0 -3
  390. package/build/parserCompose.js +0 -7
  391. package/build/parserImplementationInvariantInvariant.d.ts +0 -3
  392. package/build/parserImplementationInvariantInvariant.js +0 -15
  393. package/build/parserInvariant.d.ts +0 -4
  394. package/build/parserInvariant.js +0 -11
  395. package/build/promiseFish.d.ts +0 -1
  396. package/build/promiseFish.js +0 -3
  397. package/build/sequenceParser.d.ts +0 -3
  398. package/build/sequenceParser.js +0 -10
  399. package/build/terminatedSequenceParser.d.ts +0 -2
  400. package/build/terminatedSequenceParser.js +0 -24
  401. package/build/unparserInputCompanion.d.ts +0 -15
  402. package/build/unparserInputCompanion.js +0 -13
  403. package/build/zipEntry.d.ts +0 -28
  404. package/build/zipFile.d.ts +0 -32
  405. package/build/zipFileEntry.d.ts +0 -6
  406. package/src/apk.ts +0 -48
  407. package/src/apkParser.test.ts +0 -30
  408. package/src/apkParser.test.ts.snap +0 -0
  409. package/src/apkParser.ts +0 -392
  410. package/src/apkUnparser.test.ts +0 -37
  411. package/src/apkUnparser.ts +0 -120
  412. package/src/invariantDefined.ts +0 -6
  413. package/src/invariantIdentity.ts +0 -8
  414. /package/build/{apk.js → androidPackage.js} +0 -0
  415. /package/build/{apkParser.test.d.ts → androidPackageParser.test.d.ts} +0 -0
  416. /package/build/{apkUnparser.test.d.ts → androidPackageUnparser.test.d.ts} +0 -0
  417. /package/build/{arbitraryDosPermissions.d.ts → dalvikBytecodeUnparser.test.d.ts} +0 -0
  418. /package/build/{arbitraryDosPermissions.js → dalvikExecutableParser.test.d.ts} +0 -0
  419. /package/build/{inputChunkBuffer.test.d.ts → dalvikExecutableParserAgainstSmaliParser.test.d.ts} +0 -0
  420. /package/build/{jsonParser2.test.d.ts → dalvikExecutableUnparser.test.d.ts} +0 -0
  421. /package/build/{parserParsingInvariant.d.ts → elementTerminatedArrayParser.test.d.ts} +0 -0
  422. /package/build/{parserParsingInvariant.js → elementTerminatedSequenceArrayParser.test.d.ts} +0 -0
  423. /package/build/{zipEntry.js → elementTerminatedSequenceParser.test.d.ts} +0 -0
  424. /package/build/{zipFile.js → fetchCid.test.d.ts} +0 -0
  425. /package/build/{zipFileEntry.js → fixedLengthSequenceParser.test.d.ts} +0 -0
package/.yarnrc.yml CHANGED
@@ -4,4 +4,4 @@ enableGlobalCache: false
4
4
 
5
5
  nodeLinker: node-modules
6
6
 
7
- yarnPath: .yarn/releases/yarn-4.5.3.cjs
7
+ yarnPath: .yarn/releases/yarn-4.9.4.cjs
@@ -1,21 +1,39 @@
1
+ import { promiseSettled } from './promiseSettled.js';
1
2
  export function allSettledStream(tasks) {
3
+ let cancelled = false;
2
4
  return new ReadableStream({
3
- async start(controller) {
5
+ start(controller) {
6
+ const startStack = ((new Error('allSettledStream ReadableStream start stack holder').stack ?? '')
7
+ .split('\n')
8
+ .slice(1)
9
+ .join('\n'));
10
+ const allSettledStreamTaskAwaiter = async ({ promise, context, }) => {
11
+ const promiseSettledResult = await promiseSettled(promise);
12
+ if (promiseSettledResult.status === 'rejected'
13
+ && promiseSettledResult.reason instanceof Error
14
+ && promiseSettledResult.reason.stack) {
15
+ promiseSettledResult.reason.stack += `\n${startStack}`;
16
+ }
17
+ settledCount++;
18
+ if (cancelled) {
19
+ return;
20
+ }
21
+ const allSettedStreamResult = {
22
+ ...promiseSettledResult,
23
+ context,
24
+ };
25
+ controller.enqueue(allSettedStreamResult);
26
+ if (settledCount === tasks.length) {
27
+ controller.close();
28
+ }
29
+ };
4
30
  let settledCount = 0;
5
- for (const { promise, context } of tasks) {
6
- (async () => {
7
- const [promiseSettledResult] = await Promise.allSettled([promise]);
8
- settledCount++;
9
- const allSettedStreamResult = {
10
- ...promiseSettledResult,
11
- context,
12
- };
13
- controller.enqueue(allSettedStreamResult);
14
- if (settledCount === tasks.length) {
15
- controller.close();
16
- }
17
- })();
31
+ for (const task of tasks) {
32
+ allSettledStreamTaskAwaiter(task);
18
33
  }
19
34
  },
35
+ cancel() {
36
+ cancelled = true;
37
+ },
20
38
  });
21
39
  }
@@ -54,3 +54,35 @@ test('allSettledStream', async (t) => {
54
54
  t.snapshot(results);
55
55
  t.is(results.length, 8);
56
56
  });
57
+ test('allSettledStream reader cancel', async (t) => {
58
+ const stream = allSettledStream([
59
+ 10,
60
+ 20,
61
+ 0,
62
+ 40,
63
+ 30,
64
+ ].map(delay => ({
65
+ promise: new Promise(resolve => {
66
+ setTimeout(() => {
67
+ resolve(delay);
68
+ }, delay);
69
+ }),
70
+ context: delay,
71
+ })));
72
+ const results = [];
73
+ for await (const value of stream) {
74
+ results.push(value);
75
+ if (value.context === 30) {
76
+ break;
77
+ }
78
+ }
79
+ await new Promise(resolve => {
80
+ setTimeout(resolve, 50);
81
+ });
82
+ stream.cancel();
83
+ for await (const value of stream) {
84
+ t.fail();
85
+ results.push(value);
86
+ }
87
+ t.deepEqual(results.map(({ context }) => context), [0, 10, 20, 30]);
88
+ });
@@ -0,0 +1,39 @@
1
+ import { type Zip } from './zip.js';
2
+ export type AndroidPackageSigningBlockPair = {
3
+ id: number;
4
+ value: Uint8Array;
5
+ };
6
+ export type AndroidPackageSignatureV2Digest = {
7
+ signatureAlgorithmId: number;
8
+ digest: Uint8Array;
9
+ };
10
+ export type AndroidPackageSignatureV2AdditionalAttribute = {
11
+ id: number;
12
+ value: Uint8Array;
13
+ };
14
+ export type AndroidPackageSignatureV2SignedData = {
15
+ digests: AndroidPackageSignatureV2Digest[];
16
+ certificates: Uint8Array[];
17
+ additionalAttributes: AndroidPackageSignatureV2AdditionalAttribute[];
18
+ zeroPaddingLength?: number;
19
+ };
20
+ export type AndroidPackageSignatureV2Signature = {
21
+ signatureAlgorithmId: number;
22
+ signature: Uint8Array;
23
+ };
24
+ export type AndroidPackageSignatureV2Signer = {
25
+ signedData: AndroidPackageSignatureV2SignedData;
26
+ signatures: AndroidPackageSignatureV2Signature[];
27
+ publicKey: Uint8Array;
28
+ };
29
+ export type AndroidPackageSignatureV2 = {
30
+ signers: AndroidPackageSignatureV2Signer[];
31
+ };
32
+ export type AndroidPackageSigningBlock = {
33
+ pairs: AndroidPackageSigningBlockPair[];
34
+ signatureV2?: AndroidPackageSignatureV2;
35
+ zeroPaddingLength?: number;
36
+ };
37
+ export type AndroidPackage = Zip & {
38
+ signingBlock?: AndroidPackageSigningBlock;
39
+ };
@@ -0,0 +1,17 @@
1
+ import { type Parser } from './parser.js';
2
+ import { type ZipCentralDirectoryHeader, type ZipEndOfCentralDirectoryRecord, type ZipLocalFile } from './zipParser.js';
3
+ import { type AndroidPackage, type AndroidPackageSigningBlock } from './androidPackage.js';
4
+ export declare const androidPackageSigningBlockParser: Parser<AndroidPackageSigningBlock, Uint8Array>;
5
+ export declare const androidPackageParser: Parser<AndroidPackage, Uint8Array>;
6
+ export type AndroidPackageSignableSections = {
7
+ zipLocalFiles: ZipLocalFile[];
8
+ zipLocalFilesZeroPaddingLength: number;
9
+ androidPackageSigningBlock?: AndroidPackageSigningBlock;
10
+ zipCentralDirectory: ZipCentralDirectoryHeader[];
11
+ zipEndOfCentralDirectory: ZipEndOfCentralDirectoryRecord;
12
+ zipLocalFilesUint8Array: Uint8Array;
13
+ androidPackageSigningBlockUint8Array?: Uint8Array;
14
+ zipCentralDirectoryUint8Array: Uint8Array;
15
+ zipEndOfCentralDirectoryUint8Array: Uint8Array;
16
+ };
17
+ export declare const androidPackageSignableSectionsParser: Parser<AndroidPackageSignableSections, Uint8Array>;
@@ -0,0 +1,185 @@
1
+ import invariant from 'invariant';
2
+ import { createArrayParser } from './arrayParser.js';
3
+ import { createOptionalParser } from './optionalParser.js';
4
+ import { setParserName } from './parser.js';
5
+ import { promiseCompose } from './promiseCompose.js';
6
+ import { createTupleParser } from './tupleParser.js';
7
+ import { zip64EndOfCentralDirectoryLocatorParser, zip64EndOfCentralDirectoryRecordParser, zipArchiveDecryptionHeaderParser, zipArchiveExtraDataRecordParser, zipCentralDirectoryHeaderParser, zipEndOfCentralDirectoryRecordParser, zipFromZipSegments, zipLocalFileParser, } from './zipParser.js';
8
+ import { createFixedLengthSequenceParser } from './fixedLengthSequenceParser.js';
9
+ import { parserCreatorCompose } from './parserCreatorCompose.js';
10
+ import { createExactSequenceParser } from './exactSequenceParser.js';
11
+ import { createSliceBoundedParser } from './sliceBoundedParser.js';
12
+ import { createDisjunctionParser } from './disjunctionParser.js';
13
+ import { createExactElementParser } from './exactElementParser.js';
14
+ import { createParserConsumedSequenceParser } from './parserConsumedSequenceParser.js';
15
+ // https://source.android.com/docs/security/features/androidPackagesigning/v2#androidPackage-signing-block
16
+ const uint32LEParser = promiseCompose(createFixedLengthSequenceParser(4), array => Buffer.from(array).readUInt32LE());
17
+ setParserName(uint32LEParser, 'uint32LEParser');
18
+ const uint64LEParser = promiseCompose(createFixedLengthSequenceParser(8), array => Buffer.from(array).readBigUInt64LE());
19
+ setParserName(uint64LEParser, 'uint64LEParser');
20
+ const createUint32LengthPrefixedParser = (createInnerParser) => parserCreatorCompose(() => uint32LEParser, length => createInnerParser(length))();
21
+ const createUint64LengthPrefixedParser = (createInnerParser) => parserCreatorCompose(() => uint64LEParser, length => createInnerParser(length))();
22
+ const createUint32LengthPrefixedSliceBoundedParser = (innerParser) => createUint32LengthPrefixedParser(length => createSliceBoundedParser(innerParser, length));
23
+ const createUint32LengthPrefixedSliceBoundedArrayParser = (innerParser) => createUint32LengthPrefixedSliceBoundedParser(createArrayParser(innerParser));
24
+ const createAndroidPackageSigningBlockZeroPaddingPairInnerParser = (length) => {
25
+ const androidPackageSigningBlockZeroPaddingPairInnerParser = promiseCompose(createTupleParser([
26
+ createExactSequenceParser(Buffer.from('77657242', 'hex')),
27
+ createFixedLengthSequenceParser(length - 4),
28
+ ]), ([_magic, zeroPadding]) => ({ type: 'zeroPadding', length: zeroPadding.length }));
29
+ setParserName(androidPackageSigningBlockZeroPaddingPairInnerParser, 'androidPackageSigningBlockZeroPaddingPairInnerParser');
30
+ return androidPackageSigningBlockZeroPaddingPairInnerParser;
31
+ };
32
+ const createAndroidPackageSigningBlockSignatureV2PairInnerParser = (length) => {
33
+ const androidPackageSigningBlockSignatureV2PairInnerParser = promiseCompose(createTupleParser([
34
+ createExactSequenceParser(Buffer.from('1a870971', 'hex')),
35
+ androidPackageSignatureV2SignersParser,
36
+ ]), ([_magic, signers = []]) => ({ type: 'signatureV2', signers }));
37
+ return setParserName(androidPackageSigningBlockSignatureV2PairInnerParser, 'androidPackageSigningBlockSignatureV2PairInnerParser');
38
+ };
39
+ const createAndroidPackageSigningBlockGenericPairInnerParser = (length) => promiseCompose(createTupleParser([
40
+ uint32LEParser,
41
+ createFixedLengthSequenceParser(length - 4),
42
+ ]), ([id, value]) => ({ type: 'generic', pair: { id, value } }));
43
+ const createAndroidPackageSigningBlockPairInnerParser = (length) => {
44
+ const androidPackageSigningBlockPairInnerParser = promiseCompose(createTupleParser([
45
+ parserContext => {
46
+ parserContext.invariant(Number.isSafeInteger(length), 'Signing block length is unreasonable: %s.', length);
47
+ },
48
+ createDisjunctionParser([
49
+ createAndroidPackageSigningBlockZeroPaddingPairInnerParser(length),
50
+ createAndroidPackageSigningBlockSignatureV2PairInnerParser(length),
51
+ createAndroidPackageSigningBlockGenericPairInnerParser(length),
52
+ ]),
53
+ ]), ([_lengthInvariant, pair,]) => pair);
54
+ setParserName(androidPackageSigningBlockPairInnerParser, 'androidPackageSigningBlockPairInnerParser');
55
+ return androidPackageSigningBlockPairInnerParser;
56
+ };
57
+ const androidPackageSigningBlockPairParser = createUint64LengthPrefixedParser(length => createAndroidPackageSigningBlockPairInnerParser(Number(length)));
58
+ setParserName(androidPackageSigningBlockPairParser, 'androidPackageSigningBlockPairParser');
59
+ const androidPackageSigningBlockPairsParser = createArrayParser(androidPackageSigningBlockPairParser);
60
+ export const androidPackageSigningBlockParser = createUint64LengthPrefixedParser(sizeOfBlock => promiseCompose(createTupleParser([
61
+ androidPackageSigningBlockPairsParser,
62
+ uint64LEParser,
63
+ createExactSequenceParser(Buffer.from('APK Sig Block 42', 'utf8')),
64
+ ]), async ([pairs, sizeOfBlockRepeated, _magic,]) => {
65
+ invariant(sizeOfBlock === sizeOfBlockRepeated, 'Size of block mismatch: %s !== %s.', sizeOfBlock, sizeOfBlockRepeated);
66
+ const zeroPaddingPair = pairs.find(pair => pair.type === 'zeroPadding');
67
+ const signatureV2Pair = pairs.find(pair => pair.type === 'signatureV2');
68
+ const genericPairs = (pairs
69
+ .filter(pair => (pair !== zeroPaddingPair
70
+ && pair !== signatureV2Pair))
71
+ .map(pair => {
72
+ invariant(pair.type === 'generic', 'Expected generic pair, got %s.', pair.type);
73
+ return pair.pair;
74
+ }));
75
+ return {
76
+ zeroPaddingLength: zeroPaddingPair?.length,
77
+ signatureV2: signatureV2Pair
78
+ ? {
79
+ signers: signatureV2Pair?.signers,
80
+ }
81
+ : undefined,
82
+ pairs: genericPairs,
83
+ };
84
+ }));
85
+ const androidPackageSignatureV2DigestParser = createUint32LengthPrefixedParser(pairLength => promiseCompose(createTupleParser([
86
+ uint32LEParser,
87
+ createUint32LengthPrefixedParser(digestLength => createFixedLengthSequenceParser(digestLength)),
88
+ ]), ([signatureAlgorithmId, digest]) => ({ signatureAlgorithmId, digest })));
89
+ const androidPackageSignatureV2DigestsParser = createUint32LengthPrefixedSliceBoundedArrayParser(androidPackageSignatureV2DigestParser);
90
+ setParserName(androidPackageSignatureV2DigestsParser, 'androidPackageSignatureV2DigestsParser');
91
+ const androidPackageSignatureV2CertificateParser = createUint32LengthPrefixedParser(certificateLength => createFixedLengthSequenceParser(certificateLength));
92
+ setParserName(androidPackageSignatureV2CertificateParser, 'androidPackageSignatureV2CertificateParser');
93
+ const androidPackageSignatureV2CertificatesParser = createUint32LengthPrefixedSliceBoundedArrayParser(androidPackageSignatureV2CertificateParser);
94
+ setParserName(androidPackageSignatureV2CertificatesParser, 'androidPackageSignatureV2CertificatesParser');
95
+ const androidPackageSignatureV2AdditionalAttributeParser = createUint32LengthPrefixedParser(pairLength => promiseCompose(createTupleParser([
96
+ uint32LEParser,
97
+ createFixedLengthSequenceParser(pairLength - 4),
98
+ ]), ([id, value]) => ({ id, value })));
99
+ setParserName(androidPackageSignatureV2AdditionalAttributeParser, 'androidPackageSignatureV2AdditionalAttributeParser');
100
+ const androidPackageSignatureV2AdditionalAttributesParser = createUint32LengthPrefixedSliceBoundedArrayParser(androidPackageSignatureV2AdditionalAttributeParser);
101
+ setParserName(androidPackageSignatureV2AdditionalAttributesParser, 'androidPackageSignatureV2AdditionalAttributesParser');
102
+ const androidPackageSignatureV2SignedDataParser = createUint32LengthPrefixedSliceBoundedParser(promiseCompose(createTupleParser([
103
+ androidPackageSignatureV2DigestsParser,
104
+ androidPackageSignatureV2CertificatesParser,
105
+ androidPackageSignatureV2AdditionalAttributesParser,
106
+ createArrayParser(createExactElementParser(0)),
107
+ ]), ([digests, certificates, additionalAttributes, zeroPadding,]) => ({
108
+ digests,
109
+ certificates,
110
+ additionalAttributes,
111
+ zeroPaddingLength: zeroPadding.length,
112
+ })));
113
+ setParserName(androidPackageSignatureV2SignedDataParser, 'androidPackageSignatureV2SignedDataParser');
114
+ const androidPackageSignatureV2SignatureParser = createUint32LengthPrefixedParser(signatureLength => promiseCompose(createTupleParser([
115
+ uint32LEParser,
116
+ createUint32LengthPrefixedParser(signatureLength => createFixedLengthSequenceParser(signatureLength)),
117
+ ]), ([signatureAlgorithmId, signature,]) => ({
118
+ signatureAlgorithmId,
119
+ signature,
120
+ })));
121
+ const androidPackageSignatureV2SignaturesParser = createUint32LengthPrefixedSliceBoundedArrayParser(androidPackageSignatureV2SignatureParser);
122
+ setParserName(androidPackageSignatureV2SignaturesParser, 'androidPackageSignatureV2SignaturesParser');
123
+ const androidPackageSignatureV2PublicKeyParser = createUint32LengthPrefixedParser(publicKeyLength => createFixedLengthSequenceParser(publicKeyLength));
124
+ setParserName(androidPackageSignatureV2PublicKeyParser, 'androidPackageSignatureV2PublicKeyParser');
125
+ const androidPackageSignatureV2SignerParser = createUint32LengthPrefixedSliceBoundedParser(promiseCompose(createTupleParser([
126
+ androidPackageSignatureV2SignedDataParser,
127
+ androidPackageSignatureV2SignaturesParser,
128
+ androidPackageSignatureV2PublicKeyParser,
129
+ ]), ([signedData, signatures = [], publicKey,]) => ({
130
+ signedData,
131
+ signatures,
132
+ publicKey,
133
+ })));
134
+ setParserName(androidPackageSignatureV2SignerParser, 'androidPackageSignatureV2SignerParser');
135
+ const androidPackageSignatureV2SignersParser = createUint32LengthPrefixedSliceBoundedArrayParser(androidPackageSignatureV2SignerParser);
136
+ setParserName(androidPackageSignatureV2SignersParser, 'androidPackageSignatureV2SignersParser');
137
+ const androidPackageParser_ = createTupleParser([
138
+ createArrayParser(zipLocalFileParser),
139
+ createOptionalParser(zipArchiveDecryptionHeaderParser),
140
+ createOptionalParser(zipArchiveExtraDataRecordParser),
141
+ createOptionalParser(androidPackageSigningBlockParser),
142
+ createArrayParser(zipCentralDirectoryHeaderParser),
143
+ createOptionalParser(zip64EndOfCentralDirectoryRecordParser),
144
+ createOptionalParser(zip64EndOfCentralDirectoryLocatorParser),
145
+ zipEndOfCentralDirectoryRecordParser,
146
+ ]);
147
+ setParserName(androidPackageParser_, 'androidPackageParser_');
148
+ export const androidPackageParser = promiseCompose(androidPackageParser_, async ([zipLocalFiles, zipArchiveDecryptionHeader, zipArchiveExtraDataRecord, androidPackageSigningBlock, zipCentralDirectoryHeaders, zip64EndOfCentralDirectoryRecord, zip64EndOfCentralDirectoryLocator, zipEndOfCentralDirectoryRecord,]) => {
149
+ const zip = await zipFromZipSegments({
150
+ zipLocalFiles,
151
+ zipCentralDirectoryHeaders,
152
+ zipEndOfCentralDirectoryRecord,
153
+ });
154
+ return {
155
+ ...zip,
156
+ signingBlock: androidPackageSigningBlock,
157
+ };
158
+ });
159
+ setParserName(androidPackageParser, 'androidPackageParser');
160
+ export const androidPackageSignableSectionsParser = promiseCompose(createTupleParser([
161
+ createParserConsumedSequenceParser(createTupleParser([
162
+ createArrayParser(zipLocalFileParser),
163
+ createOptionalParser(zipArchiveDecryptionHeaderParser),
164
+ createOptionalParser(zipArchiveExtraDataRecordParser),
165
+ ])),
166
+ createArrayParser(createExactElementParser(0)),
167
+ createOptionalParser(createParserConsumedSequenceParser(androidPackageSigningBlockParser)),
168
+ createParserConsumedSequenceParser(createTupleParser([
169
+ createArrayParser(zipCentralDirectoryHeaderParser),
170
+ createOptionalParser(zip64EndOfCentralDirectoryRecordParser),
171
+ createOptionalParser(zip64EndOfCentralDirectoryLocatorParser),
172
+ ])),
173
+ createParserConsumedSequenceParser(zipEndOfCentralDirectoryRecordParser),
174
+ ]), async ([[[zipLocalFiles,], zipLocalFilesUint8Array,], zipLocalFilesZeroPadding, [androidPackageSigningBlock = undefined, androidPackageSigningBlockUint8Array = undefined,] = [], [[zipCentralDirectory,], zipCentralDirectoryUint8Array,], [zipEndOfCentralDirectory, zipEndOfCentralDirectoryUint8Array,],]) => ({
175
+ zipLocalFiles,
176
+ zipLocalFilesZeroPaddingLength: zipLocalFilesZeroPadding.length,
177
+ androidPackageSigningBlock,
178
+ zipCentralDirectory,
179
+ zipEndOfCentralDirectory,
180
+ zipLocalFilesUint8Array,
181
+ androidPackageSigningBlockUint8Array,
182
+ zipCentralDirectoryUint8Array,
183
+ zipEndOfCentralDirectoryUint8Array,
184
+ }));
185
+ setParserName(androidPackageSignableSectionsParser, 'androidPackageSignableSectionsParser');
@@ -0,0 +1,22 @@
1
+ import test from 'ava';
2
+ import { uint8ArrayParserInputCompanion } from './parserInputCompanion.js';
3
+ import { runParser } from './parser.js';
4
+ import { androidPackageParser } from './androidPackageParser.js';
5
+ import { fetchCid } from './fetchCid.js';
6
+ const androidPackageMacro = test.macro({
7
+ title: (providedTitle, androidPackageCid) => providedTitle ?? `androidPackage ${androidPackageCid}`,
8
+ async exec(t, androidPackageCid) {
9
+ const androidPackageStream = await fetchCid(androidPackageCid);
10
+ const actual = await runParser(androidPackageParser, androidPackageStream, uint8ArrayParserInputCompanion, {
11
+ errorJoinMode: 'all',
12
+ });
13
+ for (const entry of actual.entries) {
14
+ if (entry.type === 'file') {
15
+ entry.content = new Uint8Array([entry.content.length]);
16
+ }
17
+ }
18
+ t.snapshot(actual);
19
+ },
20
+ });
21
+ test(androidPackageMacro, 'bafkreicckcmzrdxwoc3w2in3tivpyxrdtcfpct4zwauq3igew3nkpvfapu');
22
+ test(androidPackageMacro, 'bafkreidqycbgrtp7ywhevsgtm464dqpamxsijpaqfcfz2k3ymc3wrzsb5m');
@@ -0,0 +1,4 @@
1
+ import { type AndroidPackageSignatureV2SignedData, type AndroidPackageSigningBlock } from './androidPackage.js';
2
+ import { type Unparser } from './unparser.js';
3
+ export declare const androidPackageSignatureV2SignedDataUnparser: Unparser<AndroidPackageSignatureV2SignedData, Uint8Array>;
4
+ export declare const androidPackageSigningBlockUnparser: Unparser<AndroidPackageSigningBlock, Uint8Array>;
@@ -0,0 +1,94 @@
1
+ import { createArrayUnparser } from './arrayUnparser.js';
2
+ import { createSequenceUnparser } from './sequenceUnparser.js';
3
+ const uint8ArrayUnparser = createSequenceUnparser();
4
+ const uint32LEUnparser = async function* (input) {
5
+ const buffer = Buffer.alloc(4);
6
+ buffer.writeUInt32LE(input);
7
+ yield buffer;
8
+ };
9
+ const uint64LEUnparser = async function* (input) {
10
+ const buffer = Buffer.alloc(8);
11
+ buffer.writeBigUInt64LE(BigInt(input));
12
+ yield buffer;
13
+ };
14
+ const createUint32LengthPrefixedUnparser = (innerUnparser) => async function* (input, unparserContext) {
15
+ const length = yield* unparserContext.writeLater(4);
16
+ yield* innerUnparser(input, unparserContext);
17
+ yield* unparserContext.writeEarlier(length, uint32LEUnparser, unparserContext.position - length.positionEnd);
18
+ };
19
+ const createUint64LengthPrefixedUnparser = (innerUnparser) => async function* (input, unparserContext) {
20
+ const length = yield* unparserContext.writeLater(8);
21
+ yield* innerUnparser(input, unparserContext);
22
+ yield* unparserContext.writeEarlier(length, uint64LEUnparser, unparserContext.position - length.positionEnd);
23
+ };
24
+ const androidPackageSignatureV2DigestUnparser = createUint32LengthPrefixedUnparser(async function* (input, unparserContext) {
25
+ yield* uint32LEUnparser(input.signatureAlgorithmId, unparserContext);
26
+ yield* uint32LEUnparser(input.digest.length, unparserContext);
27
+ yield input.digest;
28
+ });
29
+ const androidPackageSignatureV2DigestsUnparser = createUint32LengthPrefixedUnparser(createArrayUnparser(androidPackageSignatureV2DigestUnparser));
30
+ const androidPackageSignatureV2CertificateUnparser = createUint32LengthPrefixedUnparser(uint8ArrayUnparser);
31
+ const androidPackageSignatureV2CertificatesUnparser = createUint32LengthPrefixedUnparser(createArrayUnparser(androidPackageSignatureV2CertificateUnparser));
32
+ const androidPackageSignatureV2AdditionalAttributeUnparser = createUint32LengthPrefixedUnparser(async function* (input, unparserContext) {
33
+ yield* uint32LEUnparser(input.id, unparserContext);
34
+ yield input.value;
35
+ });
36
+ const androidPackageSignatureV2AdditionalAttributesUnparser = createUint32LengthPrefixedUnparser(createArrayUnparser(androidPackageSignatureV2AdditionalAttributeUnparser));
37
+ export const androidPackageSignatureV2SignedDataUnparser = createUint32LengthPrefixedUnparser(async function* (input, unparserContext) {
38
+ yield* androidPackageSignatureV2DigestsUnparser(input.digests, unparserContext);
39
+ yield* androidPackageSignatureV2CertificatesUnparser(input.certificates, unparserContext);
40
+ yield* androidPackageSignatureV2AdditionalAttributesUnparser(input.additionalAttributes, unparserContext);
41
+ if (input.zeroPaddingLength) {
42
+ yield Buffer.alloc(input.zeroPaddingLength);
43
+ }
44
+ });
45
+ const androidPackageSignatureV2SignatureUnparser = createUint32LengthPrefixedUnparser(async function* (input, unparserContext) {
46
+ yield* uint32LEUnparser(input.signatureAlgorithmId, unparserContext);
47
+ yield* uint32LEUnparser(input.signature.length, unparserContext);
48
+ yield input.signature;
49
+ });
50
+ const androidPackageSignatureV2SignaturesUnparser = createUint32LengthPrefixedUnparser(createArrayUnparser(androidPackageSignatureV2SignatureUnparser));
51
+ const androidPackageSignatureV2PublicKeyUnparser = createUint32LengthPrefixedUnparser(uint8ArrayUnparser);
52
+ const androidPackageSignatureV2SignerUnparser = createUint32LengthPrefixedUnparser(async function* (input, unparserContext) {
53
+ yield* androidPackageSignatureV2SignedDataUnparser(input.signedData, unparserContext);
54
+ yield* androidPackageSignatureV2SignaturesUnparser(input.signatures, unparserContext);
55
+ yield* androidPackageSignatureV2PublicKeyUnparser(input.publicKey, unparserContext);
56
+ });
57
+ const androidPackageSignatureV2SignersUnparser = createUint32LengthPrefixedUnparser(createArrayUnparser(androidPackageSignatureV2SignerUnparser));
58
+ const androidPackageSigningBlockPairUnparser = createUint64LengthPrefixedUnparser(async function* (input, unparserContext) {
59
+ yield* uint32LEUnparser(input.id, unparserContext);
60
+ if (input.value instanceof Uint8Array) {
61
+ yield input.value;
62
+ }
63
+ else {
64
+ yield* androidPackageSignatureV2SignersUnparser(input.value, unparserContext);
65
+ }
66
+ });
67
+ const androidPackageSigningBlockPairsUnparser = createArrayUnparser(androidPackageSigningBlockPairUnparser);
68
+ export const androidPackageSigningBlockUnparser = async function* (input, unparserContext) {
69
+ const pairs = [
70
+ ...input.pairs,
71
+ ...(input.signatureV2
72
+ ? [
73
+ {
74
+ id: 0x71_09_87_1A,
75
+ value: input.signatureV2.signers,
76
+ },
77
+ ]
78
+ : []),
79
+ ...(input.zeroPaddingLength
80
+ ? [
81
+ {
82
+ id: 0x42_72_65_77,
83
+ value: Buffer.alloc(input.zeroPaddingLength),
84
+ },
85
+ ]
86
+ : []),
87
+ ];
88
+ const sizeOfBlockWriteLater = yield* unparserContext.writeLater(8);
89
+ yield* androidPackageSigningBlockPairsUnparser(pairs, unparserContext);
90
+ const sizeOfBlock = unparserContext.position - sizeOfBlockWriteLater.position + 16;
91
+ yield* uint64LEUnparser(sizeOfBlock, unparserContext);
92
+ yield* unparserContext.writeEarlier(sizeOfBlockWriteLater, uint64LEUnparser, sizeOfBlock);
93
+ yield Buffer.from('APK Sig Block 42', 'utf8');
94
+ };
@@ -0,0 +1,26 @@
1
+ import test from 'ava';
2
+ import invariant from 'invariant';
3
+ import { uint8ArrayParserInputCompanion } from './parserInputCompanion.js';
4
+ import { runParser } from './parser.js';
5
+ import { androidPackageParser, androidPackageSigningBlockParser } from './androidPackageParser.js';
6
+ import { runUnparser } from './unparser.js';
7
+ import { androidPackageSigningBlockUnparser } from './androidPackageUnparser.js';
8
+ import { uint8ArrayUnparserOutputCompanion } from './unparserOutputCompanion.js';
9
+ import { fetchCid } from './fetchCid.js';
10
+ const androidPackageUnparserMacro = test.macro({
11
+ title: (providedTitle, androidPackageCid) => providedTitle ?? `androidPackage ${androidPackageCid}`,
12
+ async exec(t, androidPackageCid) {
13
+ const androidPackageStream = await fetchCid(androidPackageCid);
14
+ const androidPackage = await runParser(androidPackageParser, androidPackageStream, uint8ArrayParserInputCompanion, {
15
+ errorJoinMode: 'all',
16
+ });
17
+ const androidPackageSigningBlock = androidPackage.signingBlock;
18
+ invariant(androidPackageSigningBlock, 'APK has no signing block');
19
+ const androidPackageSigningBlockStream = runUnparser(androidPackageSigningBlockUnparser, androidPackageSigningBlock, uint8ArrayUnparserOutputCompanion);
20
+ const actual = await runParser(androidPackageSigningBlockParser, androidPackageSigningBlockStream, uint8ArrayParserInputCompanion, {
21
+ errorJoinMode: 'all',
22
+ });
23
+ t.deepEqual(actual, androidPackageSigningBlock);
24
+ },
25
+ });
26
+ test(androidPackageUnparserMacro, 'bafkreicckcmzrdxwoc3w2in3tivpyxrdtcfpct4zwauq3igew3nkpvfapu');
@@ -1,2 +1,4 @@
1
1
  import { type Arbitrary } from 'fast-check';
2
- export declare function arbitrarilySlicedAsyncIterable<Sliceable extends string | Uint8Array>(arbitrarySliceable: Arbitrary<Sliceable>): Arbitrary<[Sliceable, AsyncIterable<Sliceable>]>;
2
+ export declare function arbitrarilySlicedAsyncIterable<Sliceable extends string | Uint8Array>(arbitrarySliceable: Arbitrary<Sliceable>, { minSlices, }?: {
3
+ minSlices?: number;
4
+ }): Arbitrary<[Sliceable, AsyncIterable<Sliceable>]>;
@@ -1,6 +1,6 @@
1
- import { inspect } from 'node:util';
2
1
  import * as fc from 'fast-check';
3
2
  import invariant from 'invariant';
3
+ import { inspect } from './inspect.js';
4
4
  function concat(slices) {
5
5
  const firstSlice = slices.at(0);
6
6
  if (firstSlice instanceof Uint8Array) {
@@ -14,8 +14,8 @@ function equals(a, b) {
14
14
  }
15
15
  return a === b;
16
16
  }
17
- export function arbitrarilySlicedAsyncIterable(arbitrarySliceable) {
18
- return (fc.tuple(arbitrarySliceable, fc.array(fc.nat(), { minLength: 1 }))
17
+ export function arbitrarilySlicedAsyncIterable(arbitrarySliceable, { minSlices = 1, } = {}) {
18
+ return (fc.tuple(arbitrarySliceable, fc.array(fc.nat(), { minLength: Math.max(1, minSlices) }))
19
19
  .map(([sliceable, sliceSizes]) => {
20
20
  let start = 0;
21
21
  const slices = sliceSizes.map(sliceSize => {
@@ -3,11 +3,12 @@ export function arbitrarilySlicedAsyncIterator(arbitrarySliceable) {
3
3
  return (arbitrarilySlicedAsyncIterable(arbitrarySliceable)
4
4
  .map(([sliceable, asyncIterable]) => {
5
5
  const asyncIterator_ = asyncIterable[Symbol.asyncIterator]();
6
+ const asyncIterableWithTag = asyncIterable;
6
7
  const asyncIterator = {
7
8
  next: asyncIterator_.next.bind(asyncIterator_),
8
9
  return: asyncIterator_.return?.bind(asyncIterator_),
9
10
  throw: asyncIterator_.throw?.bind(asyncIterator_),
10
- [Symbol.toStringTag]: 'ArbitrarilySlicedAsyncIterator ' + asyncIterable[Symbol.toStringTag],
11
+ [Symbol.toStringTag]: 'ArbitrarilySlicedAsyncIterator ' + (asyncIterableWithTag[Symbol.toStringTag] ?? ''),
11
12
  };
12
13
  return [
13
14
  sliceable,
@@ -0,0 +1,4 @@
1
+ import * as fc from 'fast-check';
2
+ import { type DalvikBytecode, type DalvikBytecodeOperation } from './dalvikBytecodeParser.js';
3
+ export declare const arbitraryDalvikBytecodeOperation: fc.Arbitrary<DalvikBytecodeOperation>;
4
+ export declare const arbitraryDalvikBytecode: fc.Arbitrary<DalvikBytecode>;