/
context.ts
86 lines (78 loc) · 2.75 KB
/
context.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
import { Db } from '../db/db';
import { DBAdapter } from '../db/dbAdapter';
import { SqliteAdapter } from '../db/sqliteAdapter';
import { SqljsAdapter } from '../db/sqljsAdapter';
import { Canvas } from '../canvas/canvas';
import { CanvasAdapter } from '../canvas/canvasAdapter';
import { CanvasKitCanvasAdapter } from '../canvas/canvasKitCanvasAdapter';
import { HtmlCanvasAdapter } from '../canvas/htmlCanvasAdapter';
import { OffscreenCanvasAdapter } from '../canvas/offscreenCanvasAdapter';
export class Context {
static isNode: boolean = typeof process !== 'undefined' && process.versions != null && process.versions.node != null;
static isBrowser: boolean = typeof window !== 'undefined' && typeof window.document !== 'undefined';
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-ignore
static isWebWorker: boolean = typeof importScripts !== 'undefined';
static async initializeContext(): Promise<void> {
await Canvas.initializeAdapter();
}
/**
* Registers the sqlite adapter. Will check for better-sqlite3 dependency before trying.
* @private
*/
private static registerSqliteAdapter(): void {
try {
// better-sqlite3 is an optional dependency
require('better-sqlite3');
Db.registerDbAdapter(SqliteAdapter);
} catch (e) {
console.error('Unable to register SqliteAdapter. The better-sqlite3 module was not found. Falling back to SqljsAdapter.', e);
// fallback to sqljs adapter
Db.registerDbAdapter(SqljsAdapter);
}
}
/**
* Sets up GeoPackage for Node.js
*/
static setupNodeContext(): void {
Context.registerSqliteAdapter();
Canvas.registerCanvasAdapter(CanvasKitCanvasAdapter);
// TODO: think about catching an uncaught error
// process.on('uncaughtException', () => {});
}
/**
* Sets up GeoPackage for Browser
*/
static setupBrowserContext(): void {
Db.registerDbAdapter(SqljsAdapter);
Canvas.registerCanvasAdapter(HtmlCanvasAdapter);
}
/**
* Sets up GeoPackage for WebWorker
*/
static setupWebWorkerContext(): void {
Db.registerDbAdapter(SqljsAdapter);
Canvas.registerCanvasAdapter(OffscreenCanvasAdapter);
}
/**
* Will attempt to register a custom context.
* @param dbAdapter
* @param canvasAdapter
*/
static setupCustomContext(
dbAdapter: new (path: string | Buffer | Uint8Array | undefined) => DBAdapter,
canvasAdapter: new () => CanvasAdapter,
): void {
Db.registerDbAdapter(dbAdapter);
Canvas.registerCanvasAdapter(canvasAdapter);
}
static setupDefaultContext(): void {
if (Context.isNode) {
Context.setupNodeContext();
} else if (Context.isBrowser) {
Context.setupBrowserContext();
} else if (Context.isWebWorker) {
Context.setupWebWorkerContext();
}
}
}