@massif-maps/web 6.1.2 → 6.2.0
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/index.d.ts +6 -0
- package/index.mjs +3 -1
- package/massif-maps.bundle.mjs +78 -6
- package/massif-web-full.mjs +1 -1
- package/massif-web-full.wasm +0 -0
- package/massif-web.mjs +1 -1
- package/massif-web.wasm +0 -0
- package/massif.mjs +77 -0
- package/package.json +2 -2
package/index.d.ts
CHANGED
|
@@ -17,3 +17,9 @@ export interface CreateMapOptions {
|
|
|
17
17
|
|
|
18
18
|
/** Loads the SDK module and starts a map on `canvas`. One per page. */
|
|
19
19
|
export declare function createMap(canvas: HTMLCanvasElement, options?: CreateMapOptions): Promise<MassifMap & { module: any }>;
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Keeps a directory of `module`'s filesystem (`map.module`) in the origin private file system: restored
|
|
23
|
+
* now, written back every `interval` ms (default 10000) and on `pagehide`. Resolves to a flush function.
|
|
24
|
+
*/
|
|
25
|
+
export declare function persistDirectory(module: any, path: string, options?: { interval?: number }): Promise<() => Promise<void>>;
|
package/index.mjs
CHANGED
|
@@ -9,6 +9,8 @@ import { attach, setBridge } from '@massif-maps/api';
|
|
|
9
9
|
import { createBridge } from './bridge.mjs';
|
|
10
10
|
import { canvasSelector, loadModule } from './massif.mjs';
|
|
11
11
|
|
|
12
|
+
export { persistDirectory } from './massif.mjs';
|
|
13
|
+
|
|
12
14
|
export * from '@massif-maps/api';
|
|
13
15
|
|
|
14
16
|
let created = false;
|
|
@@ -35,7 +37,7 @@ export async function createMap(canvas, { id = 'map', projection = 'EPSG:4326',
|
|
|
35
37
|
getMeasuredHeight: () => canvas.height,
|
|
36
38
|
};
|
|
37
39
|
const map = attach(view, { id, projection });
|
|
38
|
-
// The emscripten module, for what the facade does not cover (its FS,
|
|
40
|
+
// The emscripten module, for what the facade does not cover (its FS, persistDirectory).
|
|
39
41
|
map.module = module;
|
|
40
42
|
return map;
|
|
41
43
|
}
|
package/massif-maps.bundle.mjs
CHANGED
|
@@ -116,9 +116,9 @@ var PROPS = {
|
|
|
116
116
|
"massif::Label": "style,o,massif::LabelStyle",
|
|
117
117
|
"massif::LabelStyle": "anchorPointX,f;anchorPointY,f;flippable,b;orientationMode,e,BillboardOrientation;renderScale,f;scalingMode,e,BillboardScaling",
|
|
118
118
|
"massif::LabelStyleBuilder": "anchorPointX,f;anchorPointY,f;flippable,b;orientationMode,e,BillboardOrientation;renderScale,f;scalingMode,e,BillboardScaling",
|
|
119
|
-
"massif::Layer": "cullDelay,i;metaData,g,v;opacity,f;postProcessed,b;updatePriority,i;visible,b;visibleZoomRange,t",
|
|
119
|
+
"massif::Layer": "billboardsUnderLabels,b;cullDelay,i;metaData,g,v;opacity,f;postProcessed,b;updatePriority,i;visible,b;visibleZoomRange,t",
|
|
120
120
|
"massif::Layers": "count,i",
|
|
121
|
-
"massif::LightOptions": "ambientColor,c;ambientIntensity,f;dayCycleLightStops,t;dayCycleLightsEnabled,b;dayCycleRisingLightStops,t;shadowBias,f;shadowCascades,i;shadowCasterMargin,i;shadowDistance,f;shadowMapSize,i;shadowNormalOffset,f;shadowSoftness,f;shadowStrength,f;sunAltitude,f;sunAzimuth,f;sunColor,c;sunIntensity,f;sunOverridingStyle,b;terrainLightingEnabled,b",
|
|
121
|
+
"massif::LightOptions": "ambientColor,c;ambientIntensity,f;dayCycleLightStops,t;dayCycleLightsEnabled,b;dayCycleRisingLightStops,t;shadowBias,f;shadowCascades,i;shadowCasterMargin,i;shadowDistance,f;shadowFollowsBuildingHeight,b;shadowMapSize,i;shadowNormalOffset,f;shadowSoftness,f;shadowStrength,f;sunAltitude,f;sunAzimuth,f;sunColor,c;sunIntensity,f;sunOverridingStyle,b;terrainLightingEnabled,b;terrainShadowCastingEnabled,b",
|
|
122
122
|
"massif::LightStop": "ambientColor,c;ambientIntensity,f;sunAltitude,f;sunColor,c;sunIntensity,f",
|
|
123
123
|
"massif::Line": "geometry,o,massif::LineGeometry;style,o,massif::LineStyle",
|
|
124
124
|
"massif::LineGeometry": "poses,t",
|
|
@@ -148,7 +148,7 @@ var PROPS = {
|
|
|
148
148
|
"massif::NMLModel": "rotationAngle,f;rotationAxis,t;scale,f;style,o,massif::NMLModelStyle",
|
|
149
149
|
"massif::NMLModelStyle": "modelAsset,o,massif::BinaryData;orientationMode,e,BillboardOrientation;scalingMode,e,BillboardScaling",
|
|
150
150
|
"massif::NMLModelStyleBuilder": "modelAsset,o,massif::BinaryData;orientationMode,e,BillboardOrientation;scalingMode,e,BillboardScaling",
|
|
151
|
-
"massif::Options": "DPI,f;ambientLightColor,c;backgroundBitmap,o,massif::Bitmap;baseProjection,o,massif::Projection;clearColor,c;clickMovingTolerance,f;clickTypeDetection,b;debugTileBorders,b;doubleClickDetection,b;doubleClickMaxDuration,f;drawDistance,f;envelopeThreadPoolSize,i;fieldOfViewY,f;focusPointOffset,t;fogOptions,o,massif::FogOptions;freeRoamLookSensitivity,f;freeRoamMode,e,FreeRoamMode;freeRoamMoveSpeed,f;kineticPan,b;kineticRotation,b;kineticZoom,b;labelPadding,f;labelViewDistance,f;layersLabelsProcessedInReverseOrder,b;lightOptions,o,massif::LightOptions;longClickDuration,f;mainLightColor,c;mainLightDirection,t;panBounds,p;panningMode,e,PanningMode;panningSpeedMode,e,PanningSpeedMode;pivotMode,e,PivotMode;renderProjectionMode,e,RenderProjectionMode;restrictedPanning,b;rotatable,b;rotationGestures,b;seamlessPanning,b;skyColor,c;skyOptions,o,massif::SkyOptions;terrainOptions,o,massif::TerrainOptions;tileDrawSize,i;tileLODFactor,f;tileLODMaxZoomLevelsOnScreen,f;tileLODTileCountRatio,f;tileStyleZoomLift,i;tileThreadPoolSize,i;tiltGestureReversed,b;tiltRange,t;userInput,b;zoomGestures,b;zoomOffset,f;zoomRange,t",
|
|
151
|
+
"massif::Options": "DPI,f;ambientLightColor,c;backgroundBitmap,o,massif::Bitmap;baseProjection,o,massif::Projection;clearColor,c;clickMovingTolerance,f;clickTypeDetection,b;debugTileBorders,b;doubleClickDetection,b;doubleClickMaxDuration,f;drawDistance,f;envelopeThreadPoolSize,i;fieldOfViewY,f;focusPointOffset,t;fogOptions,o,massif::FogOptions;freeRoamLookSensitivity,f;freeRoamMode,e,FreeRoamMode;freeRoamMoveSpeed,f;kineticPan,b;kineticRotation,b;kineticZoom,b;labelPadding,f;labelViewDistance,f;layersLabelsProcessedInReverseOrder,b;lightOptions,o,massif::LightOptions;longClickDuration,f;mainLightColor,c;mainLightDirection,t;modelAnimationsEnabled,b;modelShadowsEnabled,b;orbitAroundPivot,b;panBounds,p;panningMode,e,PanningMode;panningSpeedMode,e,PanningSpeedMode;pivotMode,e,PivotMode;renderProjectionMode,e,RenderProjectionMode;restrictedPanning,b;rotatable,b;rotationGestures,b;seamlessPanning,b;skyColor,c;skyOptions,o,massif::SkyOptions;terrainOptions,o,massif::TerrainOptions;tileDrawSize,i;tileLODFactor,f;tileLODMaxZoomLevelsOnScreen,f;tileLODTileCountRatio,f;tileStyleZoomLift,i;tileThreadPoolSize,i;tiltGestureReversed,b;tiltRange,t;userInput,b;zoomGestures,b;zoomOffset,f;zoomRange,t",
|
|
152
152
|
"massif::PackageInfo": "metaInfo,o,massif::PackageMetaInfo;name,s;packageId,s;packageType,e,PackageType;size,i;tileMask,o,massif::PackageTileMask;version,i",
|
|
153
153
|
"massif::PackageManager": "localPackages,t;packageManagerListener,o,massif::PackageManagerListener;serverPackageListAge,i;serverPackageListMetaInfo,o,massif::PackageMetaInfo;serverPackages,t",
|
|
154
154
|
"massif::PackageManagerTileDataSource": "packageManager,o,massif::PackageManager",
|
|
@@ -193,7 +193,7 @@ var PROPS = {
|
|
|
193
193
|
"massif::SolidLayer": "bitmap,o,massif::Bitmap;bitmapScale,f;color,c",
|
|
194
194
|
"massif::Style": "color,c",
|
|
195
195
|
"massif::StyleBuilder": "color,c",
|
|
196
|
-
"massif::TerrainOptions": "autoFlattenDuration,f;autoFlattenParallax,f;autoFlattenRiseDuration,f;autoFlattenTilt,f;backgroundColor,c;billboardOcclusionEnabled,b;billboardOcclusionTolerance,f;bridges3DEnabled,b;cameraClampDuration,f;cameraClearance,f;cameraClearanceFraction,f;depthBias,f;drapeCacheSize,i;drapeFillsEnabled,b;drapeLinesEnabled,b;drapeResolution,i;drapeWorkingSet,i;elevationCacheSize,i;elevationPrefetchEnabled,b;enabled,b;exaggeration,f;flattenMode,e,TerrainFlattenMode;flattenRatio,f;flattened,b;focusLift,f;maxTileZoomCoarsening,i;maxTileZoomOffset,i;maxZoom,i;meshCacheSize,i;meshResolution,i;minZoom,i;noDrapeLayerFilter,s;normalSampleDistance,f;postProcessDownscale,i;seamlessTileEdgesEnabled,b;sharedGroundEnabled,b;subdivideDistance,f;surfaceNodeResolution,i;surfaceShaderSource,s;switching,b;textOcclusionOpacity,f;tileEdgeStitchingEnabled,b;viewDistance,f;viewDistanceFactor,f;viewDistanceMax,f",
|
|
196
|
+
"massif::TerrainOptions": "alwaysDecode,b;autoFlattenDuration,f;autoFlattenParallax,f;autoFlattenRiseDuration,f;autoFlattenTilt,f;backgroundColor,c;billboardOcclusionEnabled,b;billboardOcclusionTolerance,f;bridges3DEnabled,b;cameraClampDuration,f;cameraClearance,f;cameraClearanceFraction,f;depthBias,f;drapeCacheSize,i;drapeFillsEnabled,b;drapeLinesEnabled,b;drapeResolution,i;drapeWorkingSet,i;elevationCacheSize,i;elevationPrefetchEnabled,b;enabled,b;exaggeration,f;flattenMode,e,TerrainFlattenMode;flattenRatio,f;flattened,b;focusLift,f;maxTileZoomCoarsening,i;maxTileZoomOffset,i;maxZoom,i;meshCacheSize,i;meshResolution,i;minZoom,i;noDrapeLayerFilter,s;normalSampleDistance,f;postProcessDownscale,i;seamlessTileEdgesEnabled,b;sharedGroundEnabled,b;subdivideDistance,f;surfaceNodeResolution,i;surfaceShaderSource,s;switching,b;textOcclusionOpacity,f;tileEdgeStitchingEnabled,b;viewDistance,f;viewDistanceFactor,f;viewDistanceMax,f",
|
|
197
197
|
"massif::Text": "style,o,massif::TextStyle;title,s",
|
|
198
198
|
"massif::TextMargins": "bottom,i;left,i;right,i;top,i",
|
|
199
199
|
"massif::TextStyle": "backgroundColor,c;borderColor,c;borderWidth,f;breakLines,b;fontColor,c;fontName,s;fontSize,f;strokeColor,c;strokeWidth,f;textField,s;textMargins,t",
|
|
@@ -400,7 +400,7 @@ var SPEC_CLASS = {
|
|
|
400
400
|
"elementstyle": { "balloon": "massif::BalloonPopupStyle", "line": "massif::LineStyle", "marker": "massif::MarkerStyle", "point": "massif::PointStyle", "polygon": "massif::PolygonStyle", "text": "massif::TextStyle" },
|
|
401
401
|
"feature": { "feature": "massif::Feature" },
|
|
402
402
|
"geocoding": { "multi-osm-offline": "massif::MultiOSMOfflineGeocodingService", "multi-osm-offline-reverse": "massif::MultiOSMOfflineReverseGeocodingService" },
|
|
403
|
-
"geometry": { "line": "massif::LineGeometry", "point": "massif::PointGeometry", "polygon": "massif::PolygonGeometry" },
|
|
403
|
+
"geometry": { "line": "massif::LineGeometry", "maneuver-arrow": "massif::ManeuverArrowBuilder", "point": "massif::PointGeometry", "polygon": "massif::PolygonGeometry" },
|
|
404
404
|
"layer": { "celestial": "massif::CelestialLayer", "composite-vector": "massif::CompositeVectorTileLayer", "elements": "massif::VectorLayer", "hillshade": "massif::HillshadeRasterTileLayer", "raster": "massif::RasterTileLayer", "solid": "massif::SolidLayer", "vector": "massif::VectorTileLayer" },
|
|
405
405
|
"options": { "fog": "massif::FogOptions", "light": "massif::LightOptions", "sky": "massif::SkyOptions", "terrain": "massif::TerrainOptions" },
|
|
406
406
|
"routing": { "multi-valhalla-offline": "massif::MultiValhallaOfflineRoutingService", "valhalla-offline": "massif::ValhallaOfflineRoutingService", "valhalla-online": "massif::ValhallaOnlineRoutingService" },
|
|
@@ -455,6 +455,7 @@ var KIND_OF_CLASS = {
|
|
|
455
455
|
"massif::LocalVectorDataSource": "source",
|
|
456
456
|
"massif::MBTilesTileDataSource": "source",
|
|
457
457
|
"massif::MBVectorTileDecoder": "style",
|
|
458
|
+
"massif::ManeuverArrowBuilder": "geometry",
|
|
458
459
|
"massif::MapTilerOnlineTileDataSource": "source",
|
|
459
460
|
"massif::Marker": "element",
|
|
460
461
|
"massif::MarkerStyle": "elementstyle",
|
|
@@ -515,7 +516,7 @@ var METHODS = {
|
|
|
515
516
|
"massif::CelestialImage": "setAnchors,v",
|
|
516
517
|
"massif::CelestialLabel": "setAnchorPoint,v;setOffset,v",
|
|
517
518
|
"massif::CelestialLayer": "add,v;clear,v;remove,b",
|
|
518
|
-
"massif::CelestialObject": "setDirection,v",
|
|
519
|
+
"massif::CelestialObject": "setDirection,v;setPosition,v",
|
|
519
520
|
"massif::CompositeVectorTileLayer": "addExternalDataSource,v;addVectorDataSource,v;getExternalChildLayer,o,massif::Layer;getExternalDataSourceNames,j;removeExternalDataSource,b;setExternalDataSourceMaxOverzoomLevel,v;setExternalDataSourceZoomLevelBias,v",
|
|
520
521
|
"massif::FeatureCollection": "getFeature,o,massif::Feature",
|
|
521
522
|
"massif::FeatureCollectionSearchService": "findFeatures,o,massif::FeatureCollection",
|
|
@@ -527,6 +528,7 @@ var METHODS = {
|
|
|
527
528
|
"massif::LightOptions": "setSunPositionFromTime,v",
|
|
528
529
|
"massif::LocalVectorDataSource": "add,v;clear,v;remove,b",
|
|
529
530
|
"massif::MBVectorTileDecoder": "addFallbackFont,v;getLegend,j;getStyleParameter,s;setStyleParameter,b;setStyleParameters,v",
|
|
531
|
+
"massif::ManeuverArrowBuilder": "buildArrow,j;buildArrowAtIndex,j",
|
|
530
532
|
"massif::MultiOSMOfflineGeocodingService": "add,v;remove,b",
|
|
531
533
|
"massif::MultiOSMOfflineReverseGeocodingService": "add,v;remove,b",
|
|
532
534
|
"massif::MultiTileDataSource": "add,v;remove,b",
|
|
@@ -543,6 +545,7 @@ var METHODS = {
|
|
|
543
545
|
"massif::TileDataSource": "getMetaDataElement,j;loadTile,o,massif::TileData;setMetaDataElement,v",
|
|
544
546
|
"massif::TileLayer": "clearTileCaches,v",
|
|
545
547
|
"massif::VectorTileFeatureCollection": "getFeature,o,massif::VectorTileFeature",
|
|
548
|
+
"massif::VectorTileLayer": "clearModelHighlight,v;setModelHighlight,v",
|
|
546
549
|
"massif::VectorTileSearchService": "findFeatures,o,massif::VectorTileFeatureCollection"
|
|
547
550
|
};
|
|
548
551
|
var EVENTS = {
|
|
@@ -2404,6 +2407,74 @@ async function loadModule({ variant, moduleUrl = new URL(`${MODULE_NAME}${varian
|
|
|
2404
2407
|
const base = new URL(".", new URL(moduleUrl, location.href)).href;
|
|
2405
2408
|
return factory({ locateFile: (path) => base + path, ...options });
|
|
2406
2409
|
}
|
|
2410
|
+
var S_IFMT = 61440;
|
|
2411
|
+
var S_IFDIR = 16384;
|
|
2412
|
+
var statSeconds = (time) => typeof time === "number" ? time : Math.floor(time.getTime() / 1e3);
|
|
2413
|
+
async function persistDirectory(module, path, { interval = 1e4 } = {}) {
|
|
2414
|
+
const { FS } = module;
|
|
2415
|
+
FS.mkdirTree(path);
|
|
2416
|
+
let root = await navigator.storage.getDirectory();
|
|
2417
|
+
for (const name of path.split("/").filter(Boolean)) {
|
|
2418
|
+
root = await root.getDirectoryHandle(name, { create: true });
|
|
2419
|
+
}
|
|
2420
|
+
const written = /* @__PURE__ */ new Map();
|
|
2421
|
+
const unchanged = (child, mtime) => {
|
|
2422
|
+
const entry = written.get(child);
|
|
2423
|
+
return entry !== void 0 && entry.mtime === mtime && mtime < entry.at;
|
|
2424
|
+
};
|
|
2425
|
+
async function restore(handle, dir) {
|
|
2426
|
+
for await (const [name, entry] of handle.entries()) {
|
|
2427
|
+
const child = `${dir}/${name}`;
|
|
2428
|
+
if (entry.kind === "directory") {
|
|
2429
|
+
FS.mkdirTree(child);
|
|
2430
|
+
await restore(entry, child);
|
|
2431
|
+
} else {
|
|
2432
|
+
FS.writeFile(child, new Uint8Array(await (await entry.getFile()).arrayBuffer()));
|
|
2433
|
+
written.set(child, { mtime: statSeconds(FS.stat(child).mtime), at: Infinity });
|
|
2434
|
+
}
|
|
2435
|
+
}
|
|
2436
|
+
}
|
|
2437
|
+
async function save(handle, dir) {
|
|
2438
|
+
const names2 = new Set(FS.readdir(dir).filter((name) => name !== "." && name !== ".."));
|
|
2439
|
+
for (const child of [...written.keys()]) {
|
|
2440
|
+
const name = child.slice(dir.length + 1);
|
|
2441
|
+
if (child.startsWith(`${dir}/`) && !name.includes("/") && !names2.has(name)) {
|
|
2442
|
+
await handle.removeEntry(name).catch(() => {
|
|
2443
|
+
});
|
|
2444
|
+
written.delete(child);
|
|
2445
|
+
}
|
|
2446
|
+
}
|
|
2447
|
+
for (const name of names2) {
|
|
2448
|
+
const child = `${dir}/${name}`;
|
|
2449
|
+
const stat = FS.stat(child);
|
|
2450
|
+
if ((stat.mode & S_IFMT) === S_IFDIR) {
|
|
2451
|
+
await save(await handle.getDirectoryHandle(name, { create: true }), child);
|
|
2452
|
+
continue;
|
|
2453
|
+
}
|
|
2454
|
+
const mtime = statSeconds(stat.mtime);
|
|
2455
|
+
if (unchanged(child, mtime)) {
|
|
2456
|
+
continue;
|
|
2457
|
+
}
|
|
2458
|
+
const at = Math.floor(Date.now() / 1e3);
|
|
2459
|
+
const data = FS.readFile(child);
|
|
2460
|
+
const writable = await (await handle.getFileHandle(name, { create: true })).createWritable();
|
|
2461
|
+
await writable.write(data);
|
|
2462
|
+
await writable.close();
|
|
2463
|
+
written.set(child, { mtime, at });
|
|
2464
|
+
}
|
|
2465
|
+
}
|
|
2466
|
+
await restore(root, path.replace(/\/+$/, ""));
|
|
2467
|
+
let saving = null;
|
|
2468
|
+
const flush = () => {
|
|
2469
|
+
saving ?? (saving = save(root, path.replace(/\/+$/, "")).finally(() => {
|
|
2470
|
+
saving = null;
|
|
2471
|
+
}));
|
|
2472
|
+
return saving;
|
|
2473
|
+
};
|
|
2474
|
+
setInterval(flush, interval);
|
|
2475
|
+
addEventListener("pagehide", flush);
|
|
2476
|
+
return flush;
|
|
2477
|
+
}
|
|
2407
2478
|
|
|
2408
2479
|
// ../../dist/web/index.mjs
|
|
2409
2480
|
var created = false;
|
|
@@ -2453,6 +2524,7 @@ export {
|
|
|
2453
2524
|
find,
|
|
2454
2525
|
isAvailable,
|
|
2455
2526
|
log,
|
|
2527
|
+
persistDirectory,
|
|
2456
2528
|
setBridge,
|
|
2457
2529
|
wrap,
|
|
2458
2530
|
wrapLayer
|