@loaders.gl/loader-utils 4.0.0-beta.2 → 4.0.0-beta.4

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 (306) hide show
  1. package/dist/index.cjs +1252 -0
  2. package/dist/index.d.ts +7 -10
  3. package/dist/index.d.ts.map +1 -1
  4. package/dist/index.js +34 -0
  5. package/dist/index.js.map +1 -0
  6. package/dist/{esm/json-loader.js → json-loader.js} +1 -1
  7. package/dist/json-loader.js.map +1 -0
  8. package/dist/lib/binary-utils/array-buffer-utils.js.map +1 -0
  9. package/dist/{esm/lib → lib}/binary-utils/dataview-copy-utils.js +1 -1
  10. package/dist/lib/binary-utils/dataview-copy-utils.js.map +1 -0
  11. package/dist/lib/binary-utils/get-first-characters.js.map +1 -0
  12. package/dist/{esm/lib → lib}/binary-utils/memory-conversion-utils.js +1 -1
  13. package/dist/lib/binary-utils/memory-conversion-utils.js.map +1 -0
  14. package/dist/{esm/lib → lib}/binary-utils/memory-copy-utils.js +1 -1
  15. package/dist/lib/binary-utils/memory-copy-utils.js.map +1 -0
  16. package/dist/lib/env-utils/assert.js.map +1 -0
  17. package/dist/lib/env-utils/globals.js.map +1 -0
  18. package/dist/lib/file-provider/data-view-file.d.ts +4 -1
  19. package/dist/lib/file-provider/data-view-file.d.ts.map +1 -1
  20. package/dist/{esm/lib → lib}/file-provider/data-view-file.js +1 -2
  21. package/dist/lib/file-provider/data-view-file.js.map +1 -0
  22. package/dist/lib/file-provider/file-handle-file.d.ts +12 -19
  23. package/dist/lib/file-provider/file-handle-file.d.ts.map +1 -1
  24. package/dist/lib/file-provider/file-handle-file.js +56 -0
  25. package/dist/lib/file-provider/file-handle-file.js.map +1 -0
  26. package/dist/lib/file-provider/file-provider.d.ts +1 -0
  27. package/dist/lib/file-provider/file-provider.d.ts.map +1 -1
  28. package/dist/lib/file-provider/file-provider.js.map +1 -0
  29. package/dist/lib/files/blob-file.d.ts +16 -0
  30. package/dist/lib/files/blob-file.d.ts.map +1 -0
  31. package/dist/lib/files/blob-file.js +25 -0
  32. package/dist/lib/files/blob-file.js.map +1 -0
  33. package/dist/lib/files/file.d.ts +33 -0
  34. package/dist/lib/files/file.d.ts.map +1 -0
  35. package/dist/lib/files/file.js +2 -0
  36. package/dist/lib/files/file.js.map +1 -0
  37. package/dist/lib/files/http-file.d.ts +21 -0
  38. package/dist/lib/files/http-file.d.ts.map +1 -0
  39. package/dist/lib/files/http-file.js +79 -0
  40. package/dist/lib/files/http-file.js.map +1 -0
  41. package/dist/lib/files/node-file-facade.d.ts +18 -0
  42. package/dist/lib/files/node-file-facade.d.ts.map +1 -0
  43. package/dist/lib/files/node-file-facade.js +29 -0
  44. package/dist/lib/files/node-file-facade.js.map +1 -0
  45. package/dist/lib/files/sources.d.ts +1 -0
  46. package/dist/lib/files/sources.d.ts.map +1 -0
  47. package/dist/lib/files/sources.js +2 -0
  48. package/dist/lib/files/sources.js.map +1 -0
  49. package/dist/lib/filesystems/filesystem.d.ts +18 -65
  50. package/dist/lib/filesystems/filesystem.d.ts.map +1 -1
  51. package/dist/lib/filesystems/filesystem.js.map +1 -0
  52. package/dist/lib/filesystems/node-filesystem-facade.d.ts +23 -0
  53. package/dist/lib/filesystems/node-filesystem-facade.d.ts.map +1 -0
  54. package/dist/lib/filesystems/node-filesystem-facade.js +37 -0
  55. package/dist/lib/filesystems/node-filesystem-facade.js.map +1 -0
  56. package/dist/{esm/lib → lib}/iterators/async-iteration.js +1 -1
  57. package/dist/lib/iterators/async-iteration.js.map +1 -0
  58. package/dist/lib/iterators/text-iterators.js.map +1 -0
  59. package/dist/lib/node/buffer.browser.d.ts +1 -1
  60. package/dist/lib/node/buffer.browser.d.ts.map +1 -1
  61. package/dist/lib/node/buffer.browser.js.map +1 -0
  62. package/dist/lib/node/buffer.d.ts +1 -1
  63. package/dist/lib/node/buffer.d.ts.map +1 -1
  64. package/dist/lib/node/buffer.js.map +1 -0
  65. package/dist/lib/node/fs.browser.js.map +1 -0
  66. package/dist/lib/node/promisify.js.map +1 -0
  67. package/dist/lib/node/stream.browser.js.map +1 -0
  68. package/dist/lib/node/stream.js.map +1 -0
  69. package/dist/lib/option-utils/merge-loader-options.js.map +1 -0
  70. package/dist/lib/parser-utils/parse-json.js +9 -0
  71. package/dist/lib/parser-utils/parse-json.js.map +1 -0
  72. package/dist/{esm/lib → lib}/path-utils/file-aliases.js +1 -1
  73. package/dist/lib/path-utils/file-aliases.js.map +1 -0
  74. package/dist/lib/path-utils/get-cwd.js.map +1 -0
  75. package/dist/{esm/lib → lib}/path-utils/path.js +6 -6
  76. package/dist/lib/path-utils/path.js.map +1 -0
  77. package/dist/{esm/lib → lib}/request-utils/request-scheduler.js +6 -7
  78. package/dist/lib/request-utils/request-scheduler.js.map +1 -0
  79. package/dist/{esm/lib → lib}/sources/data-source.js +4 -5
  80. package/dist/lib/sources/data-source.js.map +1 -0
  81. package/dist/lib/sources/image-source.js +5 -0
  82. package/dist/lib/sources/image-source.js.map +1 -0
  83. package/dist/lib/sources/image-tile-source.js.map +1 -0
  84. package/dist/lib/sources/tile-source.js.map +1 -0
  85. package/dist/lib/sources/utils/image-type.js.map +1 -0
  86. package/dist/lib/sources/utils/utils.js.map +1 -0
  87. package/dist/lib/sources/vector-tile-source.js.map +1 -0
  88. package/dist/{esm/lib → lib}/worker-loader-utils/create-loader-worker.js +1 -1
  89. package/dist/lib/worker-loader-utils/create-loader-worker.js.map +1 -0
  90. package/dist/{esm/lib → lib}/worker-loader-utils/encode-with-worker.js +1 -1
  91. package/dist/lib/worker-loader-utils/encode-with-worker.js.map +1 -0
  92. package/dist/{esm/lib → lib}/worker-loader-utils/parse-with-worker.js +1 -1
  93. package/dist/lib/worker-loader-utils/parse-with-worker.js.map +1 -0
  94. package/dist/loader-types.js.map +1 -0
  95. package/dist/service-types.js.map +1 -0
  96. package/dist/types.d.ts +2 -2
  97. package/dist/types.d.ts.map +1 -1
  98. package/dist/types.js.map +1 -0
  99. package/dist/workers/json-worker.js +4 -0
  100. package/dist/workers/json-worker.js.map +1 -0
  101. package/dist/writer-types.js.map +1 -0
  102. package/package.json +13 -5
  103. package/src/index.ts +10 -15
  104. package/src/lib/file-provider/data-view-file.ts +4 -2
  105. package/src/lib/file-provider/file-handle-file.ts +28 -44
  106. package/src/lib/file-provider/file-provider.ts +1 -0
  107. package/src/lib/files/blob-file.ts +32 -0
  108. package/src/lib/files/file.ts +37 -0
  109. package/src/lib/files/http-file.ts +120 -0
  110. package/src/lib/files/node-file-facade.ts +39 -0
  111. package/src/lib/files/sources.ts +150 -0
  112. package/src/lib/filesystems/filesystem.ts +19 -68
  113. package/src/lib/filesystems/node-filesystem-facade.ts +63 -0
  114. package/src/lib/node/buffer.browser.ts +1 -1
  115. package/src/lib/node/buffer.ts +1 -1
  116. package/src/types.ts +0 -4
  117. package/dist/es5/index.js +0 -389
  118. package/dist/es5/index.js.map +0 -1
  119. package/dist/es5/json-loader.js +0 -44
  120. package/dist/es5/json-loader.js.map +0 -1
  121. package/dist/es5/lib/binary-utils/array-buffer-utils.js +0 -80
  122. package/dist/es5/lib/binary-utils/array-buffer-utils.js.map +0 -1
  123. package/dist/es5/lib/binary-utils/dataview-copy-utils.js +0 -58
  124. package/dist/es5/lib/binary-utils/dataview-copy-utils.js.map +0 -1
  125. package/dist/es5/lib/binary-utils/get-first-characters.js +0 -31
  126. package/dist/es5/lib/binary-utils/get-first-characters.js.map +0 -1
  127. package/dist/es5/lib/binary-utils/memory-conversion-utils.js +0 -44
  128. package/dist/es5/lib/binary-utils/memory-conversion-utils.js.map +0 -1
  129. package/dist/es5/lib/binary-utils/memory-copy-utils.js +0 -34
  130. package/dist/es5/lib/binary-utils/memory-copy-utils.js.map +0 -1
  131. package/dist/es5/lib/env-utils/assert.js +0 -12
  132. package/dist/es5/lib/env-utils/assert.js.map +0 -1
  133. package/dist/es5/lib/env-utils/globals.js +0 -30
  134. package/dist/es5/lib/env-utils/globals.js.map +0 -1
  135. package/dist/es5/lib/file-provider/data-view-file.js +0 -146
  136. package/dist/es5/lib/file-provider/data-view-file.js.map +0 -1
  137. package/dist/es5/lib/file-provider/file-handle-file.js +0 -236
  138. package/dist/es5/lib/file-provider/file-handle-file.js.map +0 -1
  139. package/dist/es5/lib/file-provider/file-handle.js +0 -98
  140. package/dist/es5/lib/file-provider/file-handle.js.map +0 -1
  141. package/dist/es5/lib/file-provider/file-provider.js +0 -11
  142. package/dist/es5/lib/file-provider/file-provider.js.map +0 -1
  143. package/dist/es5/lib/filesystems/filesystem.js +0 -2
  144. package/dist/es5/lib/filesystems/filesystem.js.map +0 -1
  145. package/dist/es5/lib/filesystems/node-filesystem.js +0 -176
  146. package/dist/es5/lib/filesystems/node-filesystem.js.map +0 -1
  147. package/dist/es5/lib/filesystems/readable-file.js +0 -91
  148. package/dist/es5/lib/filesystems/readable-file.js.map +0 -1
  149. package/dist/es5/lib/filesystems/writable-file.js +0 -82
  150. package/dist/es5/lib/filesystems/writable-file.js.map +0 -1
  151. package/dist/es5/lib/iterators/async-iteration.js +0 -190
  152. package/dist/es5/lib/iterators/async-iteration.js.map +0 -1
  153. package/dist/es5/lib/iterators/text-iterators.js +0 -305
  154. package/dist/es5/lib/iterators/text-iterators.js.map +0 -1
  155. package/dist/es5/lib/node/buffer.browser.js +0 -14
  156. package/dist/es5/lib/node/buffer.browser.js.map +0 -1
  157. package/dist/es5/lib/node/buffer.js +0 -27
  158. package/dist/es5/lib/node/buffer.js.map +0 -1
  159. package/dist/es5/lib/node/fs.browser.js +0 -9
  160. package/dist/es5/lib/node/fs.browser.js.map +0 -1
  161. package/dist/es5/lib/node/fs.js +0 -82
  162. package/dist/es5/lib/node/fs.js.map +0 -1
  163. package/dist/es5/lib/node/promisify.js +0 -36
  164. package/dist/es5/lib/node/promisify.js.map +0 -1
  165. package/dist/es5/lib/node/stream.browser.js +0 -9
  166. package/dist/es5/lib/node/stream.browser.js.map +0 -1
  167. package/dist/es5/lib/node/stream.js +0 -15
  168. package/dist/es5/lib/node/stream.js.map +0 -1
  169. package/dist/es5/lib/option-utils/merge-loader-options.js +0 -30
  170. package/dist/es5/lib/option-utils/merge-loader-options.js.map +0 -1
  171. package/dist/es5/lib/parser-utils/parse-json.js +0 -15
  172. package/dist/es5/lib/parser-utils/parse-json.js.map +0 -1
  173. package/dist/es5/lib/path-utils/file-aliases.js +0 -33
  174. package/dist/es5/lib/path-utils/file-aliases.js.map +0 -1
  175. package/dist/es5/lib/path-utils/get-cwd.js +0 -15
  176. package/dist/es5/lib/path-utils/get-cwd.js.map +0 -1
  177. package/dist/es5/lib/path-utils/path.js +0 -136
  178. package/dist/es5/lib/path-utils/path.js.map +0 -1
  179. package/dist/es5/lib/request-utils/request-scheduler.js +0 -150
  180. package/dist/es5/lib/request-utils/request-scheduler.js.map +0 -1
  181. package/dist/es5/lib/sources/data-source.js +0 -67
  182. package/dist/es5/lib/sources/data-source.js.map +0 -1
  183. package/dist/es5/lib/sources/image-source.js +0 -31
  184. package/dist/es5/lib/sources/image-source.js.map +0 -1
  185. package/dist/es5/lib/sources/image-tile-source.js +0 -2
  186. package/dist/es5/lib/sources/image-tile-source.js.map +0 -1
  187. package/dist/es5/lib/sources/tile-source.js +0 -2
  188. package/dist/es5/lib/sources/tile-source.js.map +0 -1
  189. package/dist/es5/lib/sources/utils/image-type.js +0 -2
  190. package/dist/es5/lib/sources/utils/image-type.js.map +0 -1
  191. package/dist/es5/lib/sources/utils/utils.js +0 -36
  192. package/dist/es5/lib/sources/utils/utils.js.map +0 -1
  193. package/dist/es5/lib/sources/vector-tile-source.js +0 -2
  194. package/dist/es5/lib/sources/vector-tile-source.js.map +0 -1
  195. package/dist/es5/lib/worker-loader-utils/create-loader-worker.js +0 -142
  196. package/dist/es5/lib/worker-loader-utils/create-loader-worker.js.map +0 -1
  197. package/dist/es5/lib/worker-loader-utils/encode-with-worker.js +0 -18
  198. package/dist/es5/lib/worker-loader-utils/encode-with-worker.js.map +0 -1
  199. package/dist/es5/lib/worker-loader-utils/parse-with-worker.js +0 -115
  200. package/dist/es5/lib/worker-loader-utils/parse-with-worker.js.map +0 -1
  201. package/dist/es5/loader-types.js +0 -58
  202. package/dist/es5/loader-types.js.map +0 -1
  203. package/dist/es5/service-types.js +0 -2
  204. package/dist/es5/service-types.js.map +0 -1
  205. package/dist/es5/types.js +0 -2
  206. package/dist/es5/types.js.map +0 -1
  207. package/dist/es5/workers/json-worker.js +0 -6
  208. package/dist/es5/workers/json-worker.js.map +0 -1
  209. package/dist/es5/writer-types.js +0 -2
  210. package/dist/es5/writer-types.js.map +0 -1
  211. package/dist/esm/index.js +0 -36
  212. package/dist/esm/index.js.map +0 -1
  213. package/dist/esm/json-loader.js.map +0 -1
  214. package/dist/esm/lib/binary-utils/array-buffer-utils.js.map +0 -1
  215. package/dist/esm/lib/binary-utils/dataview-copy-utils.js.map +0 -1
  216. package/dist/esm/lib/binary-utils/get-first-characters.js.map +0 -1
  217. package/dist/esm/lib/binary-utils/memory-conversion-utils.js.map +0 -1
  218. package/dist/esm/lib/binary-utils/memory-copy-utils.js.map +0 -1
  219. package/dist/esm/lib/env-utils/assert.js.map +0 -1
  220. package/dist/esm/lib/env-utils/globals.js.map +0 -1
  221. package/dist/esm/lib/file-provider/data-view-file.js.map +0 -1
  222. package/dist/esm/lib/file-provider/file-handle-file.js +0 -59
  223. package/dist/esm/lib/file-provider/file-handle-file.js.map +0 -1
  224. package/dist/esm/lib/file-provider/file-handle.js +0 -33
  225. package/dist/esm/lib/file-provider/file-handle.js.map +0 -1
  226. package/dist/esm/lib/file-provider/file-provider.js.map +0 -1
  227. package/dist/esm/lib/filesystems/filesystem.js.map +0 -1
  228. package/dist/esm/lib/filesystems/node-filesystem.js +0 -46
  229. package/dist/esm/lib/filesystems/node-filesystem.js.map +0 -1
  230. package/dist/esm/lib/filesystems/readable-file.js +0 -20
  231. package/dist/esm/lib/filesystems/readable-file.js.map +0 -1
  232. package/dist/esm/lib/filesystems/writable-file.js +0 -20
  233. package/dist/esm/lib/filesystems/writable-file.js.map +0 -1
  234. package/dist/esm/lib/iterators/async-iteration.js.map +0 -1
  235. package/dist/esm/lib/iterators/text-iterators.js.map +0 -1
  236. package/dist/esm/lib/node/buffer.browser.js.map +0 -1
  237. package/dist/esm/lib/node/buffer.js.map +0 -1
  238. package/dist/esm/lib/node/fs.browser.js.map +0 -1
  239. package/dist/esm/lib/node/fs.js +0 -29
  240. package/dist/esm/lib/node/fs.js.map +0 -1
  241. package/dist/esm/lib/node/promisify.js.map +0 -1
  242. package/dist/esm/lib/node/stream.browser.js.map +0 -1
  243. package/dist/esm/lib/node/stream.js.map +0 -1
  244. package/dist/esm/lib/option-utils/merge-loader-options.js.map +0 -1
  245. package/dist/esm/lib/parser-utils/parse-json.js +0 -9
  246. package/dist/esm/lib/parser-utils/parse-json.js.map +0 -1
  247. package/dist/esm/lib/path-utils/file-aliases.js.map +0 -1
  248. package/dist/esm/lib/path-utils/get-cwd.js.map +0 -1
  249. package/dist/esm/lib/path-utils/path.js.map +0 -1
  250. package/dist/esm/lib/request-utils/request-scheduler.js.map +0 -1
  251. package/dist/esm/lib/sources/data-source.js.map +0 -1
  252. package/dist/esm/lib/sources/image-source.js +0 -6
  253. package/dist/esm/lib/sources/image-source.js.map +0 -1
  254. package/dist/esm/lib/sources/image-tile-source.js.map +0 -1
  255. package/dist/esm/lib/sources/tile-source.js.map +0 -1
  256. package/dist/esm/lib/sources/utils/image-type.js.map +0 -1
  257. package/dist/esm/lib/sources/utils/utils.js.map +0 -1
  258. package/dist/esm/lib/sources/vector-tile-source.js.map +0 -1
  259. package/dist/esm/lib/worker-loader-utils/create-loader-worker.js.map +0 -1
  260. package/dist/esm/lib/worker-loader-utils/encode-with-worker.js.map +0 -1
  261. package/dist/esm/lib/worker-loader-utils/parse-with-worker.js.map +0 -1
  262. package/dist/esm/loader-types.js.map +0 -1
  263. package/dist/esm/service-types.js.map +0 -1
  264. package/dist/esm/types.js.map +0 -1
  265. package/dist/esm/workers/json-worker.js +0 -4
  266. package/dist/esm/workers/json-worker.js.map +0 -1
  267. package/dist/esm/writer-types.js.map +0 -1
  268. package/dist/lib/file-provider/file-handle.d.ts +0 -40
  269. package/dist/lib/file-provider/file-handle.d.ts.map +0 -1
  270. package/dist/lib/filesystems/node-filesystem.d.ts +0 -39
  271. package/dist/lib/filesystems/node-filesystem.d.ts.map +0 -1
  272. package/dist/lib/filesystems/readable-file.d.ts +0 -10
  273. package/dist/lib/filesystems/readable-file.d.ts.map +0 -1
  274. package/dist/lib/filesystems/writable-file.d.ts +0 -18
  275. package/dist/lib/filesystems/writable-file.d.ts.map +0 -1
  276. package/dist/lib/node/fs.d.ts +0 -30
  277. package/dist/lib/node/fs.d.ts.map +0 -1
  278. package/src/lib/file-provider/file-handle.ts +0 -79
  279. package/src/lib/filesystems/node-filesystem.ts +0 -67
  280. package/src/lib/filesystems/readable-file.ts +0 -30
  281. package/src/lib/filesystems/writable-file.ts +0 -44
  282. package/src/lib/node/fs.ts +0 -49
  283. /package/dist/{esm/lib → lib}/binary-utils/array-buffer-utils.js +0 -0
  284. /package/dist/{esm/lib → lib}/binary-utils/get-first-characters.js +0 -0
  285. /package/dist/{esm/lib → lib}/env-utils/assert.js +0 -0
  286. /package/dist/{esm/lib → lib}/env-utils/globals.js +0 -0
  287. /package/dist/{esm/lib → lib}/file-provider/file-provider.js +0 -0
  288. /package/dist/{esm/lib → lib}/filesystems/filesystem.js +0 -0
  289. /package/dist/{esm/lib → lib}/iterators/text-iterators.js +0 -0
  290. /package/dist/{esm/lib → lib}/node/buffer.browser.js +0 -0
  291. /package/dist/{esm/lib → lib}/node/buffer.js +0 -0
  292. /package/dist/{esm/lib → lib}/node/fs.browser.js +0 -0
  293. /package/dist/{esm/lib → lib}/node/promisify.js +0 -0
  294. /package/dist/{esm/lib → lib}/node/stream.browser.js +0 -0
  295. /package/dist/{esm/lib → lib}/node/stream.js +0 -0
  296. /package/dist/{esm/lib → lib}/option-utils/merge-loader-options.js +0 -0
  297. /package/dist/{esm/lib → lib}/path-utils/get-cwd.js +0 -0
  298. /package/dist/{esm/lib → lib}/sources/image-tile-source.js +0 -0
  299. /package/dist/{esm/lib → lib}/sources/tile-source.js +0 -0
  300. /package/dist/{esm/lib → lib}/sources/utils/image-type.js +0 -0
  301. /package/dist/{esm/lib → lib}/sources/utils/utils.js +0 -0
  302. /package/dist/{esm/lib → lib}/sources/vector-tile-source.js +0 -0
  303. /package/dist/{esm/loader-types.js → loader-types.js} +0 -0
  304. /package/dist/{esm/service-types.js → service-types.js} +0 -0
  305. /package/dist/{esm/types.js → types.js} +0 -0
  306. /package/dist/{esm/writer-types.js → writer-types.js} +0 -0
@@ -0,0 +1,120 @@
1
+ // loaders.gl, MIT license
2
+
3
+ import {ReadableFile, Stat} from './file';
4
+
5
+ export class HttpFile implements ReadableFile {
6
+ readonly handle: string;
7
+ readonly size: number = 0;
8
+ readonly bigsize: bigint = 0n;
9
+ readonly url: string;
10
+
11
+ constructor(url: string) {
12
+ this.handle = url;
13
+ this.url = url;
14
+ }
15
+
16
+ async close(): Promise<void> {}
17
+
18
+ async stat(): Promise<Stat> {
19
+ const response = await fetch(this.handle, {method: 'HEAD'});
20
+ if (!response.ok) {
21
+ throw new Error(`Failed to fetch HEAD ${this.handle}`);
22
+ }
23
+ const size = parseInt(response.headers.get('Content-Length') || '0');
24
+ return {
25
+ size,
26
+ bigsize: BigInt(size),
27
+ isDirectory: false
28
+ };
29
+ }
30
+
31
+ async read(offset: number | bigint, length: number): Promise<ArrayBuffer> {
32
+ const response = await this.fetchRange(offset, length);
33
+ const arrayBuffer = await response.arrayBuffer();
34
+ return arrayBuffer;
35
+ }
36
+
37
+ /**
38
+ *
39
+ * @param offset
40
+ * @param length
41
+ * @param signal
42
+ * @returns
43
+ * @see https://github.com/protomaps/PMTiles
44
+ */
45
+ // eslint-disable-next-line complexity
46
+ async fetchRange(
47
+ offset: number | bigint,
48
+ length: number,
49
+ signal?: AbortSignal
50
+ ): Promise<Response> {
51
+ const nOffset = Number(offset);
52
+ const nLength = Number(length);
53
+
54
+ let controller: AbortController | undefined;
55
+ if (!signal) {
56
+ // ToDO why is it so important to abort in case 200?
57
+ // TODO check this works or assert 206
58
+ controller = new AbortController();
59
+ signal = controller.signal;
60
+ }
61
+
62
+ const url = this.handle;
63
+ let response = await fetch(url, {
64
+ signal,
65
+ headers: {Range: `bytes=${nOffset}-${nOffset + nLength - 1}`}
66
+ });
67
+
68
+ switch (response.status) {
69
+ case 206: // Partial Content success
70
+ // This is the expected success code for a range request
71
+ break;
72
+
73
+ case 200:
74
+ // some well-behaved backends, e.g. DigitalOcean CDN, respond with 200 instead of 206
75
+ // but we also need to detect no support for Byte Serving which is returning the whole file
76
+ const contentLength = response.headers.get('Content-Length');
77
+ if (!contentLength || Number(contentLength) > length) {
78
+ if (controller) {
79
+ controller.abort();
80
+ }
81
+ throw Error(
82
+ 'content-length header missing or exceeding request. Server must support HTTP Byte Serving.'
83
+ );
84
+ }
85
+
86
+ // @eslint-disable-next-line no-fallthrough
87
+ case 416: // "Range Not Satisfiable"
88
+ // some HTTP servers don't accept ranges beyond the end of the resource.
89
+ // Retry with the exact length
90
+ // TODO: can return 416 with offset > 0 if content changed, which will have a blank etag.
91
+ // See https://github.com/protomaps/PMTiles/issues/90
92
+ if (offset === 0) {
93
+ const contentRange = response.headers.get('Content-Range');
94
+ if (!contentRange || !contentRange.startsWith('bytes *')) {
95
+ throw Error('Missing content-length on 416 response');
96
+ }
97
+ const actualLength = Number(contentRange.substr(8));
98
+ response = await fetch(this.url, {
99
+ signal,
100
+ headers: {Range: `bytes=0-${actualLength - 1}`}
101
+ });
102
+ }
103
+ break;
104
+
105
+ default:
106
+ if (response.status >= 300) {
107
+ throw Error(`Bad response code: ${response.status}`);
108
+ }
109
+ }
110
+
111
+ return response;
112
+ // const data = await response.arrayBuffer();
113
+ // return {
114
+ // data,
115
+ // etag: response.headers.get('ETag') || undefined,
116
+ // cacheControl: response.headers.get('Cache-Control') || undefined,
117
+ // expires: response.headers.get('Expires') || undefined
118
+ // };
119
+ }
120
+ }
@@ -0,0 +1,39 @@
1
+ // loaders.gl, MIT license
2
+
3
+ import {isBrowser} from '../env-utils/globals';
4
+ import {ReadableFile, WritableFile, Stat} from './file';
5
+
6
+ const NOT_IMPLEMENTED = new Error('Not implemented');
7
+
8
+ /** This class is a facade that gets replaced with an actual NodeFile instance */
9
+ export class NodeFileFacade implements ReadableFile, WritableFile {
10
+ handle: unknown;
11
+ size: number = 0;
12
+ bigsize: bigint = 0n;
13
+ url: string = '';
14
+
15
+ constructor(url: string, flags?: 'r' | 'w' | 'wx', mode?: number) {
16
+ // Return the actual implementation instance
17
+ if (globalThis.loaders?.NodeFile) {
18
+ return new globalThis.loaders.NodeFile(url, flags, mode);
19
+ }
20
+ if (isBrowser) {
21
+ throw new Error('Can\'t instantiate NodeFile in browser.');
22
+ }
23
+ throw new Error('Can\'t instantiate NodeFile. Make sure to import @loaders.gl/polyfills first.');
24
+ }
25
+ /** Read data */
26
+ async read(start?: number | bigint, end?: number | bigint): Promise<ArrayBuffer> {
27
+ throw NOT_IMPLEMENTED;
28
+ }
29
+ /** Write to file. The number of bytes written will be returned */
30
+ async write(arrayBuffer: ArrayBuffer, offset?: number | bigint, length?: number | bigint): Promise<number> {
31
+ throw NOT_IMPLEMENTED;
32
+ }
33
+ /** Get information about file */
34
+ async stat(): Promise<Stat> {
35
+ throw NOT_IMPLEMENTED;
36
+ }
37
+ /** Close the file */
38
+ async close(): Promise<void> {}
39
+ }
@@ -0,0 +1,150 @@
1
+ /*
2
+ import {fetchFile} from '@loaders.gl/core';
3
+
4
+ import {Source as PMTilesSource, RangeResponse} from 'pmtiles';
5
+
6
+ /** @note "source" here is a PMTiles library type, referring to *
7
+ export function makeSource(data: string | Blob, fetch?) {
8
+ if (typeof data === 'string') {
9
+ return new FetchSource(data, fetch);
10
+ }
11
+ if (data instanceof Blob) {
12
+ const url = '';
13
+ return new BlobSource(data, url);
14
+ }
15
+ }
16
+
17
+ export class BlobSource implements PMTilesSource {
18
+ blob: Blob;
19
+ key: string;
20
+
21
+ constructor(blob: Blob, key: string) {
22
+ this.blob = blob;
23
+ this.key = key;
24
+ }
25
+
26
+ // TODO - how is this used?
27
+ getKey() {
28
+ return this.blob.url || '';
29
+ }
30
+
31
+ async getBytes(offset: number, length: number, signal?: AbortSignal): Promise<RangeResponse> {
32
+ const data = await this.blob.arrayBuffer();
33
+ return {
34
+ data
35
+ // etag: response.headers.get('ETag') || undefined,
36
+ // cacheControl: response.headers.get('Cache-Control') || undefined,
37
+ // expires: response.headers.get('Expires') || undefined
38
+ };
39
+ }
40
+ }
41
+
42
+ export class FetchSource implements PMTilesSource {
43
+ url: string;
44
+ fetch;
45
+
46
+ constructor(url: string, fetch = fetchFile) {
47
+ this.url = url;
48
+ this.fetch = fetch;
49
+ }
50
+
51
+ // TODO - how is this used?
52
+ getKey() {
53
+ return this.url;
54
+ }
55
+
56
+ async getBytes(offset: number, length: number, signal?: AbortSignal): Promise<RangeResponse> {
57
+ let controller;
58
+ if (!signal) {
59
+ // ToDO why is it so important to abort in case 200?
60
+ // TODO check this works or assert 206
61
+ controller = new AbortController();
62
+ signal = controller.signal;
63
+ }
64
+
65
+ let response = await fetch(this.url, {
66
+ signal,
67
+ headers: {Range: `bytes=${offset}-${offset + length - 1}`}
68
+ });
69
+
70
+ switch (response.status) {
71
+ case 206: // Partial Content success
72
+ // This is the expected success code for a range request
73
+ break;
74
+
75
+ case 200:
76
+ // some well-behaved backends, e.g. DigitalOcean CDN, respond with 200 instead of 206
77
+ // but we also need to detect no support for Byte Serving which is returning the whole file
78
+ const content_length = response.headers.get('Content-Length');
79
+ if (!content_length || Number(content_length) > length) {
80
+ if (controller) {
81
+ controller.abort();
82
+ }
83
+ throw Error(
84
+ 'content-length header missing or exceeding request. Server must support HTTP Byte Serving.'
85
+ );
86
+ }
87
+
88
+ case 416: // "Range Not Satisfiable"
89
+ // some HTTP servers don't accept ranges beyond the end of the resource.
90
+ // Retry with the exact length
91
+ // TODO: can return 416 with offset > 0 if content changed, which will have a blank etag.
92
+ // See https://github.com/protomaps/PMTiles/issues/90
93
+ if (offset === 0) {
94
+ const content_range = response.headers.get('Content-Range');
95
+ if (!content_range || !content_range.startsWith('bytes *')) {
96
+ throw Error('Missing content-length on 416 response');
97
+ }
98
+ const actual_length = Number(content_range.substr(8));
99
+ response = await fetch(this.url, {
100
+ signal,
101
+ headers: {Range: `bytes=0-${actual_length - 1}`}
102
+ });
103
+ }
104
+ break;
105
+
106
+ default:
107
+ if (response.status >= 300) {
108
+ throw Error(`Bad response code: ${response.status}`);
109
+ }
110
+ }
111
+
112
+ const data = await response.arrayBuffer();
113
+ return {
114
+ data,
115
+ etag: response.headers.get('ETag') || undefined,
116
+ cacheControl: response.headers.get('Cache-Control') || undefined,
117
+ expires: response.headers.get('Expires') || undefined
118
+ };
119
+ }
120
+ }
121
+
122
+ /*
123
+ class TestNodeFileSource implements Source {
124
+ buffer: ArrayBuffer;
125
+ path: string;
126
+ key: string;
127
+ etag?: string;
128
+
129
+ constructor(path: string, key: string) {
130
+ this.path = path;
131
+ this.buffer = fs.readFileSync(path);
132
+ this.key = key;
133
+ }
134
+
135
+ getKey() {
136
+ return this.key;
137
+ }
138
+
139
+ replaceData(path: string) {
140
+ this.path = path;
141
+ this.buffer = fs.readFileSync(path);
142
+ }
143
+
144
+ async getBytes(offset: number, length: number): Promise<RangeResponse> {
145
+ const slice = new Uint8Array(this.buffer.slice(offset, offset + length))
146
+ .buffer;
147
+ return { data: slice, etag: this.etag };
148
+ }
149
+ }
150
+ */
@@ -1,87 +1,38 @@
1
1
  // loaders.gl, MIT license
2
2
 
3
- export type ReadOptions = {};
4
-
5
- export type Stat = {
6
- size: number;
7
- isDirectory: () => boolean;
8
- };
3
+ import {ReadableFile, WritableFile} from '../files/file';
9
4
 
10
5
  /**
11
6
  * A FileSystem interface can encapsulate various file sources,
12
- * a FileList, a ZipFile, a GoogleDrive etc.
7
+ * a FileList, a Node.js filesystem, a ZipFile, a GoogleDrive etc.
13
8
  */
14
9
  export interface FileSystem {
15
- /**
16
- * Return a list of file names
17
- * @param dirname directory name. file system root directory if omitted
18
- */
10
+ /** Return a list of file names in a "directory" */
19
11
  readdir(dirname?: string, options?: {recursive?: boolean}): Promise<string[]>;
20
12
 
21
- /**
22
- * Gets information from a local file from the filesystem
23
- * @param filename file name to stat
24
- * @param options currently unused
25
- * @throws if filename is not in local filesystem
26
- */
13
+ /** Gets information from a local file from the filesystem */
27
14
  stat(filename: string, options?: object): Promise<{size: number}>;
28
15
 
29
- /**
30
- * Fetches a local file from the filesystem (or a URL)
31
- * @param filename
32
- * @param options
33
- */
34
- fetch(filename: RequestInfo, options?: RequestInit): Promise<Response>;
35
- }
16
+ /** Removes a file from the file system */
17
+ unlink?(path: string): Promise<void>;
36
18
 
37
- /**
38
- * A random access file system
39
- */
40
- export interface RandomAccessReadFileSystem extends FileSystem {
41
- open(path: string, flags: unknown, mode?: unknown): Promise<any>;
42
- close(fd: unknown): Promise<void>;
43
- fstat(fd: unknown): Promise<Stat>;
44
- read(fd: any, options?: ReadOptions): Promise<{bytesRead: number; buffer: Uint8Array}>;
45
- // read(
46
- // fd: any,
47
- // buffer: ArrayBuffer | ArrayBufferView,
48
- // offset?: number,
49
- // length?: number,
50
- // position?: number
51
- // ): Promise<{bytesRead: number; buffer: ArrayBuffer}>;
19
+ /** Fetches the full contents of a file from the filesystem (or a URL) */
20
+ fetch(path: string, options?: RequestInit): Promise<Response>;
52
21
  }
53
22
 
54
23
  /**
55
- * A FileSystem interface can encapsulate a FileList, a ZipFile, a GoogleDrive etc.
56
- *
57
- export interface IFileSystem {
58
- /**
59
- * Return a list of file names
60
- * @param dirname directory name. file system root directory if omitted
61
- *
62
- readdir(dirname?: string, options?: {recursive?: boolean}): Promise<string[]>;
24
+ * A random access file system, open readable and/or writable files
25
+ */
26
+ export interface RandomAccessFileSystem extends FileSystem {
27
+ /** Can open readable files */
28
+ readonly readable: boolean;
63
29
 
64
- /**
65
- * Gets information from a local file from the filesystem
66
- * @param filename file name to stat
67
- * @param options currently unused
68
- * @throws if filename is not in local filesystem
69
- *
70
- stat(filename: string, options?: object): Promise<{size: number}>;
30
+ /** Can open writable files */
31
+ readonly writable: boolean;
71
32
 
72
- /**
73
- * Fetches a local file from the filesystem (or a URL)
74
- * @param filename
75
- * @param options
76
- *
77
- fetch(filename: string, options?: object): Promise<Response>;
78
- }
33
+ /** Open a readable file */
34
+ openReadableFile(path: string, flags?: 'r'): Promise<ReadableFile>;
79
35
 
80
- type ReadOptions = {buffer?: ArrayBuffer; offset?: number; length?: number; position?: number};
81
- export interface IRandomAccessReadFileSystem extends IFileSystem {
82
- open(path: string, flags: string | number, mode?: any): Promise<any>;
83
- close(fd: any): Promise<void>;
84
- fstat(fd: any): Promise<object>;
85
- read(fd: any, options?: ReadOptions): Promise<{bytesRead: number; buffer: Buffer}>;
36
+ /** Open a writable file */
37
+ openWritableFile(path: string, flags?: 'w' | 'wx', mode?: number): Promise<WritableFile>;
86
38
  }
87
- */
@@ -0,0 +1,63 @@
1
+ // loaders.gl, MIT license
2
+
3
+ import {isBrowser} from '../env-utils/globals';
4
+ import {Stat} from '../files/file';
5
+ import {NodeFileFacade as NodeFile} from '../files/node-file-facade';
6
+ import {RandomAccessFileSystem} from './filesystem';
7
+
8
+ const NOT_IMPLEMENTED = new Error('Not implemented');
9
+
10
+ /**
11
+ * FileSystem pass-through for Node.js
12
+ * Compatible with BrowserFileSystem.
13
+ * @note Dummy implementation, not used (constructor returns a real NodeFileSystem instance)
14
+ * @param options
15
+ */
16
+ export class NodeFileSystemFacade implements RandomAccessFileSystem {
17
+ // implements FileSystem
18
+ constructor(options: {[key: string]: any}) {
19
+ if (globalThis.loaders?.NodeFileSystem) {
20
+ return new globalThis.loaders.NodeFileSystem(options);
21
+ }
22
+ if (isBrowser) {
23
+ throw new Error('Can\'t instantiate NodeFileSystem in browser.');
24
+ }
25
+ throw new Error(
26
+ 'Can\'t instantiate NodeFileSystem. Make sure to import @loaders.gl/polyfills first.'
27
+ );
28
+ }
29
+
30
+ // DUMMY IMPLEMENTATION, not used (constructor returns a real NodeFileSystem instance)
31
+
32
+ // implements RandomAccessReadFileSystem
33
+
34
+ readonly readable = true;
35
+ readonly writable = true;
36
+
37
+ async openReadableFile(path: string, flags): Promise<NodeFile> {
38
+ throw NOT_IMPLEMENTED;
39
+ }
40
+
41
+ // implements RandomAccessWriteFileSystem
42
+ async openWritableFile(path: string, flags, mode): Promise<NodeFile> {
43
+ throw NOT_IMPLEMENTED;
44
+ }
45
+
46
+ // Implements file system
47
+
48
+ async readdir(dirname = '.', options?: {}): Promise<string[]> {
49
+ throw NOT_IMPLEMENTED;
50
+ }
51
+
52
+ async stat(path: string, options?: {}): Promise<Stat> {
53
+ throw NOT_IMPLEMENTED;
54
+ }
55
+
56
+ async unlink(path: string): Promise<void> {
57
+ throw NOT_IMPLEMENTED;
58
+ }
59
+
60
+ async fetch(path: RequestInfo, options?: RequestInit): Promise<Response> {
61
+ throw NOT_IMPLEMENTED;
62
+ }
63
+ }
@@ -15,6 +15,6 @@ export function toArrayBuffer(buffer) {
15
15
  /**
16
16
  * Convert (copy) ArrayBuffer to Buffer
17
17
  */
18
- export function toBuffer(binaryData: ArrayBuffer | ArrayBuffer | Buffer): Buffer {
18
+ export function toBuffer(binaryData: ArrayBuffer | Buffer): Buffer {
19
19
  throw new Error('Buffer not supported in browser');
20
20
  }
@@ -20,7 +20,7 @@ export function toArrayBuffer(buffer) {
20
20
  /**
21
21
  * Convert (copy) ArrayBuffer to Buffer
22
22
  */
23
- export function toBuffer(binaryData: ArrayBuffer | ArrayBuffer | Buffer): Buffer {
23
+ export function toBuffer(binaryData: ArrayBuffer | Buffer): Buffer {
24
24
  if (Buffer.isBuffer(binaryData)) {
25
25
  return binaryData;
26
26
  }
package/src/types.ts CHANGED
@@ -7,8 +7,6 @@ export type TypedIntArray =
7
7
  | Int16Array
8
8
  | Uint16Array
9
9
  | Int32Array
10
- | Uint32Array
11
- | Int32Array
12
10
  | Uint32Array;
13
11
 
14
12
  export type TypedFloatArray = Uint16Array | Float32Array | Float64Array;
@@ -24,8 +22,6 @@ export type TypedArrayConstructor =
24
22
  | Uint16ArrayConstructor
25
23
  | Int32ArrayConstructor
26
24
  | Uint32ArrayConstructor
27
- | Int32ArrayConstructor
28
- | Uint32ArrayConstructor
29
25
  | Float32ArrayConstructor
30
26
  | Float64ArrayConstructor;
31
27