@loaders.gl/parquet 4.4.2 → 5.0.0-alpha.1

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 (267) hide show
  1. package/dist/bundled.d.ts +6 -0
  2. package/dist/bundled.d.ts.map +1 -0
  3. package/dist/bundled.js +7 -0
  4. package/dist/bundled.js.map +1 -0
  5. package/dist/geoparquet-loader-with-parser.d.ts +34 -0
  6. package/dist/geoparquet-loader-with-parser.d.ts.map +1 -0
  7. package/dist/geoparquet-loader-with-parser.js +52 -0
  8. package/dist/geoparquet-loader-with-parser.js.map +1 -0
  9. package/dist/geoparquet-loader.d.ts +61 -0
  10. package/dist/geoparquet-loader.d.ts.map +1 -0
  11. package/dist/geoparquet-loader.js +30 -0
  12. package/dist/geoparquet-loader.js.map +1 -0
  13. package/dist/index.cjs +5879 -5643
  14. package/dist/index.cjs.map +4 -4
  15. package/dist/index.d.ts +7 -7
  16. package/dist/index.d.ts.map +1 -1
  17. package/dist/index.js +5 -11
  18. package/dist/index.js.map +1 -1
  19. package/dist/lib/constants.d.ts +1 -1
  20. package/dist/lib/constants.js +2 -2
  21. package/dist/lib/constants.js.map +1 -1
  22. package/dist/lib/encoders/encode-arrow-to-parquet.d.ts +2 -2
  23. package/dist/lib/encoders/encode-arrow-to-parquet.d.ts.map +1 -1
  24. package/dist/lib/encoders/encode-arrow-to-parquet.js +3 -10
  25. package/dist/lib/encoders/encode-arrow-to-parquet.js.map +1 -1
  26. package/dist/lib/encoders/encode-table-to-parquet-js.d.ts +5 -0
  27. package/dist/lib/encoders/encode-table-to-parquet-js.d.ts.map +1 -0
  28. package/dist/lib/encoders/encode-table-to-parquet-js.js +149 -0
  29. package/dist/lib/encoders/encode-table-to-parquet-js.js.map +1 -0
  30. package/dist/lib/geo/geospatial-metadata.d.ts +67 -0
  31. package/dist/lib/geo/geospatial-metadata.d.ts.map +1 -0
  32. package/dist/lib/geo/geospatial-metadata.js +357 -0
  33. package/dist/lib/geo/geospatial-metadata.js.map +1 -0
  34. package/dist/lib/parsers/get-parquet-schema.d.ts.map +1 -1
  35. package/dist/lib/parsers/get-parquet-schema.js +3 -1
  36. package/dist/lib/parsers/get-parquet-schema.js.map +1 -1
  37. package/dist/lib/parsers/parse-geoparquet-to-geojson.d.ts +4 -4
  38. package/dist/lib/parsers/parse-geoparquet-to-geojson.d.ts.map +1 -1
  39. package/dist/lib/parsers/parse-geoparquet-to-geojson.js +19 -6
  40. package/dist/lib/parsers/parse-geoparquet-to-geojson.js.map +1 -1
  41. package/dist/lib/parsers/parse-parquet-tables.d.ts +50 -0
  42. package/dist/lib/parsers/parse-parquet-tables.d.ts.map +1 -0
  43. package/dist/lib/parsers/parse-parquet-tables.js +101 -0
  44. package/dist/lib/parsers/parse-parquet-tables.js.map +1 -0
  45. package/dist/lib/parsers/parse-parquet-to-arrow-js.d.ts +6 -0
  46. package/dist/lib/parsers/parse-parquet-to-arrow-js.d.ts.map +1 -0
  47. package/dist/lib/parsers/parse-parquet-to-arrow-js.js +23 -0
  48. package/dist/lib/parsers/parse-parquet-to-arrow-js.js.map +1 -0
  49. package/dist/lib/parsers/parse-parquet-to-arrow.d.ts +7 -7
  50. package/dist/lib/parsers/parse-parquet-to-arrow.d.ts.map +1 -1
  51. package/dist/lib/parsers/parse-parquet-to-arrow.js +45 -32
  52. package/dist/lib/parsers/parse-parquet-to-arrow.js.map +1 -1
  53. package/dist/lib/parsers/parse-parquet-to-columns.d.ts +3 -3
  54. package/dist/lib/parsers/parse-parquet-to-columns.d.ts.map +1 -1
  55. package/dist/lib/parsers/parse-parquet-to-columns.js +1 -4
  56. package/dist/lib/parsers/parse-parquet-to-columns.js.map +1 -1
  57. package/dist/lib/parsers/parse-parquet-to-json.d.ts +3 -3
  58. package/dist/lib/parsers/parse-parquet-to-json.d.ts.map +1 -1
  59. package/dist/lib/parsers/parse-parquet-to-json.js +77 -26
  60. package/dist/lib/parsers/parse-parquet-to-json.js.map +1 -1
  61. package/dist/lib/utils/load-wasm.d.ts +2 -2
  62. package/dist/lib/utils/load-wasm.d.ts.map +1 -1
  63. package/dist/lib/utils/load-wasm.js +7 -7
  64. package/dist/lib/utils/load-wasm.js.map +1 -1
  65. package/dist/lib/utils/make-stream-iterator.js +1 -1
  66. package/dist/lib/utils/make-stream-iterator.js.map +1 -1
  67. package/dist/lib/utils/normalize-parquet-options.d.ts +5 -0
  68. package/dist/lib/utils/normalize-parquet-options.d.ts.map +1 -0
  69. package/dist/lib/utils/normalize-parquet-options.js +11 -0
  70. package/dist/lib/utils/normalize-parquet-options.js.map +1 -0
  71. package/dist/parquet-format.d.ts +2 -0
  72. package/dist/parquet-format.d.ts.map +1 -1
  73. package/dist/parquet-format.js +2 -0
  74. package/dist/parquet-format.js.map +1 -1
  75. package/dist/parquet-js-loader.d.ts +57 -0
  76. package/dist/parquet-js-loader.d.ts.map +1 -0
  77. package/dist/parquet-js-loader.js +33 -0
  78. package/dist/parquet-js-loader.js.map +1 -0
  79. package/dist/parquet-js-writer.d.ts +34 -0
  80. package/dist/parquet-js-writer.d.ts.map +1 -0
  81. package/dist/parquet-js-writer.js +28 -0
  82. package/dist/parquet-js-writer.js.map +1 -0
  83. package/dist/parquet-loader-options.d.ts +56 -0
  84. package/dist/parquet-loader-options.d.ts.map +1 -0
  85. package/dist/parquet-loader-options.js +11 -0
  86. package/dist/parquet-loader-options.js.map +1 -0
  87. package/dist/parquet-loader-with-parser.d.ts +33 -0
  88. package/dist/parquet-loader-with-parser.d.ts.map +1 -0
  89. package/dist/parquet-loader-with-parser.js +40 -0
  90. package/dist/parquet-loader-with-parser.js.map +1 -0
  91. package/dist/parquet-loader.d.ts +62 -0
  92. package/dist/parquet-loader.d.ts.map +1 -0
  93. package/dist/parquet-loader.js +53 -0
  94. package/dist/parquet-loader.js.map +1 -0
  95. package/dist/parquet-wasm-loader-with-parser.d.ts +40 -0
  96. package/dist/parquet-wasm-loader-with-parser.d.ts.map +1 -0
  97. package/dist/parquet-wasm-loader-with-parser.js +68 -0
  98. package/dist/parquet-wasm-loader-with-parser.js.map +1 -0
  99. package/dist/parquet-writer.d.ts +10 -0
  100. package/dist/parquet-writer.d.ts.map +1 -0
  101. package/dist/parquet-writer.js +29 -0
  102. package/dist/parquet-writer.js.map +1 -0
  103. package/dist/parquet_wasm_bg.wasm +0 -0
  104. package/dist/parquetjs/codecs/declare.d.ts +2 -2
  105. package/dist/parquetjs/codecs/declare.d.ts.map +1 -1
  106. package/dist/parquetjs/codecs/dictionary.js +1 -1
  107. package/dist/parquetjs/codecs/dictionary.js.map +1 -1
  108. package/dist/parquetjs/codecs/plain.d.ts +1 -1
  109. package/dist/parquetjs/codecs/plain.d.ts.map +1 -1
  110. package/dist/parquetjs/codecs/plain.js +36 -41
  111. package/dist/parquetjs/codecs/plain.js.map +1 -1
  112. package/dist/parquetjs/codecs/rle.d.ts +1 -1
  113. package/dist/parquetjs/codecs/rle.d.ts.map +1 -1
  114. package/dist/parquetjs/codecs/rle.js +16 -21
  115. package/dist/parquetjs/codecs/rle.js.map +1 -1
  116. package/dist/parquetjs/compression.d.ts +2 -3
  117. package/dist/parquetjs/compression.d.ts.map +1 -1
  118. package/dist/parquetjs/compression.js +4 -105
  119. package/dist/parquetjs/compression.js.map +1 -1
  120. package/dist/parquetjs/encoder/parquet-encoder.d.ts +4 -4
  121. package/dist/parquetjs/encoder/parquet-encoder.d.ts.map +1 -1
  122. package/dist/parquetjs/encoder/parquet-encoder.js +38 -33
  123. package/dist/parquetjs/encoder/parquet-encoder.js.map +1 -1
  124. package/dist/parquetjs/parquet-thrift/ColumnIndex.js +1 -1
  125. package/dist/parquetjs/parquet-thrift/ColumnIndex.js.map +1 -1
  126. package/dist/parquetjs/parquet-thrift/index.d.ts +0 -1
  127. package/dist/parquetjs/parquet-thrift/index.d.ts.map +1 -1
  128. package/dist/parquetjs/parquet-thrift/index.js +0 -1
  129. package/dist/parquetjs/parquet-thrift/index.js.map +1 -1
  130. package/dist/parquetjs/parser/decoders.d.ts +1 -1
  131. package/dist/parquetjs/parser/decoders.d.ts.map +1 -1
  132. package/dist/parquetjs/parser/decoders.js +4 -22
  133. package/dist/parquetjs/parser/decoders.js.map +1 -1
  134. package/dist/parquetjs/parser/parquet-reader.d.ts +1 -1
  135. package/dist/parquetjs/parser/parquet-reader.d.ts.map +1 -1
  136. package/dist/parquetjs/parser/parquet-reader.js +9 -9
  137. package/dist/parquetjs/parser/parquet-reader.js.map +1 -1
  138. package/dist/parquetjs/schema/declare.d.ts +1 -1
  139. package/dist/parquetjs/schema/declare.d.ts.map +1 -1
  140. package/dist/parquetjs/schema/types.d.ts.map +1 -1
  141. package/dist/parquetjs/schema/types.js +36 -35
  142. package/dist/parquetjs/schema/types.js.map +1 -1
  143. package/dist/parquetjs/utils/binary-utils.d.ts +39 -0
  144. package/dist/parquetjs/utils/binary-utils.d.ts.map +1 -0
  145. package/dist/parquetjs/utils/binary-utils.js +102 -0
  146. package/dist/parquetjs/utils/binary-utils.js.map +1 -0
  147. package/dist/parquetjs/utils/file-utils.d.ts +1 -1
  148. package/dist/parquetjs/utils/file-utils.d.ts.map +1 -1
  149. package/dist/parquetjs/utils/file-utils.js +3 -3
  150. package/dist/parquetjs/utils/file-utils.js.map +1 -1
  151. package/dist/parquetjs/utils/read-utils.d.ts +4 -4
  152. package/dist/parquetjs/utils/read-utils.d.ts.map +1 -1
  153. package/dist/parquetjs/utils/read-utils.js +12 -17
  154. package/dist/parquetjs/utils/read-utils.js.map +1 -1
  155. package/dist/parquetjs/utils/uint8-array-compact-protocol-writer.d.ts +78 -0
  156. package/dist/parquetjs/utils/uint8-array-compact-protocol-writer.d.ts.map +1 -0
  157. package/dist/parquetjs/utils/uint8-array-compact-protocol-writer.js +213 -0
  158. package/dist/parquetjs/utils/uint8-array-compact-protocol-writer.js.map +1 -0
  159. package/dist/parquetjs/utils/uint8-array-compact-protocol.d.ts +78 -0
  160. package/dist/parquetjs/utils/uint8-array-compact-protocol.d.ts.map +1 -0
  161. package/dist/parquetjs/utils/uint8-array-compact-protocol.js +276 -0
  162. package/dist/parquetjs/utils/uint8-array-compact-protocol.js.map +1 -0
  163. package/dist/parquetjs/utils/uint8-array-transport.d.ts +25 -0
  164. package/dist/parquetjs/utils/uint8-array-transport.d.ts.map +1 -0
  165. package/dist/parquetjs/utils/uint8-array-transport.js +62 -0
  166. package/dist/parquetjs/utils/uint8-array-transport.js.map +1 -0
  167. package/dist/unbundled.d.ts +6 -0
  168. package/dist/unbundled.d.ts.map +1 -0
  169. package/dist/unbundled.js +7 -0
  170. package/dist/unbundled.js.map +1 -0
  171. package/package.json +21 -25
  172. package/src/bundled.ts +9 -0
  173. package/src/geoparquet-loader-with-parser.ts +95 -0
  174. package/src/geoparquet-loader.ts +54 -0
  175. package/src/index.ts +7 -25
  176. package/src/lib/constants.ts +1 -1
  177. package/src/lib/encoders/encode-arrow-to-parquet.ts +9 -15
  178. package/src/lib/encoders/encode-table-to-parquet-js.ts +199 -0
  179. package/src/lib/geo/geospatial-metadata.ts +507 -0
  180. package/src/lib/parsers/get-parquet-schema.ts +3 -1
  181. package/src/lib/parsers/parse-geoparquet-to-geojson.ts +27 -14
  182. package/src/lib/parsers/parse-parquet-tables.ts +137 -0
  183. package/src/lib/parsers/parse-parquet-to-arrow-js.ts +36 -0
  184. package/src/lib/parsers/parse-parquet-to-arrow.ts +63 -36
  185. package/src/lib/parsers/parse-parquet-to-columns.ts +6 -7
  186. package/src/lib/parsers/parse-parquet-to-json.ts +101 -33
  187. package/src/lib/utils/load-wasm.ts +16 -9
  188. package/src/lib/utils/make-stream-iterator.ts +1 -1
  189. package/src/lib/utils/normalize-parquet-options.ts +14 -0
  190. package/src/parquet-format.ts +2 -0
  191. package/src/parquet-js-loader.ts +43 -0
  192. package/src/parquet-js-writer.ts +52 -0
  193. package/src/parquet-loader-options.ts +63 -0
  194. package/src/parquet-loader-with-parser.ts +68 -0
  195. package/src/parquet-loader.ts +79 -0
  196. package/src/parquet-wasm-loader-with-parser.ts +115 -0
  197. package/src/parquet-writer.ts +44 -0
  198. package/src/parquetjs/codecs/declare.ts +2 -2
  199. package/src/parquetjs/codecs/dictionary.ts +1 -1
  200. package/src/parquetjs/codecs/plain.ts +67 -53
  201. package/src/parquetjs/codecs/rle.ts +20 -26
  202. package/src/parquetjs/compression.ts +7 -114
  203. package/src/parquetjs/encoder/parquet-encoder.ts +49 -43
  204. package/src/parquetjs/parquet-thrift/ColumnIndex.ts +1 -1
  205. package/src/parquetjs/parquet-thrift/index.ts +0 -2
  206. package/src/parquetjs/parser/decoders.ts +5 -23
  207. package/src/parquetjs/parser/parquet-reader.ts +10 -12
  208. package/src/parquetjs/schema/declare.ts +1 -1
  209. package/src/parquetjs/schema/types.ts +48 -40
  210. package/src/parquetjs/utils/binary-utils.ts +127 -0
  211. package/src/parquetjs/utils/file-utils.ts +4 -4
  212. package/src/parquetjs/utils/read-utils.ts +19 -34
  213. package/src/parquetjs/utils/uint8-array-compact-protocol-writer.ts +254 -0
  214. package/src/parquetjs/utils/uint8-array-compact-protocol.ts +322 -0
  215. package/src/parquetjs/utils/uint8-array-transport.ts +79 -0
  216. package/src/unbundled.ts +9 -0
  217. package/dist/parquet-arrow-loader.d.ts +0 -43
  218. package/dist/parquet-arrow-loader.d.ts.map +0 -1
  219. package/dist/parquet-arrow-loader.js +0 -49
  220. package/dist/parquet-arrow-loader.js.map +0 -1
  221. package/dist/parquet-arrow-writer.d.ts +0 -9
  222. package/dist/parquet-arrow-writer.d.ts.map +0 -1
  223. package/dist/parquet-arrow-writer.js +0 -23
  224. package/dist/parquet-arrow-writer.js.map +0 -1
  225. package/dist/parquet-json-loader.d.ts +0 -148
  226. package/dist/parquet-json-loader.d.ts.map +0 -1
  227. package/dist/parquet-json-loader.js +0 -106
  228. package/dist/parquet-json-loader.js.map +0 -1
  229. package/dist/parquet-json-writer.d.ts +0 -19
  230. package/dist/parquet-json-writer.d.ts.map +0 -1
  231. package/dist/parquet-json-writer.js +0 -20
  232. package/dist/parquet-json-writer.js.map +0 -1
  233. package/dist/polyfills/buffer/buffer-polyfill.browser.d.ts +0 -3
  234. package/dist/polyfills/buffer/buffer-polyfill.browser.d.ts.map +0 -1
  235. package/dist/polyfills/buffer/buffer-polyfill.browser.js +0 -12
  236. package/dist/polyfills/buffer/buffer-polyfill.browser.js.map +0 -1
  237. package/dist/polyfills/buffer/buffer-polyfill.node.d.ts +0 -3
  238. package/dist/polyfills/buffer/buffer-polyfill.node.d.ts.map +0 -1
  239. package/dist/polyfills/buffer/buffer-polyfill.node.js +0 -17
  240. package/dist/polyfills/buffer/buffer-polyfill.node.js.map +0 -1
  241. package/dist/polyfills/buffer/buffer.d.ts +0 -222
  242. package/dist/polyfills/buffer/buffer.d.ts.map +0 -1
  243. package/dist/polyfills/buffer/buffer.js +0 -1868
  244. package/dist/polyfills/buffer/buffer.js.map +0 -1
  245. package/dist/polyfills/buffer/index.d.ts +0 -4
  246. package/dist/polyfills/buffer/index.d.ts.map +0 -1
  247. package/dist/polyfills/buffer/index.js +0 -9
  248. package/dist/polyfills/buffer/index.js.map +0 -1
  249. package/dist/polyfills/buffer/install-buffer-polyfill.d.ts +0 -2
  250. package/dist/polyfills/buffer/install-buffer-polyfill.d.ts.map +0 -1
  251. package/dist/polyfills/buffer/install-buffer-polyfill.js +0 -10
  252. package/dist/polyfills/buffer/install-buffer-polyfill.js.map +0 -1
  253. package/dist/workers/parquet-json-worker.d.ts +0 -2
  254. package/dist/workers/parquet-json-worker.d.ts.map +0 -1
  255. package/dist/workers/parquet-json-worker.js +0 -7
  256. package/dist/workers/parquet-json-worker.js.map +0 -1
  257. package/src/parquet-arrow-loader.ts +0 -74
  258. package/src/parquet-arrow-writer.ts +0 -33
  259. package/src/parquet-json-loader.ts +0 -160
  260. package/src/parquet-json-writer.ts +0 -27
  261. package/src/parquetjs/modules.d.ts +0 -25
  262. package/src/polyfills/buffer/buffer-polyfill.browser.ts +0 -14
  263. package/src/polyfills/buffer/buffer-polyfill.node.ts +0 -19
  264. package/src/polyfills/buffer/buffer.ts +0 -2205
  265. package/src/polyfills/buffer/index.ts +0 -11
  266. package/src/polyfills/buffer/install-buffer-polyfill.ts +0 -12
  267. package/src/workers/parquet-json-worker.ts +0 -8
@@ -7,13 +7,28 @@
7
7
  /* eslint-disable camelcase */
8
8
  import type {PrimitiveType} from '../schema/declare';
9
9
  import type {CursorBuffer, ParquetCodecOptions} from './declare';
10
- import INT53 from 'int53';
10
+ import {
11
+ concatUint8Arrays,
12
+ copyUint8Array,
13
+ encodeUtf8,
14
+ readDoubleLE,
15
+ readFloatLE,
16
+ readInt32LE,
17
+ readInt64LE,
18
+ readUInt32LE,
19
+ toUint8Array,
20
+ writeDoubleLE,
21
+ writeFloatLE,
22
+ writeInt32LE,
23
+ writeInt64LE,
24
+ writeUInt32LE
25
+ } from '../utils/binary-utils';
11
26
 
12
27
  export function encodeValues(
13
28
  type: PrimitiveType,
14
29
  values: any[],
15
30
  opts: ParquetCodecOptions
16
- ): Buffer {
31
+ ): Uint8Array {
17
32
  switch (type) {
18
33
  case 'BOOLEAN':
19
34
  return encodeValues_BOOLEAN(values);
@@ -64,9 +79,8 @@ export function decodeValues(
64
79
  }
65
80
  }
66
81
 
67
- function encodeValues_BOOLEAN(values: boolean[]): Buffer {
68
- const buf = Buffer.alloc(Math.ceil(values.length / 8));
69
- buf.fill(0);
82
+ function encodeValues_BOOLEAN(values: boolean[]): Uint8Array {
83
+ const buf = new Uint8Array(Math.ceil(values.length / 8));
70
84
  for (let i = 0; i < values.length; i++) {
71
85
  if (values[i]) {
72
86
  buf[Math.floor(i / 8)] |= 1 << (i % 8);
@@ -85,10 +99,10 @@ function decodeValues_BOOLEAN(cursor: CursorBuffer, count: number): boolean[] {
85
99
  return values;
86
100
  }
87
101
 
88
- function encodeValues_INT32(values: number[]): Buffer {
89
- const buf = Buffer.alloc(4 * values.length);
102
+ function encodeValues_INT32(values: number[]): Uint8Array {
103
+ const buf = new Uint8Array(4 * values.length);
90
104
  for (let i = 0; i < values.length; i++) {
91
- buf.writeInt32LE(values[i], i * 4);
105
+ writeInt32LE(buf, values[i], i * 4);
92
106
  }
93
107
  return buf;
94
108
  }
@@ -96,16 +110,16 @@ function encodeValues_INT32(values: number[]): Buffer {
96
110
  function decodeValues_INT32(cursor: CursorBuffer, count: number): number[] {
97
111
  const values: number[] = [];
98
112
  for (let i = 0; i < count; i++) {
99
- values.push(cursor.buffer.readInt32LE(cursor.offset));
113
+ values.push(readInt32LE(cursor.buffer, cursor.offset));
100
114
  cursor.offset += 4;
101
115
  }
102
116
  return values;
103
117
  }
104
118
 
105
- function encodeValues_INT64(values: number[]): Buffer {
106
- const buf = Buffer.alloc(8 * values.length);
119
+ function encodeValues_INT64(values: number[]): Uint8Array {
120
+ const buf = new Uint8Array(8 * values.length);
107
121
  for (let i = 0; i < values.length; i++) {
108
- INT53.writeInt64LE(values[i], buf, i * 8);
122
+ writeInt64LE(buf, values[i], i * 8);
109
123
  }
110
124
  return buf;
111
125
  }
@@ -113,22 +127,17 @@ function encodeValues_INT64(values: number[]): Buffer {
113
127
  function decodeValues_INT64(cursor: CursorBuffer, count: number): number[] {
114
128
  const values: number[] = [];
115
129
  for (let i = 0; i < count; i++) {
116
- values.push(INT53.readInt64LE(cursor.buffer, cursor.offset));
130
+ values.push(readInt64LE(cursor.buffer, cursor.offset));
117
131
  cursor.offset += 8;
118
132
  }
119
133
  return values;
120
134
  }
121
135
 
122
- function encodeValues_INT96(values: number[]): Buffer {
123
- const buf = Buffer.alloc(12 * values.length);
136
+ function encodeValues_INT96(values: number[]): Uint8Array {
137
+ const buf = new Uint8Array(12 * values.length);
124
138
  for (let i = 0; i < values.length; i++) {
125
- if (values[i] >= 0) {
126
- INT53.writeInt64LE(values[i], buf, i * 12);
127
- buf.writeUInt32LE(0, i * 12 + 8); // truncate to 64 actual precision
128
- } else {
129
- INT53.writeInt64LE(~-values[i] + 1, buf, i * 12);
130
- buf.writeUInt32LE(0xffffffff, i * 12 + 8); // truncate to 64 actual precision
131
- }
139
+ writeInt64LE(buf, values[i], i * 12);
140
+ writeUInt32LE(buf, values[i] >= 0 ? 0 : 0xffffffff, i * 12 + 8);
132
141
  }
133
142
  return buf;
134
143
  }
@@ -136,8 +145,8 @@ function encodeValues_INT96(values: number[]): Buffer {
136
145
  function decodeValues_INT96(cursor: CursorBuffer, count: number): number[] {
137
146
  const values: number[] = [];
138
147
  for (let i = 0; i < count; i++) {
139
- const low = INT53.readInt64LE(cursor.buffer, cursor.offset);
140
- const high = cursor.buffer.readUInt32LE(cursor.offset + 8);
148
+ const low = readInt64LE(cursor.buffer, cursor.offset);
149
+ const high = readUInt32LE(cursor.buffer, cursor.offset + 8);
141
150
  if (high === 0xffffffff) {
142
151
  values.push(~-low + 1); // truncate to 64 actual precision
143
152
  } else {
@@ -148,10 +157,10 @@ function decodeValues_INT96(cursor: CursorBuffer, count: number): number[] {
148
157
  return values;
149
158
  }
150
159
 
151
- function encodeValues_FLOAT(values: number[]): Buffer {
152
- const buf = Buffer.alloc(4 * values.length);
160
+ function encodeValues_FLOAT(values: number[]): Uint8Array {
161
+ const buf = new Uint8Array(4 * values.length);
153
162
  for (let i = 0; i < values.length; i++) {
154
- buf.writeFloatLE(values[i], i * 4);
163
+ writeFloatLE(buf, values[i], i * 4);
155
164
  }
156
165
  return buf;
157
166
  }
@@ -159,16 +168,16 @@ function encodeValues_FLOAT(values: number[]): Buffer {
159
168
  function decodeValues_FLOAT(cursor: CursorBuffer, count: number): number[] {
160
169
  const values: number[] = [];
161
170
  for (let i = 0; i < count; i++) {
162
- values.push(cursor.buffer.readFloatLE(cursor.offset));
171
+ values.push(readFloatLE(cursor.buffer, cursor.offset));
163
172
  cursor.offset += 4;
164
173
  }
165
174
  return values;
166
175
  }
167
176
 
168
- function encodeValues_DOUBLE(values: number[]): Buffer {
169
- const buf = Buffer.alloc(8 * values.length);
177
+ function encodeValues_DOUBLE(values: number[]): Uint8Array {
178
+ const buf = new Uint8Array(8 * values.length);
170
179
  for (let i = 0; i < values.length; i++) {
171
- buf.writeDoubleLE(values[i], i * 8);
180
+ writeDoubleLE(buf, values[i], i * 8);
172
181
  }
173
182
  return buf;
174
183
  }
@@ -176,67 +185,72 @@ function encodeValues_DOUBLE(values: number[]): Buffer {
176
185
  function decodeValues_DOUBLE(cursor: CursorBuffer, count: number): number[] {
177
186
  const values: number[] = [];
178
187
  for (let i = 0; i < count; i++) {
179
- values.push(cursor.buffer.readDoubleLE(cursor.offset));
188
+ values.push(readDoubleLE(cursor.buffer, cursor.offset));
180
189
  cursor.offset += 8;
181
190
  }
182
191
  return values;
183
192
  }
184
193
 
185
- function encodeValues_BYTE_ARRAY(values: Buffer[]): Buffer {
194
+ function encodeValues_BYTE_ARRAY(values: any[]): Uint8Array {
195
+ const byteValues = values.map(toPrimitiveBytes);
186
196
  // tslint:disable-next-line:variable-name
187
197
  let buf_len = 0;
188
- for (let i = 0; i < values.length; i++) {
189
- values[i] = Buffer.from(values[i]);
190
- buf_len += 4 + values[i].length;
198
+ for (let i = 0; i < byteValues.length; i++) {
199
+ buf_len += 4 + byteValues[i].length;
191
200
  }
192
- const buf = Buffer.alloc(buf_len);
201
+ const buf = new Uint8Array(buf_len);
193
202
  // tslint:disable-next-line:variable-name
194
203
  let buf_pos = 0;
195
- for (let i = 0; i < values.length; i++) {
196
- buf.writeUInt32LE(values[i].length, buf_pos);
197
- values[i].copy(buf as Uint8Array, buf_pos + 4);
198
- buf_pos += 4 + values[i].length;
204
+ for (let i = 0; i < byteValues.length; i++) {
205
+ writeUInt32LE(buf, byteValues[i].length, buf_pos);
206
+ buf.set(byteValues[i], buf_pos + 4);
207
+ buf_pos += 4 + byteValues[i].length;
199
208
  }
200
209
  return buf;
201
210
  }
202
211
 
203
- function decodeValues_BYTE_ARRAY(cursor: CursorBuffer, count: number): Buffer[] {
204
- const values: Buffer[] = [];
212
+ function decodeValues_BYTE_ARRAY(cursor: CursorBuffer, count: number): Uint8Array[] {
213
+ const values: Uint8Array[] = [];
205
214
  for (let i = 0; i < count; i++) {
206
- const len = cursor.buffer.readUInt32LE(cursor.offset);
215
+ const len = readUInt32LE(cursor.buffer, cursor.offset);
207
216
  cursor.offset += 4;
208
- // values.push(cursor.buffer.buffer.slice(cursor.offset, cursor.offset + len));
209
- values.push(cursor.buffer.slice(cursor.offset, cursor.offset + len));
217
+ values.push(copyUint8Array(cursor.buffer.subarray(cursor.offset, cursor.offset + len)));
210
218
  cursor.offset += len;
211
219
  }
212
220
  return values;
213
221
  }
214
222
 
215
- function encodeValues_FIXED_LEN_BYTE_ARRAY(values: Buffer[], opts: ParquetCodecOptions): Buffer {
223
+ function encodeValues_FIXED_LEN_BYTE_ARRAY(values: any[], opts: ParquetCodecOptions): Uint8Array {
216
224
  if (!opts.typeLength) {
217
225
  throw new Error('missing option: typeLength (required for FIXED_LEN_BYTE_ARRAY)');
218
226
  }
227
+ const byteValues = values.map(toPrimitiveBytes);
219
228
  for (let i = 0; i < values.length; i++) {
220
- values[i] = Buffer.from(values[i]);
221
- if (values[i].length !== opts.typeLength) {
229
+ if (byteValues[i].length !== opts.typeLength) {
222
230
  throw new Error(`invalid value for FIXED_LEN_BYTE_ARRAY: ${values[i]}`);
223
231
  }
224
232
  }
225
- return Buffer.concat(values as Uint8Array[]);
233
+ return concatUint8Arrays(byteValues);
226
234
  }
227
235
 
228
236
  function decodeValues_FIXED_LEN_BYTE_ARRAY(
229
237
  cursor: CursorBuffer,
230
238
  count: number,
231
239
  opts: ParquetCodecOptions
232
- ): Buffer[] {
233
- const values: Buffer[] = [];
240
+ ): Uint8Array[] {
241
+ const values: Uint8Array[] = [];
234
242
  if (!opts.typeLength) {
235
243
  throw new Error('missing option: typeLength (required for FIXED_LEN_BYTE_ARRAY)');
236
244
  }
237
245
  for (let i = 0; i < count; i++) {
238
- values.push(cursor.buffer.slice(cursor.offset, cursor.offset + opts.typeLength));
246
+ values.push(
247
+ copyUint8Array(cursor.buffer.subarray(cursor.offset, cursor.offset + opts.typeLength))
248
+ );
239
249
  cursor.offset += opts.typeLength;
240
250
  }
241
251
  return values;
242
252
  }
253
+
254
+ function toPrimitiveBytes(value: any): Uint8Array {
255
+ return typeof value === 'string' ? encodeUtf8(value) : toUint8Array(value);
256
+ }
@@ -6,6 +6,7 @@
6
6
 
7
7
  import type {PrimitiveType} from '../schema/declare';
8
8
  import type {CursorBuffer, ParquetCodecOptions} from './declare';
9
+ import {concatUint8Arrays, writeUInt32LE} from '../utils/binary-utils';
9
10
  import varint from 'varint';
10
11
 
11
12
  // eslint-disable-next-line max-statements, complexity
@@ -13,7 +14,7 @@ export function encodeValues(
13
14
  type: PrimitiveType,
14
15
  values: any[],
15
16
  opts: ParquetCodecOptions
16
- ): Buffer {
17
+ ): Uint8Array {
17
18
  if (!('bitWidth' in opts)) {
18
19
  throw new Error('bitWidth is required');
19
20
  }
@@ -23,14 +24,14 @@ export function encodeValues(
23
24
  case 'INT32':
24
25
  case 'INT64':
25
26
  // tslint:disable-next-line:no-parameter-reassignment
26
- values = values.map((x) => parseInt(x, 10));
27
+ values = values.map(x => parseInt(x, 10));
27
28
  break;
28
29
 
29
30
  default:
30
31
  throw new Error(`unsupported type: ${type}`);
31
32
  }
32
33
 
33
- let buf = Buffer.alloc(0);
34
+ const buffers: Uint8Array[] = [];
34
35
  let run: any[] = [];
35
36
  let repeats = 0;
36
37
 
@@ -40,7 +41,7 @@ export function encodeValues(
40
41
  if (repeats === 0 && run.length % 8 === 0 && values[i] === values[i + 1]) {
41
42
  // If we have any data in runs we need to encode them
42
43
  if (run.length) {
43
- buf = Buffer.concat([buf, encodeRunBitpacked(run, opts)] as Uint8Array[]);
44
+ buffers.push(encodeRunBitpacked(run, opts));
44
45
  run = [];
45
46
  }
46
47
  repeats = 1;
@@ -49,7 +50,7 @@ export function encodeValues(
49
50
  } else {
50
51
  // If values changes we need to post any previous repeated values
51
52
  if (repeats) {
52
- buf = Buffer.concat([buf, encodeRunRepeated(values[i - 1], repeats, opts)] as Uint8Array[]);
53
+ buffers.push(encodeRunRepeated(values[i - 1], repeats, opts));
53
54
  repeats = 0;
54
55
  }
55
56
  run.push(values[i]);
@@ -57,23 +58,19 @@ export function encodeValues(
57
58
  }
58
59
 
59
60
  if (repeats) {
60
- buf = Buffer.concat([
61
- buf,
62
- encodeRunRepeated(values[values.length - 1], repeats, opts)
63
- ] as Uint8Array[]);
61
+ buffers.push(encodeRunRepeated(values[values.length - 1], repeats, opts));
64
62
  } else if (run.length) {
65
- buf = Buffer.concat([buf, encodeRunBitpacked(run, opts)] as Uint8Array[]);
63
+ buffers.push(encodeRunBitpacked(run, opts));
66
64
  }
67
65
 
66
+ const buf = concatUint8Arrays(buffers);
68
67
  if (opts.disableEnvelope) {
69
68
  return buf;
70
69
  }
71
70
 
72
- const envelope = Buffer.alloc(buf.length + 4);
73
-
74
- // @ts-ignore buffer polyfill
75
- envelope.writeUInt32LE(buf.length, undefined);
76
- buf.copy(envelope as Uint8Array, 4);
71
+ const envelope = new Uint8Array(buf.length + 4);
72
+ writeUInt32LE(envelope, buf.length, 0);
73
+ envelope.set(buf, 4);
77
74
 
78
75
  return envelope;
79
76
  }
@@ -94,7 +91,7 @@ export function decodeValues(
94
91
 
95
92
  let values: number[] = [];
96
93
  while (values.length < count) {
97
- const header = varint.decode(cursor.buffer, cursor.offset);
94
+ const header = varint.decode(cursor.buffer as any, cursor.offset);
98
95
  cursor.offset += varint.encodingLength(header);
99
96
  let decodedValues: number[];
100
97
  if (header & 1) {
@@ -163,7 +160,7 @@ function decodeRunRepeated(
163
160
  return new Array(count).fill(value);
164
161
  }
165
162
 
166
- function encodeRunBitpacked(values: number[], opts: ParquetCodecOptions): Buffer {
163
+ function encodeRunBitpacked(values: number[], opts: ParquetCodecOptions): Uint8Array {
167
164
  // @ts-ignore
168
165
  const bitWidth: number = opts.bitWidth;
169
166
 
@@ -171,30 +168,27 @@ function encodeRunBitpacked(values: number[], opts: ParquetCodecOptions): Buffer
171
168
  values.push(0);
172
169
  }
173
170
 
174
- const buf = Buffer.alloc(Math.ceil(bitWidth * (values.length / 8)));
171
+ const buf = new Uint8Array(Math.ceil(bitWidth * (values.length / 8)));
175
172
  for (let b = 0; b < bitWidth * values.length; b++) {
176
173
  if ((values[Math.floor(b / bitWidth)] & (1 << (b % bitWidth))) > 0) {
177
174
  buf[Math.floor(b / 8)] |= 1 << (b % 8);
178
175
  }
179
176
  }
180
177
 
181
- return Buffer.concat([
182
- Buffer.from(varint.encode(((values.length / 8) << 1) | 1)),
183
- buf
184
- ] as Uint8Array[]);
178
+ return concatUint8Arrays([Uint8Array.from(varint.encode(((values.length / 8) << 1) | 1)), buf]);
185
179
  }
186
180
 
187
- function encodeRunRepeated(value: number, count: number, opts: ParquetCodecOptions): Buffer {
181
+ function encodeRunRepeated(value: number, count: number, opts: ParquetCodecOptions): Uint8Array {
188
182
  // @ts-ignore
189
183
  const bitWidth: number = opts.bitWidth;
190
184
 
191
- const buf = Buffer.alloc(Math.ceil(bitWidth / 8));
185
+ const buf = new Uint8Array(Math.ceil(bitWidth / 8));
192
186
 
193
187
  for (let i = 0; i < buf.length; i++) {
194
- buf.writeUInt8(value & 0xff, i);
188
+ buf[i] = value & 0xff;
195
189
  // eslint-disable-next-line
196
190
  value >> 8; // TODO - this looks wrong
197
191
  }
198
192
 
199
- return Buffer.concat([Buffer.from(varint.encode(count << 1)), buf] as Uint8Array[]);
193
+ return concatUint8Arrays([Uint8Array.from(varint.encode(count << 1)), buf]);
200
194
  }
@@ -18,20 +18,7 @@ import {
18
18
  import {registerJSModules} from '@loaders.gl/loader-utils';
19
19
 
20
20
  import {ParquetCompression} from './schema/declare';
21
-
22
- /** We can't use loaders-util buffer handling since we are dependent on buffers even in the browser */
23
- function toBuffer(arrayBuffer: ArrayBuffer): Buffer {
24
- return Buffer.from(arrayBuffer);
25
- }
26
-
27
- function toArrayBuffer(buffer: Buffer): ArrayBuffer {
28
- // TODO - per docs we should just be able to call buffer.buffer, but there are issues
29
- if (Buffer.isBuffer(buffer)) {
30
- const typedArray = new Uint8Array(buffer.buffer, buffer.byteOffset, buffer.length);
31
- return typedArray.slice().buffer;
32
- }
33
- return buffer;
34
- }
21
+ import {toArrayBuffer, toUint8Array} from './utils/binary-utils';
35
22
 
36
23
  // TODO switch to worker compression to avoid bundling...
37
24
 
@@ -79,22 +66,20 @@ export const PARQUET_COMPRESSION_METHODS: Record<ParquetCompression, Compression
79
66
  export async function preloadCompressions(options?: {modules?: {[key: string]: any}}) {
80
67
  registerJSModules(options?.modules);
81
68
  const compressions = Object.values(PARQUET_COMPRESSION_METHODS);
82
- return await Promise.all(
83
- compressions.map((compression) => compression.preload(options?.modules))
84
- );
69
+ return await Promise.all(compressions.map(compression => compression.preload(options?.modules)));
85
70
  }
86
71
 
87
72
  /**
88
73
  * Deflate a value using compression method `method`
89
74
  */
90
- export async function deflate(method: ParquetCompression, value: Buffer): Promise<Buffer> {
75
+ export async function deflate(method: ParquetCompression, value: Uint8Array): Promise<Uint8Array> {
91
76
  const compression = PARQUET_COMPRESSION_METHODS[method];
92
77
  if (!compression) {
93
78
  throw new Error(`parquet: invalid compression method: ${method}`);
94
79
  }
95
80
  const inputArrayBuffer = toArrayBuffer(value);
96
81
  const compressedArrayBuffer = await compression.compress(inputArrayBuffer);
97
- return toBuffer(compressedArrayBuffer);
82
+ return toUint8Array(compressedArrayBuffer);
98
83
  }
99
84
 
100
85
  /**
@@ -102,106 +87,14 @@ export async function deflate(method: ParquetCompression, value: Buffer): Promis
102
87
  */
103
88
  export async function decompress(
104
89
  method: ParquetCompression,
105
- value: Buffer,
90
+ value: Uint8Array,
106
91
  size: number
107
- ): Promise<Buffer> {
92
+ ): Promise<Uint8Array> {
108
93
  const compression = PARQUET_COMPRESSION_METHODS[method];
109
94
  if (!compression) {
110
95
  throw new Error(`parquet: invalid compression method: ${method}`);
111
96
  }
112
97
  const inputArrayBuffer = toArrayBuffer(value);
113
98
  const compressedArrayBuffer = await compression.decompress(inputArrayBuffer, size);
114
- return toBuffer(compressedArrayBuffer);
115
- }
116
-
117
- /*
118
- * Inflate a value using compression method `method`
119
- */
120
- export function inflate(method: ParquetCompression, value: Buffer, size: number): Buffer {
121
- if (!(method in PARQUET_COMPRESSION_METHODS)) {
122
- throw new Error(`invalid compression method: ${method}`);
123
- }
124
- // @ts-ignore
125
- return PARQUET_COMPRESSION_METHODS[method].inflate(value, size);
126
- }
127
-
128
- /*
129
- function deflate_identity(value: Buffer): Buffer {
130
- return value;
131
- }
132
-
133
- function deflate_gzip(value: Buffer): Buffer {
134
- return zlib.gzipSync(value);
135
- }
136
-
137
- function deflate_snappy(value: Buffer): Buffer {
138
- return snappyjs.compress(value);
139
- }
140
-
141
- function deflate_lzo(value: Buffer): Buffer {
142
- lzo = lzo || Util.load('lzo');
143
- return lzo.compress(value);
144
- }
145
-
146
- function deflate_brotli(value: Buffer): Buffer {
147
- brotli = brotli || Util.load('brotli');
148
- const result = brotli.compress(value, {
149
- mode: 0,
150
- quality: 8,
151
- lgwin: 22
152
- });
153
- return result ? Buffer.from(result) : Buffer.alloc(0);
154
- }
155
-
156
- function deflate_lz4(value: Buffer): Buffer {
157
- lz4js = lz4js || Util.load('lz4js');
158
- try {
159
- // let result = Buffer.alloc(lz4js.encodeBound(value.length));
160
- // const compressedSize = lz4.encodeBlock(value, result);
161
- // // remove unnecessary bytes
162
- // result = result.slice(0, compressedSize);
163
- // return result;
164
- return Buffer.from(lz4js.compress(value));
165
- } catch (err) {
166
- throw err;
167
- }
168
- }
169
- function inflate_identity(value: Buffer): Buffer {
170
- return value;
171
- }
172
-
173
- function inflate_gzip(value: Buffer): Buffer {
174
- return zlib.gunzipSync(value);
175
- }
176
-
177
- function inflate_snappy(value: Buffer): Buffer {
178
- return snappyjs.uncompress(value);
179
- }
180
-
181
- function inflate_lzo(value: Buffer, size: number): Buffer {
182
- lzo = lzo || Util.load('lzo');
183
- return lzo.decompress(value, size);
184
- }
185
-
186
- function inflate_lz4(value: Buffer, size: number): Buffer {
187
- lz4js = lz4js || Util.load('lz4js');
188
- try {
189
- // let result = Buffer.alloc(size);
190
- // const uncompressedSize = lz4js.decodeBlock(value, result);
191
- // // remove unnecessary bytes
192
- // result = result.slice(0, uncompressedSize);
193
- // return result;
194
- return Buffer.from(lz4js.decompress(value, size));
195
- } catch (err) {
196
- throw err;
197
- }
198
- }
199
-
200
- function inflate_brotli(value: Buffer): Buffer {
201
- brotli = brotli || Util.load('brotli');
202
- if (!value.length) {
203
- return Buffer.alloc(0);
204
- }
205
- return Buffer.from(brotli.decompress(value));
99
+ return toUint8Array(compressedArrayBuffer);
206
100
  }
207
- */