Skip to main content

Create Your Own Source

A source captures events from an environment (browser, server, third-party API) and forwards them to the walkerOS collector.

The source interface

Sources are async functions that receive a context object and return a source instance:

Loading...

The context contains:

Loading...

The returned instance must implement:

Loading...

Types bundle

Sources use a Types interface to bundle all TypeScript types:

Loading...

The 4 type parameters:

  1. Settings: Source configuration options
  2. Mapping: Event mapping (usually never for sources)
  3. Push: External push signature (what source.push exposes)
  4. Env: Internal dependencies (what source calls via env.elb)

Context destructuring

The context parameter contains everything your source needs:

Loading...

The collector provides env.push (formerly env.elb). You provide other dependencies (like window, document, custom APIs) when configuring the source.

Minimal example

Loading...

Complete example: Event API source

Capturing events from a third-party API with event listeners:

Loading...

Using your source

Loading...

Testing your source

Test Utilities

Loading...

Test Example

Loading...

Conditional activation with require

Sources can declare dependencies on collector events. A source with require won't initialize until all specified events have fired:

Loading...

How it works:

  • Sources with require are stored in collector.pending instead of initializing
  • After each collector event (consent, user, session, run, etc.), pending sources are checked
  • When all required events have fired, the source initializes
  • Chains work naturally: consent activates session source, which fires user, which activates dataLayer

Common patterns:

RequireUse case
['consent']Wait for CMP consent before tracking
['user']Wait for identity resolution
['session']Wait for session detection
['consent', 'run']Wait for both consent and collector run

Common patterns

Polling for API Readiness

When the external API isn't immediately available:

Loading...

Source as adapter pattern

Sources bridge external systems and the collector:

External System  ←→  Source (Adapter)  ←→  Collector

Two interfaces:

  1. External (source.push): Platform-specific signature

    • Browser: push(elem, data, options) → Returns Promise<PushResult>
    • Server: push(req, res) → Returns Promise<void> (writes HTTP response)
    • Your choice: Match your environment's needs
  2. Internal (env.elb): Standard collector interface

    • Always Elb.Fn - same across all sources
    • Sources translate external inputs → standard events → env.elb(event)

Example signatures:

Loading...

The Push type parameter defines what your source exposes externally. Internally, all sources use env.elb to forward to the collector.

Key concepts

  • Context pattern: Sources receive a single context object with config, env, logger, id
  • Validate custom dependencies: Only check optional env properties your source needs
  • Types bundle: Use 4-parameter pattern for full type safety
  • Adapter pattern: External push adapts to environment, internal env.push stays standard
  • Cleanup: Implement destroy() to remove listeners
  • Stateless: Let collector manage state

Package convention

Every walkerOS package includes machine-readable metadata for tooling and discovery.

walkerOS field in package.json

Loading...
FieldRequiredDescription
walkerOSYesObject with type and platform metadata

Build-time generation

Use buildDev() from the shared tsup config to auto-generate walkerOS.json:

Loading...

This file contains your package's JSON Schemas and examples, enabling MCP tools and the CLI to validate configurations without installing your package.

Publishing checklist

  • walkerOS field in package.json
  • Keywords include walkeros and walkeros-source
  • buildDev() in tsup.config.ts
  • dist/walkerOS.json generated on build
  • npm run test passes
  • npm run lint passes

Next steps

💡 Need Professional Support?
Need professional support with your walkerOS implementation? Check out our services.