@futpib/parser 1.0.0 → 1.0.2

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 (380) hide show
  1. package/build/allSettledStream.js +32 -14
  2. package/build/allSettledStream.test.js +32 -0
  3. package/build/androidPackage.d.ts +39 -0
  4. package/build/androidPackageParser.d.ts +17 -0
  5. package/build/androidPackageParser.js +183 -0
  6. package/build/{apkParser.test.js → androidPackageParser.test.js} +7 -7
  7. package/build/androidPackageUnparser.d.ts +4 -0
  8. package/build/androidPackageUnparser.js +90 -0
  9. package/build/androidPackageUnparser.test.js +26 -0
  10. package/build/arbitrarilySlicedAsyncInterable.d.ts +3 -1
  11. package/build/arbitrarilySlicedAsyncInterable.js +3 -3
  12. package/build/arbitraryFileSystemEntry.js +1 -1
  13. package/build/arbitraryZip.d.ts +1 -1
  14. package/build/arbitraryZip.js +13 -19
  15. package/build/arbitraryZipPermissions.d.ts +1 -8
  16. package/build/arbitraryZipPermissions.js +1 -16
  17. package/build/arbitraryZipStream.d.ts +1 -1
  18. package/build/arbitraryZipStream.js +3 -3
  19. package/build/arrayParser.d.ts +1 -1
  20. package/build/arrayParser.js +2 -2
  21. package/build/arrayParser.test.js +4 -4
  22. package/build/arrayUnparser.d.ts +2 -0
  23. package/build/arrayUnparser.js +8 -0
  24. package/build/backsmali.d.ts +1 -0
  25. package/build/backsmali.js +22 -0
  26. package/build/bsonParser.js +6 -2
  27. package/build/bsonParser.test.js +2 -2
  28. package/build/{parserInvariant.d.ts → customInvariant.d.ts} +1 -1
  29. package/build/{parserInvariant.js → customInvariant.js} +1 -1
  30. package/build/dalvikBytecodeParser/formatParsers.d.ts +97 -0
  31. package/build/dalvikBytecodeParser/formatParsers.js +169 -0
  32. package/build/dalvikBytecodeParser.d.ts +107 -0
  33. package/build/dalvikBytecodeParser.js +836 -0
  34. package/build/dalvikExecutable.d.ts +158 -0
  35. package/build/dalvikExecutable.js +20 -0
  36. package/build/dalvikExecutableParser/stringSyntaxParser.d.ts +4 -0
  37. package/build/dalvikExecutableParser/stringSyntaxParser.js +76 -0
  38. package/build/dalvikExecutableParser/typeParsers.d.ts +10 -0
  39. package/build/dalvikExecutableParser/typeParsers.js +34 -0
  40. package/build/dalvikExecutableParser/typedNumbers.d.ts +90 -0
  41. package/build/dalvikExecutableParser/typedNumbers.js +19 -0
  42. package/build/dalvikExecutableParser.d.ts +5 -0
  43. package/build/dalvikExecutableParser.js +1439 -0
  44. package/build/dalvikExecutableParser.test.js +70 -0
  45. package/build/dalvikExecutableParserAgainstSmaliParser.test.js +298 -0
  46. package/build/debugLogInputParser.d.ts +4 -0
  47. package/build/debugLogInputParser.js +16 -0
  48. package/build/debugLogParser.d.ts +1 -1
  49. package/build/debugLogParser.js +15 -4
  50. package/build/disjunctionParser.d.ts +2 -1
  51. package/build/disjunctionParser.js +4 -2
  52. package/build/elementParser.d.ts +2 -2
  53. package/build/elementParser.js +1 -1
  54. package/build/elementTerminatedArrayParser.d.ts +3 -0
  55. package/build/elementTerminatedArrayParser.js +18 -0
  56. package/build/elementTerminatedArrayParser.test.js +52 -0
  57. package/build/elementTerminatedSequenceArrayParser.d.ts +3 -0
  58. package/build/elementTerminatedSequenceArrayParser.js +32 -0
  59. package/build/elementTerminatedSequenceArrayParser.test.js +34 -0
  60. package/build/elementTerminatedSequenceParser.d.ts +3 -0
  61. package/build/elementTerminatedSequenceParser.js +27 -0
  62. package/build/elementTerminatedSequenceParser.test.js +34 -0
  63. package/build/endOfInputParser.d.ts +2 -2
  64. package/build/exactElementParser.d.ts +1 -1
  65. package/build/exactElementParser.js +10 -5
  66. package/build/exactSequenceParser.d.ts +2 -1
  67. package/build/exactSequenceParser.js +12 -2
  68. package/build/fetchCid.d.ts +1 -0
  69. package/build/fetchCid.js +107 -0
  70. package/build/fixedLengthSequenceParser.d.ts +1 -0
  71. package/build/fixedLengthSequenceParser.js +18 -1
  72. package/build/fixedLengthSequenceParser.test.js +41 -0
  73. package/build/hasExecutable.d.ts +1 -0
  74. package/build/hasExecutable.js +8 -0
  75. package/build/highResolutionTimer.d.ts +16 -0
  76. package/build/highResolutionTimer.js +42 -0
  77. package/build/index.d.ts +5 -2
  78. package/build/index.js +3 -0
  79. package/build/inputReader.d.ts +14 -3
  80. package/build/inputReader.js +43 -6
  81. package/build/inputReader.test.js +172 -7
  82. package/build/inputReaderState.d.ts +10 -0
  83. package/build/inputReaderState.js +16 -0
  84. package/build/inspect.d.ts +1 -0
  85. package/build/inspect.js +7 -0
  86. package/build/javaKeyStoreParser.d.ts +2 -0
  87. package/build/javaKeyStoreParser.js +67 -0
  88. package/build/javaKeyStoreParser.test.d.ts +1 -0
  89. package/build/javaKeyStoreParser.test.js +16 -0
  90. package/build/jsonParser.d.ts +2 -0
  91. package/build/jsonParser.js +13 -15
  92. package/build/jsonParser.test.js +2 -2
  93. package/build/leb128Parser.d.ts +7 -0
  94. package/build/leb128Parser.js +82 -0
  95. package/build/leb128Parser.test.d.ts +1 -0
  96. package/build/leb128Parser.test.js +107 -0
  97. package/build/listParser.d.ts +1 -1
  98. package/build/listParser.js +5 -5
  99. package/build/lookaheadParser.d.ts +2 -0
  100. package/build/lookaheadParser.js +14 -0
  101. package/build/{negativeLookahead.d.ts → negativeLookaheadParser.d.ts} +1 -1
  102. package/build/negativeLookaheadParser.js +24 -0
  103. package/build/negativeLookaheadParser.test.d.ts +1 -0
  104. package/build/negativeLookaheadParser.test.js +30 -0
  105. package/build/nonEmptyArrayParser.d.ts +2 -0
  106. package/build/nonEmptyArrayParser.js +32 -0
  107. package/build/nonEmptyArrayParser.test.d.ts +1 -0
  108. package/build/nonEmptyArrayParser.test.js +16 -0
  109. package/build/optionalParser.d.ts +1 -1
  110. package/build/optionalParser.js +2 -2
  111. package/build/parser.d.ts +13 -4
  112. package/build/parser.js +67 -32
  113. package/build/parser.test.js +94 -27
  114. package/build/parserAccessorParser.d.ts +1 -1
  115. package/build/parserAccessorParser.js +9 -1
  116. package/build/parserConsumedSequenceParser.d.ts +2 -0
  117. package/build/parserConsumedSequenceParser.js +22 -0
  118. package/build/parserContext.d.ts +20 -6
  119. package/build/parserContext.js +70 -40
  120. package/build/parserContext.test.js +34 -7
  121. package/build/parserCreatorCompose.d.ts +4 -3
  122. package/build/parserCreatorCompose.js +9 -3
  123. package/build/parserError.d.ts +6 -0
  124. package/build/parserError.js +6 -6
  125. package/build/parserImplementationInvariant.d.ts +1 -1
  126. package/build/parserImplementationInvariant.js +2 -2
  127. package/build/parserInputCompanion.d.ts +35 -0
  128. package/build/parserInputCompanion.js +68 -0
  129. package/build/promiseCompose.d.ts +1 -1
  130. package/build/promiseCompose.js +12 -1
  131. package/build/promiseSettled.d.ts +1 -0
  132. package/build/promiseSettled.js +4 -0
  133. package/build/quantifierParser.d.ts +2 -0
  134. package/build/quantifierParser.js +17 -0
  135. package/build/separatedArrayParser.d.ts +2 -0
  136. package/build/separatedArrayParser.js +39 -0
  137. package/build/separatedArrayParser.test.d.ts +1 -0
  138. package/build/separatedArrayParser.test.js +21 -0
  139. package/build/sequenceBuffer.d.ts +13 -3
  140. package/build/sequenceBuffer.js +60 -8
  141. package/build/sequenceBuffer.test.js +59 -2
  142. package/build/sequenceTerminatedSequenceParser.d.ts +5 -0
  143. package/build/sequenceTerminatedSequenceParser.js +32 -0
  144. package/build/sequenceTerminatedSequenceParser.test.d.ts +1 -0
  145. package/build/sequenceTerminatedSequenceParser.test.js +37 -0
  146. package/build/sequenceUnparser.d.ts +2 -0
  147. package/build/sequenceUnparser.js +6 -0
  148. package/build/skipParser.d.ts +1 -1
  149. package/build/skipParser.js +4 -2
  150. package/build/skipToParser.d.ts +2 -0
  151. package/build/skipToParser.js +11 -0
  152. package/build/sliceBoundedParser.d.ts +2 -2
  153. package/build/sliceBoundedParser.js +8 -3
  154. package/build/sliceBoundedParser.test.js +37 -3
  155. package/build/smali.d.ts +1 -0
  156. package/build/smali.js +17 -0
  157. package/build/smaliParser.d.ts +12 -0
  158. package/build/smaliParser.js +656 -0
  159. package/build/smaliParser.test.d.ts +1 -0
  160. package/build/smaliParser.test.js +115 -0
  161. package/build/terminatedArrayParser.d.ts +4 -2
  162. package/build/terminatedArrayParser.js +82 -5
  163. package/build/terminatedArrayParser.test.d.ts +1 -0
  164. package/build/terminatedArrayParser.test.js +131 -0
  165. package/build/toAsyncIterable.d.ts +1 -0
  166. package/build/toAsyncIterable.js +7 -0
  167. package/build/toAsyncIterator.d.ts +1 -0
  168. package/build/toAsyncIterator.js +33 -0
  169. package/build/tupleParser.d.ts +4 -0
  170. package/build/tupleParser.js +1 -5
  171. package/build/uint8Array.d.ts +1 -0
  172. package/build/uint8Array.js +7 -0
  173. package/build/unionParser.d.ts +2 -1
  174. package/build/unionParser.js +27 -12
  175. package/build/unionParser.test.d.ts +1 -0
  176. package/build/unionParser.test.js +60 -0
  177. package/build/unparser.d.ts +8 -0
  178. package/build/unparser.js +104 -0
  179. package/build/unparser.test.d.ts +1 -0
  180. package/build/unparser.test.js +150 -0
  181. package/build/unparserContext.d.ts +31 -0
  182. package/build/unparserContext.js +74 -0
  183. package/build/unparserError.d.ts +9 -0
  184. package/build/unparserError.js +9 -0
  185. package/build/unparserImplementationInvariant.d.ts +2 -0
  186. package/build/unparserImplementationInvariant.js +5 -0
  187. package/build/unparserOutputCompanion.d.ts +15 -0
  188. package/build/unparserOutputCompanion.js +13 -0
  189. package/build/zip.d.ts +9 -17
  190. package/build/zipParser.d.ts +20 -12
  191. package/build/zipParser.js +83 -71
  192. package/build/zipParser.test.js +2 -7
  193. package/build/zipUnparser.d.ts +8 -0
  194. package/build/zipUnparser.js +200 -0
  195. package/build/zipUnparser.test.d.ts +1 -0
  196. package/build/zipUnparser.test.js +80 -0
  197. package/package.json +26 -8
  198. package/src/allSettledStream.test.ts +40 -0
  199. package/src/allSettledStream.ts +47 -15
  200. package/src/androidPackage.ts +48 -0
  201. package/src/{apkParser.test.ts → androidPackageParser.test.ts} +7 -8
  202. package/src/androidPackageParser.test.ts.md +271 -0
  203. package/src/androidPackageParser.test.ts.snap +0 -0
  204. package/src/androidPackageParser.ts +440 -0
  205. package/src/androidPackageUnparser.test.ts +36 -0
  206. package/src/androidPackageUnparser.ts +120 -0
  207. package/src/arbitrarilySlicedAsyncInterable.ts +7 -2
  208. package/src/arbitraryFileSystemEntry.ts +2 -4
  209. package/src/arbitraryZip.ts +20 -27
  210. package/src/arbitraryZipPermissions.ts +0 -25
  211. package/src/arbitraryZipStream.ts +4 -4
  212. package/src/arrayParser.test.ts +4 -4
  213. package/src/arrayParser.ts +3 -2
  214. package/src/arrayUnparser.ts +13 -0
  215. package/src/backsmali.ts +30 -0
  216. package/src/bsonParser.test.ts +2 -2
  217. package/src/bsonParser.ts +16 -5
  218. package/src/{parserInvariant.ts → customInvariant.ts} +2 -2
  219. package/src/dalvikBytecodeParser/formatParsers.ts +421 -0
  220. package/src/dalvikBytecodeParser.ts +2074 -0
  221. package/src/dalvikExecutable.ts +220 -0
  222. package/src/dalvikExecutableParser/stringSyntaxParser.ts +145 -0
  223. package/src/dalvikExecutableParser/typeParsers.ts +65 -0
  224. package/src/dalvikExecutableParser/typedNumbers.ts +57 -0
  225. package/src/dalvikExecutableParser.test.ts +89 -0
  226. package/src/dalvikExecutableParser.test.ts.md +634 -0
  227. package/src/dalvikExecutableParser.test.ts.snap +0 -0
  228. package/src/dalvikExecutableParser.ts +2768 -0
  229. package/src/dalvikExecutableParserAgainstSmaliParser.test.ts +346 -0
  230. package/src/debugLogInputParser.ts +28 -0
  231. package/src/debugLogParser.ts +20 -4
  232. package/src/disjunctionParser.ts +10 -5
  233. package/src/elementParser.ts +3 -3
  234. package/src/elementTerminatedArrayParser.test.ts +99 -0
  235. package/src/elementTerminatedArrayParser.ts +31 -0
  236. package/src/elementTerminatedSequenceArrayParser.test.ts +54 -0
  237. package/src/elementTerminatedSequenceArrayParser.ts +52 -0
  238. package/src/elementTerminatedSequenceParser.test.ts +54 -0
  239. package/src/elementTerminatedSequenceParser.ts +43 -0
  240. package/src/endOfInputParser.ts +4 -4
  241. package/src/exactElementParser.ts +18 -12
  242. package/src/exactSequenceParser.ts +24 -3
  243. package/src/fetchCid.ts +125 -0
  244. package/src/fixedLengthSequenceParser.test.ts +77 -0
  245. package/src/fixedLengthSequenceParser.ts +28 -1
  246. package/src/hasExecutable.ts +11 -0
  247. package/src/highResolutionTimer.ts +49 -0
  248. package/src/index.ts +15 -2
  249. package/src/inputReader.test.ts +216 -7
  250. package/src/inputReader.ts +80 -5
  251. package/src/inputReaderState.ts +33 -0
  252. package/src/inspect.ts +9 -0
  253. package/src/javaKeyStore.ts +0 -0
  254. package/src/javaKeyStoreParser.test.ts +22 -0
  255. package/src/javaKeyStoreParser.test.ts.md +103 -0
  256. package/src/javaKeyStoreParser.test.ts.snap +0 -0
  257. package/src/javaKeyStoreParser.ts +136 -0
  258. package/src/jsonParser.test.ts +2 -2
  259. package/src/jsonParser.ts +23 -34
  260. package/src/leb128Parser.test.ts +171 -0
  261. package/src/leb128Parser.ts +125 -0
  262. package/src/listParser.ts +6 -6
  263. package/src/lookaheadParser.ts +19 -0
  264. package/src/negativeLookaheadParser.test.ts +53 -0
  265. package/src/negativeLookaheadParser.ts +36 -0
  266. package/src/nonEmptyArrayParser.test.ts +20 -0
  267. package/src/nonEmptyArrayParser.ts +44 -0
  268. package/src/optionalParser.ts +4 -3
  269. package/src/parser.test.ts +148 -27
  270. package/src/parser.test.ts.md +21 -21
  271. package/src/parser.test.ts.snap +0 -0
  272. package/src/parser.ts +153 -49
  273. package/src/parserAccessorParser.ts +12 -2
  274. package/src/parserConsumedSequenceParser.ts +29 -0
  275. package/src/parserContext.test.ts +38 -7
  276. package/src/parserContext.ts +127 -51
  277. package/src/parserCreatorCompose.ts +25 -7
  278. package/src/parserError.ts +9 -6
  279. package/src/parserImplementationInvariant.ts +2 -2
  280. package/src/parserInputCompanion.ts +102 -0
  281. package/src/promiseCompose.ts +17 -3
  282. package/src/promiseSettled.ts +6 -0
  283. package/src/quantifierParser.ts +25 -0
  284. package/src/separatedArrayParser.test.ts +34 -0
  285. package/src/separatedArrayParser.ts +55 -0
  286. package/src/sequenceBuffer.test.ts +72 -2
  287. package/src/sequenceBuffer.ts +93 -7
  288. package/src/sequenceTerminatedSequenceParser.test.ts +60 -0
  289. package/src/sequenceTerminatedSequenceParser.ts +62 -0
  290. package/src/sequenceUnparser.ts +9 -0
  291. package/src/skipParser.ts +7 -5
  292. package/src/skipToParser.ts +16 -0
  293. package/src/sliceBoundedParser.test.ts +45 -3
  294. package/src/sliceBoundedParser.ts +21 -3
  295. package/src/smali.ts +24 -0
  296. package/src/smaliParser.test.ts +132 -0
  297. package/src/smaliParser.test.ts.md +2320 -0
  298. package/src/smaliParser.test.ts.snap +0 -0
  299. package/src/smaliParser.ts +1166 -0
  300. package/src/terminatedArrayParser.test.ts +258 -0
  301. package/src/terminatedArrayParser.ts +111 -6
  302. package/src/toAsyncIterable.ts +7 -0
  303. package/src/toAsyncIterator.ts +48 -0
  304. package/src/tupleParser.ts +8 -5
  305. package/src/uint8Array.ts +10 -0
  306. package/src/unionParser.test.ts +79 -0
  307. package/src/unionParser.ts +44 -16
  308. package/src/unparser.test.ts +221 -0
  309. package/src/unparser.ts +209 -0
  310. package/src/unparserContext.ts +127 -0
  311. package/src/unparserError.ts +12 -0
  312. package/src/unparserImplementationInvariant.ts +6 -0
  313. package/src/unparserOutputCompanion.ts +24 -0
  314. package/src/zip.ts +10 -22
  315. package/src/zipParser.test.ts +2 -8
  316. package/src/zipParser.ts +223 -146
  317. package/src/zipUnparser.test.ts +119 -0
  318. package/src/zipUnparser.ts +300 -0
  319. package/build/apk.d.ts +0 -13
  320. package/build/apkParser.d.ts +0 -3
  321. package/build/apkParser.js +0 -135
  322. package/build/arbitraryDosDate.d.ts +0 -2
  323. package/build/arbitraryDosDate.js +0 -8
  324. package/build/arbitraryZipEntry.d.ts +0 -3
  325. package/build/arbitraryZipEntry.js +0 -26
  326. package/build/createDisjunctionParser.d.ts +0 -2
  327. package/build/createDisjunctionParser.js +0 -47
  328. package/build/createExactParser.d.ts +0 -2
  329. package/build/createExactParser.js +0 -12
  330. package/build/createSequentialUnionParser.d.ts +0 -2
  331. package/build/createSequentialUnionParser.js +0 -69
  332. package/build/fixedLengthChunkParser.d.ts +0 -2
  333. package/build/fixedLengthChunkParser.js +0 -12
  334. package/build/fixedLengthParser.d.ts +0 -2
  335. package/build/fixedLengthParser.js +0 -12
  336. package/build/inputChunkBuffer.d.ts +0 -15
  337. package/build/inputChunkBuffer.js +0 -40
  338. package/build/inputChunkBuffer.test.js +0 -34
  339. package/build/inputCompanion.d.ts +0 -18
  340. package/build/inputCompanion.js +0 -28
  341. package/build/invariantDefined.d.ts +0 -1
  342. package/build/invariantDefined.js +0 -5
  343. package/build/invariantIdentity.d.ts +0 -3
  344. package/build/invariantIdentity.js +0 -5
  345. package/build/jsonParser2.d.ts +0 -3
  346. package/build/jsonParser2.js +0 -52
  347. package/build/jsonParser2.test.js +0 -22
  348. package/build/negativeLookahead.js +0 -20
  349. package/build/parserCompose.d.ts +0 -3
  350. package/build/parserCompose.js +0 -7
  351. package/build/parserImplementationInvariantInvariant.d.ts +0 -3
  352. package/build/parserImplementationInvariantInvariant.js +0 -15
  353. package/build/promiseFish.d.ts +0 -1
  354. package/build/promiseFish.js +0 -3
  355. package/build/sequenceParser.d.ts +0 -3
  356. package/build/sequenceParser.js +0 -10
  357. package/build/terminatedSequenceParser.d.ts +0 -2
  358. package/build/terminatedSequenceParser.js +0 -24
  359. package/build/zipEntry.d.ts +0 -28
  360. package/build/zipFile.d.ts +0 -32
  361. package/build/zipFileEntry.d.ts +0 -6
  362. package/src/apk.ts +0 -16
  363. package/src/apkParser.test.ts.md +0 -268
  364. package/src/apkParser.test.ts.snap +0 -0
  365. package/src/apkParser.ts +0 -327
  366. package/src/inputCompanion.ts +0 -43
  367. package/src/invariantDefined.ts +0 -6
  368. package/src/invariantIdentity.ts +0 -8
  369. package/src/negativeLookahead.ts +0 -26
  370. /package/build/{apk.js → androidPackage.js} +0 -0
  371. /package/build/{apkParser.test.d.ts → androidPackageParser.test.d.ts} +0 -0
  372. /package/build/{arbitraryDosPermissions.d.ts → androidPackageUnparser.test.d.ts} +0 -0
  373. /package/build/{arbitraryDosPermissions.js → dalvikExecutableParser.test.d.ts} +0 -0
  374. /package/build/{inputChunkBuffer.test.d.ts → dalvikExecutableParserAgainstSmaliParser.test.d.ts} +0 -0
  375. /package/build/{jsonParser2.test.d.ts → elementTerminatedArrayParser.test.d.ts} +0 -0
  376. /package/build/{parserParsingInvariant.d.ts → elementTerminatedSequenceArrayParser.test.d.ts} +0 -0
  377. /package/build/{parserParsingInvariant.js → elementTerminatedSequenceParser.test.d.ts} +0 -0
  378. /package/build/{zipEntry.js → fixedLengthSequenceParser.test.d.ts} +0 -0
  379. /package/build/{zipFile.js → javaKeyStore.d.ts} +0 -0
  380. /package/build/{zipFileEntry.js → javaKeyStore.js} +0 -0
@@ -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 { ZipCentralDirectoryHeader, ZipEndOfCentralDirectoryRecord, 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,183 @@
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
+ signers: signatureV2Pair?.signers,
79
+ } : undefined,
80
+ pairs: genericPairs,
81
+ };
82
+ }));
83
+ const androidPackageSignatureV2DigestParser = createUint32LengthPrefixedParser(pairLength => promiseCompose(createTupleParser([
84
+ uint32LEParser,
85
+ createUint32LengthPrefixedParser(digestLength => createFixedLengthSequenceParser(digestLength)),
86
+ ]), ([signatureAlgorithmId, digest]) => ({ signatureAlgorithmId, digest })));
87
+ const androidPackageSignatureV2DigestsParser = createUint32LengthPrefixedSliceBoundedArrayParser(androidPackageSignatureV2DigestParser);
88
+ setParserName(androidPackageSignatureV2DigestsParser, 'androidPackageSignatureV2DigestsParser');
89
+ const androidPackageSignatureV2CertificateParser = createUint32LengthPrefixedParser(certificateLength => createFixedLengthSequenceParser(certificateLength));
90
+ setParserName(androidPackageSignatureV2CertificateParser, 'androidPackageSignatureV2CertificateParser');
91
+ const androidPackageSignatureV2CertificatesParser = createUint32LengthPrefixedSliceBoundedArrayParser(androidPackageSignatureV2CertificateParser);
92
+ setParserName(androidPackageSignatureV2CertificatesParser, 'androidPackageSignatureV2CertificatesParser');
93
+ const androidPackageSignatureV2AdditionalAttributeParser = createUint32LengthPrefixedParser(pairLength => promiseCompose(createTupleParser([
94
+ uint32LEParser,
95
+ createFixedLengthSequenceParser(pairLength - 4),
96
+ ]), ([id, value]) => ({ id, value })));
97
+ setParserName(androidPackageSignatureV2AdditionalAttributeParser, 'androidPackageSignatureV2AdditionalAttributeParser');
98
+ const androidPackageSignatureV2AdditionalAttributesParser = createUint32LengthPrefixedSliceBoundedArrayParser(androidPackageSignatureV2AdditionalAttributeParser);
99
+ setParserName(androidPackageSignatureV2AdditionalAttributesParser, 'androidPackageSignatureV2AdditionalAttributesParser');
100
+ const androidPackageSignatureV2SignedDataParser = createUint32LengthPrefixedSliceBoundedParser(promiseCompose(createTupleParser([
101
+ androidPackageSignatureV2DigestsParser,
102
+ androidPackageSignatureV2CertificatesParser,
103
+ androidPackageSignatureV2AdditionalAttributesParser,
104
+ createArrayParser(createExactElementParser(0)),
105
+ ]), ([digests, certificates, additionalAttributes, zeroPadding,]) => ({
106
+ digests,
107
+ certificates,
108
+ additionalAttributes,
109
+ zeroPaddingLength: zeroPadding.length,
110
+ })));
111
+ setParserName(androidPackageSignatureV2SignedDataParser, 'androidPackageSignatureV2SignedDataParser');
112
+ const androidPackageSignatureV2SignatureParser = createUint32LengthPrefixedParser(signatureLength => promiseCompose(createTupleParser([
113
+ uint32LEParser,
114
+ createUint32LengthPrefixedParser(signatureLength => createFixedLengthSequenceParser(signatureLength)),
115
+ ]), ([signatureAlgorithmId, signature,]) => ({
116
+ signatureAlgorithmId,
117
+ signature,
118
+ })));
119
+ const androidPackageSignatureV2SignaturesParser = createUint32LengthPrefixedSliceBoundedArrayParser(androidPackageSignatureV2SignatureParser);
120
+ setParserName(androidPackageSignatureV2SignaturesParser, 'androidPackageSignatureV2SignaturesParser');
121
+ const androidPackageSignatureV2PublicKeyParser = createUint32LengthPrefixedParser(publicKeyLength => createFixedLengthSequenceParser(publicKeyLength));
122
+ setParserName(androidPackageSignatureV2PublicKeyParser, 'androidPackageSignatureV2PublicKeyParser');
123
+ const androidPackageSignatureV2SignerParser = createUint32LengthPrefixedSliceBoundedParser(promiseCompose(createTupleParser([
124
+ androidPackageSignatureV2SignedDataParser,
125
+ androidPackageSignatureV2SignaturesParser,
126
+ androidPackageSignatureV2PublicKeyParser,
127
+ ]), ([signedData, signatures = [], publicKey,]) => ({
128
+ signedData,
129
+ signatures,
130
+ publicKey,
131
+ })));
132
+ setParserName(androidPackageSignatureV2SignerParser, 'androidPackageSignatureV2SignerParser');
133
+ const androidPackageSignatureV2SignersParser = createUint32LengthPrefixedSliceBoundedArrayParser(androidPackageSignatureV2SignerParser);
134
+ setParserName(androidPackageSignatureV2SignersParser, 'androidPackageSignatureV2SignersParser');
135
+ const androidPackageParser_ = createTupleParser([
136
+ createArrayParser(zipLocalFileParser),
137
+ createOptionalParser(zipArchiveDecryptionHeaderParser),
138
+ createOptionalParser(zipArchiveExtraDataRecordParser),
139
+ createOptionalParser(androidPackageSigningBlockParser),
140
+ createArrayParser(zipCentralDirectoryHeaderParser),
141
+ createOptionalParser(zip64EndOfCentralDirectoryRecordParser),
142
+ createOptionalParser(zip64EndOfCentralDirectoryLocatorParser),
143
+ zipEndOfCentralDirectoryRecordParser,
144
+ ]);
145
+ setParserName(androidPackageParser_, 'androidPackageParser_');
146
+ export const androidPackageParser = promiseCompose(androidPackageParser_, async ([zipLocalFiles, zipArchiveDecryptionHeader, zipArchiveExtraDataRecord, androidPackageSigningBlock, zipCentralDirectoryHeaders, zip64EndOfCentralDirectoryRecord, zip64EndOfCentralDirectoryLocator, zipEndOfCentralDirectoryRecord,]) => {
147
+ const zip = await zipFromZipSegments({
148
+ zipLocalFiles,
149
+ zipCentralDirectoryHeaders,
150
+ zipEndOfCentralDirectoryRecord,
151
+ });
152
+ return {
153
+ ...zip,
154
+ signingBlock: androidPackageSigningBlock,
155
+ };
156
+ });
157
+ setParserName(androidPackageParser, 'androidPackageParser');
158
+ export const androidPackageSignableSectionsParser = promiseCompose(createTupleParser([
159
+ createParserConsumedSequenceParser(createTupleParser([
160
+ createArrayParser(zipLocalFileParser),
161
+ createOptionalParser(zipArchiveDecryptionHeaderParser),
162
+ createOptionalParser(zipArchiveExtraDataRecordParser),
163
+ ])),
164
+ createArrayParser(createExactElementParser(0)),
165
+ createOptionalParser(createParserConsumedSequenceParser(androidPackageSigningBlockParser)),
166
+ createParserConsumedSequenceParser(createTupleParser([
167
+ createArrayParser(zipCentralDirectoryHeaderParser),
168
+ createOptionalParser(zip64EndOfCentralDirectoryRecordParser),
169
+ createOptionalParser(zip64EndOfCentralDirectoryLocatorParser),
170
+ ])),
171
+ createParserConsumedSequenceParser(zipEndOfCentralDirectoryRecordParser),
172
+ ]), async ([[[zipLocalFiles,], zipLocalFilesUint8Array,], zipLocalFilesZeroPadding, [androidPackageSigningBlock = undefined, androidPackageSigningBlockUint8Array = undefined,] = [], [[zipCentralDirectory,], zipCentralDirectoryUint8Array,], [zipEndOfCentralDirectory, zipEndOfCentralDirectoryUint8Array,],]) => ({
173
+ zipLocalFiles,
174
+ zipLocalFilesZeroPaddingLength: zipLocalFilesZeroPadding.length,
175
+ androidPackageSigningBlock,
176
+ zipCentralDirectory,
177
+ zipEndOfCentralDirectory,
178
+ zipLocalFilesUint8Array,
179
+ androidPackageSigningBlockUint8Array,
180
+ zipCentralDirectoryUint8Array,
181
+ zipEndOfCentralDirectoryUint8Array,
182
+ }));
183
+ setParserName(androidPackageSignableSectionsParser, 'androidPackageSignableSectionsParser');
@@ -1,15 +1,15 @@
1
1
  import test from 'ava';
2
- import { uint8ArrayInputCompanion } from './inputCompanion.js';
2
+ import { uint8ArrayParserInputCompanion } from './parserInputCompanion.js';
3
3
  import { runParser } from './parser.js';
4
- import { apkParser } from './apkParser.js';
5
- for (const apkCid of [
4
+ import { androidPackageParser } from './androidPackageParser.js';
5
+ import { fetchCid } from './fetchCid.js';
6
+ for (const androidPackageCid of [
6
7
  'bafkreicckcmzrdxwoc3w2in3tivpyxrdtcfpct4zwauq3igew3nkpvfapu',
7
8
  'bafkreidqycbgrtp7ywhevsgtm464dqpamxsijpaqfcfz2k3ymc3wrzsb5m',
8
9
  ]) {
9
- test('apk ' + apkCid, async (t) => {
10
- const apkResponse = await fetch('https://ipfs.io/ipfs/' + apkCid);
11
- const apkStream = apkResponse.body;
12
- const actual = await runParser(apkParser, apkStream, uint8ArrayInputCompanion, {
10
+ test('androidPackage ' + androidPackageCid, async (t) => {
11
+ const androidPackageStream = await fetchCid(androidPackageCid);
12
+ const actual = await runParser(androidPackageParser, androidPackageStream, uint8ArrayParserInputCompanion, {
13
13
  errorJoinMode: 'all',
14
14
  });
15
15
  for (const entry of actual.entries) {
@@ -0,0 +1,4 @@
1
+ import { AndroidPackageSignatureV2SignedData, AndroidPackageSigningBlock } from "./androidPackage.js";
2
+ import { Unparser } from "./unparser.js";
3
+ export declare const androidPackageSignatureV2SignedDataUnparser: Unparser<AndroidPackageSignatureV2SignedData, Uint8Array>;
4
+ export declare const androidPackageSigningBlockUnparser: Unparser<AndroidPackageSigningBlock, Uint8Array>;
@@ -0,0 +1,90 @@
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
+ id: 0x7109871a,
74
+ value: input.signatureV2.signers,
75
+ },
76
+ ] : []),
77
+ ...(input.zeroPaddingLength ? [
78
+ {
79
+ id: 0x42726577,
80
+ value: Buffer.alloc(input.zeroPaddingLength),
81
+ },
82
+ ] : []),
83
+ ];
84
+ const sizeOfBlockWriteLater = yield* unparserContext.writeLater(8);
85
+ yield* androidPackageSigningBlockPairsUnparser(pairs, unparserContext);
86
+ const sizeOfBlock = unparserContext.position - sizeOfBlockWriteLater.position + 16;
87
+ yield* uint64LEUnparser(sizeOfBlock, unparserContext);
88
+ yield* unparserContext.writeEarlier(sizeOfBlockWriteLater, uint64LEUnparser, sizeOfBlock);
89
+ yield Buffer.from('APK Sig Block 42', 'utf8');
90
+ };
@@ -0,0 +1,26 @@
1
+ import test from 'ava';
2
+ import { uint8ArrayParserInputCompanion } from './parserInputCompanion.js';
3
+ import { runParser } from './parser.js';
4
+ import { androidPackageParser, androidPackageSigningBlockParser } from './androidPackageParser.js';
5
+ import { runUnparser } from './unparser.js';
6
+ import { androidPackageSigningBlockUnparser } from './androidPackageUnparser.js';
7
+ import { uint8ArrayUnparserOutputCompanion } from './unparserOutputCompanion.js';
8
+ import invariant from 'invariant';
9
+ import { fetchCid } from './fetchCid.js';
10
+ for (const androidPackageCid of [
11
+ 'bafkreicckcmzrdxwoc3w2in3tivpyxrdtcfpct4zwauq3igew3nkpvfapu',
12
+ ]) {
13
+ test('androidPackage ' + androidPackageCid, async (t) => {
14
+ const androidPackageStream = await fetchCid(androidPackageCid);
15
+ const androidPackage = await runParser(androidPackageParser, androidPackageStream, uint8ArrayParserInputCompanion, {
16
+ errorJoinMode: 'all',
17
+ });
18
+ const androidPackageSigningBlock = androidPackage.signingBlock;
19
+ invariant(androidPackageSigningBlock, 'APK has no signing block');
20
+ const androidPackageSigningBlockStream = runUnparser(androidPackageSigningBlockUnparser, androidPackageSigningBlock, uint8ArrayUnparserOutputCompanion);
21
+ const actual = await runParser(androidPackageSigningBlockParser, androidPackageSigningBlockStream, uint8ArrayParserInputCompanion, {
22
+ errorJoinMode: 'all',
23
+ });
24
+ t.deepEqual(actual, androidPackageSigningBlock);
25
+ });
26
+ }
@@ -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 => {
@@ -1,5 +1,5 @@
1
1
  import * as fc from 'fast-check';
2
- export const arbitraryFileSystemEntry = fc.letrec((tie) => ({
2
+ export const arbitraryFileSystemEntry = fc.letrec(tie => ({
3
3
  entry: fc.oneof(fc.record({
4
4
  type: fc.constant('file'),
5
5
  name: fc.string(),
@@ -1,5 +1,5 @@
1
1
  import * as fc from 'fast-check';
2
- import { ZipEntry } from './zip.js';
2
+ import { type ZipEntry } from './zip.js';
3
3
  export declare const arbitraryZip: fc.Arbitrary<{
4
4
  comment: string;
5
5
  entries: ZipEntry[];
@@ -1,8 +1,6 @@
1
1
  import * as fc from 'fast-check';
2
- import { arbitraryDosDateTime } from './arbitraryDosDateTime.js';
3
- import { createArbitraryZipPermissions } from './arbitraryZipPermissions.js';
4
2
  import invariant from 'invariant';
5
- const DOS_DIRECTORY_FLAG = 0b00010000;
3
+ import { arbitraryDosDateTime } from './arbitraryDosDateTime.js';
6
4
  const arbitraryPath = fc.string({ minLength: 1 }).filter(path => {
7
5
  const pathSegments = path.split('/');
8
6
  const pathHasEmptySegments = pathSegments.some(segment => segment.length === 0);
@@ -16,7 +14,10 @@ const createArbitraryZipEntry = (platform) => fc.oneof(fc.record({
16
14
  path: arbitraryPath,
17
15
  date: arbitraryDosDateTime,
18
16
  comment: fc.string(),
19
- permissions: createArbitraryZipPermissions(platform),
17
+ hostSystem: fc.constant(platform),
18
+ attributes: fc.record({
19
+ directory: fc.constant(false),
20
+ }),
20
21
  compression: fc.oneof(fc.constant('store'), fc.constant('deflate')),
21
22
  content: fc.uint8Array(),
22
23
  }).filter(zipFileEntry => {
@@ -24,23 +25,16 @@ const createArbitraryZipEntry = (platform) => fc.oneof(fc.record({
24
25
  && zipFileEntry.compression === 'deflate') {
25
26
  return false;
26
27
  }
27
- if (zipFileEntry.permissions.type === 'dos'
28
- && zipFileEntry.permissions.dosPermissions & DOS_DIRECTORY_FLAG) {
29
- return false;
30
- }
31
28
  return true;
32
29
  }), fc.record({
33
30
  type: fc.constant('directory'),
34
31
  path: arbitraryPath,
35
32
  date: arbitraryDosDateTime,
36
33
  comment: fc.string(),
37
- permissions: createArbitraryZipPermissions(platform),
38
- }).filter(zipDirectoryEntry => {
39
- if (zipDirectoryEntry.permissions.type === 'dos'
40
- && !(zipDirectoryEntry.permissions.dosPermissions & DOS_DIRECTORY_FLAG)) {
41
- return false;
42
- }
43
- return true;
34
+ hostSystem: fc.constant(platform),
35
+ attributes: fc.record({
36
+ directory: fc.constant(false),
37
+ }),
44
38
  }));
45
39
  const createArbitraryZipEntries = (platform) => (fc
46
40
  .array(createArbitraryZipEntry(platform))
@@ -70,10 +64,10 @@ const createArbitraryZipEntries = (platform) => (fc
70
64
  path: directoryPath,
71
65
  date: entry.date,
72
66
  comment: '',
73
- permissions: entry.permissions.type === 'dos' ? {
74
- type: 'dos',
75
- dosPermissions: entry.permissions.dosPermissions | DOS_DIRECTORY_FLAG,
76
- } : entry.permissions,
67
+ hostSystem: platform,
68
+ attributes: {
69
+ directory: true,
70
+ },
77
71
  });
78
72
  seenDirectoryPaths.add(directoryPath);
79
73
  }
@@ -1,8 +1 @@
1
- import * as fc from 'fast-check';
2
- export declare const createArbitraryZipPermissions: (type: "unix" | "dos") => fc.Arbitrary<{
3
- type: "unix";
4
- unixPermissions: number;
5
- }> | fc.Arbitrary<{
6
- type: "dos";
7
- dosPermissions: number;
8
- }>;
1
+ export {};
@@ -1,16 +1 @@
1
- import * as fc from 'fast-check';
2
- const arbitraryZipUnixPermissions = fc.record({
3
- type: fc.constant('unix'),
4
- unixPermissions: (fc.nat({ max: 0b0000000111111111 })
5
- .filter((unixPermissions) => unixPermissions > 0)),
6
- });
7
- const arbitraryZipDosPermissions = fc.record({
8
- type: fc.constant('dos'),
9
- dosPermissions: (fc.nat({ max: 0b00111111 })),
10
- });
11
- export const createArbitraryZipPermissions = (type) => {
12
- if (type === 'unix') {
13
- return arbitraryZipUnixPermissions;
14
- }
15
- return arbitraryZipDosPermissions;
16
- };
1
+ export {};
@@ -1,4 +1,4 @@
1
- import { ZipEntry } from './zip.js';
1
+ import { type ZipEntry } from './zip.js';
2
2
  export declare const arbitraryZipStream: import("fast-check").Arbitrary<readonly [{
3
3
  comment: string;
4
4
  entries: ZipEntry[];
@@ -4,8 +4,8 @@ function addZipEntryToZip(zip, zipEntry) {
4
4
  const options = {
5
5
  comment: zipEntry.comment,
6
6
  date: zipEntry.date,
7
- unixPermissions: zipEntry.permissions.type === 'unix' ? zipEntry.permissions.unixPermissions : undefined,
8
- dosPermissions: zipEntry.permissions.type === 'dos' ? zipEntry.permissions.dosPermissions : undefined,
7
+ // unixPermissions: zipEntry.permissions.type === 'unix' ? zipEntry.permissions.unixPermissions : undefined,
8
+ // dosPermissions: zipEntry.permissions.type === 'dos' ? zipEntry.permissions.dosPermissions : undefined,
9
9
  };
10
10
  if (zipEntry.type === 'file') {
11
11
  zip.file(zipEntry.path, zipEntry.content, {
@@ -30,7 +30,7 @@ export const arbitraryZipStream = arbitraryZip.map(zip => {
30
30
  const zipInternalStream = jsZip.generateInternalStream({
31
31
  type: 'uint8array',
32
32
  comment: zip.comment,
33
- platform: zip.entries.at(0)?.permissions.type.toUpperCase(),
33
+ platform: zip.entries.at(0)?.hostSystem.toUpperCase(),
34
34
  });
35
35
  const zipStream = new ReadableStream({
36
36
  start(controller) {
@@ -1,2 +1,2 @@
1
- import { Parser } from "./parser.js";
1
+ import { type Parser } from './parser.js';
2
2
  export declare const createArrayParser: <ElementOutput, Sequence>(elementParser: Parser<ElementOutput, Sequence>) => Parser<ElementOutput[], Sequence>;