JSPM

  • ESM via JSPM
  • ES Module Entrypoint
  • Export Map
  • Keywords
  • License
  • Repository URL
  • TypeScript Types
  • README
  • Created
  • Published
  • Downloads 25
  • Score
    100M100P100Q86259F
  • License MIT

Server-side exporter for @meframe/core (browser-driven, multipart upload via injected store)

Package Exports

  • @meframe/server

Readme

@meframe/server

@meframe/server is a Node.js package that runs @meframe/core export inside a real Chromium instance (via browser automation) and uploads the output using an injected multipart store interface.

Status

Experimental, but functional.

Current capabilities:

  • Runs @meframe/core export in a real Chromium instance (via puppeteer-core)
  • Streams mux output into multipart parts (no full MP4 Blob in Node memory)
  • Supports cancellation (AbortSignal) and progress callback (onProgress)

See:

  • packages/server/examples/README.md for example usage (local + S3)
  • packages/server/docs/INTEGRATION.md for a complete integration guide (Chinese)
  • packages/server/docs/ARCHITECTURE.md for architecture and constraints

Design goals

  • No cloud SDK dependency: upload is abstracted via MultipartObjectStore.
  • Low memory: avoid returning a full MP4 Blob to Node; stream mux output into multipart parts.
  • Works with existing web pipeline: reuse @meframe/core export flow (OPFS + WebCodecs + workers).

Public API

  • ServerExporter
    • exportToStore({ model, exportOptions, pageUrl?, key?, metadata?, abortSignal? })

Types are exported from @meframe/server root entry.

Notes / requirements

  • Chromium is not bundled: this package depends on puppeteer-core internally, so production must provide a Chromium/Chrome binary and pass browser.executablePath when creating ServerExporter (or load it from your own config system).
  • Secure context is required for WebCodecs: the exporter should navigate to a trustworthy origin (e.g. http://127.0.0.1 or https://...) via pageUrl before running the runner.
  • Worker files must be accessible to the page at /<workerPath>/... (default /meframe-workers/...). If you do not pass workerPath, @meframe/server will start a temporary local server that serves @meframe/core/dist/workers and inject its base URL.

Run examples

Local end-to-end (writes packages/server/examples/local/out.mp4):

pnpm --filter @meframe/core build
pnpm --filter @meframe/adapter-medeo build
pnpm --filter @meframe/server build

MEFRAME_CHROME_PATH="/Applications/Google Chrome.app/Contents/MacOS/Google Chrome" \
  pnpm --filter @meframe/server dev

S3 example (reference; requires AWS creds + bucket CORS exposing ETag):

MEFRAME_CHROME_PATH="/Applications/Google Chrome.app/Contents/MacOS/Google Chrome" \
  MEFRAME_RUNNER_PAGE_URL="https://your-domain.example/meframe-runner.html" \
  S3_BUCKET="your-bucket" \
  MEDEO_PUBLIC_BASE_URL="https://cdn.example.com" \
  node packages/server/examples/s3/export-to-s3.mjs