/
remote-dem-manager.ts
123 lines (117 loc) · 2.52 KB
/
remote-dem-manager.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
import Actor from "./actor";
import CONFIG from "./config";
import type WorkerDispatch from "./worker-dispatch";
import decodeImage from "./decode-image";
import type { DemManager } from "./dem-manager";
import { Timer } from "./performance";
import {
ContourTile,
DemTile,
Encoding,
FetchResponse,
IndividualContourTileOptions,
} from "./types";
import { prepareDemTile } from "./utils";
let _actor: Actor<WorkerDispatch> | undefined;
let id = 0;
export class MainThreadDispatch {
decodeImage = (
blob: Blob,
encoding: Encoding,
abortController: AbortController,
) => prepareDemTile(decodeImage(blob, encoding, abortController), false);
}
function defaultActor(): Actor<WorkerDispatch> {
if (!_actor) {
const worker = new Worker(CONFIG.workerUrl);
const dispatch = new MainThreadDispatch();
_actor = new Actor(worker, dispatch);
}
return _actor;
}
/**
* Caches, decodes, and processes raster tiles in a shared web worker.
*/
export default class RemoteDemManager implements DemManager {
managerId: number;
actor: Actor<WorkerDispatch>;
loaded: Promise<any>;
constructor(
demUrlPattern: string,
cacheSize: number,
encoding: Encoding,
maxzoom: number,
timeoutMs: number,
actor?: Actor<WorkerDispatch>,
) {
const managerId = (this.managerId = ++id);
this.actor = actor || defaultActor();
this.loaded = this.actor.send(
"init",
[],
new AbortController(),
undefined,
{
cacheSize,
demUrlPattern,
encoding,
maxzoom,
managerId,
timeoutMs,
},
);
}
fetchTile = (
z: number,
x: number,
y: number,
abortController: AbortController,
timer?: Timer,
): Promise<FetchResponse> =>
this.actor.send(
"fetchTile",
[],
abortController,
timer,
this.managerId,
z,
x,
y,
);
fetchAndParseTile = (
z: number,
x: number,
y: number,
abortController: AbortController,
timer?: Timer,
): Promise<DemTile> =>
this.actor.send(
"fetchAndParseTile",
[],
abortController,
timer,
this.managerId,
z,
x,
y,
);
fetchContourTile = (
z: number,
x: number,
y: number,
options: IndividualContourTileOptions,
abortController: AbortController,
timer?: Timer,
): Promise<ContourTile> =>
this.actor.send(
"fetchContourTile",
[],
abortController,
timer,
this.managerId,
z,
x,
y,
options,
);
}