cline 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 (299) hide show
  1. package/bin/cline +0 -0
  2. package/bin/cline-darwin-amd64 +0 -0
  3. package/bin/cline-darwin-arm64 +0 -0
  4. package/bin/cline-host +0 -0
  5. package/bin/cline-host-darwin-amd64 +0 -0
  6. package/bin/cline-host-darwin-arm64 +0 -0
  7. package/bin/cline-host-linux-amd64 +0 -0
  8. package/bin/cline-host-linux-arm64 +0 -0
  9. package/bin/cline-linux-amd64 +0 -0
  10. package/bin/cline-linux-arm64 +0 -0
  11. package/cline-core.js +24841 -16621
  12. package/extension/package.json +12 -4
  13. package/node_modules/b4a/LICENSE +201 -0
  14. package/node_modules/b4a/README.md +153 -0
  15. package/node_modules/b4a/browser.js +563 -0
  16. package/node_modules/b4a/index.js +188 -0
  17. package/node_modules/b4a/lib/ascii.js +31 -0
  18. package/node_modules/b4a/lib/base64.js +65 -0
  19. package/node_modules/b4a/lib/hex.js +51 -0
  20. package/node_modules/b4a/lib/utf16le.js +40 -0
  21. package/node_modules/b4a/lib/utf8.js +141 -0
  22. package/node_modules/b4a/package.json +49 -0
  23. package/node_modules/b4a/react-native.js +5 -0
  24. package/node_modules/bare-events/LICENSE +201 -0
  25. package/node_modules/bare-events/README.md +25 -0
  26. package/node_modules/bare-events/global.d.ts +15 -0
  27. package/node_modules/bare-events/global.js +5 -0
  28. package/node_modules/bare-events/index.d.ts +94 -0
  29. package/node_modules/bare-events/index.js +355 -0
  30. package/node_modules/bare-events/lib/errors.js +32 -0
  31. package/node_modules/bare-events/package.json +61 -0
  32. package/node_modules/bare-events/web.d.ts +79 -0
  33. package/node_modules/bare-events/web.js +347 -0
  34. package/node_modules/bare-fs/CMakeLists.txt +13 -0
  35. package/node_modules/bare-fs/LICENSE +201 -0
  36. package/node_modules/bare-fs/README.md +29 -0
  37. package/node_modules/bare-fs/binding.c +2238 -0
  38. package/node_modules/bare-fs/binding.js +1 -0
  39. package/node_modules/bare-fs/index.d.ts +1115 -0
  40. package/node_modules/bare-fs/index.js +2330 -0
  41. package/node_modules/bare-fs/lib/constants.d.ts +49 -0
  42. package/node_modules/bare-fs/lib/constants.js +49 -0
  43. package/node_modules/bare-fs/lib/errors.d.ts +11 -0
  44. package/node_modules/bare-fs/lib/errors.js +55 -0
  45. package/node_modules/bare-fs/package.json +71 -0
  46. package/node_modules/bare-fs/prebuilds/android-arm/bare-fs.bare +0 -0
  47. package/node_modules/bare-fs/prebuilds/android-arm64/bare-fs.bare +0 -0
  48. package/node_modules/bare-fs/prebuilds/android-ia32/bare-fs.bare +0 -0
  49. package/node_modules/bare-fs/prebuilds/android-x64/bare-fs.bare +0 -0
  50. package/node_modules/bare-fs/prebuilds/darwin-arm64/bare-fs.bare +0 -0
  51. package/node_modules/bare-fs/prebuilds/darwin-x64/bare-fs.bare +0 -0
  52. package/node_modules/bare-fs/prebuilds/ios-arm64/bare-fs.bare +0 -0
  53. package/node_modules/bare-fs/prebuilds/ios-arm64-simulator/bare-fs.bare +0 -0
  54. package/node_modules/bare-fs/prebuilds/ios-x64-simulator/bare-fs.bare +0 -0
  55. package/node_modules/bare-fs/prebuilds/linux-arm64/bare-fs.bare +0 -0
  56. package/node_modules/bare-fs/prebuilds/linux-x64/bare-fs.bare +0 -0
  57. package/node_modules/bare-fs/prebuilds/win32-arm64/bare-fs.bare +0 -0
  58. package/node_modules/bare-fs/prebuilds/win32-x64/bare-fs.bare +0 -0
  59. package/node_modules/bare-fs/promises.d.ts +282 -0
  60. package/node_modules/bare-fs/promises.js +90 -0
  61. package/node_modules/bare-os/CMakeLists.txt +13 -0
  62. package/node_modules/bare-os/LICENSE +201 -0
  63. package/node_modules/bare-os/README.md +11 -0
  64. package/node_modules/bare-os/binding.c +1119 -0
  65. package/node_modules/bare-os/binding.js +1 -0
  66. package/node_modules/bare-os/index.d.ts +109 -0
  67. package/node_modules/bare-os/index.js +99 -0
  68. package/node_modules/bare-os/lib/constants.js +6 -0
  69. package/node_modules/bare-os/lib/errors.js +22 -0
  70. package/node_modules/bare-os/package.json +46 -0
  71. package/node_modules/bare-os/prebuilds/android-arm/bare-os.bare +0 -0
  72. package/node_modules/bare-os/prebuilds/android-arm64/bare-os.bare +0 -0
  73. package/node_modules/bare-os/prebuilds/android-ia32/bare-os.bare +0 -0
  74. package/node_modules/bare-os/prebuilds/android-x64/bare-os.bare +0 -0
  75. package/node_modules/bare-os/prebuilds/darwin-arm64/bare-os.bare +0 -0
  76. package/node_modules/bare-os/prebuilds/darwin-x64/bare-os.bare +0 -0
  77. package/node_modules/bare-os/prebuilds/ios-arm64/bare-os.bare +0 -0
  78. package/node_modules/bare-os/prebuilds/ios-arm64-simulator/bare-os.bare +0 -0
  79. package/node_modules/bare-os/prebuilds/ios-x64-simulator/bare-os.bare +0 -0
  80. package/node_modules/bare-os/prebuilds/linux-arm64/bare-os.bare +0 -0
  81. package/node_modules/bare-os/prebuilds/linux-x64/bare-os.bare +0 -0
  82. package/node_modules/bare-os/prebuilds/win32-arm64/bare-os.bare +0 -0
  83. package/node_modules/bare-os/prebuilds/win32-x64/bare-os.bare +0 -0
  84. package/node_modules/bare-path/LICENSE +201 -0
  85. package/node_modules/bare-path/NOTICE +28 -0
  86. package/node_modules/bare-path/README.md +19 -0
  87. package/node_modules/bare-path/index.js +11 -0
  88. package/node_modules/bare-path/lib/constants.js +11 -0
  89. package/node_modules/bare-path/lib/posix.js +242 -0
  90. package/node_modules/bare-path/lib/shared.js +67 -0
  91. package/node_modules/bare-path/lib/win32.js +513 -0
  92. package/node_modules/bare-path/package.json +36 -0
  93. package/node_modules/bare-stream/LICENSE +201 -0
  94. package/node_modules/bare-stream/README.md +15 -0
  95. package/node_modules/bare-stream/global.js +8 -0
  96. package/node_modules/bare-stream/index.d.ts +237 -0
  97. package/node_modules/bare-stream/index.js +355 -0
  98. package/node_modules/bare-stream/package.json +61 -0
  99. package/node_modules/bare-stream/promises.js +3 -0
  100. package/node_modules/bare-stream/web.d.ts +73 -0
  101. package/node_modules/bare-stream/web.js +229 -0
  102. package/node_modules/bare-url/CMakeLists.txt +27 -0
  103. package/node_modules/bare-url/LICENSE +201 -0
  104. package/node_modules/bare-url/README.md +19 -0
  105. package/node_modules/bare-url/binding.c +188 -0
  106. package/node_modules/bare-url/binding.js +1 -0
  107. package/node_modules/bare-url/global.d.ts +12 -0
  108. package/node_modules/bare-url/global.js +2 -0
  109. package/node_modules/bare-url/index.d.ts +39 -0
  110. package/node_modules/bare-url/index.js +450 -0
  111. package/node_modules/bare-url/lib/errors.d.ts +8 -0
  112. package/node_modules/bare-url/lib/errors.js +38 -0
  113. package/node_modules/bare-url/lib/url-search-params.d.ts +21 -0
  114. package/node_modules/bare-url/lib/url-search-params.js +176 -0
  115. package/node_modules/bare-url/package.json +51 -0
  116. package/node_modules/bare-url/prebuilds/android-arm/bare-url.bare +0 -0
  117. package/node_modules/bare-url/prebuilds/android-arm64/bare-url.bare +0 -0
  118. package/node_modules/bare-url/prebuilds/android-ia32/bare-url.bare +0 -0
  119. package/node_modules/bare-url/prebuilds/android-x64/bare-url.bare +0 -0
  120. package/node_modules/bare-url/prebuilds/darwin-arm64/bare-url.bare +0 -0
  121. package/node_modules/bare-url/prebuilds/darwin-x64/bare-url.bare +0 -0
  122. package/node_modules/bare-url/prebuilds/ios-arm64/bare-url.bare +0 -0
  123. package/node_modules/bare-url/prebuilds/ios-arm64-simulator/bare-url.bare +0 -0
  124. package/node_modules/bare-url/prebuilds/ios-x64-simulator/bare-url.bare +0 -0
  125. package/node_modules/bare-url/prebuilds/linux-arm64/bare-url.bare +0 -0
  126. package/node_modules/bare-url/prebuilds/linux-x64/bare-url.bare +0 -0
  127. package/node_modules/bare-url/prebuilds/win32-arm64/bare-url.bare +0 -0
  128. package/node_modules/bare-url/prebuilds/win32-x64/bare-url.bare +0 -0
  129. package/node_modules/better-sqlite3/deps/download.sh +1 -1
  130. package/node_modules/better-sqlite3/deps/sqlite3/sqlite3.c +122 -81
  131. package/node_modules/better-sqlite3/deps/sqlite3/sqlite3.h +45 -45
  132. package/node_modules/better-sqlite3/lib/database.js +1 -1
  133. package/node_modules/better-sqlite3/package.json +4 -7
  134. package/node_modules/better-sqlite3/src/addon.cpp +47 -0
  135. package/node_modules/better-sqlite3/src/better_sqlite3.cpp +44 -2164
  136. package/node_modules/better-sqlite3/src/objects/backup.cpp +120 -0
  137. package/node_modules/better-sqlite3/src/objects/backup.hpp +36 -0
  138. package/node_modules/better-sqlite3/src/objects/database.cpp +417 -0
  139. package/node_modules/better-sqlite3/src/objects/database.hpp +103 -0
  140. package/node_modules/better-sqlite3/src/objects/statement-iterator.cpp +113 -0
  141. package/node_modules/better-sqlite3/src/objects/statement-iterator.hpp +50 -0
  142. package/node_modules/better-sqlite3/src/objects/statement.cpp +383 -0
  143. package/node_modules/better-sqlite3/src/objects/statement.hpp +58 -0
  144. package/node_modules/better-sqlite3/src/util/bind-map.cpp +73 -0
  145. package/node_modules/better-sqlite3/src/util/binder.cpp +193 -0
  146. package/node_modules/better-sqlite3/src/util/constants.cpp +172 -0
  147. package/node_modules/better-sqlite3/src/util/custom-aggregate.cpp +121 -0
  148. package/node_modules/better-sqlite3/src/util/custom-function.cpp +59 -0
  149. package/node_modules/better-sqlite3/src/util/custom-table.cpp +409 -0
  150. package/node_modules/better-sqlite3/src/util/data-converter.cpp +17 -0
  151. package/node_modules/better-sqlite3/src/util/data.cpp +194 -0
  152. package/node_modules/better-sqlite3/src/util/helpers.cpp +109 -0
  153. package/node_modules/better-sqlite3/src/util/macros.cpp +63 -0
  154. package/node_modules/better-sqlite3/src/util/query-macros.cpp +71 -0
  155. package/node_modules/better-sqlite3/src/util/row-builder.cpp +49 -0
  156. package/node_modules/events-universal/LICENSE +201 -0
  157. package/node_modules/events-universal/README.md +17 -0
  158. package/node_modules/events-universal/bare.js +1 -0
  159. package/node_modules/events-universal/default.js +1 -0
  160. package/node_modules/events-universal/index.js +1 -0
  161. package/node_modules/events-universal/package.json +39 -0
  162. package/node_modules/events-universal/react-native.js +1 -0
  163. package/node_modules/{fs-constants → fast-fifo}/LICENSE +1 -1
  164. package/node_modules/fast-fifo/README.md +78 -0
  165. package/node_modules/fast-fifo/fixed-size.js +39 -0
  166. package/node_modules/fast-fifo/index.js +48 -0
  167. package/node_modules/fast-fifo/package.json +28 -0
  168. package/node_modules/{base64-js → streamx}/LICENSE +1 -1
  169. package/node_modules/streamx/README.md +489 -0
  170. package/node_modules/streamx/index.js +1184 -0
  171. package/node_modules/streamx/package.json +34 -0
  172. package/node_modules/tar-fs/README.md +23 -34
  173. package/node_modules/tar-fs/index.js +211 -184
  174. package/node_modules/tar-fs/package.json +27 -7
  175. package/node_modules/tar-stream/README.md +34 -19
  176. package/node_modules/tar-stream/constants.js +14 -0
  177. package/node_modules/tar-stream/extract.js +341 -192
  178. package/node_modules/tar-stream/headers.js +201 -175
  179. package/node_modules/tar-stream/pack.js +226 -194
  180. package/node_modules/tar-stream/package.json +23 -46
  181. package/node_modules/text-decoder/LICENSE +201 -0
  182. package/node_modules/text-decoder/README.md +36 -0
  183. package/node_modules/text-decoder/index.js +64 -0
  184. package/node_modules/text-decoder/lib/browser-decoder.js +17 -0
  185. package/node_modules/text-decoder/lib/pass-through-decoder.js +19 -0
  186. package/node_modules/text-decoder/lib/utf8-decoder.js +104 -0
  187. package/node_modules/text-decoder/package.json +38 -0
  188. package/package.json +2 -2
  189. package/proto/cline/account.proto +10 -8
  190. package/proto/cline/browser.proto +3 -1
  191. package/proto/cline/checkpoints.proto +5 -3
  192. package/proto/cline/commands.proto +4 -2
  193. package/proto/cline/common.proto +5 -7
  194. package/proto/cline/dictation.proto +3 -1
  195. package/proto/cline/file.proto +36 -34
  196. package/proto/cline/hooks.proto +3 -2
  197. package/proto/cline/mcp.proto +6 -4
  198. package/proto/cline/models.proto +189 -19
  199. package/proto/cline/oca_account.proto +6 -7
  200. package/proto/cline/slash.proto +3 -1
  201. package/proto/cline/state.proto +147 -292
  202. package/proto/cline/task.proto +4 -2
  203. package/proto/cline/ui.proto +25 -24
  204. package/proto/cline/web.proto +3 -1
  205. package/proto/descriptor_set.pb +0 -0
  206. package/proto/host/diff.proto +5 -4
  207. package/proto/host/env.proto +8 -7
  208. package/proto/host/testing.proto +3 -3
  209. package/proto/host/window.proto +2 -2
  210. package/proto/host/workspace.proto +24 -11
  211. package/node_modules/base64-js/README.md +0 -34
  212. package/node_modules/base64-js/base64js.min.js +0 -1
  213. package/node_modules/base64-js/index.d.ts +0 -3
  214. package/node_modules/base64-js/index.js +0 -150
  215. package/node_modules/base64-js/package.json +0 -47
  216. package/node_modules/better-sqlite3/src/better_sqlite3.hpp +0 -1036
  217. package/node_modules/bl/.travis.yml +0 -17
  218. package/node_modules/bl/BufferList.js +0 -396
  219. package/node_modules/bl/LICENSE.md +0 -13
  220. package/node_modules/bl/README.md +0 -247
  221. package/node_modules/bl/bl.js +0 -84
  222. package/node_modules/bl/package.json +0 -37
  223. package/node_modules/bl/test/convert.js +0 -21
  224. package/node_modules/bl/test/indexOf.js +0 -492
  225. package/node_modules/bl/test/isBufferList.js +0 -32
  226. package/node_modules/bl/test/test.js +0 -869
  227. package/node_modules/buffer/AUTHORS.md +0 -70
  228. package/node_modules/buffer/LICENSE +0 -21
  229. package/node_modules/buffer/README.md +0 -410
  230. package/node_modules/buffer/index.d.ts +0 -186
  231. package/node_modules/buffer/index.js +0 -1817
  232. package/node_modules/buffer/package.json +0 -96
  233. package/node_modules/chownr/LICENSE +0 -15
  234. package/node_modules/chownr/README.md +0 -3
  235. package/node_modules/chownr/chownr.js +0 -167
  236. package/node_modules/chownr/package.json +0 -29
  237. package/node_modules/fs-constants/README.md +0 -26
  238. package/node_modules/fs-constants/browser.js +0 -1
  239. package/node_modules/fs-constants/index.js +0 -1
  240. package/node_modules/fs-constants/package.json +0 -19
  241. package/node_modules/ieee754/LICENSE +0 -11
  242. package/node_modules/ieee754/README.md +0 -51
  243. package/node_modules/ieee754/index.d.ts +0 -10
  244. package/node_modules/ieee754/index.js +0 -85
  245. package/node_modules/ieee754/package.json +0 -52
  246. package/node_modules/inherits/LICENSE +0 -16
  247. package/node_modules/inherits/README.md +0 -42
  248. package/node_modules/inherits/inherits.js +0 -9
  249. package/node_modules/inherits/inherits_browser.js +0 -27
  250. package/node_modules/inherits/package.json +0 -29
  251. package/node_modules/readable-stream/CONTRIBUTING.md +0 -38
  252. package/node_modules/readable-stream/GOVERNANCE.md +0 -136
  253. package/node_modules/readable-stream/LICENSE +0 -47
  254. package/node_modules/readable-stream/README.md +0 -106
  255. package/node_modules/readable-stream/errors-browser.js +0 -127
  256. package/node_modules/readable-stream/errors.js +0 -116
  257. package/node_modules/readable-stream/experimentalWarning.js +0 -17
  258. package/node_modules/readable-stream/lib/_stream_duplex.js +0 -126
  259. package/node_modules/readable-stream/lib/_stream_passthrough.js +0 -37
  260. package/node_modules/readable-stream/lib/_stream_readable.js +0 -1027
  261. package/node_modules/readable-stream/lib/_stream_transform.js +0 -190
  262. package/node_modules/readable-stream/lib/_stream_writable.js +0 -641
  263. package/node_modules/readable-stream/lib/internal/streams/async_iterator.js +0 -180
  264. package/node_modules/readable-stream/lib/internal/streams/buffer_list.js +0 -183
  265. package/node_modules/readable-stream/lib/internal/streams/destroy.js +0 -96
  266. package/node_modules/readable-stream/lib/internal/streams/end-of-stream.js +0 -86
  267. package/node_modules/readable-stream/lib/internal/streams/from-browser.js +0 -3
  268. package/node_modules/readable-stream/lib/internal/streams/from.js +0 -52
  269. package/node_modules/readable-stream/lib/internal/streams/pipeline.js +0 -86
  270. package/node_modules/readable-stream/lib/internal/streams/state.js +0 -22
  271. package/node_modules/readable-stream/lib/internal/streams/stream-browser.js +0 -1
  272. package/node_modules/readable-stream/lib/internal/streams/stream.js +0 -1
  273. package/node_modules/readable-stream/package.json +0 -68
  274. package/node_modules/readable-stream/readable-browser.js +0 -9
  275. package/node_modules/readable-stream/readable.js +0 -16
  276. package/node_modules/string_decoder/LICENSE +0 -48
  277. package/node_modules/string_decoder/README.md +0 -47
  278. package/node_modules/string_decoder/lib/string_decoder.js +0 -296
  279. package/node_modules/string_decoder/package.json +0 -34
  280. package/node_modules/tar-fs/.travis.yml +0 -6
  281. package/node_modules/tar-fs/test/fixtures/a/hello.txt +0 -1
  282. package/node_modules/tar-fs/test/fixtures/b/a/test.txt +0 -1
  283. package/node_modules/tar-fs/test/fixtures/d/file1 +0 -0
  284. package/node_modules/tar-fs/test/fixtures/d/file2 +0 -0
  285. package/node_modules/tar-fs/test/fixtures/d/sub-dir/file5 +0 -0
  286. package/node_modules/tar-fs/test/fixtures/d/sub-files/file3 +0 -0
  287. package/node_modules/tar-fs/test/fixtures/d/sub-files/file4 +0 -0
  288. package/node_modules/tar-fs/test/fixtures/e/directory/.ignore +0 -0
  289. package/node_modules/tar-fs/test/fixtures/e/file +0 -0
  290. package/node_modules/tar-fs/test/fixtures/invalid.tar +0 -0
  291. package/node_modules/tar-fs/test/index.js +0 -346
  292. package/node_modules/tar-stream/sandbox.js +0 -11
  293. package/node_modules/util-deprecate/History.md +0 -16
  294. package/node_modules/util-deprecate/LICENSE +0 -24
  295. package/node_modules/util-deprecate/README.md +0 -53
  296. package/node_modules/util-deprecate/browser.js +0 -67
  297. package/node_modules/util-deprecate/node.js +0 -6
  298. package/node_modules/util-deprecate/package.json +0 -27
  299. package/test-startup.sh +0 -14
@@ -1,257 +1,406 @@
1
- var util = require('util')
2
- var bl = require('bl')
3
- var headers = require('./headers')
1
+ const { Writable, Readable, getStreamError } = require('streamx')
2
+ const FIFO = require('fast-fifo')
3
+ const b4a = require('b4a')
4
+ const headers = require('./headers')
4
5
 
5
- var Writable = require('readable-stream').Writable
6
- var PassThrough = require('readable-stream').PassThrough
6
+ const EMPTY = b4a.alloc(0)
7
7
 
8
- var noop = function () {}
8
+ class BufferList {
9
+ constructor () {
10
+ this.buffered = 0
11
+ this.shifted = 0
12
+ this.queue = new FIFO()
9
13
 
10
- var overflow = function (size) {
11
- size &= 511
12
- return size && 512 - size
13
- }
14
+ this._offset = 0
15
+ }
14
16
 
15
- var emptyStream = function (self, offset) {
16
- var s = new Source(self, offset)
17
- s.end()
18
- return s
19
- }
17
+ push (buffer) {
18
+ this.buffered += buffer.byteLength
19
+ this.queue.push(buffer)
20
+ }
20
21
 
21
- var mixinPax = function (header, pax) {
22
- if (pax.path) header.name = pax.path
23
- if (pax.linkpath) header.linkname = pax.linkpath
24
- if (pax.size) header.size = parseInt(pax.size, 10)
25
- header.pax = pax
26
- return header
27
- }
22
+ shiftFirst (size) {
23
+ return this._buffered === 0 ? null : this._next(size)
24
+ }
28
25
 
29
- var Source = function (self, offset) {
30
- this._parent = self
31
- this.offset = offset
32
- PassThrough.call(this, { autoDestroy: false })
33
- }
26
+ shift (size) {
27
+ if (size > this.buffered) return null
28
+ if (size === 0) return EMPTY
34
29
 
35
- util.inherits(Source, PassThrough)
30
+ let chunk = this._next(size)
36
31
 
37
- Source.prototype.destroy = function (err) {
38
- this._parent.destroy(err)
39
- }
32
+ if (size === chunk.byteLength) return chunk // likely case
33
+
34
+ const chunks = [chunk]
40
35
 
41
- var Extract = function (opts) {
42
- if (!(this instanceof Extract)) return new Extract(opts)
43
- Writable.call(this, opts)
44
-
45
- opts = opts || {}
46
-
47
- this._offset = 0
48
- this._buffer = bl()
49
- this._missing = 0
50
- this._partial = false
51
- this._onparse = noop
52
- this._header = null
53
- this._stream = null
54
- this._overflow = null
55
- this._cb = null
56
- this._locked = false
57
- this._destroyed = false
58
- this._pax = null
59
- this._paxGlobal = null
60
- this._gnuLongPath = null
61
- this._gnuLongLinkPath = null
62
-
63
- var self = this
64
- var b = self._buffer
65
-
66
- var oncontinue = function () {
67
- self._continue()
36
+ while ((size -= chunk.byteLength) > 0) {
37
+ chunk = this._next(size)
38
+ chunks.push(chunk)
39
+ }
40
+
41
+ return b4a.concat(chunks)
68
42
  }
69
43
 
70
- var onunlock = function (err) {
71
- self._locked = false
72
- if (err) return self.destroy(err)
73
- if (!self._stream) oncontinue()
44
+ _next (size) {
45
+ const buf = this.queue.peek()
46
+ const rem = buf.byteLength - this._offset
47
+
48
+ if (size >= rem) {
49
+ const sub = this._offset ? buf.subarray(this._offset, buf.byteLength) : buf
50
+ this.queue.shift()
51
+ this._offset = 0
52
+ this.buffered -= rem
53
+ this.shifted += rem
54
+ return sub
55
+ }
56
+
57
+ this.buffered -= size
58
+ this.shifted += size
59
+
60
+ return buf.subarray(this._offset, (this._offset += size))
74
61
  }
62
+ }
63
+
64
+ class Source extends Readable {
65
+ constructor (self, header, offset) {
66
+ super()
67
+
68
+ this.header = header
69
+ this.offset = offset
75
70
 
76
- var onstreamend = function () {
77
- self._stream = null
78
- var drain = overflow(self._header.size)
79
- if (drain) self._parse(drain, ondrain)
80
- else self._parse(512, onheader)
81
- if (!self._locked) oncontinue()
71
+ this._parent = self
82
72
  }
83
73
 
84
- var ondrain = function () {
85
- self._buffer.consume(overflow(self._header.size))
86
- self._parse(512, onheader)
87
- oncontinue()
74
+ _read (cb) {
75
+ if (this.header.size === 0) {
76
+ this.push(null)
77
+ }
78
+ if (this._parent._stream === this) {
79
+ this._parent._update()
80
+ }
81
+ cb(null)
88
82
  }
89
83
 
90
- var onpaxglobalheader = function () {
91
- var size = self._header.size
92
- self._paxGlobal = headers.decodePax(b.slice(0, size))
93
- b.consume(size)
94
- onstreamend()
84
+ _predestroy () {
85
+ this._parent.destroy(getStreamError(this))
95
86
  }
96
87
 
97
- var onpaxheader = function () {
98
- var size = self._header.size
99
- self._pax = headers.decodePax(b.slice(0, size))
100
- if (self._paxGlobal) self._pax = Object.assign({}, self._paxGlobal, self._pax)
101
- b.consume(size)
102
- onstreamend()
88
+ _detach () {
89
+ if (this._parent._stream === this) {
90
+ this._parent._stream = null
91
+ this._parent._missing = overflow(this.header.size)
92
+ this._parent._update()
93
+ }
103
94
  }
104
95
 
105
- var ongnulongpath = function () {
106
- var size = self._header.size
107
- this._gnuLongPath = headers.decodeLongPath(b.slice(0, size), opts.filenameEncoding)
108
- b.consume(size)
109
- onstreamend()
96
+ _destroy (cb) {
97
+ this._detach()
98
+ cb(null)
110
99
  }
100
+ }
101
+
102
+ class Extract extends Writable {
103
+ constructor (opts) {
104
+ super(opts)
105
+
106
+ if (!opts) opts = {}
107
+
108
+ this._buffer = new BufferList()
109
+ this._offset = 0
110
+ this._header = null
111
+ this._stream = null
112
+ this._missing = 0
113
+ this._longHeader = false
114
+ this._callback = noop
115
+ this._locked = false
116
+ this._finished = false
117
+ this._pax = null
118
+ this._paxGlobal = null
119
+ this._gnuLongPath = null
120
+ this._gnuLongLinkPath = null
121
+ this._filenameEncoding = opts.filenameEncoding || 'utf-8'
122
+ this._allowUnknownFormat = !!opts.allowUnknownFormat
123
+ this._unlockBound = this._unlock.bind(this)
124
+ }
125
+
126
+ _unlock (err) {
127
+ this._locked = false
111
128
 
112
- var ongnulonglinkpath = function () {
113
- var size = self._header.size
114
- this._gnuLongLinkPath = headers.decodeLongPath(b.slice(0, size), opts.filenameEncoding)
115
- b.consume(size)
116
- onstreamend()
129
+ if (err) {
130
+ this.destroy(err)
131
+ this._continueWrite(err)
132
+ return
133
+ }
134
+
135
+ this._update()
117
136
  }
118
137
 
119
- var onheader = function () {
120
- var offset = self._offset
121
- var header
138
+ _consumeHeader () {
139
+ if (this._locked) return false
140
+
141
+ this._offset = this._buffer.shifted
142
+
122
143
  try {
123
- header = self._header = headers.decode(b.slice(0, 512), opts.filenameEncoding, opts.allowUnknownFormat)
144
+ this._header = headers.decode(this._buffer.shift(512), this._filenameEncoding, this._allowUnknownFormat)
124
145
  } catch (err) {
125
- self.emit('error', err)
146
+ this._continueWrite(err)
147
+ return false
126
148
  }
127
- b.consume(512)
128
149
 
129
- if (!header) {
130
- self._parse(512, onheader)
131
- oncontinue()
132
- return
150
+ if (!this._header) return true
151
+
152
+ switch (this._header.type) {
153
+ case 'gnu-long-path':
154
+ case 'gnu-long-link-path':
155
+ case 'pax-global-header':
156
+ case 'pax-header':
157
+ this._longHeader = true
158
+ this._missing = this._header.size
159
+ return true
133
160
  }
134
- if (header.type === 'gnu-long-path') {
135
- self._parse(header.size, ongnulongpath)
136
- oncontinue()
137
- return
161
+
162
+ this._locked = true
163
+ this._applyLongHeaders()
164
+
165
+ if (this._header.size === 0 || this._header.type === 'directory') {
166
+ this.emit('entry', this._header, this._createStream(), this._unlockBound)
167
+ return true
138
168
  }
139
- if (header.type === 'gnu-long-link-path') {
140
- self._parse(header.size, ongnulonglinkpath)
141
- oncontinue()
142
- return
169
+
170
+ this._stream = this._createStream()
171
+ this._missing = this._header.size
172
+
173
+ this.emit('entry', this._header, this._stream, this._unlockBound)
174
+ return true
175
+ }
176
+
177
+ _applyLongHeaders () {
178
+ if (this._gnuLongPath) {
179
+ this._header.name = this._gnuLongPath
180
+ this._gnuLongPath = null
143
181
  }
144
- if (header.type === 'pax-global-header') {
145
- self._parse(header.size, onpaxglobalheader)
146
- oncontinue()
147
- return
182
+
183
+ if (this._gnuLongLinkPath) {
184
+ this._header.linkname = this._gnuLongLinkPath
185
+ this._gnuLongLinkPath = null
148
186
  }
149
- if (header.type === 'pax-header') {
150
- self._parse(header.size, onpaxheader)
151
- oncontinue()
152
- return
187
+
188
+ if (this._pax) {
189
+ if (this._pax.path) this._header.name = this._pax.path
190
+ if (this._pax.linkpath) this._header.linkname = this._pax.linkpath
191
+ if (this._pax.size) this._header.size = parseInt(this._pax.size, 10)
192
+ this._header.pax = this._pax
193
+ this._pax = null
153
194
  }
195
+ }
154
196
 
155
- if (self._gnuLongPath) {
156
- header.name = self._gnuLongPath
157
- self._gnuLongPath = null
197
+ _decodeLongHeader (buf) {
198
+ switch (this._header.type) {
199
+ case 'gnu-long-path':
200
+ this._gnuLongPath = headers.decodeLongPath(buf, this._filenameEncoding)
201
+ break
202
+ case 'gnu-long-link-path':
203
+ this._gnuLongLinkPath = headers.decodeLongPath(buf, this._filenameEncoding)
204
+ break
205
+ case 'pax-global-header':
206
+ this._paxGlobal = headers.decodePax(buf)
207
+ break
208
+ case 'pax-header':
209
+ this._pax = this._paxGlobal === null
210
+ ? headers.decodePax(buf)
211
+ : Object.assign({}, this._paxGlobal, headers.decodePax(buf))
212
+ break
158
213
  }
214
+ }
215
+
216
+ _consumeLongHeader () {
217
+ this._longHeader = false
218
+ this._missing = overflow(this._header.size)
219
+
220
+ const buf = this._buffer.shift(this._header.size)
159
221
 
160
- if (self._gnuLongLinkPath) {
161
- header.linkname = self._gnuLongLinkPath
162
- self._gnuLongLinkPath = null
222
+ try {
223
+ this._decodeLongHeader(buf)
224
+ } catch (err) {
225
+ this._continueWrite(err)
226
+ return false
163
227
  }
164
228
 
165
- if (self._pax) {
166
- self._header = header = mixinPax(header, self._pax)
167
- self._pax = null
229
+ return true
230
+ }
231
+
232
+ _consumeStream () {
233
+ const buf = this._buffer.shiftFirst(this._missing)
234
+ if (buf === null) return false
235
+
236
+ this._missing -= buf.byteLength
237
+ const drained = this._stream.push(buf)
238
+
239
+ if (this._missing === 0) {
240
+ this._stream.push(null)
241
+ if (drained) this._stream._detach()
242
+ return drained && this._locked === false
168
243
  }
169
244
 
170
- self._locked = true
245
+ return drained
246
+ }
247
+
248
+ _createStream () {
249
+ return new Source(this, this._header, this._offset)
250
+ }
171
251
 
172
- if (!header.size || header.type === 'directory') {
173
- self._parse(512, onheader)
174
- self.emit('entry', header, emptyStream(self, offset), onunlock)
175
- return
252
+ _update () {
253
+ while (this._buffer.buffered > 0 && !this.destroying) {
254
+ if (this._missing > 0) {
255
+ if (this._stream !== null) {
256
+ if (this._consumeStream() === false) return
257
+ continue
258
+ }
259
+
260
+ if (this._longHeader === true) {
261
+ if (this._missing > this._buffer.buffered) break
262
+ if (this._consumeLongHeader() === false) return false
263
+ continue
264
+ }
265
+
266
+ const ignore = this._buffer.shiftFirst(this._missing)
267
+ if (ignore !== null) this._missing -= ignore.byteLength
268
+ continue
269
+ }
270
+
271
+ if (this._buffer.buffered < 512) break
272
+ if (this._stream !== null || this._consumeHeader() === false) return
176
273
  }
177
274
 
178
- self._stream = new Source(self, offset)
275
+ this._continueWrite(null)
276
+ }
179
277
 
180
- self.emit('entry', header, self._stream, onunlock)
181
- self._parse(header.size, onstreamend)
182
- oncontinue()
278
+ _continueWrite (err) {
279
+ const cb = this._callback
280
+ this._callback = noop
281
+ cb(err)
183
282
  }
184
283
 
185
- this._onheader = onheader
186
- this._parse(512, onheader)
187
- }
284
+ _write (data, cb) {
285
+ this._callback = cb
286
+ this._buffer.push(data)
287
+ this._update()
288
+ }
188
289
 
189
- util.inherits(Extract, Writable)
290
+ _final (cb) {
291
+ this._finished = this._missing === 0 && this._buffer.buffered === 0
292
+ cb(this._finished ? null : new Error('Unexpected end of data'))
293
+ }
190
294
 
191
- Extract.prototype.destroy = function (err) {
192
- if (this._destroyed) return
193
- this._destroyed = true
295
+ _predestroy () {
296
+ this._continueWrite(null)
297
+ }
194
298
 
195
- if (err) this.emit('error', err)
196
- this.emit('close')
197
- if (this._stream) this._stream.emit('close')
198
- }
299
+ _destroy (cb) {
300
+ if (this._stream) this._stream.destroy(getStreamError(this))
301
+ cb(null)
302
+ }
199
303
 
200
- Extract.prototype._parse = function (size, onparse) {
201
- if (this._destroyed) return
202
- this._offset += size
203
- this._missing = size
204
- if (onparse === this._onheader) this._partial = false
205
- this._onparse = onparse
206
- }
304
+ [Symbol.asyncIterator] () {
305
+ let error = null
306
+
307
+ let promiseResolve = null
308
+ let promiseReject = null
309
+
310
+ let entryStream = null
311
+ let entryCallback = null
312
+
313
+ const extract = this
314
+
315
+ this.on('entry', onentry)
316
+ this.on('error', (err) => { error = err })
317
+ this.on('close', onclose)
318
+
319
+ return {
320
+ [Symbol.asyncIterator] () {
321
+ return this
322
+ },
323
+ next () {
324
+ return new Promise(onnext)
325
+ },
326
+ return () {
327
+ return destroy(null)
328
+ },
329
+ throw (err) {
330
+ return destroy(err)
331
+ }
332
+ }
207
333
 
208
- Extract.prototype._continue = function () {
209
- if (this._destroyed) return
210
- var cb = this._cb
211
- this._cb = noop
212
- if (this._overflow) this._write(this._overflow, undefined, cb)
213
- else cb()
214
- }
334
+ function consumeCallback (err) {
335
+ if (!entryCallback) return
336
+ const cb = entryCallback
337
+ entryCallback = null
338
+ cb(err)
339
+ }
215
340
 
216
- Extract.prototype._write = function (data, enc, cb) {
217
- if (this._destroyed) return
341
+ function onnext (resolve, reject) {
342
+ if (error) {
343
+ return reject(error)
344
+ }
218
345
 
219
- var s = this._stream
220
- var b = this._buffer
221
- var missing = this._missing
222
- if (data.length) this._partial = true
346
+ if (entryStream) {
347
+ resolve({ value: entryStream, done: false })
348
+ entryStream = null
349
+ return
350
+ }
223
351
 
224
- // we do not reach end-of-chunk now. just forward it
352
+ promiseResolve = resolve
353
+ promiseReject = reject
225
354
 
226
- if (data.length < missing) {
227
- this._missing -= data.length
228
- this._overflow = null
229
- if (s) return s.write(data, cb)
230
- b.append(data)
231
- return cb()
232
- }
355
+ consumeCallback(null)
233
356
 
234
- // end-of-chunk. the parser should call cb.
357
+ if (extract._finished && promiseResolve) {
358
+ promiseResolve({ value: undefined, done: true })
359
+ promiseResolve = promiseReject = null
360
+ }
361
+ }
235
362
 
236
- this._cb = cb
237
- this._missing = 0
363
+ function onentry (header, stream, callback) {
364
+ entryCallback = callback
365
+ stream.on('error', noop) // no way around this due to tick sillyness
238
366
 
239
- var overflow = null
240
- if (data.length > missing) {
241
- overflow = data.slice(missing)
242
- data = data.slice(0, missing)
243
- }
367
+ if (promiseResolve) {
368
+ promiseResolve({ value: stream, done: false })
369
+ promiseResolve = promiseReject = null
370
+ } else {
371
+ entryStream = stream
372
+ }
373
+ }
244
374
 
245
- if (s) s.end(data)
246
- else b.append(data)
375
+ function onclose () {
376
+ consumeCallback(error)
377
+ if (!promiseResolve) return
378
+ if (error) promiseReject(error)
379
+ else promiseResolve({ value: undefined, done: true })
380
+ promiseResolve = promiseReject = null
381
+ }
247
382
 
248
- this._overflow = overflow
249
- this._onparse()
383
+ function destroy (err) {
384
+ extract.destroy(err)
385
+ consumeCallback(err)
386
+ return new Promise((resolve, reject) => {
387
+ if (extract.destroyed) return resolve({ value: undefined, done: true })
388
+ extract.once('close', function () {
389
+ if (err) reject(err)
390
+ else resolve({ value: undefined, done: true })
391
+ })
392
+ })
393
+ }
394
+ }
250
395
  }
251
396
 
252
- Extract.prototype._final = function (cb) {
253
- if (this._partial) return this.destroy(new Error('Unexpected end of data'))
254
- cb()
397
+ module.exports = function extract (opts) {
398
+ return new Extract(opts)
255
399
  }
256
400
 
257
- module.exports = Extract
401
+ function noop () {}
402
+
403
+ function overflow (size) {
404
+ size &= 511
405
+ return size && 512 - size
406
+ }