Skip to content

Build environment to compile MapServer with Emscripten to a WebAssembly package

License

Notifications You must be signed in to change notification settings

codeart1st/mapserver-wasm

Folders and files

NameName
Last commit message
Last commit date

Latest commit

7b4a455 · Mar 31, 2025
Mar 20, 2025
Mar 31, 2025
Mar 2, 2025
Jul 13, 2024
Jan 18, 2025
Mar 31, 2025
Jul 13, 2024
Jul 13, 2024
Jul 14, 2024
Jul 21, 2024
Mar 7, 2025
Jul 13, 2024
Mar 31, 2025
Mar 31, 2025
Jul 21, 2024
Jul 21, 2024

Repository files navigation

mapserver-wasm

MapServer WFS and WMS inside Web Worker
Build environment to compile MapServer with Emscripten to a WebAssembly package

Features

  • Use MapServer inside your browser
  • Expose WFS 2.0.0 and WMS 1.3.0 services
  • Read vector and raster data from GeoPackage

ThirdParty Dependencies

Name Version Home page License Status
MapServer 8.4.0 https://mapserver.org/ MIT
GDAL/OGR 3.10.2 https://gdal.org/ MIT/X style
PROJ 9.5.1 https://proj.org/ MIT/X style
GEOS 3.13.1 https://libgeos.org/ LGPL-2.1
SQLite 3.49.1 https://www.sqlite.org/ Public Domain
Libxml2 2.13.5 http://xmlsoft.org/ MIT

✅ up-to-date | 🚧 needs-update | Last update check 02.03.2025

Getting started

Installation

To download mapserver-wasm run:

npm install mapserver-wasm
# or
yarn add mapserver-wasm

Usage

import MapServer from 'mapserver-wasm'

MapServer().then(async Module => {
  const WORKERFS = Module.FS.filesystems['WORKERFS']
  const MEMFS = Module.FS.filesystems['MEMFS']

  Module.FS.mkdir('/ms')
  Module.FS.mkdir('/proj')

  try {
    WORKERFS.node_ops.mknod = MEMFS.node_ops.mknod // GDAL needs temporary file support
    Module.FS.mount(WORKERFS, {
      blobs: [
        { name: 'test.gpkg', data: /* gpkg blob */ }
      ]
    }, '/ms')
    Module.FS.writeFile('/proj/epsg', crsDefinitions.map(({ crs, definition }) => {
      return `<${crs.replace('EPSG:', '')}>${definition}<>`
    }).join('\n'), { flags: 'w+' })
    // ...
    resolve()
  } catch (e) {
    reject(e)
  }
})

Please look into the demo project or into the test folder for further information.

Development

Required Web APIs

WebAssembly 1.0 | WebAssembly Exception Handling

Checkout

git clone --recurse-submodules git@github.com:codeart1st/mapserver-wasm.git
git clone git@github.com:codeart1st/mapserver-wasm.git
git submodule update --init --recursive

Update

git pull --recurse-submodules

Compilation

Start the build container with the following command to ensure the filesystem permissions for newly created files are correct.

docker run -it --rm -v $(pwd):/src -v /etc/passwd:/etc/passwd --user "$(id -u):$(id -g)" --name mapserver-wasm emscripten/emsdk:3.1.68 bash

And execute in a second terminal the following command to install the missing build depedencies as root user.

docker exec --user root mapserver-wasm bash -c "apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y brotli"

After that execute all job script commands described in .github/workflows/ci.yml inside the interactive build container. It can be helpful to set the GITHUB_WORKSPACE environment variable beforehand.

GITHUB_WORKSPACE=/src

Test

Tests will be executed with Vitest framework. Test execution needs compilation of mapserver-wasm first.

npm ci && npm test

Logging

To avoid debugging in first place it can be helpful to activate file logging for MapServer and GDAL.

MAP
  DEBUG 5
  CONFIG "MS_ERRORFILE" "error.log"
  CONFIG "CPL_LOG" "error.log"
  CONFIG "CPL_DEBUG" "ON"
  CONFIG "CPL_LOG_ERRORS" "ON"
  CONFIG "CPL_TIMESTAMP" "ON"
END

Debugging

Debugging in DWARF format has initial support in Chrome.