@osmix/pbf 0.0.2 → 0.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +12 -0
- package/README.md +75 -82
- package/dist/blobs-to-blocks.d.ts +52 -3
- package/dist/blobs-to-blocks.d.ts.map +1 -0
- package/dist/blobs-to-blocks.js +63 -9
- package/dist/blobs-to-blocks.js.map +1 -0
- package/dist/blocks-to-pbf.d.ts +43 -6
- package/dist/blocks-to-pbf.d.ts.map +1 -0
- package/dist/blocks-to-pbf.js +44 -7
- package/dist/blocks-to-pbf.js.map +1 -0
- package/dist/index.d.ts +29 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +29 -0
- package/dist/index.js.map +1 -0
- package/dist/pbf-to-blobs.d.ts +23 -3
- package/dist/pbf-to-blobs.d.ts.map +1 -0
- package/dist/pbf-to-blobs.js +25 -3
- package/dist/pbf-to-blobs.js.map +1 -0
- package/dist/pbf-to-blocks.d.ts +50 -7
- package/dist/pbf-to-blocks.d.ts.map +1 -0
- package/dist/pbf-to-blocks.js +51 -8
- package/dist/pbf-to-blocks.js.map +1 -0
- package/dist/proto/fileformat.d.ts +1 -0
- package/dist/proto/fileformat.d.ts.map +1 -0
- package/dist/proto/fileformat.js +1 -0
- package/dist/proto/fileformat.js.map +1 -0
- package/dist/proto/osmformat.d.ts +1 -0
- package/dist/proto/osmformat.d.ts.map +1 -0
- package/dist/proto/osmformat.js +1 -0
- package/dist/proto/osmformat.js.map +1 -0
- package/dist/spec.d.ts +1 -0
- package/dist/spec.d.ts.map +1 -0
- package/dist/spec.js +1 -0
- package/dist/spec.js.map +1 -0
- package/dist/src/blobs-to-blocks.d.ts +51 -3
- package/dist/src/blobs-to-blocks.d.ts.map +1 -1
- package/dist/src/blobs-to-blocks.js +60 -7
- package/dist/src/blobs-to-blocks.js.map +1 -1
- package/dist/src/blocks-to-pbf.d.ts +41 -5
- package/dist/src/blocks-to-pbf.d.ts.map +1 -1
- package/dist/src/blocks-to-pbf.js +41 -5
- package/dist/src/blocks-to-pbf.js.map +1 -1
- package/dist/src/index.d.ts +28 -0
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +28 -0
- package/dist/src/index.js.map +1 -1
- package/dist/src/pbf-to-blobs.d.ts +22 -3
- package/dist/src/pbf-to-blobs.d.ts.map +1 -1
- package/dist/src/pbf-to-blobs.js +24 -3
- package/dist/src/pbf-to-blobs.js.map +1 -1
- package/dist/src/pbf-to-blocks.d.ts +46 -4
- package/dist/src/pbf-to-blocks.d.ts.map +1 -1
- package/dist/src/pbf-to-blocks.js +46 -4
- package/dist/src/pbf-to-blocks.js.map +1 -1
- package/dist/src/utils.d.ts +0 -4
- package/dist/src/utils.d.ts.map +1 -1
- package/dist/src/utils.js +0 -32
- package/dist/src/utils.js.map +1 -1
- package/dist/test/blobs-to-blocks.test.js +22 -18
- package/dist/test/blobs-to-blocks.test.js.map +1 -1
- package/dist/test/pbf-to-blobs.test.js +24 -16
- package/dist/test/pbf-to-blobs.test.js.map +1 -1
- package/dist/test/read.bench.js +6 -4
- package/dist/test/read.bench.js.map +1 -1
- package/dist/test/read.test.js +5 -5
- package/dist/test/read.test.js.map +1 -1
- package/dist/test/streams.test.js +21 -13
- package/dist/test/streams.test.js.map +1 -1
- package/dist/test/utils.d.ts.map +1 -1
- package/dist/test/utils.js +8 -8
- package/dist/test/utils.js.map +1 -1
- package/dist/test/utils.test.js +8 -8
- package/dist/test/utils.test.js.map +1 -1
- package/dist/test/write.test.js +13 -8
- package/dist/test/write.test.js.map +1 -1
- package/dist/utils.d.ts +5 -10
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +8 -32
- package/dist/utils.js.map +1 -0
- package/package.json +12 -11
- package/src/blobs-to-blocks.ts +78 -7
- package/src/blocks-to-pbf.ts +42 -5
- package/src/index.ts +29 -0
- package/src/pbf-to-blobs.ts +24 -3
- package/src/pbf-to-blocks.ts +46 -4
- package/src/utils.ts +0 -29
- package/test/blobs-to-blocks.test.ts +25 -19
- package/test/pbf-to-blobs.test.ts +23 -17
- package/test/read.bench.ts +8 -4
- package/test/read.test.ts +5 -5
- package/test/streams.test.ts +22 -13
- package/test/utils.test.ts +8 -8
- package/test/utils.ts +8 -8
- package/test/write.test.ts +13 -8
- package/tsconfig.build.json +5 -0
- package/dist/test/utils.bun.test.d.ts +0 -2
- package/dist/test/utils.bun.test.d.ts.map +0 -1
- package/dist/test/utils.bun.test.js +0 -221
- package/dist/test/utils.bun.test.js.map +0 -1
- package/dist/test/verify-pbf-reading.bun.test.d.ts +0 -2
- package/dist/test/verify-pbf-reading.bun.test.d.ts.map +0 -1
- package/dist/test/verify-pbf-reading.bun.test.js +0 -32
- package/dist/test/verify-pbf-reading.bun.test.js.map +0 -1
- package/test/utils.bun.test.ts +0 -277
- package/test/verify-pbf-reading.bun.test.ts +0 -39
package/dist/test/read.test.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
+
import { beforeAll, describe, expect, it } from "bun:test";
|
|
1
2
|
import { getFixtureFile, getFixtureFileReadStream, PBFs, } from "@osmix/shared/test/fixtures";
|
|
2
|
-
import { assert, beforeAll, describe, it } from "vitest";
|
|
3
3
|
import { OsmPbfBytesToBlocksTransformStream, readOsmPbf, } from "../src/pbf-to-blocks";
|
|
4
4
|
import { createOsmEntityCounter, testOsmPbfReader } from "./utils";
|
|
5
5
|
describe("read", () => {
|
|
@@ -16,13 +16,13 @@ describe("read", () => {
|
|
|
16
16
|
onGroup(group);
|
|
17
17
|
}
|
|
18
18
|
else {
|
|
19
|
-
|
|
19
|
+
expect(block.bbox).toEqual(pbf.bbox);
|
|
20
20
|
}
|
|
21
21
|
},
|
|
22
22
|
}));
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
23
|
+
expect(count.nodes).toBe(pbf.nodes);
|
|
24
|
+
expect(count.ways).toBe(pbf.ways);
|
|
25
|
+
expect(count.relations).toBe(pbf.relations);
|
|
26
26
|
});
|
|
27
27
|
it("from buffer", async () => {
|
|
28
28
|
const fileData = await getFixtureFile(pbf.url);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"read.test.js","sourceRoot":"","sources":["../../test/read.test.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"read.test.js","sourceRoot":"","sources":["../../test/read.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,UAAU,CAAA;AAC1D,OAAO,EACN,cAAc,EACd,wBAAwB,EACxB,IAAI,GACJ,MAAM,6BAA6B,CAAA;AACpC,OAAO,EACN,kCAAkC,EAClC,UAAU,GACV,MAAM,sBAAsB,CAAA;AAC7B,OAAO,EAAE,sBAAsB,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAA;AAElE,QAAQ,CAAC,MAAM,EAAE,GAAG,EAAE;IACrB,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;QAC9D,SAAS,CAAC,GAAG,EAAE,CAAC,cAAc,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAA;QAExC,EAAE,CAAC,aAAa,EAAE,KAAK,IAAI,EAAE;YAC5B,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,sBAAsB,EAAE,CAAA;YAEnD,MAAM,wBAAwB,CAAC,GAAG,CAAC,GAAG,CAAC;iBACrC,WAAW,CAAC,IAAI,kCAAkC,EAAE,CAAC;iBACrD,MAAM,CACN,IAAI,cAAc,CAAC;gBAClB,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE;oBAChB,IAAI,gBAAgB,IAAI,KAAK,EAAE,CAAC;wBAC/B,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,cAAc;4BAAE,OAAO,CAAC,KAAK,CAAC,CAAA;oBACzD,CAAC;yBAAM,CAAC;wBACP,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;oBACrC,CAAC;gBACF,CAAC;aACD,CAAC,CACF,CAAA;YAEF,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA;YACnC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;YACjC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;QAC5C,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,aAAa,EAAE,KAAK,IAAI,EAAE;YAC5B,MAAM,QAAQ,GAAG,MAAM,cAAc,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;YAC9C,MAAM,GAAG,GAAG,MAAM,UAAU,CAAC,QAAQ,CAAC,CAAA;YACtC,MAAM,gBAAgB,CAAC,GAAG,EAAE,GAAG,CAAC,CAAA;QACjC,CAAC,CAAC,CAAA;IACH,CAAC,CAAC,CAAA;AACH,CAAC,CAAC,CAAA"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { describe, expect, it } from "bun:test";
|
|
2
2
|
import { OsmBlocksToPbfBytesTransformStream } from "../src/blocks-to-pbf";
|
|
3
3
|
import { OsmPbfBytesToBlocksTransformStream } from "../src/pbf-to-blocks";
|
|
4
4
|
import { concatUint8 } from "../src/utils";
|
|
@@ -30,11 +30,11 @@ describe("transform streams", () => {
|
|
|
30
30
|
chunks.push(chunk);
|
|
31
31
|
},
|
|
32
32
|
}));
|
|
33
|
-
|
|
33
|
+
expect(concatUint8(...chunks)).toEqual(fileBytes);
|
|
34
34
|
});
|
|
35
35
|
it("parses streamed bytes back into header and primitive blocks", async () => {
|
|
36
36
|
const { header, primitiveBlock, fileBytes } = await createSamplePbfFileBytes();
|
|
37
|
-
|
|
37
|
+
expect(primitiveBlock.primitivegroup[0]).toBeDefined();
|
|
38
38
|
const blocks = [];
|
|
39
39
|
const input = new ReadableStream({
|
|
40
40
|
start(controller) {
|
|
@@ -48,23 +48,31 @@ describe("transform streams", () => {
|
|
|
48
48
|
blocks.push(chunk);
|
|
49
49
|
},
|
|
50
50
|
}));
|
|
51
|
-
|
|
51
|
+
expect(blocks.length).toBe(2);
|
|
52
52
|
const headerBlock = blocks[0];
|
|
53
53
|
if (!isHeaderBlock(headerBlock)) {
|
|
54
|
-
|
|
54
|
+
throw new Error("Expected header block");
|
|
55
55
|
}
|
|
56
|
-
|
|
57
|
-
|
|
56
|
+
expect(headerBlock.bbox).toEqual(header.bbox);
|
|
57
|
+
expect(headerBlock.required_features).toEqual(header.required_features);
|
|
58
58
|
const block = blocks[1];
|
|
59
59
|
if (!isPrimitiveBlock(block)) {
|
|
60
|
-
|
|
60
|
+
throw new Error("Expected primitive block");
|
|
61
61
|
}
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
62
|
+
expect(block.primitivegroup).toHaveLength(primitiveBlock.primitivegroup.length);
|
|
63
|
+
expect(block.primitivegroup).toBeDefined();
|
|
64
|
+
expect(block.primitivegroup[0]).toBeDefined();
|
|
65
|
+
if (!block.primitivegroup[0])
|
|
66
|
+
throw new Error("block.primitivegroup[0] is undefined");
|
|
67
|
+
if (!primitiveBlock.primitivegroup[0])
|
|
68
|
+
throw new Error("primitiveBlock.primitivegroup[0] is undefined");
|
|
65
69
|
const dense = block.primitivegroup[0].dense;
|
|
66
|
-
|
|
67
|
-
|
|
70
|
+
expect(dense).toBeDefined();
|
|
71
|
+
if (!dense)
|
|
72
|
+
throw new Error("dense is undefined");
|
|
73
|
+
if (!primitiveBlock.primitivegroup[0]?.dense)
|
|
74
|
+
throw new Error("primitiveBlock.primitivegroup[0].dense is undefined");
|
|
75
|
+
expect(dense.id).toEqual(primitiveBlock.primitivegroup[0].dense.id);
|
|
68
76
|
});
|
|
69
77
|
});
|
|
70
78
|
//# sourceMappingURL=streams.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"streams.test.js","sourceRoot":"","sources":["../../test/streams.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"streams.test.js","sourceRoot":"","sources":["../../test/streams.test.ts"],"names":[],"mappings":"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"}
|
package/dist/test/utils.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../test/utils.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../test/utils.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAA;AAC7D,OAAO,KAAK,EACX,WAAW,EACX,WAAW,EACX,iBAAiB,EACjB,MAAM,wBAAwB,CAAA;AAE/B,wBAAsB,gBAAgB,CACrC,GAAG,EAAE;IACJ,MAAM,EAAE,iBAAiB,CAAA;IACzB,MAAM,EAAE,cAAc,CAAC,WAAW,CAAC,CAAA;CACnC,EACD,GAAG,EAAE,UAAU;;;;;;;GAgBf;AAED,wBAAgB,sBAAsB;qBAUb,WAAW;;;;;;;;;EAuBnC"}
|
package/dist/test/utils.js
CHANGED
|
@@ -1,16 +1,16 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { expect } from "bun:test";
|
|
2
2
|
export async function testOsmPbfReader(osm, pbf) {
|
|
3
|
-
|
|
3
|
+
expect(osm.header.bbox).toEqual(pbf.bbox);
|
|
4
4
|
const { onGroup, count } = createOsmEntityCounter();
|
|
5
5
|
for await (const block of osm.blocks)
|
|
6
6
|
for (const group of block.primitivegroup)
|
|
7
7
|
onGroup(group);
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
8
|
+
expect(count.nodes).toBe(pbf.nodes);
|
|
9
|
+
expect(count.ways).toBe(pbf.ways);
|
|
10
|
+
expect(count.relations).toBe(pbf.relations);
|
|
11
|
+
expect(count.node0).toBe(pbf.node0.id);
|
|
12
|
+
expect(count.way0).toBe(pbf.way0);
|
|
13
|
+
expect(count.relation0).toBe(pbf.relation0);
|
|
14
14
|
return count;
|
|
15
15
|
}
|
|
16
16
|
export function createOsmEntityCounter() {
|
package/dist/test/utils.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../test/utils.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../test/utils.ts"],"names":[],"mappings":"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"}
|
package/dist/test/utils.test.js
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { describe, expect, it } from "bun:test";
|
|
2
2
|
import { concatUint8, toAsyncGenerator, uint32BE, webCompress, webDecompress, } from "../src/utils";
|
|
3
3
|
describe("utils", () => {
|
|
4
4
|
it("wraps values into an async generator", async () => {
|
|
5
5
|
const generator = toAsyncGenerator(3);
|
|
6
6
|
const first = await generator.next();
|
|
7
|
-
|
|
7
|
+
expect(first).toEqual({ value: 3, done: false });
|
|
8
8
|
const done = await generator.next();
|
|
9
|
-
|
|
9
|
+
expect(done).toEqual({ value: undefined, done: true });
|
|
10
10
|
});
|
|
11
11
|
it("consumes readable streams", async () => {
|
|
12
12
|
const stream = new ReadableStream({
|
|
@@ -19,7 +19,7 @@ describe("utils", () => {
|
|
|
19
19
|
const values = [];
|
|
20
20
|
for await (const value of toAsyncGenerator(stream))
|
|
21
21
|
values.push(value);
|
|
22
|
-
|
|
22
|
+
expect(values).toEqual([1, 2]);
|
|
23
23
|
});
|
|
24
24
|
it("throws on nullish inputs", async () => {
|
|
25
25
|
const invalidInput = null;
|
|
@@ -28,17 +28,17 @@ describe("utils", () => {
|
|
|
28
28
|
it("concatenates Uint8Array segments", () => {
|
|
29
29
|
const a = Uint8Array.of(1, 2);
|
|
30
30
|
const b = Uint8Array.of(3);
|
|
31
|
-
|
|
31
|
+
expect(concatUint8(a, b)).toEqual(Uint8Array.of(1, 2, 3));
|
|
32
32
|
});
|
|
33
33
|
it("encodes big-endian 32-bit integers", () => {
|
|
34
|
-
|
|
34
|
+
expect(uint32BE(0x01020304)).toEqual(Uint8Array.of(1, 2, 3, 4));
|
|
35
35
|
});
|
|
36
36
|
it("compresses and decompresses data", async () => {
|
|
37
37
|
const input = new TextEncoder().encode("osmix");
|
|
38
38
|
const compressed = await webCompress(input);
|
|
39
|
-
|
|
39
|
+
expect(compressed).not.toEqual(input);
|
|
40
40
|
const decompressed = await webDecompress(compressed);
|
|
41
|
-
|
|
41
|
+
expect(decompressed).toEqual(input);
|
|
42
42
|
});
|
|
43
43
|
});
|
|
44
44
|
//# sourceMappingURL=utils.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.test.js","sourceRoot":"","sources":["../../test/utils.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"utils.test.js","sourceRoot":"","sources":["../../test/utils.test.ts"],"names":[],"mappings":"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"}
|
package/dist/test/write.test.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
+
import { describe, expect, it } from "bun:test";
|
|
1
2
|
import { unlink } from "node:fs/promises";
|
|
2
3
|
import { getFixtureFile, getFixtureFileReadStream, getFixtureFileWriteStream, getFixturePath, PBFs, } from "@osmix/shared/test/fixtures";
|
|
3
|
-
import { assert, describe, it } from "vitest";
|
|
4
4
|
import { OsmBlocksToPbfBytesTransformStream, osmBlockToPbfBlobBytes, } from "../src/blocks-to-pbf";
|
|
5
5
|
import { OsmPbfBytesToBlocksTransformStream, readOsmPbf, } from "../src/pbf-to-blocks";
|
|
6
6
|
import { testOsmPbfReader } from "./utils";
|
|
@@ -36,14 +36,19 @@ describe("write", () => {
|
|
|
36
36
|
write(await osmBlockToPbfBlobBytes(block));
|
|
37
37
|
}
|
|
38
38
|
// Re-parse the new PBF and test
|
|
39
|
-
|
|
40
|
-
//
|
|
39
|
+
expect(data.buffer).toBeDefined();
|
|
40
|
+
// Note: We don't assert byte-level equality because the written PBF may have
|
|
41
|
+
// different compression, block ordering, or encoding than the original file.
|
|
42
|
+
// Semantic equivalence (verified by parsing and comparing entities) is more meaningful.
|
|
41
43
|
const osm2 = await readOsmPbf(data);
|
|
42
|
-
|
|
44
|
+
expect(osm.header).toEqual(osm2.header);
|
|
43
45
|
const entities = await testOsmPbfReader(osm2, pbf);
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
46
|
+
if (node0 === null || way0 === null || relation0 === null) {
|
|
47
|
+
throw new Error("Expected node0, way0, and relation0 to be set");
|
|
48
|
+
}
|
|
49
|
+
expect(entities.node0).toBe(node0);
|
|
50
|
+
expect(entities.way0).toBe(way0);
|
|
51
|
+
expect(entities.relation0).toBe(relation0);
|
|
47
52
|
});
|
|
48
53
|
it("to file", async () => {
|
|
49
54
|
const testFileName = `${name}-write-test.pbf`;
|
|
@@ -55,7 +60,7 @@ describe("write", () => {
|
|
|
55
60
|
.pipeTo(fileWriteStream);
|
|
56
61
|
const testFileData = await getFixtureFile(pbf.url);
|
|
57
62
|
const testOsm = await readOsmPbf(testFileData);
|
|
58
|
-
|
|
63
|
+
expect(testOsm.header.bbox).toEqual(pbf.bbox);
|
|
59
64
|
await testOsmPbfReader(testOsm, pbf);
|
|
60
65
|
await unlink(getFixturePath(testFileName));
|
|
61
66
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"write.test.js","sourceRoot":"","sources":["../../test/write.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAA;AACzC,OAAO,EACN,cAAc,EACd,wBAAwB,EACxB,yBAAyB,EACzB,cAAc,EACd,IAAI,GACJ,MAAM,6BAA6B,CAAA;AACpC,OAAO,
|
|
1
|
+
{"version":3,"file":"write.test.js","sourceRoot":"","sources":["../../test/write.test.ts"],"names":[],"mappings":"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"}
|
package/dist/utils.d.ts
CHANGED
|
@@ -4,19 +4,13 @@ export type AsyncGeneratorValue<T> = T | ReadableStream<T> | AsyncGenerator<T> |
|
|
|
4
4
|
*/
|
|
5
5
|
export declare function toAsyncGenerator<T>(v: AsyncGeneratorValue<T>): AsyncGenerator<T>;
|
|
6
6
|
/**
|
|
7
|
-
*
|
|
7
|
+
* Web decompression stream
|
|
8
8
|
*/
|
|
9
|
-
export declare function
|
|
9
|
+
export declare function webDecompress(data: Uint8Array<ArrayBuffer>): Promise<Uint8Array<ArrayBuffer>>;
|
|
10
10
|
/**
|
|
11
|
-
*
|
|
12
|
-
* Falls back to Node zlib when running under Bun to match OSM PBF expectations.
|
|
11
|
+
* Web compression stream
|
|
13
12
|
*/
|
|
14
|
-
export declare function
|
|
15
|
-
/**
|
|
16
|
-
* Compresses binary data using runtime-native APIs.
|
|
17
|
-
* Falls back to Node zlib when running under Bun to match OSM PBF expectations.
|
|
18
|
-
*/
|
|
19
|
-
export declare function compress(data: Uint8Array): Promise<Uint8Array>;
|
|
13
|
+
export declare function webCompress(data: Uint8Array<ArrayBuffer>): Promise<Uint8Array<ArrayBuffer>>;
|
|
20
14
|
/**
|
|
21
15
|
* Concatenates multiple `Uint8Array` segments into a contiguous array.
|
|
22
16
|
*/
|
|
@@ -25,3 +19,4 @@ export declare function concatUint8(...parts: Uint8Array[]): Uint8Array;
|
|
|
25
19
|
* Encodes a 32-bit big-endian unsigned integer as a four-byte buffer.
|
|
26
20
|
*/
|
|
27
21
|
export declare function uint32BE(n: number): Uint8Array;
|
|
22
|
+
//# sourceMappingURL=utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,mBAAmB,CAAC,CAAC,IAC9B,CAAC,GACD,cAAc,CAAC,CAAC,CAAC,GACjB,cAAc,CAAC,CAAC,CAAC,GACjB,OAAO,CAAC,CAAC,CAAC,GACV,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,GAC1B,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAA;AAE7B;;GAEG;AACH,wBAAuB,gBAAgB,CAAC,CAAC,EACxC,CAAC,EAAE,mBAAmB,CAAC,CAAC,CAAC,GACvB,cAAc,CAAC,CAAC,CAAC,CAuBnB;AAED;;GAEG;AACH,wBAAsB,aAAa,CAClC,IAAI,EAAE,UAAU,CAAC,WAAW,CAAC,GAC3B,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC,CAElC;AAED;;GAEG;AACH,wBAAsB,WAAW,CAChC,IAAI,EAAE,UAAU,CAAC,WAAW,CAAC,GAC3B,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC,CAElC;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,GAAG,KAAK,EAAE,UAAU,EAAE,GAAG,UAAU,CAS9D;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,CAAC,EAAE,MAAM,GAAG,UAAU,CAO9C"}
|
package/dist/utils.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { transformBytes } from "@osmix/shared/transform-bytes";
|
|
2
2
|
/**
|
|
3
3
|
* Normalizes values, streams, and iterables into a unified async generator interface.
|
|
4
4
|
*/
|
|
@@ -30,41 +30,16 @@ export async function* toAsyncGenerator(v) {
|
|
|
30
30
|
}
|
|
31
31
|
}
|
|
32
32
|
/**
|
|
33
|
-
*
|
|
33
|
+
* Web decompression stream
|
|
34
34
|
*/
|
|
35
|
-
export function
|
|
36
|
-
return "
|
|
35
|
+
export async function webDecompress(data) {
|
|
36
|
+
return transformBytes(data, new DecompressionStream("deflate"));
|
|
37
37
|
}
|
|
38
38
|
/**
|
|
39
|
-
*
|
|
40
|
-
* Falls back to Node zlib when running under Bun to match OSM PBF expectations.
|
|
39
|
+
* Web compression stream
|
|
41
40
|
*/
|
|
42
|
-
export async function
|
|
43
|
-
|
|
44
|
-
if (isBun()) {
|
|
45
|
-
const { inflateSync } = await import("node:zlib");
|
|
46
|
-
return new Uint8Array(inflateSync(data));
|
|
47
|
-
}
|
|
48
|
-
// Fallback to standard Web API
|
|
49
|
-
const decompressedStream = new Blob([data])
|
|
50
|
-
.stream()
|
|
51
|
-
.pipeThrough(new DecompressionStream("deflate"));
|
|
52
|
-
return streamToBytes(decompressedStream);
|
|
53
|
-
}
|
|
54
|
-
/**
|
|
55
|
-
* Compresses binary data using runtime-native APIs.
|
|
56
|
-
* Falls back to Node zlib when running under Bun to match OSM PBF expectations.
|
|
57
|
-
*/
|
|
58
|
-
export async function compress(data) {
|
|
59
|
-
// Check if we're in Bun runtime - use Node.js zlib for proper OSM PBF zlib format support
|
|
60
|
-
if (isBun()) {
|
|
61
|
-
const { deflateSync } = await import("node:zlib");
|
|
62
|
-
return new Uint8Array(deflateSync(data));
|
|
63
|
-
}
|
|
64
|
-
// Fallback to standard Web API
|
|
65
|
-
const stream = new CompressionStream("deflate");
|
|
66
|
-
const compressedStream = new Blob([data]).stream().pipeThrough(stream);
|
|
67
|
-
return streamToBytes(compressedStream);
|
|
41
|
+
export async function webCompress(data) {
|
|
42
|
+
return transformBytes(data, new CompressionStream("deflate"));
|
|
68
43
|
}
|
|
69
44
|
/**
|
|
70
45
|
* Concatenates multiple `Uint8Array` segments into a contiguous array.
|
|
@@ -90,3 +65,4 @@ export function uint32BE(n) {
|
|
|
90
65
|
out[3] = n & 0xff;
|
|
91
66
|
return out;
|
|
92
67
|
}
|
|
68
|
+
//# sourceMappingURL=utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAA;AAU9D;;GAEG;AACH,MAAM,CAAC,KAAK,SAAS,CAAC,CAAC,gBAAgB,CACtC,CAAyB;IAEzB,IAAI,CAAC,YAAY,OAAO;QAAE,OAAO,gBAAgB,CAAC,MAAM,CAAC,CAAC,CAAA;IAE1D,IAAI,CAAC,IAAI,IAAI;QAAE,MAAM,KAAK,CAAC,eAAe,CAAC,CAAA;IAC3C,IAAI,CAAC,YAAY,cAAc,EAAE,CAAC;QACjC,MAAM,MAAM,GAAG,CAAC,CAAC,SAAS,EAAE,CAAA;QAC5B,OAAO,IAAI,EAAE,CAAC;YACb,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE,CAAA;YAC3C,IAAI,IAAI;gBAAE,MAAK;YACf,MAAM,KAAK,CAAA;QACZ,CAAC;QACD,MAAM,CAAC,WAAW,EAAE,CAAA;IACrB,CAAC;SAAM,IAAI,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,WAAW,EAAE,CAAC;QAC9D,+EAA+E;QAC/E,MAAM,CAAM,CAAA;IACb,CAAC;SAAM,IACN,OAAO,CAAC,KAAK,QAAQ;QACrB,CAAC,MAAM,CAAC,aAAa,IAAI,CAAC,IAAI,MAAM,CAAC,QAAQ,IAAI,CAAC,CAAC,EAClD,CAAC;QACF,OAAO,CAAC,CAAA;IACT,CAAC;SAAM,CAAC;QACP,MAAM,CAAC,CAAA;IACR,CAAC;AACF,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAClC,IAA6B;IAE7B,OAAO,cAAc,CAAC,IAAI,EAAE,IAAI,mBAAmB,CAAC,SAAS,CAAC,CAAC,CAAA;AAChE,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAChC,IAA6B;IAE7B,OAAO,cAAc,CAAC,IAAI,EAAE,IAAI,iBAAiB,CAAC,SAAS,CAAC,CAAC,CAAA;AAC9D,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,GAAG,KAAmB;IACjD,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAA;IACrD,MAAM,GAAG,GAAG,IAAI,UAAU,CAAC,KAAK,CAAC,CAAA;IACjC,IAAI,MAAM,GAAG,CAAC,CAAA;IACd,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACvB,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,CAAA;QAClB,MAAM,IAAI,CAAC,CAAC,MAAM,CAAA;IACnB,CAAC;IACD,OAAO,GAAG,CAAA;AACX,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,QAAQ,CAAC,CAAS;IACjC,MAAM,GAAG,GAAG,IAAI,UAAU,CAAC,CAAC,CAAC,CAAA;IAC7B,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,GAAG,IAAI,CAAA;IAC1B,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,GAAG,IAAI,CAAA;IAC1B,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,IAAI,CAAA;IACzB,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI,CAAA;IACjB,OAAO,GAAG,CAAA;AACX,CAAC"}
|
package/package.json
CHANGED
|
@@ -2,11 +2,12 @@
|
|
|
2
2
|
"$schema": "https://json.schemastore.org/package",
|
|
3
3
|
"name": "@osmix/pbf",
|
|
4
4
|
"description": "A low level, modern, runtime agnostic OSM PBF parser and writer written in TypeScript.",
|
|
5
|
-
"version": "0.0.
|
|
5
|
+
"version": "0.0.4",
|
|
6
6
|
"type": "module",
|
|
7
7
|
"main": "./src/index.ts",
|
|
8
8
|
"publishConfig": {
|
|
9
9
|
"access": "public",
|
|
10
|
+
"registry": "https://registry.npmjs.org/",
|
|
10
11
|
"main": "./dist/index.js",
|
|
11
12
|
"types": "./dist/index.d.ts",
|
|
12
13
|
"exports": {
|
|
@@ -32,19 +33,19 @@
|
|
|
32
33
|
},
|
|
33
34
|
"sideEffects": false,
|
|
34
35
|
"scripts": {
|
|
35
|
-
"bench": "
|
|
36
|
-
"build": "tsc",
|
|
37
|
-
"
|
|
38
|
-
"
|
|
39
|
-
"
|
|
36
|
+
"bench": "bun test --bench",
|
|
37
|
+
"build": "tsc -p tsconfig.build.json",
|
|
38
|
+
"prepare": "bun run build",
|
|
39
|
+
"release": "bun publish",
|
|
40
|
+
"test": "bun test",
|
|
41
|
+
"typecheck": "tsgo --noEmit"
|
|
40
42
|
},
|
|
41
43
|
"devDependencies": {
|
|
42
|
-
"@osmix/shared": "
|
|
43
|
-
"@types/
|
|
44
|
-
"typescript": "
|
|
45
|
-
"vitest": "catalog:"
|
|
44
|
+
"@osmix/shared": "0.0.7",
|
|
45
|
+
"@types/bun": "^1.3.3",
|
|
46
|
+
"typescript": "^5.9.0"
|
|
46
47
|
},
|
|
47
48
|
"dependencies": {
|
|
48
|
-
"pbf": "
|
|
49
|
+
"pbf": "^4.0.1"
|
|
49
50
|
}
|
|
50
51
|
}
|
package/src/blobs-to-blocks.ts
CHANGED
|
@@ -1,10 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Blob-to-block conversion utilities.
|
|
3
|
+
*
|
|
4
|
+
* Handles decompression and protobuf decoding of raw OSM PBF blobs into
|
|
5
|
+
* typed header and primitive block structures.
|
|
6
|
+
*
|
|
7
|
+
* @module
|
|
8
|
+
*/
|
|
9
|
+
|
|
1
10
|
import Pbf from "pbf"
|
|
2
|
-
import {
|
|
11
|
+
import {
|
|
12
|
+
type OsmPbfBlock,
|
|
13
|
+
type OsmPbfHeaderBlock,
|
|
14
|
+
readHeaderBlock,
|
|
15
|
+
readPrimitiveBlock,
|
|
16
|
+
} from "./proto/osmformat"
|
|
3
17
|
import { webDecompress } from "./utils"
|
|
4
18
|
|
|
5
19
|
/**
|
|
6
|
-
*
|
|
7
|
-
*
|
|
20
|
+
* Decompress and decode a stream of raw PBF blobs into typed blocks.
|
|
21
|
+
*
|
|
22
|
+
* This async generator handles the transition from compressed bytes to parsed
|
|
23
|
+
* protobuf structures. The first blob is always decoded as a header block;
|
|
24
|
+
* subsequent blobs are decoded as primitive blocks containing OSM entities.
|
|
25
|
+
*
|
|
26
|
+
* @param blobs - Async or sync generator yielding compressed blob payloads.
|
|
27
|
+
* @param decompress - Optional decompression function (defaults to Web Streams zlib).
|
|
28
|
+
* @yields Header block first, then primitive blocks.
|
|
29
|
+
*
|
|
30
|
+
* @example
|
|
31
|
+
* ```ts
|
|
32
|
+
* import { osmPbfBlobsToBlocksGenerator, createOsmPbfBlobGenerator } from "@osmix/pbf"
|
|
33
|
+
*
|
|
34
|
+
* const generateBlobs = createOsmPbfBlobGenerator()
|
|
35
|
+
* const blobsGen = (async function* () {
|
|
36
|
+
* for await (const chunk of stream) {
|
|
37
|
+
* yield* generateBlobs(chunk)
|
|
38
|
+
* }
|
|
39
|
+
* })()
|
|
40
|
+
*
|
|
41
|
+
* for await (const block of osmPbfBlobsToBlocksGenerator(blobsGen)) {
|
|
42
|
+
* // First iteration yields header, rest yield primitive blocks
|
|
43
|
+
* }
|
|
44
|
+
* ```
|
|
8
45
|
*/
|
|
9
46
|
export async function* osmPbfBlobsToBlocksGenerator(
|
|
10
47
|
blobs:
|
|
@@ -16,13 +53,47 @@ export async function* osmPbfBlobsToBlocksGenerator(
|
|
|
16
53
|
) {
|
|
17
54
|
let headerRead = false
|
|
18
55
|
for await (const blob of blobs) {
|
|
19
|
-
const decompressedBlob = await decompress(blob)
|
|
20
|
-
const pbf = new Pbf(decompressedBlob)
|
|
21
56
|
if (!headerRead) {
|
|
22
57
|
headerRead = true
|
|
23
|
-
yield
|
|
58
|
+
yield readOsmHeaderBlock(blob, decompress)
|
|
24
59
|
} else {
|
|
25
|
-
yield
|
|
60
|
+
yield readOsmPrimitiveBlock(blob, decompress)
|
|
26
61
|
}
|
|
27
62
|
}
|
|
28
63
|
}
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* Decompress and parse a header block from a compressed blob.
|
|
67
|
+
*
|
|
68
|
+
* @param compressedBlob - Zlib-compressed protobuf header blob.
|
|
69
|
+
* @param decompress - Optional decompression function.
|
|
70
|
+
* @returns Parsed header block with required/optional features and bbox.
|
|
71
|
+
*/
|
|
72
|
+
export async function readOsmHeaderBlock(
|
|
73
|
+
compressedBlob: Uint8Array<ArrayBuffer>,
|
|
74
|
+
decompress: (
|
|
75
|
+
data: Uint8Array<ArrayBuffer>,
|
|
76
|
+
) => Promise<Uint8Array<ArrayBuffer>> = webDecompress,
|
|
77
|
+
): Promise<OsmPbfHeaderBlock> {
|
|
78
|
+
const decompressedBlob = await decompress(compressedBlob)
|
|
79
|
+
const pbf = new Pbf(decompressedBlob)
|
|
80
|
+
return readHeaderBlock(pbf)
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
/**
|
|
84
|
+
* Decompress and parse a primitive block from a compressed blob.
|
|
85
|
+
*
|
|
86
|
+
* @param compressedBlob - Zlib-compressed protobuf primitive blob.
|
|
87
|
+
* @param decompress - Optional decompression function.
|
|
88
|
+
* @returns Parsed primitive block with string table and primitive groups.
|
|
89
|
+
*/
|
|
90
|
+
export async function readOsmPrimitiveBlock(
|
|
91
|
+
compressedBlob: Uint8Array<ArrayBuffer>,
|
|
92
|
+
decompress: (
|
|
93
|
+
data: Uint8Array<ArrayBuffer>,
|
|
94
|
+
) => Promise<Uint8Array<ArrayBuffer>> = webDecompress,
|
|
95
|
+
): Promise<OsmPbfBlock> {
|
|
96
|
+
const decompressedBlob = await decompress(compressedBlob)
|
|
97
|
+
const pbf = new Pbf(decompressedBlob)
|
|
98
|
+
return readPrimitiveBlock(pbf)
|
|
99
|
+
}
|
package/src/blocks-to-pbf.ts
CHANGED
|
@@ -1,3 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Block-to-PBF serialization utilities.
|
|
3
|
+
*
|
|
4
|
+
* Converts parsed OSM header and primitive blocks back into spec-compliant
|
|
5
|
+
* PBF byte sequences with proper framing, compression, and size validation.
|
|
6
|
+
*
|
|
7
|
+
* @module
|
|
8
|
+
*/
|
|
9
|
+
|
|
1
10
|
import Pbf from "pbf"
|
|
2
11
|
import { writeBlob, writeBlobHeader } from "./proto/fileformat"
|
|
3
12
|
import type { OsmPbfBlock, OsmPbfHeaderBlock } from "./proto/osmformat"
|
|
@@ -11,10 +20,26 @@ import {
|
|
|
11
20
|
import { concatUint8, uint32BE, webCompress } from "./utils"
|
|
12
21
|
|
|
13
22
|
/**
|
|
14
|
-
*
|
|
15
|
-
*
|
|
23
|
+
* Serialize a header or primitive block into spec-compliant PBF bytes.
|
|
24
|
+
*
|
|
25
|
+
* Handles protobuf encoding, zlib compression, blob wrapping, and length prefixing.
|
|
26
|
+
* Validates output against OSM PBF specification size limits and logs warnings
|
|
27
|
+
* if recommended sizes are exceeded.
|
|
28
|
+
*
|
|
16
29
|
* @param block - Parsed header or primitive block to encode.
|
|
17
|
-
* @
|
|
30
|
+
* @param compress - Optional compression function (defaults to Web Streams zlib).
|
|
31
|
+
* @returns Complete blob bytes: 4-byte length prefix + BlobHeader + Blob.
|
|
32
|
+
* @throws If blob exceeds maximum size limits (64 KiB header, 32 MiB data).
|
|
33
|
+
*
|
|
34
|
+
* @example
|
|
35
|
+
* ```ts
|
|
36
|
+
* import { osmBlockToPbfBlobBytes } from "@osmix/pbf"
|
|
37
|
+
*
|
|
38
|
+
* const headerBytes = await osmBlockToPbfBlobBytes({
|
|
39
|
+
* required_features: ["OsmSchema-V0.6", "DenseNodes"],
|
|
40
|
+
* optional_features: [],
|
|
41
|
+
* })
|
|
42
|
+
* ```
|
|
18
43
|
*/
|
|
19
44
|
export async function osmBlockToPbfBlobBytes(
|
|
20
45
|
block: OsmPbfBlock | OsmPbfHeaderBlock,
|
|
@@ -76,8 +101,20 @@ export async function osmBlockToPbfBlobBytes(
|
|
|
76
101
|
}
|
|
77
102
|
|
|
78
103
|
/**
|
|
79
|
-
* Web `TransformStream` that
|
|
80
|
-
*
|
|
104
|
+
* Web `TransformStream` that encodes OSM blocks into PBF byte chunks.
|
|
105
|
+
*
|
|
106
|
+
* Accepts a stream of header and primitive blocks and outputs spec-compliant
|
|
107
|
+
* PBF bytes. The header block must be the first item in the stream.
|
|
108
|
+
*
|
|
109
|
+
* @throws If a primitive block is received before the header.
|
|
110
|
+
*
|
|
111
|
+
* @example
|
|
112
|
+
* ```ts
|
|
113
|
+
* import { OsmBlocksToPbfBytesTransformStream } from "@osmix/pbf"
|
|
114
|
+
*
|
|
115
|
+
* const pbfStream = blocksStream.pipeThrough(new OsmBlocksToPbfBytesTransformStream())
|
|
116
|
+
* await pbfStream.pipeTo(writableFile)
|
|
117
|
+
* ```
|
|
81
118
|
*/
|
|
82
119
|
export class OsmBlocksToPbfBytesTransformStream extends TransformStream<
|
|
83
120
|
OsmPbfHeaderBlock | OsmPbfBlock,
|
package/src/index.ts
CHANGED
|
@@ -1,3 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @osmix/pbf - Low-level OSM PBF parsing and serialization.
|
|
3
|
+
*
|
|
4
|
+
* Provides streaming primitives for reading and writing OpenStreetMap PBF files
|
|
5
|
+
* using Web Streams and native compression APIs. Stays close to the official
|
|
6
|
+
* protobuf schema (`osmformat.proto`, `fileformat.proto`) while exposing
|
|
7
|
+
* predictable TypeScript types.
|
|
8
|
+
*
|
|
9
|
+
* Key capabilities:
|
|
10
|
+
* - **Parse**: Read headers and primitive blocks from `ArrayBuffer`, async iterables, or `ReadableStream`.
|
|
11
|
+
* - **Stream**: Use `TransformStream` helpers to process large files without buffering entirely in memory.
|
|
12
|
+
* - **Serialize**: Write header and primitive blocks back to spec-compliant blobs with size guardrails.
|
|
13
|
+
* - **Types**: Generated protobuf readers/writers and TypeScript interfaces for OSM data structures.
|
|
14
|
+
*
|
|
15
|
+
* @example
|
|
16
|
+
* ```ts
|
|
17
|
+
* import { readOsmPbf } from "@osmix/pbf"
|
|
18
|
+
*
|
|
19
|
+
* const { header, blocks } = await readOsmPbf(Bun.file('./monaco.pbf').stream())
|
|
20
|
+
* console.log(header.required_features)
|
|
21
|
+
*
|
|
22
|
+
* for await (const block of blocks) {
|
|
23
|
+
* console.log(block.primitivegroup.length, "groups")
|
|
24
|
+
* }
|
|
25
|
+
* ```
|
|
26
|
+
*
|
|
27
|
+
* @module @osmix/pbf
|
|
28
|
+
*/
|
|
29
|
+
|
|
1
30
|
export * from "./blobs-to-blocks"
|
|
2
31
|
export * from "./blocks-to-pbf"
|
|
3
32
|
export * from "./pbf-to-blobs"
|