@loaders.gl/pmtiles 4.0.0-beta.2 → 4.0.0-beta.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{dist.min.js → dist.dev.js} +3578 -3303
- package/dist/index.cjs +182 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/parse-pmtiles.d.ts +6 -6
- package/dist/lib/parse-pmtiles.d.ts.map +1 -1
- package/dist/{esm/lib → lib}/parse-pmtiles.js +5 -1
- package/dist/lib/parse-pmtiles.js.map +1 -0
- package/dist/pmtiles-source.d.ts +20 -24
- package/dist/pmtiles-source.d.ts.map +1 -1
- package/dist/{esm/pmtiles-source.js → pmtiles-source.js} +23 -8
- package/dist/pmtiles-source.js.map +1 -0
- package/package.json +18 -10
- package/src/lib/parse-pmtiles.ts +9 -7
- package/src/pmtiles-source.ts +32 -28
- package/dist/bundle.d.ts +0 -2
- package/dist/bundle.d.ts.map +0 -1
- package/dist/es5/bundle.js +0 -6
- package/dist/es5/bundle.js.map +0 -1
- package/dist/es5/index.js +0 -13
- package/dist/es5/index.js.map +0 -1
- package/dist/es5/lib/parse-pmtiles.js +0 -126
- package/dist/es5/lib/parse-pmtiles.js.map +0 -1
- package/dist/es5/lib/sources.js +0 -2
- package/dist/es5/lib/sources.js.map +0 -1
- package/dist/es5/pmtiles-source.js +0 -289
- package/dist/es5/pmtiles-source.js.map +0 -1
- package/dist/esm/bundle.js +0 -4
- package/dist/esm/bundle.js.map +0 -1
- package/dist/esm/index.js +0 -2
- package/dist/esm/index.js.map +0 -1
- package/dist/esm/lib/parse-pmtiles.js.map +0 -1
- package/dist/esm/lib/sources.js +0 -2
- package/dist/esm/lib/sources.js.map +0 -1
- package/dist/esm/pmtiles-source.js.map +0 -1
- package/dist/lib/sources.d.ts +0 -1
- package/dist/lib/sources.d.ts.map +0 -1
- package/src/bundle.ts +0 -4
- package/src/lib/sources.ts +0 -150
package/src/lib/sources.ts
DELETED
|
@@ -1,150 +0,0 @@
|
|
|
1
|
-
/*
|
|
2
|
-
import {fetchFile} from '@loaders.gl/core';
|
|
3
|
-
|
|
4
|
-
import {Source as PMTilesSource, RangeResponse} from 'pmtiles';
|
|
5
|
-
|
|
6
|
-
/** @note "source" here is a PMTiles library type, referring to *
|
|
7
|
-
export function makeSource(data: string | Blob, fetch?) {
|
|
8
|
-
if (typeof data === 'string') {
|
|
9
|
-
return new FetchSource(data, fetch);
|
|
10
|
-
}
|
|
11
|
-
if (data instanceof Blob) {
|
|
12
|
-
const url = '';
|
|
13
|
-
return new BlobSource(data, url);
|
|
14
|
-
}
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
export class BlobSource implements PMTilesSource {
|
|
18
|
-
blob: Blob;
|
|
19
|
-
key: string;
|
|
20
|
-
|
|
21
|
-
constructor(blob: Blob, key: string) {
|
|
22
|
-
this.blob = blob;
|
|
23
|
-
this.key = key;
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
// TODO - how is this used?
|
|
27
|
-
getKey() {
|
|
28
|
-
return this.blob.url || '';
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
async getBytes(offset: number, length: number, signal?: AbortSignal): Promise<RangeResponse> {
|
|
32
|
-
const data = await this.blob.arrayBuffer();
|
|
33
|
-
return {
|
|
34
|
-
data
|
|
35
|
-
// etag: response.headers.get('ETag') || undefined,
|
|
36
|
-
// cacheControl: response.headers.get('Cache-Control') || undefined,
|
|
37
|
-
// expires: response.headers.get('Expires') || undefined
|
|
38
|
-
};
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
export class FetchSource implements PMTilesSource {
|
|
43
|
-
url: string;
|
|
44
|
-
fetch;
|
|
45
|
-
|
|
46
|
-
constructor(url: string, fetch = fetchFile) {
|
|
47
|
-
this.url = url;
|
|
48
|
-
this.fetch = fetch;
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
// TODO - how is this used?
|
|
52
|
-
getKey() {
|
|
53
|
-
return this.url;
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
async getBytes(offset: number, length: number, signal?: AbortSignal): Promise<RangeResponse> {
|
|
57
|
-
let controller;
|
|
58
|
-
if (!signal) {
|
|
59
|
-
// ToDO why is it so important to abort in case 200?
|
|
60
|
-
// TODO check this works or assert 206
|
|
61
|
-
controller = new AbortController();
|
|
62
|
-
signal = controller.signal;
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
let response = await fetch(this.url, {
|
|
66
|
-
signal,
|
|
67
|
-
headers: {Range: `bytes=${offset}-${offset + length - 1}`}
|
|
68
|
-
});
|
|
69
|
-
|
|
70
|
-
switch (response.status) {
|
|
71
|
-
case 206: // Partial Content success
|
|
72
|
-
// This is the expected success code for a range request
|
|
73
|
-
break;
|
|
74
|
-
|
|
75
|
-
case 200:
|
|
76
|
-
// some well-behaved backends, e.g. DigitalOcean CDN, respond with 200 instead of 206
|
|
77
|
-
// but we also need to detect no support for Byte Serving which is returning the whole file
|
|
78
|
-
const content_length = response.headers.get('Content-Length');
|
|
79
|
-
if (!content_length || Number(content_length) > length) {
|
|
80
|
-
if (controller) {
|
|
81
|
-
controller.abort();
|
|
82
|
-
}
|
|
83
|
-
throw Error(
|
|
84
|
-
'content-length header missing or exceeding request. Server must support HTTP Byte Serving.'
|
|
85
|
-
);
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
case 416: // "Range Not Satisfiable"
|
|
89
|
-
// some HTTP servers don't accept ranges beyond the end of the resource.
|
|
90
|
-
// Retry with the exact length
|
|
91
|
-
// TODO: can return 416 with offset > 0 if content changed, which will have a blank etag.
|
|
92
|
-
// See https://github.com/protomaps/PMTiles/issues/90
|
|
93
|
-
if (offset === 0) {
|
|
94
|
-
const content_range = response.headers.get('Content-Range');
|
|
95
|
-
if (!content_range || !content_range.startsWith('bytes *')) {
|
|
96
|
-
throw Error('Missing content-length on 416 response');
|
|
97
|
-
}
|
|
98
|
-
const actual_length = Number(content_range.substr(8));
|
|
99
|
-
response = await fetch(this.url, {
|
|
100
|
-
signal,
|
|
101
|
-
headers: {Range: `bytes=0-${actual_length - 1}`}
|
|
102
|
-
});
|
|
103
|
-
}
|
|
104
|
-
break;
|
|
105
|
-
|
|
106
|
-
default:
|
|
107
|
-
if (response.status >= 300) {
|
|
108
|
-
throw Error(`Bad response code: ${response.status}`);
|
|
109
|
-
}
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
const data = await response.arrayBuffer();
|
|
113
|
-
return {
|
|
114
|
-
data,
|
|
115
|
-
etag: response.headers.get('ETag') || undefined,
|
|
116
|
-
cacheControl: response.headers.get('Cache-Control') || undefined,
|
|
117
|
-
expires: response.headers.get('Expires') || undefined
|
|
118
|
-
};
|
|
119
|
-
}
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
/*
|
|
123
|
-
class TestNodeFileSource implements Source {
|
|
124
|
-
buffer: ArrayBuffer;
|
|
125
|
-
path: string;
|
|
126
|
-
key: string;
|
|
127
|
-
etag?: string;
|
|
128
|
-
|
|
129
|
-
constructor(path: string, key: string) {
|
|
130
|
-
this.path = path;
|
|
131
|
-
this.buffer = fs.readFileSync(path);
|
|
132
|
-
this.key = key;
|
|
133
|
-
}
|
|
134
|
-
|
|
135
|
-
getKey() {
|
|
136
|
-
return this.key;
|
|
137
|
-
}
|
|
138
|
-
|
|
139
|
-
replaceData(path: string) {
|
|
140
|
-
this.path = path;
|
|
141
|
-
this.buffer = fs.readFileSync(path);
|
|
142
|
-
}
|
|
143
|
-
|
|
144
|
-
async getBytes(offset: number, length: number): Promise<RangeResponse> {
|
|
145
|
-
const slice = new Uint8Array(this.buffer.slice(offset, offset + length))
|
|
146
|
-
.buffer;
|
|
147
|
-
return { data: slice, etag: this.etag };
|
|
148
|
-
}
|
|
149
|
-
}
|
|
150
|
-
*/
|