@loaders.gl/parquet 4.5.3 → 5.0.0-alpha.10

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 (790) hide show
  1. package/LICENSE +14 -3
  2. package/dist/bundled.d.ts +9 -0
  3. package/dist/bundled.d.ts.map +1 -0
  4. package/dist/bundled.js +10 -0
  5. package/dist/bundled.js.map +1 -0
  6. package/dist/delta-format.d.ts +9 -0
  7. package/dist/delta-format.d.ts.map +1 -0
  8. package/dist/delta-format.js +12 -0
  9. package/dist/delta-format.js.map +1 -0
  10. package/dist/delta-source-loader-types.d.ts +27 -0
  11. package/dist/delta-source-loader-types.d.ts.map +1 -0
  12. package/dist/delta-source-loader-types.js +28 -0
  13. package/dist/delta-source-loader-types.js.map +1 -0
  14. package/dist/delta-source.d.ts +48 -0
  15. package/dist/delta-source.d.ts.map +1 -0
  16. package/dist/delta-source.js +222 -0
  17. package/dist/delta-source.js.map +1 -0
  18. package/dist/delta-types.d.ts +38 -0
  19. package/dist/delta-types.d.ts.map +1 -0
  20. package/dist/delta-types.js +5 -0
  21. package/dist/delta-types.js.map +1 -0
  22. package/dist/geoparquet-loader-with-parser.d.ts +33 -0
  23. package/dist/geoparquet-loader-with-parser.d.ts.map +1 -0
  24. package/dist/geoparquet-loader-with-parser.js +52 -0
  25. package/dist/geoparquet-loader-with-parser.js.map +1 -0
  26. package/dist/geoparquet-loader.d.ts +59 -0
  27. package/dist/geoparquet-loader.d.ts.map +1 -0
  28. package/dist/geoparquet-loader.js +30 -0
  29. package/dist/geoparquet-loader.js.map +1 -0
  30. package/dist/iceberg-rest-catalog.d.ts +49 -0
  31. package/dist/iceberg-rest-catalog.d.ts.map +1 -0
  32. package/dist/iceberg-rest-catalog.js +78 -0
  33. package/dist/iceberg-rest-catalog.js.map +1 -0
  34. package/dist/iceberg-table-source.d.ts +63 -0
  35. package/dist/iceberg-table-source.d.ts.map +1 -0
  36. package/dist/iceberg-table-source.js +797 -0
  37. package/dist/iceberg-table-source.js.map +1 -0
  38. package/dist/iceberg-types.d.ts +150 -0
  39. package/dist/iceberg-types.d.ts.map +1 -0
  40. package/dist/iceberg-types.js +5 -0
  41. package/dist/iceberg-types.js.map +1 -0
  42. package/dist/index.cjs +41568 -6781
  43. package/dist/index.cjs.map +3 -4
  44. package/dist/index.d.ts +15 -9
  45. package/dist/index.d.ts.map +1 -1
  46. package/dist/index.js +11 -12
  47. package/dist/index.js.map +1 -1
  48. package/dist/lib/arrow/convert-columns-to-row-group.js +3 -0
  49. package/dist/lib/arrow/convert-columns-to-row-group.js.map +1 -1
  50. package/dist/lib/arrow/convert-schema-from-parquet.d.ts +3 -1
  51. package/dist/lib/arrow/convert-schema-from-parquet.d.ts.map +1 -1
  52. package/dist/lib/arrow/convert-schema-from-parquet.js +164 -29
  53. package/dist/lib/arrow/convert-schema-from-parquet.js.map +1 -1
  54. package/dist/lib/arrow/convert-schema-to-parquet.d.ts.map +1 -1
  55. package/dist/lib/arrow/convert-schema-to-parquet.js +16 -7
  56. package/dist/lib/arrow/convert-schema-to-parquet.js.map +1 -1
  57. package/dist/lib/arrow/create-nested-arrow-vector.d.ts +8 -0
  58. package/dist/lib/arrow/create-nested-arrow-vector.d.ts.map +1 -0
  59. package/dist/lib/arrow/create-nested-arrow-vector.js +485 -0
  60. package/dist/lib/arrow/create-nested-arrow-vector.js.map +1 -0
  61. package/dist/lib/constants.d.ts +0 -1
  62. package/dist/lib/constants.d.ts.map +1 -1
  63. package/dist/lib/constants.js +1 -2
  64. package/dist/lib/constants.js.map +1 -1
  65. package/dist/lib/encoders/encode-arrow-to-parquet.d.ts +2 -2
  66. package/dist/lib/encoders/encode-arrow-to-parquet.d.ts.map +1 -1
  67. package/dist/lib/encoders/encode-arrow-to-parquet.js +3 -10
  68. package/dist/lib/encoders/encode-arrow-to-parquet.js.map +1 -1
  69. package/dist/lib/encoders/encode-table-to-parquet-js.d.ts +5 -0
  70. package/dist/lib/encoders/encode-table-to-parquet-js.d.ts.map +1 -0
  71. package/dist/lib/encoders/encode-table-to-parquet-js.js +394 -0
  72. package/dist/lib/encoders/encode-table-to-parquet-js.js.map +1 -0
  73. package/dist/lib/geo/geoparquet-covering.d.ts +19 -0
  74. package/dist/lib/geo/geoparquet-covering.d.ts.map +1 -0
  75. package/dist/lib/geo/geoparquet-covering.js +137 -0
  76. package/dist/lib/geo/geoparquet-covering.js.map +1 -0
  77. package/dist/lib/geo/geospatial-metadata.d.ts +67 -0
  78. package/dist/lib/geo/geospatial-metadata.d.ts.map +1 -0
  79. package/dist/lib/geo/geospatial-metadata.js +412 -0
  80. package/dist/lib/geo/geospatial-metadata.js.map +1 -0
  81. package/dist/lib/parquet-bloom-filter-planner.d.ts +16 -0
  82. package/dist/lib/parquet-bloom-filter-planner.d.ts.map +1 -0
  83. package/dist/lib/parquet-bloom-filter-planner.js +57 -0
  84. package/dist/lib/parquet-bloom-filter-planner.js.map +1 -0
  85. package/dist/lib/parquet-bloom-filter.d.ts +30 -0
  86. package/dist/lib/parquet-bloom-filter.d.ts.map +1 -0
  87. package/dist/lib/parquet-bloom-filter.js +289 -0
  88. package/dist/lib/parquet-bloom-filter.js.map +1 -0
  89. package/dist/lib/parquet-encryption.d.ts +80 -0
  90. package/dist/lib/parquet-encryption.d.ts.map +1 -0
  91. package/dist/lib/parquet-encryption.js +190 -0
  92. package/dist/lib/parquet-encryption.js.map +1 -0
  93. package/dist/lib/parquet-page-index.d.ts +91 -0
  94. package/dist/lib/parquet-page-index.d.ts.map +1 -0
  95. package/dist/lib/parquet-page-index.js +463 -0
  96. package/dist/lib/parquet-page-index.js.map +1 -0
  97. package/dist/lib/parquet-predicate.d.ts +21 -0
  98. package/dist/lib/parquet-predicate.d.ts.map +1 -0
  99. package/dist/lib/parquet-predicate.js +328 -0
  100. package/dist/lib/parquet-predicate.js.map +1 -0
  101. package/dist/lib/parquet-source-worker-client.d.ts +6 -0
  102. package/dist/lib/parquet-source-worker-client.d.ts.map +1 -0
  103. package/dist/lib/parquet-source-worker-client.js +24 -0
  104. package/dist/lib/parquet-source-worker-client.js.map +1 -0
  105. package/dist/lib/parquet-source-worker-decoder.d.ts +7 -0
  106. package/dist/lib/parquet-source-worker-decoder.d.ts.map +1 -0
  107. package/dist/lib/parquet-source-worker-decoder.js +181 -0
  108. package/dist/lib/parquet-source-worker-decoder.js.map +1 -0
  109. package/dist/lib/parquet-source-worker-file.d.ts +24 -0
  110. package/dist/lib/parquet-source-worker-file.d.ts.map +1 -0
  111. package/dist/lib/parquet-source-worker-file.js +40 -0
  112. package/dist/lib/parquet-source-worker-file.js.map +1 -0
  113. package/dist/lib/parquet-source-worker-types.d.ts +121 -0
  114. package/dist/lib/parquet-source-worker-types.d.ts.map +1 -0
  115. package/dist/lib/parquet-source-worker-types.js +5 -0
  116. package/dist/lib/parquet-source-worker-types.js.map +1 -0
  117. package/dist/lib/parquet-worker-transport.d.ts +8 -0
  118. package/dist/lib/parquet-worker-transport.d.ts.map +1 -0
  119. package/dist/lib/parquet-worker-transport.js +40 -0
  120. package/dist/lib/parquet-worker-transport.js.map +1 -0
  121. package/dist/lib/parsers/convert-parquet-tables.d.ts +16 -0
  122. package/dist/lib/parsers/convert-parquet-tables.d.ts.map +1 -0
  123. package/dist/lib/parsers/convert-parquet-tables.js +30 -0
  124. package/dist/lib/parsers/convert-parquet-tables.js.map +1 -0
  125. package/dist/lib/parsers/get-parquet-schema.d.ts.map +1 -1
  126. package/dist/lib/parsers/get-parquet-schema.js +6 -2
  127. package/dist/lib/parsers/get-parquet-schema.js.map +1 -1
  128. package/dist/lib/parsers/parse-geoparquet-to-geojson.d.ts +4 -4
  129. package/dist/lib/parsers/parse-geoparquet-to-geojson.d.ts.map +1 -1
  130. package/dist/lib/parsers/parse-geoparquet-to-geojson.js +19 -6
  131. package/dist/lib/parsers/parse-geoparquet-to-geojson.js.map +1 -1
  132. package/dist/lib/parsers/parse-parquet-tables.d.ts +37 -0
  133. package/dist/lib/parsers/parse-parquet-tables.d.ts.map +1 -0
  134. package/dist/lib/parsers/parse-parquet-tables.js +50 -0
  135. package/dist/lib/parsers/parse-parquet-tables.js.map +1 -0
  136. package/dist/lib/parsers/parse-parquet-to-arrow-js.d.ts +19 -0
  137. package/dist/lib/parsers/parse-parquet-to-arrow-js.d.ts.map +1 -0
  138. package/dist/lib/parsers/parse-parquet-to-arrow-js.js +921 -0
  139. package/dist/lib/parsers/parse-parquet-to-arrow-js.js.map +1 -0
  140. package/dist/lib/parsers/parse-parquet-to-arrow.d.ts +7 -7
  141. package/dist/lib/parsers/parse-parquet-to-arrow.d.ts.map +1 -1
  142. package/dist/lib/parsers/parse-parquet-to-arrow.js +45 -32
  143. package/dist/lib/parsers/parse-parquet-to-arrow.js.map +1 -1
  144. package/dist/lib/parsers/parse-parquet-to-columns.d.ts +3 -3
  145. package/dist/lib/parsers/parse-parquet-to-columns.d.ts.map +1 -1
  146. package/dist/lib/parsers/parse-parquet-to-columns.js +4 -5
  147. package/dist/lib/parsers/parse-parquet-to-columns.js.map +1 -1
  148. package/dist/lib/parsers/parse-parquet-to-json.d.ts +3 -3
  149. package/dist/lib/parsers/parse-parquet-to-json.d.ts.map +1 -1
  150. package/dist/lib/parsers/parse-parquet-to-json.js +95 -28
  151. package/dist/lib/parsers/parse-parquet-to-json.js.map +1 -1
  152. package/dist/lib/slice-parquet-batch.d.ts +9 -0
  153. package/dist/lib/slice-parquet-batch.d.ts.map +1 -0
  154. package/dist/lib/slice-parquet-batch.js +28 -0
  155. package/dist/lib/slice-parquet-batch.js.map +1 -0
  156. package/dist/lib/sources/parquet-range-file.d.ts +80 -0
  157. package/dist/lib/sources/parquet-range-file.d.ts.map +1 -0
  158. package/dist/lib/sources/parquet-range-file.js +267 -0
  159. package/dist/lib/sources/parquet-range-file.js.map +1 -0
  160. package/dist/lib/sources/single-batch-queue.d.ts +24 -0
  161. package/dist/lib/sources/single-batch-queue.d.ts.map +1 -0
  162. package/dist/lib/sources/single-batch-queue.js +91 -0
  163. package/dist/lib/sources/single-batch-queue.js.map +1 -0
  164. package/dist/lib/utils/load-wasm-node.d.ts +3 -0
  165. package/dist/lib/utils/load-wasm-node.d.ts.map +1 -0
  166. package/dist/lib/utils/load-wasm-node.js +23 -0
  167. package/dist/lib/utils/load-wasm-node.js.map +1 -0
  168. package/dist/lib/utils/load-wasm.d.ts +2 -2
  169. package/dist/lib/utils/load-wasm.d.ts.map +1 -1
  170. package/dist/lib/utils/load-wasm.js +28 -12
  171. package/dist/lib/utils/load-wasm.js.map +1 -1
  172. package/dist/lib/utils/make-stream-iterator.d.ts +2 -0
  173. package/dist/lib/utils/make-stream-iterator.d.ts.map +1 -1
  174. package/dist/lib/utils/make-stream-iterator.js +123 -14
  175. package/dist/lib/utils/make-stream-iterator.js.map +1 -1
  176. package/dist/lib/utils/normalize-parquet-options.d.ts +5 -0
  177. package/dist/lib/utils/normalize-parquet-options.d.ts.map +1 -0
  178. package/dist/lib/utils/normalize-parquet-options.js +25 -0
  179. package/dist/lib/utils/normalize-parquet-options.js.map +1 -0
  180. package/dist/parquet-dataset-source.cjs +38974 -0
  181. package/dist/parquet-dataset-source.cjs.map +6 -0
  182. package/dist/parquet-dataset-source.d.ts +81 -0
  183. package/dist/parquet-dataset-source.d.ts.map +1 -0
  184. package/dist/parquet-dataset-source.js +602 -0
  185. package/dist/parquet-dataset-source.js.map +1 -0
  186. package/dist/parquet-encoded-page-types.d.ts +108 -0
  187. package/dist/parquet-encoded-page-types.d.ts.map +1 -0
  188. package/dist/parquet-encoded-page-types.js +5 -0
  189. package/dist/parquet-encoded-page-types.js.map +1 -0
  190. package/dist/parquet-format.d.ts +2 -0
  191. package/dist/parquet-format.d.ts.map +1 -1
  192. package/dist/parquet-format.js +2 -0
  193. package/dist/parquet-format.js.map +1 -1
  194. package/dist/parquet-js-loader-types.d.ts +59 -0
  195. package/dist/parquet-js-loader-types.d.ts.map +1 -0
  196. package/dist/parquet-js-loader-types.js +34 -0
  197. package/dist/parquet-js-loader-types.js.map +1 -0
  198. package/dist/parquet-js-loader.d.ts +18 -22
  199. package/dist/parquet-js-loader.d.ts.map +1 -1
  200. package/dist/parquet-js-loader.js +53 -14
  201. package/dist/parquet-js-loader.js.map +1 -1
  202. package/dist/parquet-js-writer.d.ts +65 -0
  203. package/dist/parquet-js-writer.d.ts.map +1 -0
  204. package/dist/parquet-js-writer.js +28 -0
  205. package/dist/parquet-js-writer.js.map +1 -0
  206. package/dist/parquet-loader-base.d.ts +25 -0
  207. package/dist/parquet-loader-base.d.ts.map +1 -0
  208. package/dist/parquet-loader-base.js +23 -0
  209. package/dist/parquet-loader-base.js.map +1 -0
  210. package/dist/parquet-loader-options.d.ts +55 -0
  211. package/dist/parquet-loader-options.d.ts.map +1 -0
  212. package/dist/parquet-loader-options.js +10 -0
  213. package/dist/parquet-loader-options.js.map +1 -0
  214. package/dist/parquet-loader-types.d.ts +61 -0
  215. package/dist/parquet-loader-types.d.ts.map +1 -0
  216. package/dist/parquet-loader-types.js +17 -0
  217. package/dist/parquet-loader-types.js.map +1 -0
  218. package/dist/parquet-loader.d.ts +42 -0
  219. package/dist/parquet-loader.d.ts.map +1 -0
  220. package/dist/parquet-loader.js +68 -0
  221. package/dist/parquet-loader.js.map +1 -0
  222. package/dist/parquet-source-capabilities.d.ts +43 -0
  223. package/dist/parquet-source-capabilities.d.ts.map +1 -0
  224. package/dist/parquet-source-capabilities.js +32 -0
  225. package/dist/parquet-source-capabilities.js.map +1 -0
  226. package/dist/parquet-source-loader-types.d.ts +82 -0
  227. package/dist/parquet-source-loader-types.d.ts.map +1 -0
  228. package/dist/parquet-source-loader-types.js +84 -0
  229. package/dist/parquet-source-loader-types.js.map +1 -0
  230. package/dist/parquet-source-loader.cjs +38261 -0
  231. package/dist/parquet-source-loader.cjs.map +6 -0
  232. package/dist/parquet-source-loader.d.ts +167 -0
  233. package/dist/parquet-source-loader.d.ts.map +1 -0
  234. package/dist/parquet-source-loader.js +1438 -0
  235. package/dist/parquet-source-loader.js.map +1 -0
  236. package/dist/parquet-source-types.d.ts +534 -0
  237. package/dist/parquet-source-types.d.ts.map +1 -0
  238. package/dist/parquet-source-types.js +5 -0
  239. package/dist/parquet-source-types.js.map +1 -0
  240. package/dist/parquet-source-worker-factory.d.ts +4 -0
  241. package/dist/parquet-source-worker-factory.d.ts.map +1 -0
  242. package/dist/parquet-source-worker-factory.js +6 -0
  243. package/dist/parquet-source-worker-factory.js.map +1 -0
  244. package/dist/parquet-source-worker-url.d.ts +3 -0
  245. package/dist/parquet-source-worker-url.d.ts.map +1 -0
  246. package/dist/parquet-source-worker-url.js +22 -0
  247. package/dist/parquet-source-worker-url.js.map +1 -0
  248. package/dist/parquet-source-worker.js +38871 -0
  249. package/dist/parquet-source-worker.js.map +7 -0
  250. package/dist/parquet-worker-node.cjs +78507 -0
  251. package/dist/parquet-worker-node.cjs.map +7 -0
  252. package/dist/parquet-worker-url.d.ts +3 -0
  253. package/dist/parquet-worker-url.d.ts.map +1 -0
  254. package/dist/parquet-worker-url.js +19 -0
  255. package/dist/parquet-worker-url.js.map +1 -0
  256. package/dist/parquet-worker.js +20094 -0
  257. package/dist/parquet-worker.js.map +7 -0
  258. package/dist/parquet-writer.d.ts +10 -0
  259. package/dist/parquet-writer.d.ts.map +1 -0
  260. package/dist/parquet-writer.js +27 -0
  261. package/dist/parquet-writer.js.map +1 -0
  262. package/dist/parquet_wasm_bg.wasm +0 -0
  263. package/dist/parquetjs/codecs/byte-stream-split.d.ts +9 -0
  264. package/dist/parquetjs/codecs/byte-stream-split.d.ts.map +1 -0
  265. package/dist/parquetjs/codecs/byte-stream-split.js +159 -0
  266. package/dist/parquetjs/codecs/byte-stream-split.js.map +1 -0
  267. package/dist/parquetjs/codecs/declare.d.ts +35 -3
  268. package/dist/parquetjs/codecs/declare.d.ts.map +1 -1
  269. package/dist/parquetjs/codecs/declare.js +17 -1
  270. package/dist/parquetjs/codecs/declare.js.map +1 -1
  271. package/dist/parquetjs/codecs/delta.d.ts +17 -0
  272. package/dist/parquetjs/codecs/delta.d.ts.map +1 -0
  273. package/dist/parquetjs/codecs/delta.js +788 -0
  274. package/dist/parquetjs/codecs/delta.js.map +1 -0
  275. package/dist/parquetjs/codecs/dictionary.d.ts +5 -2
  276. package/dist/parquetjs/codecs/dictionary.d.ts.map +1 -1
  277. package/dist/parquetjs/codecs/dictionary.js +16 -4
  278. package/dist/parquetjs/codecs/dictionary.js.map +1 -1
  279. package/dist/parquetjs/codecs/index.d.ts.map +1 -1
  280. package/dist/parquetjs/codecs/index.js +22 -0
  281. package/dist/parquetjs/codecs/index.js.map +1 -1
  282. package/dist/parquetjs/codecs/plain.d.ts +3 -3
  283. package/dist/parquetjs/codecs/plain.d.ts.map +1 -1
  284. package/dist/parquetjs/codecs/plain.js +231 -78
  285. package/dist/parquetjs/codecs/plain.js.map +1 -1
  286. package/dist/parquetjs/codecs/rle.d.ts +7 -3
  287. package/dist/parquetjs/codecs/rle.d.ts.map +1 -1
  288. package/dist/parquetjs/codecs/rle.js +613 -69
  289. package/dist/parquetjs/codecs/rle.js.map +1 -1
  290. package/dist/parquetjs/compression.d.ts +16 -8
  291. package/dist/parquetjs/compression.d.ts.map +1 -1
  292. package/dist/parquetjs/compression.js +114 -141
  293. package/dist/parquetjs/compression.js.map +1 -1
  294. package/dist/parquetjs/encoder/dictionary-planner.d.ts +17 -0
  295. package/dist/parquetjs/encoder/dictionary-planner.d.ts.map +1 -0
  296. package/dist/parquetjs/encoder/dictionary-planner.js +67 -0
  297. package/dist/parquetjs/encoder/dictionary-planner.js.map +1 -0
  298. package/dist/parquetjs/encoder/page-planner.d.ts +11 -0
  299. package/dist/parquetjs/encoder/page-planner.d.ts.map +1 -0
  300. package/dist/parquetjs/encoder/page-planner.js +60 -0
  301. package/dist/parquetjs/encoder/page-planner.js.map +1 -0
  302. package/dist/parquetjs/encoder/parquet-encoder.d.ts +54 -5
  303. package/dist/parquetjs/encoder/parquet-encoder.d.ts.map +1 -1
  304. package/dist/parquetjs/encoder/parquet-encoder.js +930 -66
  305. package/dist/parquetjs/encoder/parquet-encoder.js.map +1 -1
  306. package/dist/parquetjs/parquet-thrift/BoundingBox.d.ts +29 -0
  307. package/dist/parquetjs/parquet-thrift/BoundingBox.d.ts.map +1 -0
  308. package/dist/parquetjs/parquet-thrift/BoundingBox.js +85 -0
  309. package/dist/parquetjs/parquet-thrift/BoundingBox.js.map +1 -0
  310. package/dist/parquetjs/parquet-thrift/BsonType.d.ts +1 -1
  311. package/dist/parquetjs/parquet-thrift/BsonType.d.ts.map +1 -1
  312. package/dist/parquetjs/parquet-thrift/BsonType.js +1 -1
  313. package/dist/parquetjs/parquet-thrift/BsonType.js.map +1 -1
  314. package/dist/parquetjs/parquet-thrift/ColumnChunk.d.ts +7 -2
  315. package/dist/parquetjs/parquet-thrift/ColumnChunk.d.ts.map +1 -1
  316. package/dist/parquetjs/parquet-thrift/ColumnChunk.js +37 -2
  317. package/dist/parquetjs/parquet-thrift/ColumnChunk.js.map +1 -1
  318. package/dist/parquetjs/parquet-thrift/ColumnCryptoMetaData.d.ts +35 -0
  319. package/dist/parquetjs/parquet-thrift/ColumnCryptoMetaData.d.ts.map +1 -0
  320. package/dist/parquetjs/parquet-thrift/ColumnCryptoMetaData.js +135 -0
  321. package/dist/parquetjs/parquet-thrift/ColumnCryptoMetaData.js.map +1 -0
  322. package/dist/parquetjs/parquet-thrift/ColumnIndex.d.ts +6 -6
  323. package/dist/parquetjs/parquet-thrift/ColumnIndex.d.ts.map +1 -1
  324. package/dist/parquetjs/parquet-thrift/ColumnIndex.js +3 -3
  325. package/dist/parquetjs/parquet-thrift/ColumnIndex.js.map +1 -1
  326. package/dist/parquetjs/parquet-thrift/ColumnMetaData.d.ts +12 -2
  327. package/dist/parquetjs/parquet-thrift/ColumnMetaData.d.ts.map +1 -1
  328. package/dist/parquetjs/parquet-thrift/ColumnMetaData.js +75 -2
  329. package/dist/parquetjs/parquet-thrift/ColumnMetaData.js.map +1 -1
  330. package/dist/parquetjs/parquet-thrift/ColumnOrder.d.ts +1 -1
  331. package/dist/parquetjs/parquet-thrift/ColumnOrder.d.ts.map +1 -1
  332. package/dist/parquetjs/parquet-thrift/ColumnOrder.js +1 -1
  333. package/dist/parquetjs/parquet-thrift/ColumnOrder.js.map +1 -1
  334. package/dist/parquetjs/parquet-thrift/DataPageHeader.d.ts +1 -1
  335. package/dist/parquetjs/parquet-thrift/DataPageHeader.d.ts.map +1 -1
  336. package/dist/parquetjs/parquet-thrift/DataPageHeader.js +1 -1
  337. package/dist/parquetjs/parquet-thrift/DataPageHeader.js.map +1 -1
  338. package/dist/parquetjs/parquet-thrift/DataPageHeaderV2.d.ts +1 -1
  339. package/dist/parquetjs/parquet-thrift/DataPageHeaderV2.d.ts.map +1 -1
  340. package/dist/parquetjs/parquet-thrift/DataPageHeaderV2.js +1 -1
  341. package/dist/parquetjs/parquet-thrift/DataPageHeaderV2.js.map +1 -1
  342. package/dist/parquetjs/parquet-thrift/DateType.d.ts +1 -1
  343. package/dist/parquetjs/parquet-thrift/DateType.d.ts.map +1 -1
  344. package/dist/parquetjs/parquet-thrift/DateType.js +1 -1
  345. package/dist/parquetjs/parquet-thrift/DateType.js.map +1 -1
  346. package/dist/parquetjs/parquet-thrift/DecimalType.d.ts +1 -1
  347. package/dist/parquetjs/parquet-thrift/DecimalType.d.ts.map +1 -1
  348. package/dist/parquetjs/parquet-thrift/DecimalType.js +1 -1
  349. package/dist/parquetjs/parquet-thrift/DecimalType.js.map +1 -1
  350. package/dist/parquetjs/parquet-thrift/DictionaryPageHeader.d.ts +1 -1
  351. package/dist/parquetjs/parquet-thrift/DictionaryPageHeader.d.ts.map +1 -1
  352. package/dist/parquetjs/parquet-thrift/DictionaryPageHeader.js +1 -1
  353. package/dist/parquetjs/parquet-thrift/DictionaryPageHeader.js.map +1 -1
  354. package/dist/parquetjs/parquet-thrift/EdgeInterpolationAlgorithm.d.ts +8 -0
  355. package/dist/parquetjs/parquet-thrift/EdgeInterpolationAlgorithm.d.ts.map +1 -0
  356. package/dist/parquetjs/parquet-thrift/EdgeInterpolationAlgorithm.js +14 -0
  357. package/dist/parquetjs/parquet-thrift/EdgeInterpolationAlgorithm.js.map +1 -0
  358. package/dist/parquetjs/parquet-thrift/Encoding.d.ts +2 -1
  359. package/dist/parquetjs/parquet-thrift/Encoding.d.ts.map +1 -1
  360. package/dist/parquetjs/parquet-thrift/Encoding.js +1 -0
  361. package/dist/parquetjs/parquet-thrift/Encoding.js.map +1 -1
  362. package/dist/parquetjs/parquet-thrift/EncryptionAlgorithm.d.ts +22 -0
  363. package/dist/parquetjs/parquet-thrift/EncryptionAlgorithm.d.ts.map +1 -0
  364. package/dist/parquetjs/parquet-thrift/EncryptionAlgorithm.js +111 -0
  365. package/dist/parquetjs/parquet-thrift/EncryptionAlgorithm.js.map +1 -0
  366. package/dist/parquetjs/parquet-thrift/EnumType.d.ts +1 -1
  367. package/dist/parquetjs/parquet-thrift/EnumType.d.ts.map +1 -1
  368. package/dist/parquetjs/parquet-thrift/EnumType.js +1 -1
  369. package/dist/parquetjs/parquet-thrift/EnumType.js.map +1 -1
  370. package/dist/parquetjs/parquet-thrift/FileCryptoMetaData.d.ts +16 -0
  371. package/dist/parquetjs/parquet-thrift/FileCryptoMetaData.d.ts.map +1 -0
  372. package/dist/parquetjs/parquet-thrift/FileCryptoMetaData.js +57 -0
  373. package/dist/parquetjs/parquet-thrift/FileCryptoMetaData.js.map +1 -0
  374. package/dist/parquetjs/parquet-thrift/FileMetaData.d.ts +7 -2
  375. package/dist/parquetjs/parquet-thrift/FileMetaData.d.ts.map +1 -1
  376. package/dist/parquetjs/parquet-thrift/FileMetaData.js +37 -2
  377. package/dist/parquetjs/parquet-thrift/FileMetaData.js.map +1 -1
  378. package/dist/parquetjs/parquet-thrift/Float16Type.d.ts +9 -0
  379. package/dist/parquetjs/parquet-thrift/Float16Type.d.ts.map +1 -0
  380. package/dist/parquetjs/parquet-thrift/Float16Type.js +27 -0
  381. package/dist/parquetjs/parquet-thrift/Float16Type.js.map +1 -0
  382. package/dist/parquetjs/parquet-thrift/GeographyType.d.ts +14 -0
  383. package/dist/parquetjs/parquet-thrift/GeographyType.d.ts.map +1 -0
  384. package/dist/parquetjs/parquet-thrift/GeographyType.js +51 -0
  385. package/dist/parquetjs/parquet-thrift/GeographyType.js.map +1 -0
  386. package/dist/parquetjs/parquet-thrift/GeometryType.d.ts +11 -0
  387. package/dist/parquetjs/parquet-thrift/GeometryType.d.ts.map +1 -0
  388. package/dist/parquetjs/parquet-thrift/GeometryType.js +41 -0
  389. package/dist/parquetjs/parquet-thrift/GeometryType.js.map +1 -0
  390. package/dist/parquetjs/parquet-thrift/GeospatialStatistics.d.ts +18 -0
  391. package/dist/parquetjs/parquet-thrift/GeospatialStatistics.d.ts.map +1 -0
  392. package/dist/parquetjs/parquet-thrift/GeospatialStatistics.js +62 -0
  393. package/dist/parquetjs/parquet-thrift/GeospatialStatistics.js.map +1 -0
  394. package/dist/parquetjs/parquet-thrift/IndexPageHeader.d.ts +1 -1
  395. package/dist/parquetjs/parquet-thrift/IndexPageHeader.d.ts.map +1 -1
  396. package/dist/parquetjs/parquet-thrift/IndexPageHeader.js +1 -1
  397. package/dist/parquetjs/parquet-thrift/IndexPageHeader.js.map +1 -1
  398. package/dist/parquetjs/parquet-thrift/IntType.d.ts +1 -1
  399. package/dist/parquetjs/parquet-thrift/IntType.d.ts.map +1 -1
  400. package/dist/parquetjs/parquet-thrift/IntType.js +1 -1
  401. package/dist/parquetjs/parquet-thrift/IntType.js.map +1 -1
  402. package/dist/parquetjs/parquet-thrift/JsonType.d.ts +1 -1
  403. package/dist/parquetjs/parquet-thrift/JsonType.d.ts.map +1 -1
  404. package/dist/parquetjs/parquet-thrift/JsonType.js +1 -1
  405. package/dist/parquetjs/parquet-thrift/JsonType.js.map +1 -1
  406. package/dist/parquetjs/parquet-thrift/KeyValue.d.ts +1 -1
  407. package/dist/parquetjs/parquet-thrift/KeyValue.d.ts.map +1 -1
  408. package/dist/parquetjs/parquet-thrift/KeyValue.js +1 -1
  409. package/dist/parquetjs/parquet-thrift/KeyValue.js.map +1 -1
  410. package/dist/parquetjs/parquet-thrift/ListType.d.ts +1 -1
  411. package/dist/parquetjs/parquet-thrift/ListType.d.ts.map +1 -1
  412. package/dist/parquetjs/parquet-thrift/ListType.js +1 -1
  413. package/dist/parquetjs/parquet-thrift/ListType.js.map +1 -1
  414. package/dist/parquetjs/parquet-thrift/LogicalType.d.ts +17 -1
  415. package/dist/parquetjs/parquet-thrift/LogicalType.d.ts.map +1 -1
  416. package/dist/parquetjs/parquet-thrift/LogicalType.js +97 -1
  417. package/dist/parquetjs/parquet-thrift/LogicalType.js.map +1 -1
  418. package/dist/parquetjs/parquet-thrift/MapType.d.ts +1 -1
  419. package/dist/parquetjs/parquet-thrift/MapType.d.ts.map +1 -1
  420. package/dist/parquetjs/parquet-thrift/MapType.js +1 -1
  421. package/dist/parquetjs/parquet-thrift/MapType.js.map +1 -1
  422. package/dist/parquetjs/parquet-thrift/MicroSeconds.d.ts +1 -1
  423. package/dist/parquetjs/parquet-thrift/MicroSeconds.d.ts.map +1 -1
  424. package/dist/parquetjs/parquet-thrift/MicroSeconds.js +1 -1
  425. package/dist/parquetjs/parquet-thrift/MicroSeconds.js.map +1 -1
  426. package/dist/parquetjs/parquet-thrift/MilliSeconds.d.ts +1 -1
  427. package/dist/parquetjs/parquet-thrift/MilliSeconds.d.ts.map +1 -1
  428. package/dist/parquetjs/parquet-thrift/MilliSeconds.js +1 -1
  429. package/dist/parquetjs/parquet-thrift/MilliSeconds.js.map +1 -1
  430. package/dist/parquetjs/parquet-thrift/NanoSeconds.d.ts +9 -0
  431. package/dist/parquetjs/parquet-thrift/NanoSeconds.d.ts.map +1 -0
  432. package/dist/parquetjs/parquet-thrift/NanoSeconds.js +27 -0
  433. package/dist/parquetjs/parquet-thrift/NanoSeconds.js.map +1 -0
  434. package/dist/parquetjs/parquet-thrift/NullType.d.ts +1 -1
  435. package/dist/parquetjs/parquet-thrift/NullType.d.ts.map +1 -1
  436. package/dist/parquetjs/parquet-thrift/NullType.js +1 -1
  437. package/dist/parquetjs/parquet-thrift/NullType.js.map +1 -1
  438. package/dist/parquetjs/parquet-thrift/OffsetIndex.d.ts +1 -1
  439. package/dist/parquetjs/parquet-thrift/OffsetIndex.d.ts.map +1 -1
  440. package/dist/parquetjs/parquet-thrift/OffsetIndex.js +1 -1
  441. package/dist/parquetjs/parquet-thrift/OffsetIndex.js.map +1 -1
  442. package/dist/parquetjs/parquet-thrift/PageEncodingStats.d.ts +1 -1
  443. package/dist/parquetjs/parquet-thrift/PageEncodingStats.d.ts.map +1 -1
  444. package/dist/parquetjs/parquet-thrift/PageEncodingStats.js +1 -1
  445. package/dist/parquetjs/parquet-thrift/PageEncodingStats.js.map +1 -1
  446. package/dist/parquetjs/parquet-thrift/PageHeader.d.ts +1 -1
  447. package/dist/parquetjs/parquet-thrift/PageHeader.d.ts.map +1 -1
  448. package/dist/parquetjs/parquet-thrift/PageHeader.js +1 -1
  449. package/dist/parquetjs/parquet-thrift/PageHeader.js.map +1 -1
  450. package/dist/parquetjs/parquet-thrift/PageLocation.d.ts +2 -2
  451. package/dist/parquetjs/parquet-thrift/PageLocation.d.ts.map +1 -1
  452. package/dist/parquetjs/parquet-thrift/PageLocation.js +2 -2
  453. package/dist/parquetjs/parquet-thrift/PageLocation.js.map +1 -1
  454. package/dist/parquetjs/parquet-thrift/RowGroup.d.ts +2 -2
  455. package/dist/parquetjs/parquet-thrift/RowGroup.d.ts.map +1 -1
  456. package/dist/parquetjs/parquet-thrift/RowGroup.js +2 -2
  457. package/dist/parquetjs/parquet-thrift/RowGroup.js.map +1 -1
  458. package/dist/parquetjs/parquet-thrift/SchemaElement.d.ts +1 -1
  459. package/dist/parquetjs/parquet-thrift/SchemaElement.d.ts.map +1 -1
  460. package/dist/parquetjs/parquet-thrift/SchemaElement.js +1 -1
  461. package/dist/parquetjs/parquet-thrift/SchemaElement.js.map +1 -1
  462. package/dist/parquetjs/parquet-thrift/SizeStatistics.d.ts +26 -0
  463. package/dist/parquetjs/parquet-thrift/SizeStatistics.d.ts.map +1 -0
  464. package/dist/parquetjs/parquet-thrift/SizeStatistics.js +85 -0
  465. package/dist/parquetjs/parquet-thrift/SizeStatistics.js.map +1 -0
  466. package/dist/parquetjs/parquet-thrift/SortingColumn.d.ts +1 -1
  467. package/dist/parquetjs/parquet-thrift/SortingColumn.d.ts.map +1 -1
  468. package/dist/parquetjs/parquet-thrift/SortingColumn.js +1 -1
  469. package/dist/parquetjs/parquet-thrift/SortingColumn.js.map +1 -1
  470. package/dist/parquetjs/parquet-thrift/Statistics.d.ts +14 -10
  471. package/dist/parquetjs/parquet-thrift/Statistics.d.ts.map +1 -1
  472. package/dist/parquetjs/parquet-thrift/Statistics.js +38 -2
  473. package/dist/parquetjs/parquet-thrift/Statistics.js.map +1 -1
  474. package/dist/parquetjs/parquet-thrift/StringType.d.ts +1 -1
  475. package/dist/parquetjs/parquet-thrift/StringType.d.ts.map +1 -1
  476. package/dist/parquetjs/parquet-thrift/StringType.js +1 -1
  477. package/dist/parquetjs/parquet-thrift/StringType.js.map +1 -1
  478. package/dist/parquetjs/parquet-thrift/TimeType.d.ts +1 -1
  479. package/dist/parquetjs/parquet-thrift/TimeType.d.ts.map +1 -1
  480. package/dist/parquetjs/parquet-thrift/TimeType.js +1 -1
  481. package/dist/parquetjs/parquet-thrift/TimeType.js.map +1 -1
  482. package/dist/parquetjs/parquet-thrift/TimeUnit.d.ts +5 -1
  483. package/dist/parquetjs/parquet-thrift/TimeUnit.d.ts.map +1 -1
  484. package/dist/parquetjs/parquet-thrift/TimeUnit.js +25 -1
  485. package/dist/parquetjs/parquet-thrift/TimeUnit.js.map +1 -1
  486. package/dist/parquetjs/parquet-thrift/TimestampType.d.ts +1 -1
  487. package/dist/parquetjs/parquet-thrift/TimestampType.d.ts.map +1 -1
  488. package/dist/parquetjs/parquet-thrift/TimestampType.js +1 -1
  489. package/dist/parquetjs/parquet-thrift/TimestampType.js.map +1 -1
  490. package/dist/parquetjs/parquet-thrift/TypeDefinedOrder.d.ts +1 -1
  491. package/dist/parquetjs/parquet-thrift/TypeDefinedOrder.d.ts.map +1 -1
  492. package/dist/parquetjs/parquet-thrift/TypeDefinedOrder.js +1 -1
  493. package/dist/parquetjs/parquet-thrift/TypeDefinedOrder.js.map +1 -1
  494. package/dist/parquetjs/parquet-thrift/UUIDType.d.ts +1 -1
  495. package/dist/parquetjs/parquet-thrift/UUIDType.d.ts.map +1 -1
  496. package/dist/parquetjs/parquet-thrift/UUIDType.js +1 -1
  497. package/dist/parquetjs/parquet-thrift/UUIDType.js.map +1 -1
  498. package/dist/parquetjs/parquet-thrift/VariantType.d.ts +11 -0
  499. package/dist/parquetjs/parquet-thrift/VariantType.d.ts.map +1 -0
  500. package/dist/parquetjs/parquet-thrift/VariantType.js +41 -0
  501. package/dist/parquetjs/parquet-thrift/VariantType.js.map +1 -0
  502. package/dist/parquetjs/parquet-thrift/index.d.ts +12 -2
  503. package/dist/parquetjs/parquet-thrift/index.d.ts.map +1 -1
  504. package/dist/parquetjs/parquet-thrift/index.js +12 -2
  505. package/dist/parquetjs/parquet-thrift/index.js.map +1 -1
  506. package/dist/parquetjs/parser/decoders.d.ts +23 -3
  507. package/dist/parquetjs/parser/decoders.d.ts.map +1 -1
  508. package/dist/parquetjs/parser/decoders.js +687 -119
  509. package/dist/parquetjs/parser/decoders.js.map +1 -1
  510. package/dist/parquetjs/parser/encoded-pages.d.ts +24 -0
  511. package/dist/parquetjs/parser/encoded-pages.d.ts.map +1 -0
  512. package/dist/parquetjs/parser/encoded-pages.js +206 -0
  513. package/dist/parquetjs/parser/encoded-pages.js.map +1 -0
  514. package/dist/parquetjs/parser/parquet-reader.d.ts +111 -10
  515. package/dist/parquetjs/parser/parquet-reader.d.ts.map +1 -1
  516. package/dist/parquetjs/parser/parquet-reader.js +836 -69
  517. package/dist/parquetjs/parser/parquet-reader.js.map +1 -1
  518. package/dist/parquetjs/schema/declare.d.ts +83 -10
  519. package/dist/parquetjs/schema/declare.d.ts.map +1 -1
  520. package/dist/parquetjs/schema/declare.js.map +1 -1
  521. package/dist/parquetjs/schema/schema.d.ts +3 -0
  522. package/dist/parquetjs/schema/schema.d.ts.map +1 -1
  523. package/dist/parquetjs/schema/schema.js +31 -3
  524. package/dist/parquetjs/schema/schema.js.map +1 -1
  525. package/dist/parquetjs/schema/shred.d.ts +2 -0
  526. package/dist/parquetjs/schema/shred.d.ts.map +1 -1
  527. package/dist/parquetjs/schema/shred.js +285 -29
  528. package/dist/parquetjs/schema/shred.js.map +1 -1
  529. package/dist/parquetjs/schema/types.d.ts.map +1 -1
  530. package/dist/parquetjs/schema/types.js +290 -71
  531. package/dist/parquetjs/schema/types.js.map +1 -1
  532. package/dist/parquetjs/schema/variant.d.ts +3 -0
  533. package/dist/parquetjs/schema/variant.d.ts.map +1 -0
  534. package/dist/parquetjs/schema/variant.js +248 -0
  535. package/dist/parquetjs/schema/variant.js.map +1 -0
  536. package/dist/parquetjs/utils/binary-utils.d.ts +41 -0
  537. package/dist/parquetjs/utils/binary-utils.d.ts.map +1 -0
  538. package/dist/parquetjs/utils/binary-utils.js +106 -0
  539. package/dist/parquetjs/utils/binary-utils.js.map +1 -0
  540. package/dist/parquetjs/utils/crc32.d.ts +3 -0
  541. package/dist/parquetjs/utils/crc32.d.ts.map +1 -0
  542. package/dist/parquetjs/utils/crc32.js +15 -0
  543. package/dist/parquetjs/utils/crc32.js.map +1 -0
  544. package/dist/parquetjs/utils/file-utils.d.ts +1 -1
  545. package/dist/parquetjs/utils/file-utils.d.ts.map +1 -1
  546. package/dist/parquetjs/utils/file-utils.js +3 -3
  547. package/dist/parquetjs/utils/file-utils.js.map +1 -1
  548. package/dist/parquetjs/utils/read-utils.d.ts +25 -7
  549. package/dist/parquetjs/utils/read-utils.d.ts.map +1 -1
  550. package/dist/parquetjs/utils/read-utils.js +66 -39
  551. package/dist/parquetjs/utils/read-utils.js.map +1 -1
  552. package/dist/parquetjs/utils/thrift-runtime.d.ts +106 -0
  553. package/dist/parquetjs/utils/thrift-runtime.d.ts.map +1 -0
  554. package/dist/parquetjs/utils/thrift-runtime.js +50 -0
  555. package/dist/parquetjs/utils/thrift-runtime.js.map +1 -0
  556. package/dist/parquetjs/utils/uint8-array-compact-protocol-writer.d.ts +78 -0
  557. package/dist/parquetjs/utils/uint8-array-compact-protocol-writer.d.ts.map +1 -0
  558. package/dist/parquetjs/utils/uint8-array-compact-protocol-writer.js +213 -0
  559. package/dist/parquetjs/utils/uint8-array-compact-protocol-writer.js.map +1 -0
  560. package/dist/parquetjs/utils/uint8-array-compact-protocol.d.ts +80 -0
  561. package/dist/parquetjs/utils/uint8-array-compact-protocol.d.ts.map +1 -0
  562. package/dist/parquetjs/utils/uint8-array-compact-protocol.js +276 -0
  563. package/dist/parquetjs/utils/uint8-array-compact-protocol.js.map +1 -0
  564. package/dist/parquetjs/utils/uint8-array-transport.d.ts +25 -0
  565. package/dist/parquetjs/utils/uint8-array-transport.d.ts.map +1 -0
  566. package/dist/parquetjs/utils/uint8-array-transport.js +62 -0
  567. package/dist/parquetjs/utils/uint8-array-transport.js.map +1 -0
  568. package/dist/polyfills/process.d.ts +12 -0
  569. package/dist/polyfills/process.d.ts.map +1 -0
  570. package/dist/polyfills/process.js +17 -0
  571. package/dist/polyfills/process.js.map +1 -0
  572. package/dist/unbundled.d.ts +10 -0
  573. package/dist/unbundled.d.ts.map +1 -0
  574. package/dist/unbundled.js +11 -0
  575. package/dist/unbundled.js.map +1 -0
  576. package/dist/wasm.d.ts +3 -0
  577. package/dist/wasm.d.ts.map +1 -0
  578. package/dist/wasm.js +6 -0
  579. package/dist/wasm.js.map +1 -0
  580. package/dist/workers/parquet-source-worker.d.ts +2 -0
  581. package/dist/workers/parquet-source-worker.d.ts.map +1 -0
  582. package/dist/workers/parquet-source-worker.js +17 -0
  583. package/dist/workers/parquet-source-worker.js.map +1 -0
  584. package/dist/workers/parquet-worker-node.d.ts +2 -0
  585. package/dist/workers/parquet-worker-node.d.ts.map +1 -0
  586. package/dist/workers/parquet-worker-node.js +5 -0
  587. package/dist/workers/parquet-worker-node.js.map +1 -0
  588. package/dist/workers/parquet-worker.d.ts +2 -0
  589. package/dist/workers/parquet-worker.d.ts.map +1 -0
  590. package/dist/workers/parquet-worker.js +27 -0
  591. package/dist/workers/parquet-worker.js.map +1 -0
  592. package/package.json +84 -40
  593. package/src/bundled.ts +43 -0
  594. package/src/delta-format.ts +12 -0
  595. package/src/delta-source-loader-types.ts +40 -0
  596. package/src/delta-source.ts +305 -0
  597. package/src/delta-types.ts +40 -0
  598. package/src/geoparquet-loader-with-parser.ts +95 -0
  599. package/src/geoparquet-loader.ts +54 -0
  600. package/src/iceberg-rest-catalog.ts +122 -0
  601. package/src/iceberg-table-source.ts +1037 -0
  602. package/src/iceberg-types.ts +165 -0
  603. package/src/index.ts +105 -26
  604. package/src/lib/arrow/convert-columns-to-row-group.ts +3 -0
  605. package/src/lib/arrow/convert-schema-from-parquet.ts +193 -32
  606. package/src/lib/arrow/convert-schema-to-parquet.ts +16 -7
  607. package/src/lib/arrow/create-nested-arrow-vector.ts +705 -0
  608. package/src/lib/constants.ts +0 -2
  609. package/src/lib/encoders/encode-arrow-to-parquet.ts +10 -16
  610. package/src/lib/encoders/encode-table-to-parquet-js.ts +526 -0
  611. package/src/lib/geo/geoparquet-covering.ts +201 -0
  612. package/src/lib/geo/geospatial-metadata.ts +547 -0
  613. package/src/lib/parquet-bloom-filter-planner.ts +86 -0
  614. package/src/lib/parquet-bloom-filter.ts +345 -0
  615. package/src/lib/parquet-encryption.ts +344 -0
  616. package/src/lib/parquet-page-index.ts +727 -0
  617. package/src/lib/parquet-predicate.ts +410 -0
  618. package/src/lib/parquet-source-worker-client.ts +41 -0
  619. package/src/lib/parquet-source-worker-decoder.ts +252 -0
  620. package/src/lib/parquet-source-worker-file.ts +56 -0
  621. package/src/lib/parquet-source-worker-types.ts +132 -0
  622. package/src/lib/parquet-worker-transport.ts +57 -0
  623. package/src/lib/parsers/convert-parquet-tables.ts +39 -0
  624. package/src/lib/parsers/get-parquet-schema.ts +6 -2
  625. package/src/lib/parsers/parse-geoparquet-to-geojson.ts +27 -14
  626. package/src/lib/parsers/parse-parquet-tables.ts +82 -0
  627. package/src/lib/parsers/parse-parquet-to-arrow-js.ts +1213 -0
  628. package/src/lib/parsers/parse-parquet-to-arrow.ts +62 -36
  629. package/src/lib/parsers/parse-parquet-to-columns.ts +9 -8
  630. package/src/lib/parsers/parse-parquet-to-json.ts +119 -35
  631. package/src/lib/slice-parquet-batch.ts +32 -0
  632. package/src/lib/sources/parquet-range-file.ts +365 -0
  633. package/src/lib/sources/single-batch-queue.ts +95 -0
  634. package/src/lib/utils/load-wasm-node.ts +25 -0
  635. package/src/lib/utils/load-wasm.ts +36 -13
  636. package/src/lib/utils/make-stream-iterator.ts +126 -14
  637. package/src/lib/utils/normalize-parquet-options.ts +30 -0
  638. package/src/parquet-dataset-source.ts +800 -0
  639. package/src/parquet-encoded-page-types.ts +122 -0
  640. package/src/parquet-format.ts +2 -0
  641. package/src/parquet-js-loader-types.ts +53 -0
  642. package/src/parquet-js-loader.ts +76 -19
  643. package/src/parquet-js-writer.ts +98 -0
  644. package/src/parquet-loader-base.ts +34 -0
  645. package/src/parquet-loader-options.ts +62 -0
  646. package/src/parquet-loader-types.ts +35 -0
  647. package/src/parquet-loader.ts +115 -0
  648. package/src/parquet-source-capabilities.ts +73 -0
  649. package/src/parquet-source-loader-types.ts +97 -0
  650. package/src/parquet-source-loader.ts +2254 -0
  651. package/src/parquet-source-types.ts +627 -0
  652. package/src/parquet-source-worker-factory.ts +8 -0
  653. package/src/parquet-source-worker-url.ts +23 -0
  654. package/src/parquet-worker-url.ts +23 -0
  655. package/src/parquet-writer.ts +42 -0
  656. package/src/parquetjs/LICENSE +23 -1
  657. package/src/parquetjs/codecs/byte-stream-split.ts +221 -0
  658. package/src/parquetjs/codecs/declare.ts +62 -3
  659. package/src/parquetjs/codecs/delta.ts +1047 -0
  660. package/src/parquetjs/codecs/dictionary.ts +22 -4
  661. package/src/parquetjs/codecs/index.ts +22 -0
  662. package/src/parquetjs/codecs/plain.ts +317 -89
  663. package/src/parquetjs/codecs/rle.ts +852 -82
  664. package/src/parquetjs/compression.ts +137 -156
  665. package/src/parquetjs/encoder/dictionary-planner.ts +104 -0
  666. package/src/parquetjs/encoder/page-planner.ts +83 -0
  667. package/src/parquetjs/encoder/parquet-encoder.ts +1374 -95
  668. package/src/parquetjs/parquet-thrift/BoundingBox.ts +108 -0
  669. package/src/parquetjs/parquet-thrift/BsonType.ts +1 -1
  670. package/src/parquetjs/parquet-thrift/ColumnChunk.ts +37 -2
  671. package/src/parquetjs/parquet-thrift/ColumnCryptoMetaData.ts +139 -0
  672. package/src/parquetjs/parquet-thrift/ColumnIndex.ts +13 -13
  673. package/src/parquetjs/parquet-thrift/ColumnMetaData.ts +75 -2
  674. package/src/parquetjs/parquet-thrift/ColumnOrder.ts +1 -1
  675. package/src/parquetjs/parquet-thrift/DataPageHeader.ts +1 -1
  676. package/src/parquetjs/parquet-thrift/DataPageHeaderV2.ts +1 -1
  677. package/src/parquetjs/parquet-thrift/DateType.ts +1 -1
  678. package/src/parquetjs/parquet-thrift/DecimalType.ts +1 -1
  679. package/src/parquetjs/parquet-thrift/DictionaryPageHeader.ts +1 -1
  680. package/src/parquetjs/parquet-thrift/EdgeInterpolationAlgorithm.ts +13 -0
  681. package/src/parquetjs/parquet-thrift/Encoding.ts +2 -1
  682. package/src/parquetjs/parquet-thrift/EncryptionAlgorithm.ts +127 -0
  683. package/src/parquetjs/parquet-thrift/EnumType.ts +1 -1
  684. package/src/parquetjs/parquet-thrift/FileCryptoMetaData.ts +60 -0
  685. package/src/parquetjs/parquet-thrift/FileMetaData.ts +37 -2
  686. package/src/parquetjs/parquet-thrift/Float16Type.ts +28 -0
  687. package/src/parquetjs/parquet-thrift/GeographyType.ts +54 -0
  688. package/src/parquetjs/parquet-thrift/GeometryType.ts +43 -0
  689. package/src/parquetjs/parquet-thrift/GeospatialStatistics.ts +68 -0
  690. package/src/parquetjs/parquet-thrift/IndexPageHeader.ts +1 -1
  691. package/src/parquetjs/parquet-thrift/IntType.ts +1 -1
  692. package/src/parquetjs/parquet-thrift/JsonType.ts +1 -1
  693. package/src/parquetjs/parquet-thrift/KeyValue.ts +1 -1
  694. package/src/parquetjs/parquet-thrift/ListType.ts +1 -1
  695. package/src/parquetjs/parquet-thrift/LogicalType.ts +97 -1
  696. package/src/parquetjs/parquet-thrift/MapType.ts +1 -1
  697. package/src/parquetjs/parquet-thrift/MicroSeconds.ts +1 -1
  698. package/src/parquetjs/parquet-thrift/MilliSeconds.ts +1 -1
  699. package/src/parquetjs/parquet-thrift/NanoSeconds.ts +28 -0
  700. package/src/parquetjs/parquet-thrift/NullType.ts +1 -1
  701. package/src/parquetjs/parquet-thrift/OffsetIndex.ts +1 -1
  702. package/src/parquetjs/parquet-thrift/PageEncodingStats.ts +1 -1
  703. package/src/parquetjs/parquet-thrift/PageHeader.ts +1 -1
  704. package/src/parquetjs/parquet-thrift/PageLocation.ts +2 -2
  705. package/src/parquetjs/parquet-thrift/RowGroup.ts +2 -2
  706. package/src/parquetjs/parquet-thrift/SchemaElement.ts +1 -1
  707. package/src/parquetjs/parquet-thrift/SizeStatistics.ts +98 -0
  708. package/src/parquetjs/parquet-thrift/SortingColumn.ts +1 -1
  709. package/src/parquetjs/parquet-thrift/Statistics.ts +50 -14
  710. package/src/parquetjs/parquet-thrift/StringType.ts +1 -1
  711. package/src/parquetjs/parquet-thrift/TimeType.ts +1 -1
  712. package/src/parquetjs/parquet-thrift/TimeUnit.ts +25 -1
  713. package/src/parquetjs/parquet-thrift/TimestampType.ts +1 -1
  714. package/src/parquetjs/parquet-thrift/TypeDefinedOrder.ts +1 -1
  715. package/src/parquetjs/parquet-thrift/UUIDType.ts +1 -1
  716. package/src/parquetjs/parquet-thrift/VariantType.ts +43 -0
  717. package/src/parquetjs/parquet-thrift/index.ts +12 -4
  718. package/src/parquetjs/parser/decoders.ts +922 -143
  719. package/src/parquetjs/parser/encoded-pages.ts +278 -0
  720. package/src/parquetjs/parser/parquet-reader.ts +1334 -83
  721. package/src/parquetjs/schema/declare.ts +121 -9
  722. package/src/parquetjs/schema/schema.ts +33 -3
  723. package/src/parquetjs/schema/shred.ts +345 -41
  724. package/src/parquetjs/schema/types.ts +308 -84
  725. package/src/parquetjs/schema/variant.ts +313 -0
  726. package/src/parquetjs/utils/binary-utils.ts +132 -0
  727. package/src/parquetjs/utils/crc32.ts +15 -0
  728. package/src/parquetjs/utils/file-utils.ts +4 -4
  729. package/src/parquetjs/utils/read-utils.ts +77 -51
  730. package/src/parquetjs/utils/thrift-runtime.ts +109 -0
  731. package/src/parquetjs/utils/uint8-array-compact-protocol-writer.ts +254 -0
  732. package/src/parquetjs/utils/uint8-array-compact-protocol.ts +322 -0
  733. package/src/parquetjs/utils/uint8-array-transport.ts +79 -0
  734. package/src/polyfills/process.ts +17 -0
  735. package/src/unbundled.ts +47 -0
  736. package/src/wasm.ts +6 -0
  737. package/src/workers/parquet-source-worker.ts +21 -0
  738. package/src/workers/parquet-worker-node.ts +5 -0
  739. package/src/workers/parquet-worker.ts +31 -0
  740. package/dist/parquet-arrow-loader.d.ts +0 -43
  741. package/dist/parquet-arrow-loader.d.ts.map +0 -1
  742. package/dist/parquet-arrow-loader.js +0 -49
  743. package/dist/parquet-arrow-loader.js.map +0 -1
  744. package/dist/parquet-arrow-writer.d.ts +0 -9
  745. package/dist/parquet-arrow-writer.d.ts.map +0 -1
  746. package/dist/parquet-arrow-writer.js +0 -23
  747. package/dist/parquet-arrow-writer.js.map +0 -1
  748. package/dist/parquet-json-loader.d.ts +0 -148
  749. package/dist/parquet-json-loader.d.ts.map +0 -1
  750. package/dist/parquet-json-loader.js +0 -106
  751. package/dist/parquet-json-loader.js.map +0 -1
  752. package/dist/parquet-json-writer.d.ts +0 -19
  753. package/dist/parquet-json-writer.d.ts.map +0 -1
  754. package/dist/parquet-json-writer.js +0 -20
  755. package/dist/parquet-json-writer.js.map +0 -1
  756. package/dist/polyfills/buffer/buffer-polyfill.browser.d.ts +0 -3
  757. package/dist/polyfills/buffer/buffer-polyfill.browser.d.ts.map +0 -1
  758. package/dist/polyfills/buffer/buffer-polyfill.browser.js +0 -12
  759. package/dist/polyfills/buffer/buffer-polyfill.browser.js.map +0 -1
  760. package/dist/polyfills/buffer/buffer-polyfill.node.d.ts +0 -3
  761. package/dist/polyfills/buffer/buffer-polyfill.node.d.ts.map +0 -1
  762. package/dist/polyfills/buffer/buffer-polyfill.node.js +0 -17
  763. package/dist/polyfills/buffer/buffer-polyfill.node.js.map +0 -1
  764. package/dist/polyfills/buffer/buffer.d.ts +0 -222
  765. package/dist/polyfills/buffer/buffer.d.ts.map +0 -1
  766. package/dist/polyfills/buffer/buffer.js +0 -1868
  767. package/dist/polyfills/buffer/buffer.js.map +0 -1
  768. package/dist/polyfills/buffer/index.d.ts +0 -4
  769. package/dist/polyfills/buffer/index.d.ts.map +0 -1
  770. package/dist/polyfills/buffer/index.js +0 -9
  771. package/dist/polyfills/buffer/index.js.map +0 -1
  772. package/dist/polyfills/buffer/install-buffer-polyfill.d.ts +0 -2
  773. package/dist/polyfills/buffer/install-buffer-polyfill.d.ts.map +0 -1
  774. package/dist/polyfills/buffer/install-buffer-polyfill.js +0 -10
  775. package/dist/polyfills/buffer/install-buffer-polyfill.js.map +0 -1
  776. package/dist/workers/parquet-json-worker.d.ts +0 -2
  777. package/dist/workers/parquet-json-worker.d.ts.map +0 -1
  778. package/dist/workers/parquet-json-worker.js +0 -7
  779. package/dist/workers/parquet-json-worker.js.map +0 -1
  780. package/src/parquet-arrow-loader.ts +0 -74
  781. package/src/parquet-arrow-writer.ts +0 -33
  782. package/src/parquet-json-loader.ts +0 -160
  783. package/src/parquet-json-writer.ts +0 -27
  784. package/src/parquetjs/modules.d.ts +0 -25
  785. package/src/polyfills/buffer/buffer-polyfill.browser.ts +0 -14
  786. package/src/polyfills/buffer/buffer-polyfill.node.ts +0 -19
  787. package/src/polyfills/buffer/buffer.ts +0 -2205
  788. package/src/polyfills/buffer/index.ts +0 -11
  789. package/src/polyfills/buffer/install-buffer-polyfill.ts +0 -12
  790. package/src/workers/parquet-json-worker.ts +0 -8
@@ -0,0 +1,345 @@
1
+ // loaders.gl
2
+ // SPDX-License-Identifier: MIT
3
+ // Copyright (c) vis.gl contributors
4
+
5
+ import {Uint8ArrayCompactProtocol} from '../parquetjs/utils/uint8-array-compact-protocol';
6
+ import {Uint8ArrayTransport} from '../parquetjs/utils/uint8-array-transport';
7
+ import {Uint8ArrayCompactProtocolWriter} from '../parquetjs/utils/uint8-array-compact-protocol-writer';
8
+ import {Thrift} from '../parquetjs/utils/thrift-runtime';
9
+ import {concatUint8Arrays} from '../parquetjs/utils/binary-utils';
10
+
11
+ const UINT64_MASK = 0xffffffffffffffffn;
12
+ const PRIME1 = 0x9e3779b185ebca87n;
13
+ const PRIME2 = 0xc2b2ae3d27d4eb4fn;
14
+ const PRIME3 = 0x165667b19e3779f9n;
15
+ const PRIME4 = 0x85ebca77c2b2ae63n;
16
+ const PRIME5 = 0x27d4eb2f165667c5n;
17
+ const SALTS = [
18
+ 0x47b6137b, 0x44974d91, 0x8824ad5b, 0xa2b7289d, 0x705495c7, 0x2df1424b, 0x9efc4947, 0x5c6bfb31
19
+ ] as const;
20
+
21
+ /** Parsed, uncompressed Parquet split-block Bloom-filter payload. */
22
+ export type ParquetSplitBlockBloomFilter = {
23
+ /** Number of bytes declared by the serialized Bloom-filter header. */
24
+ readonly bitsetByteLength: number;
25
+ /** Serialized header length, in bytes. */
26
+ readonly headerByteLength: number;
27
+ /** Bloom-filter bitset, excluding its Thrift header. */
28
+ readonly bitset: Uint8Array;
29
+ /** Bloom algorithm declared by the serialized header. */
30
+ readonly algorithm?: 'BLOCK';
31
+ /** Hash strategy declared by the serialized header. */
32
+ readonly hash?: 'XXHASH';
33
+ /** Compression declared by the serialized header. */
34
+ readonly compression?: 'UNCOMPRESSED';
35
+ };
36
+
37
+ /** Physical Parquet types supported by Bloom-filter plain-value encoding. */
38
+ export type ParquetBloomFilterPhysicalType =
39
+ | 'BOOLEAN'
40
+ | 'INT32'
41
+ | 'INT64'
42
+ | 'FLOAT'
43
+ | 'DOUBLE'
44
+ | 'BYTE_ARRAY'
45
+ | 'FIXED_LEN_BYTE_ARRAY';
46
+
47
+ /** Builds an uncompressed Parquet split-block Bloom filter for one column chunk. */
48
+ export function encodeParquetSplitBlockBloomFilter(
49
+ values: readonly (boolean | number | bigint | string | Uint8Array)[],
50
+ physicalType: ParquetBloomFilterPhysicalType,
51
+ typeLength?: number
52
+ ): Uint8Array | undefined {
53
+ if (values.length === 0) return undefined;
54
+
55
+ // Ten bits per value is the Parquet recommendation. Split-block filters are composed of
56
+ // 256-bit blocks, so round up to the next whole block and keep a useful minimum for tiny groups.
57
+ const targetBitCount = Math.max(256, values.length * 10);
58
+ const blockCount = Math.max(1, Math.ceil(targetBitCount / 256));
59
+ const bitset = new Uint8Array(blockCount * 32);
60
+ for (const value of values) {
61
+ const encoded = encodeParquetBloomFilterValue(value, physicalType, typeLength);
62
+ insertParquetSplitBlockBloomFilter(bitset, hashParquetBloomFilterValue(encoded));
63
+ }
64
+
65
+ const headerWriter = new Uint8ArrayCompactProtocolWriter();
66
+ headerWriter.writeStructBegin('BloomFilterHeader');
67
+ headerWriter.writeFieldBegin('numBytes', Thrift.Type.I32, 1);
68
+ headerWriter.writeI32(bitset.byteLength);
69
+ headerWriter.writeFieldEnd();
70
+ writeBloomFilterUnion(headerWriter, 'algorithm', 2, 'BLOCK');
71
+ writeBloomFilterUnion(headerWriter, 'hash', 3, 'XXHASH');
72
+ writeBloomFilterUnion(headerWriter, 'compression', 4, 'UNCOMPRESSED');
73
+ headerWriter.writeFieldStop();
74
+ headerWriter.writeStructEnd();
75
+ return concatUint8Arrays([headerWriter.getBytes(), bitset]);
76
+ }
77
+
78
+ /** Encodes one scalar using the Parquet PLAIN representation used by Bloom filters. */
79
+ export function encodeParquetBloomFilterValue(
80
+ value: boolean | number | bigint | string | Uint8Array,
81
+ physicalType: ParquetBloomFilterPhysicalType,
82
+ typeLength?: number
83
+ ): Uint8Array {
84
+ switch (physicalType) {
85
+ case 'BOOLEAN':
86
+ if (typeof value !== 'boolean')
87
+ throw new Error('Parquet BOOLEAN Bloom value must be boolean');
88
+ return Uint8Array.of(value ? 1 : 0);
89
+ case 'INT32': {
90
+ if (typeof value !== 'number' || !Number.isInteger(value)) {
91
+ throw new Error('Parquet INT32 Bloom value must be an integer number');
92
+ }
93
+ const bytes = new Uint8Array(4);
94
+ new DataView(bytes.buffer).setInt32(0, value, true);
95
+ return bytes;
96
+ }
97
+ case 'INT64': {
98
+ if (typeof value !== 'number' && typeof value !== 'bigint' && typeof value !== 'string') {
99
+ throw new Error('Parquet INT64 Bloom value must be an integer number, bigint, or string');
100
+ }
101
+ const integerValue = typeof value === 'bigint' ? value : BigInt(value);
102
+ const bytes = new Uint8Array(8);
103
+ new DataView(bytes.buffer).setBigInt64(0, integerValue, true);
104
+ return bytes;
105
+ }
106
+ case 'FLOAT': {
107
+ if (typeof value !== 'number') throw new Error('Parquet FLOAT Bloom value must be a number');
108
+ const bytes = new Uint8Array(4);
109
+ new DataView(bytes.buffer).setFloat32(0, value, true);
110
+ return bytes;
111
+ }
112
+ case 'DOUBLE': {
113
+ if (typeof value !== 'number') throw new Error('Parquet DOUBLE Bloom value must be a number');
114
+ const bytes = new Uint8Array(8);
115
+ new DataView(bytes.buffer).setFloat64(0, value, true);
116
+ return bytes;
117
+ }
118
+ case 'BYTE_ARRAY': {
119
+ if (typeof value !== 'string' && !(value instanceof Uint8Array)) {
120
+ throw new Error('Parquet BYTE_ARRAY Bloom value must be a string or Uint8Array');
121
+ }
122
+ const payload = typeof value === 'string' ? new TextEncoder().encode(value) : value;
123
+ return payload.slice();
124
+ }
125
+ case 'FIXED_LEN_BYTE_ARRAY': {
126
+ if (
127
+ !(value instanceof Uint8Array) ||
128
+ typeLength === undefined ||
129
+ value.byteLength !== typeLength
130
+ ) {
131
+ throw new Error('Parquet FIXED_LEN_BYTE_ARRAY Bloom value must match typeLength');
132
+ }
133
+ return value.slice();
134
+ }
135
+ default:
136
+ throw new Error(`Unsupported Parquet Bloom-filter physical type: ${physicalType}`);
137
+ }
138
+ }
139
+
140
+ /** Parses a Parquet Bloom-filter header and returns its uncompressed split-block bitset. */
141
+ export function decodeParquetSplitBlockBloomFilter(data: Uint8Array): ParquetSplitBlockBloomFilter {
142
+ const transport = new Uint8ArrayTransport(data);
143
+ const protocol = new Uint8ArrayCompactProtocol(transport);
144
+ protocol.readStructBegin();
145
+ let bitsetByteLength: number | undefined;
146
+ let algorithm: 'BLOCK' | undefined;
147
+ let hash: 'XXHASH' | undefined;
148
+ let compression: 'UNCOMPRESSED' | undefined;
149
+ while (true) {
150
+ const field = protocol.readFieldBegin();
151
+ if (field.ftype === Thrift.Type.STOP) {
152
+ break;
153
+ }
154
+ if (field.fid === 1 && field.ftype === Thrift.Type.I32) {
155
+ bitsetByteLength = protocol.readI32();
156
+ } else if (field.fid === 2 && field.ftype === Thrift.Type.STRUCT) {
157
+ algorithm = readBloomFilterUnion(protocol, 1) ? 'BLOCK' : undefined;
158
+ } else if (field.fid === 3 && field.ftype === Thrift.Type.STRUCT) {
159
+ hash = readBloomFilterUnion(protocol, 1) ? 'XXHASH' : undefined;
160
+ } else if (field.fid === 4 && field.ftype === Thrift.Type.STRUCT) {
161
+ compression = readBloomFilterUnion(protocol, 1) ? 'UNCOMPRESSED' : undefined;
162
+ } else {
163
+ protocol.skip(field.ftype);
164
+ }
165
+ protocol.readFieldEnd();
166
+ }
167
+ protocol.readStructEnd();
168
+ if (bitsetByteLength === undefined || bitsetByteLength <= 0 || bitsetByteLength % 32 !== 0) {
169
+ throw new Error('Invalid Parquet split-block Bloom filter bitset length');
170
+ }
171
+ const bitsetOffset = transport.readPos;
172
+ if (data.byteLength - bitsetOffset < bitsetByteLength) {
173
+ throw new Error('Truncated Parquet split-block Bloom filter bitset');
174
+ }
175
+ return {
176
+ bitsetByteLength,
177
+ headerByteLength: bitsetOffset,
178
+ bitset: data.subarray(bitsetOffset, bitsetOffset + bitsetByteLength),
179
+ algorithm,
180
+ hash,
181
+ compression
182
+ };
183
+ }
184
+
185
+ function readBloomFilterUnion(
186
+ protocol: Uint8ArrayCompactProtocol,
187
+ expectedFieldId: number
188
+ ): boolean {
189
+ protocol.readStructBegin();
190
+ let matches = false;
191
+ while (true) {
192
+ const field = protocol.readFieldBegin();
193
+ if (field.ftype === Thrift.Type.STOP) break;
194
+ matches = field.fid === expectedFieldId && field.ftype === Thrift.Type.STRUCT;
195
+ protocol.skip(field.ftype);
196
+ protocol.readFieldEnd();
197
+ }
198
+ protocol.readStructEnd();
199
+ return matches;
200
+ }
201
+
202
+ /** Writes one Bloom-filter Thrift union using the compact protocol. */
203
+ function writeBloomFilterUnion(
204
+ writer: Uint8ArrayCompactProtocolWriter,
205
+ fieldName: string,
206
+ fieldId: number,
207
+ variantName: string
208
+ ): void {
209
+ writer.writeFieldBegin(fieldName, Thrift.Type.STRUCT, fieldId);
210
+ writer.writeStructBegin(variantName);
211
+ writer.writeFieldBegin(variantName, Thrift.Type.STRUCT, 1);
212
+ writer.writeStructBegin(variantName);
213
+ writer.writeFieldStop();
214
+ writer.writeStructEnd();
215
+ writer.writeFieldEnd();
216
+ writer.writeFieldStop();
217
+ writer.writeStructEnd();
218
+ writer.writeFieldEnd();
219
+ }
220
+
221
+ /** Returns whether a serialized Parquet split-block Bloom filter may contain a hash. */
222
+ export function checkParquetSplitBlockBloomFilter(bitset: Uint8Array, hash: bigint): boolean {
223
+ const blockCount = bitset.byteLength / 32;
224
+ if (!Number.isInteger(blockCount) || blockCount < 1 || blockCount >= 2 ** 31) {
225
+ return false;
226
+ }
227
+ const blockIndex = Number(((hash >> 32n) * BigInt(blockCount)) >> 32n);
228
+ const blockOffset = blockIndex * 32;
229
+ const lowerHash = Number(hash & 0xffffffffn) >>> 0;
230
+ for (let wordIndex = 0; wordIndex < 8; wordIndex++) {
231
+ const bit = Math.imul(lowerHash, SALTS[wordIndex]) >>> 27;
232
+ const word = readUint32LE(bitset, blockOffset + wordIndex * 4);
233
+ if ((word & (1 << bit)) === 0) {
234
+ return false;
235
+ }
236
+ }
237
+ return true;
238
+ }
239
+
240
+ /** Adds a hash to a mutable serialized Parquet split-block Bloom filter bitset. */
241
+ export function insertParquetSplitBlockBloomFilter(bitset: Uint8Array, hash: bigint): void {
242
+ const blockCount = bitset.byteLength / 32;
243
+ if (!Number.isInteger(blockCount) || blockCount < 1 || blockCount >= 2 ** 31) {
244
+ throw new Error(
245
+ 'Parquet split-block Bloom filter bitset must contain one or more 32-byte blocks'
246
+ );
247
+ }
248
+ const blockIndex = Number(((hash >> 32n) * BigInt(blockCount)) >> 32n);
249
+ const blockOffset = blockIndex * 32;
250
+ const lowerHash = Number(hash & 0xffffffffn) >>> 0;
251
+ for (let wordIndex = 0; wordIndex < 8; wordIndex++) {
252
+ const bit = Math.imul(lowerHash, SALTS[wordIndex]) >>> 27;
253
+ const offset = blockOffset + wordIndex * 4;
254
+ writeUint32LE(bitset, offset, readUint32LE(bitset, offset) | (1 << bit));
255
+ }
256
+ }
257
+
258
+ /** Computes the Parquet Bloom-filter XXH64 hash for plain-encoded value bytes. */
259
+ export function hashParquetBloomFilterValue(value: Uint8Array): bigint {
260
+ let offset = 0;
261
+ let hash: bigint;
262
+ if (value.byteLength >= 32) {
263
+ let value1 = PRIME1 + PRIME2;
264
+ let value2 = PRIME2;
265
+ let value3 = 0n;
266
+ let value4 = -PRIME1;
267
+ const limit = value.byteLength - 32;
268
+ while (offset <= limit) {
269
+ value1 = roundXxHash64(value1, readUint64LE(value, offset));
270
+ value2 = roundXxHash64(value2, readUint64LE(value, offset + 8));
271
+ value3 = roundXxHash64(value3, readUint64LE(value, offset + 16));
272
+ value4 = roundXxHash64(value4, readUint64LE(value, offset + 24));
273
+ offset += 32;
274
+ }
275
+ hash =
276
+ rotateLeft(value1, 1) +
277
+ rotateLeft(value2, 7) +
278
+ rotateLeft(value3, 12) +
279
+ rotateLeft(value4, 18);
280
+ hash = mergeXxHash64(hash, value1);
281
+ hash = mergeXxHash64(hash, value2);
282
+ hash = mergeXxHash64(hash, value3);
283
+ hash = mergeXxHash64(hash, value4);
284
+ } else {
285
+ hash = PRIME5;
286
+ }
287
+ hash = (hash + BigInt(value.byteLength)) & UINT64_MASK;
288
+ while (offset + 8 <= value.byteLength) {
289
+ const lane = (readUint64LE(value, offset) * PRIME2) & UINT64_MASK;
290
+ hash ^= (rotateLeft(lane, 31) * PRIME1) & UINT64_MASK;
291
+ hash = (rotateLeft(hash, 27) * PRIME1 + PRIME4) & UINT64_MASK;
292
+ offset += 8;
293
+ }
294
+ if (offset + 4 <= value.byteLength) {
295
+ hash ^= (BigInt(readUint32LE(value, offset)) * PRIME1) & UINT64_MASK;
296
+ hash = (rotateLeft(hash, 23) * PRIME2 + PRIME3) & UINT64_MASK;
297
+ offset += 4;
298
+ }
299
+ while (offset < value.byteLength) {
300
+ hash ^= (BigInt(value[offset++]) * PRIME5) & UINT64_MASK;
301
+ hash = (rotateLeft(hash, 11) * PRIME1) & UINT64_MASK;
302
+ }
303
+ hash ^= hash >> 33n;
304
+ hash = (hash * PRIME2) & UINT64_MASK;
305
+ hash ^= hash >> 29n;
306
+ hash = (hash * PRIME3) & UINT64_MASK;
307
+ hash ^= hash >> 32n;
308
+ return hash & UINT64_MASK;
309
+ }
310
+
311
+ function roundXxHash64(accumulator: bigint, lane: bigint): bigint {
312
+ return (rotateLeft((accumulator + lane * PRIME2) & UINT64_MASK, 31) * PRIME1) & UINT64_MASK;
313
+ }
314
+
315
+ function mergeXxHash64(accumulator: bigint, value: bigint): bigint {
316
+ let result = accumulator ^ roundXxHash64(0n, value);
317
+ result = (result * PRIME1 + PRIME4) & UINT64_MASK;
318
+ return result;
319
+ }
320
+
321
+ function rotateLeft(value: bigint, bits: bigint | number): bigint {
322
+ const shift = BigInt(bits);
323
+ return ((value << shift) | (value >> (64n - shift))) & UINT64_MASK;
324
+ }
325
+
326
+ function readUint32LE(value: Uint8Array, offset: number): number {
327
+ return (
328
+ (value[offset] |
329
+ (value[offset + 1] << 8) |
330
+ (value[offset + 2] << 16) |
331
+ (value[offset + 3] << 24)) >>>
332
+ 0
333
+ );
334
+ }
335
+
336
+ function writeUint32LE(value: Uint8Array, offset: number, numberValue: number): void {
337
+ value[offset] = numberValue;
338
+ value[offset + 1] = numberValue >>> 8;
339
+ value[offset + 2] = numberValue >>> 16;
340
+ value[offset + 3] = numberValue >>> 24;
341
+ }
342
+
343
+ function readUint64LE(value: Uint8Array, offset: number): bigint {
344
+ return BigInt(readUint32LE(value, offset)) | (BigInt(readUint32LE(value, offset + 4)) << 32n);
345
+ }
@@ -0,0 +1,344 @@
1
+ // loaders.gl
2
+ // SPDX-License-Identifier: MIT
3
+ // Copyright (c) vis.gl contributors
4
+
5
+ /** Algorithms defined by the Parquet modular-encryption specification. */
6
+ export type ParquetEncryptionAlgorithm = 'AES_GCM_V1' | 'AES_GCM_CTR_V1';
7
+
8
+ /** Identifies one encrypted Parquet module in its authenticated-data suffix. */
9
+ export type ParquetEncryptionModule =
10
+ | 'footer'
11
+ | 'column-metadata'
12
+ | 'data-page'
13
+ | 'dictionary-page'
14
+ | 'data-page-header'
15
+ | 'dictionary-page-header'
16
+ | 'column-index'
17
+ | 'offset-index'
18
+ | 'bloom-filter-header'
19
+ | 'bloom-filter-bitset';
20
+
21
+ /** Supplies a 128-bit, 192-bit, or 256-bit key for a Parquet module. */
22
+ export type ParquetKeyRetriever = (
23
+ keyMetadata: Uint8Array | undefined,
24
+ context: {algorithm: ParquetEncryptionAlgorithm; aad: Uint8Array}
25
+ ) => Promise<ArrayBuffer | ArrayBufferView> | ArrayBuffer | ArrayBufferView;
26
+
27
+ /** Writer configuration for an encrypted Parquet footer. */
28
+ export type ParquetWriterEncryptionOptions = {
29
+ /** Encryption algorithm used for the footer and advertised in FileCryptoMetaData. */
30
+ algorithm?: ParquetEncryptionAlgorithm;
31
+ /** Optional key metadata passed to the key retriever and stored in FileCryptoMetaData. */
32
+ keyMetadata?: Uint8Array;
33
+ /** AAD prefix included in the file crypto metadata when provided. */
34
+ aadPrefix?: Uint8Array;
35
+ /** Eight-byte file identifier used in module AAD; generated when omitted. */
36
+ fileUnique?: Uint8Array;
37
+ /** Encrypt all data columns, or only the named top-level columns, with the footer key. */
38
+ encryptColumns?: boolean | Record<string, boolean>;
39
+ /** Optional per-column key metadata, enabling column-key encryption and key rotation. */
40
+ columnKeyMetadata?: Record<string, Uint8Array>;
41
+ /** Resolves the footer key without putting key material in writer options. */
42
+ keyRetriever: ParquetKeyRetriever;
43
+ };
44
+
45
+ /** Writer configuration for a plaintext footer authenticated by a Parquet signature. */
46
+ export type ParquetWriterFooterSignatureOptions = {
47
+ /** Algorithm used to authenticate the footer signature. */
48
+ algorithm?: ParquetEncryptionAlgorithm;
49
+ /** Key metadata stored in FileMetaData and supplied to the key retriever. */
50
+ keyMetadata: Uint8Array;
51
+ /** AAD prefix included in the signature AAD when provided. */
52
+ aadPrefix?: Uint8Array;
53
+ /** Eight-byte file identifier used in the signature AAD; generated when omitted. */
54
+ fileUnique?: Uint8Array;
55
+ /** Resolves the signing key without putting key material in writer options. */
56
+ keyRetriever: ParquetKeyRetriever;
57
+ };
58
+
59
+ /** Options used when decrypting one serialized Parquet module. */
60
+ export type ParquetDecryptModuleOptions = {
61
+ /** Encryption algorithm selected by the file crypto metadata. */
62
+ algorithm: ParquetEncryptionAlgorithm;
63
+ /** Authentication data constructed from the file AAD prefix and module suffix. */
64
+ aad: Uint8Array;
65
+ /** Optional key metadata passed to the caller's key retriever. */
66
+ keyMetadata?: Uint8Array;
67
+ /** Resolves the key without making key material part of source options. */
68
+ keyRetriever: ParquetKeyRetriever;
69
+ /** True for a page encrypted with AES-CTR under AES_GCM_CTR_V1. */
70
+ page?: boolean;
71
+ };
72
+
73
+ /** Reads one length-prefixed encrypted Parquet module from a serialized range. */
74
+ export function readParquetEncryptedModule(
75
+ buffer: Uint8Array,
76
+ offset = 0
77
+ ): {bytes: Uint8Array; nextOffset: number} {
78
+ if (offset + 4 > buffer.length) {
79
+ throw new Error('Invalid encrypted Parquet module: missing module length');
80
+ }
81
+ const length = new DataView(buffer.buffer, buffer.byteOffset + offset, 4).getUint32(0, true);
82
+ const moduleStart = offset + 4;
83
+ const moduleEnd = moduleStart + length;
84
+ if (length < 12 || moduleEnd > buffer.length) {
85
+ throw new Error('Invalid encrypted Parquet module: truncated module');
86
+ }
87
+ return {bytes: buffer.subarray(moduleStart, moduleEnd), nextOffset: moduleEnd};
88
+ }
89
+
90
+ /** Builds the AAD required by the Parquet modular-encryption specification. */
91
+ export function createParquetModuleAad(
92
+ aadPrefix: Uint8Array | undefined,
93
+ fileUnique: Uint8Array,
94
+ module: ParquetEncryptionModule,
95
+ rowGroupOrdinal?: number,
96
+ columnOrdinal?: number,
97
+ pageOrdinal?: number
98
+ ): Uint8Array {
99
+ const moduleType = [
100
+ 'footer',
101
+ 'column-metadata',
102
+ 'data-page',
103
+ 'dictionary-page',
104
+ 'data-page-header',
105
+ 'dictionary-page-header',
106
+ 'column-index',
107
+ 'offset-index',
108
+ 'bloom-filter-header',
109
+ 'bloom-filter-bitset'
110
+ ].indexOf(module);
111
+ if (moduleType < 0) throw new Error(`Unknown Parquet encryption module ${module}`);
112
+ const isPageModule = module === 'data-page' || module === 'data-page-header';
113
+ const suffixLength = fileUnique.length + (module === 'footer' ? 1 : isPageModule ? 7 : 5);
114
+ const suffix = new Uint8Array(suffixLength);
115
+ suffix.set(fileUnique);
116
+ suffix[fileUnique.length] = moduleType;
117
+ if (module !== 'footer') {
118
+ new DataView(suffix.buffer).setInt16(fileUnique.length + 1, rowGroupOrdinal ?? 0, true);
119
+ new DataView(suffix.buffer).setInt16(fileUnique.length + 3, columnOrdinal ?? 0, true);
120
+ if (isPageModule)
121
+ new DataView(suffix.buffer).setInt16(fileUnique.length + 5, pageOrdinal ?? 0, true);
122
+ }
123
+ const prefix = aadPrefix || new Uint8Array(0);
124
+ const aad = new Uint8Array(prefix.length + suffix.length);
125
+ aad.set(prefix);
126
+ aad.set(suffix, prefix.length);
127
+ return aad;
128
+ }
129
+
130
+ /** Decrypts a Parquet module serialized as `[length][nonce][ciphertext][tag]`. */
131
+ export async function decryptParquetModule(
132
+ encryptedModule: ArrayBuffer | ArrayBufferView,
133
+ options: ParquetDecryptModuleOptions
134
+ ): Promise<Uint8Array> {
135
+ const bytes = toUint8Array(encryptedModule);
136
+ const buffer = hasLengthPrefix(bytes) ? bytes.subarray(4) : bytes;
137
+ const nonceLength = 12;
138
+ if (buffer.length < nonceLength + (options.page ? 0 : 16)) {
139
+ throw new Error('Invalid Parquet encrypted module: truncated nonce or authentication tag');
140
+ }
141
+ const nonce = buffer.subarray(0, nonceLength);
142
+ const ciphertext = buffer.subarray(nonceLength);
143
+ const keyMaterial = await options.keyRetriever(options.keyMetadata, {
144
+ algorithm: options.algorithm,
145
+ aad: options.aad
146
+ });
147
+ const cryptoKey = await getCryptoKey(keyMaterial, options.algorithm, options.page);
148
+ const cryptoProvider = getCryptoProvider();
149
+ const plaintext =
150
+ options.page && options.algorithm === 'AES_GCM_CTR_V1'
151
+ ? await cryptoProvider.decrypt(
152
+ {name: 'AES-CTR', counter: makeCounter(nonce) as unknown as BufferSource, length: 32},
153
+ cryptoKey,
154
+ ciphertext as unknown as BufferSource
155
+ )
156
+ : await cryptoProvider.decrypt(
157
+ {
158
+ name: 'AES-GCM',
159
+ iv: nonce as unknown as BufferSource,
160
+ additionalData: options.aad as unknown as BufferSource
161
+ },
162
+ cryptoKey,
163
+ ciphertext as unknown as BufferSource
164
+ );
165
+ return new Uint8Array(plaintext);
166
+ }
167
+
168
+ /** Encrypts one Parquet footer module as nonce-prefixed AES-GCM bytes. */
169
+ export async function encryptParquetModule(
170
+ plaintext: ArrayBuffer | ArrayBufferView,
171
+ options: {
172
+ algorithm: ParquetEncryptionAlgorithm;
173
+ aad: Uint8Array;
174
+ keyMetadata?: Uint8Array;
175
+ keyRetriever: ParquetKeyRetriever;
176
+ /** Use AES-CTR for page data under AES_GCM_CTR_V1. */
177
+ page?: boolean;
178
+ }
179
+ ): Promise<Uint8Array> {
180
+ const keyMaterial = await options.keyRetriever(options.keyMetadata, {
181
+ algorithm: options.algorithm,
182
+ aad: options.aad
183
+ });
184
+ const cryptoKey = await getCryptoKey(keyMaterial, options.algorithm, false, ['encrypt']);
185
+ const nonce = new Uint8Array(12);
186
+ const cryptoProvider = getCryptoProvider();
187
+ getCryptoRandomValues(nonce);
188
+ const isCtrPage = options.page && options.algorithm === 'AES_GCM_CTR_V1';
189
+ const pageCryptoKey = isCtrPage
190
+ ? await getCryptoKey(keyMaterial, options.algorithm, true, ['encrypt'])
191
+ : cryptoKey;
192
+ const ciphertext = new Uint8Array(
193
+ await cryptoProvider.encrypt(
194
+ isCtrPage
195
+ ? {name: 'AES-CTR', counter: makeCounter(nonce) as unknown as BufferSource, length: 32}
196
+ : {
197
+ name: 'AES-GCM',
198
+ iv: nonce as unknown as BufferSource,
199
+ additionalData: options.aad as unknown as BufferSource
200
+ },
201
+ pageCryptoKey,
202
+ toUint8Array(plaintext) as unknown as BufferSource
203
+ )
204
+ );
205
+ const encryptedModule = new Uint8Array(nonce.byteLength + ciphertext.byteLength);
206
+ encryptedModule.set(nonce);
207
+ encryptedModule.set(ciphertext, nonce.byteLength);
208
+ return encryptedModule;
209
+ }
210
+
211
+ /** Verifies a plaintext-footer signature by authenticating the serialized footer bytes. */
212
+ export async function verifyParquetFooterSignature(
213
+ footerBytes: Uint8Array,
214
+ signature: Uint8Array,
215
+ options: {
216
+ algorithm: ParquetEncryptionAlgorithm;
217
+ aad: Uint8Array;
218
+ keyMetadata?: Uint8Array;
219
+ keyRetriever: ParquetKeyRetriever;
220
+ }
221
+ ): Promise<void> {
222
+ if (signature.byteLength !== 28) {
223
+ throw new Error(
224
+ `Invalid Parquet plaintext-footer signature length ${signature.byteLength}; expected 28`
225
+ );
226
+ }
227
+ const keyMaterial = await options.keyRetriever(options.keyMetadata, {
228
+ algorithm: options.algorithm,
229
+ aad: options.aad
230
+ });
231
+ const cryptoKey = await getCryptoKey(keyMaterial, options.algorithm, false, ['encrypt']);
232
+ const encryptedFooter = new Uint8Array(
233
+ await getCryptoProvider().encrypt(
234
+ {
235
+ name: 'AES-GCM',
236
+ iv: signature.subarray(0, 12) as unknown as BufferSource,
237
+ additionalData: options.aad as unknown as BufferSource
238
+ },
239
+ cryptoKey,
240
+ footerBytes as unknown as BufferSource
241
+ )
242
+ );
243
+ const calculatedTag = encryptedFooter.subarray(encryptedFooter.byteLength - 16);
244
+ for (let index = 0; index < 16; index++) {
245
+ if (calculatedTag[index] !== signature[12 + index]) {
246
+ throw new Error('Parquet plaintext-footer signature verification failed');
247
+ }
248
+ }
249
+ }
250
+
251
+ /** Creates the nonce and authentication tag used by a plaintext-footer signature. */
252
+ export async function createParquetFooterSignature(
253
+ footerBytes: Uint8Array,
254
+ options: ParquetWriterFooterSignatureOptions
255
+ ): Promise<Uint8Array> {
256
+ const algorithm = options.algorithm ?? 'AES_GCM_V1';
257
+ const fileUnique = options.fileUnique ? new Uint8Array(options.fileUnique) : createFileUnique();
258
+ if (fileUnique.byteLength !== 8) {
259
+ throw new Error('Parquet plaintext-footer signature file_unique must be 8 bytes');
260
+ }
261
+ const aad = createParquetModuleAad(options.aadPrefix, fileUnique, 'footer');
262
+ const keyMaterial = await options.keyRetriever(options.keyMetadata, {algorithm, aad});
263
+ const cryptoKey = await getCryptoKey(keyMaterial, algorithm, false, ['encrypt']);
264
+ const nonce = new Uint8Array(12);
265
+ getCryptoRandomValues(nonce);
266
+ const encryptedFooter = new Uint8Array(
267
+ await getCryptoProvider().encrypt(
268
+ {
269
+ name: 'AES-GCM',
270
+ iv: nonce as unknown as BufferSource,
271
+ additionalData: aad as unknown as BufferSource
272
+ },
273
+ cryptoKey,
274
+ footerBytes as unknown as BufferSource
275
+ )
276
+ );
277
+ const signature = new Uint8Array(28);
278
+ signature.set(nonce);
279
+ signature.set(encryptedFooter.subarray(encryptedFooter.byteLength - 16), nonce.byteLength);
280
+ return signature;
281
+ }
282
+
283
+ function hasLengthPrefix(bytes: Uint8Array): boolean {
284
+ if (bytes.length < 4) return false;
285
+ const length = new DataView(bytes.buffer, bytes.byteOffset, 4).getUint32(0, true);
286
+ return length === bytes.length - 4;
287
+ }
288
+
289
+ function createFileUnique(): Uint8Array {
290
+ const fileUnique = new Uint8Array(8);
291
+ getCryptoRandomValues(fileUnique);
292
+ return fileUnique;
293
+ }
294
+
295
+ function makeCounter(nonce: Uint8Array): Uint8Array {
296
+ const counter = new Uint8Array(16);
297
+ counter.set(nonce);
298
+ counter[15] = 1;
299
+ return counter;
300
+ }
301
+
302
+ async function getCryptoKey(
303
+ keyMaterial: ArrayBuffer | ArrayBufferView,
304
+ algorithm: ParquetEncryptionAlgorithm,
305
+ page?: boolean,
306
+ usages: KeyUsage[] = ['decrypt']
307
+ ): Promise<CryptoKey> {
308
+ const keyBytes = toUint8Array(keyMaterial);
309
+ if (keyBytes.byteLength !== 16 && keyBytes.byteLength !== 24 && keyBytes.byteLength !== 32) {
310
+ throw new Error(`Invalid Parquet encryption key length ${keyBytes.byteLength}`);
311
+ }
312
+ return await getCryptoProvider().importKey(
313
+ 'raw',
314
+ keyBytes as unknown as BufferSource,
315
+ page && algorithm === 'AES_GCM_CTR_V1' ? {name: 'AES-CTR'} : {name: 'AES-GCM'},
316
+ false,
317
+ usages
318
+ );
319
+ }
320
+
321
+ function getCryptoProvider(): SubtleCrypto {
322
+ const cryptoProvider = globalThis.crypto?.subtle;
323
+ if (!cryptoProvider) throw new Error('Parquet encryption requires Web Crypto support');
324
+ return cryptoProvider;
325
+ }
326
+
327
+ /** Fills a nonce with cryptographically secure random bytes. */
328
+ function getCryptoRandomValues(array: Uint8Array): Uint8Array {
329
+ const cryptoProvider = globalThis.crypto;
330
+ if (!cryptoProvider?.getRandomValues) {
331
+ throw new Error('Parquet encryption requires Web Crypto random values');
332
+ }
333
+ const getRandomValues = cryptoProvider.getRandomValues.bind(cryptoProvider) as unknown as (
334
+ value: Uint8Array
335
+ ) => Uint8Array;
336
+ getRandomValues(array);
337
+ return array;
338
+ }
339
+
340
+ function toUint8Array(value: ArrayBuffer | ArrayBufferView): Uint8Array {
341
+ return value instanceof ArrayBuffer
342
+ ? new Uint8Array(value)
343
+ : new Uint8Array(value.buffer, value.byteOffset, value.byteLength);
344
+ }