Cloudflare Workers quickstart

Bundle a fixed synthetic chart into a Worker without a hosted engine dependency.

Engine 1.0.0: On npm. Archive identity and release status.

Read this page as Markdown

Worker entry

Install the package in an existing Wrangler project and use this module as the Worker entry. This handler always calculates the fixed synthetic request; it does not accept personal chart input.

The fetch handler returns a JSON response. Before adapting it to user input, add schema validation, request limits, consent and a policy for logging and retention. Do not log birth details.

import { natalChart } from '@zodiacs/engine';
export default {
  fetch() {
    const chart = natalChart({
      utc: '2000-01-01T12:00:00Z',
      latitude: 51.4779,
      longitude: -0.0015,
      houseSystem: 'whole',
    });
    return Response.json({ bodies: chart.bodies, flags: chart.flags });
  },
};

Runtime verification

Bundle the dependency graph with Wrangler and exercise the Worker locally before deploying. Node compilation alone does not establish Workers compatibility. Deployment is separate from this recipe.

Install the release

npm install @zodiacs/engine@1.0.0

npm's 1.0.0 tarball is byte-identical to the archive the engine repository carries. To install those bytes from the carrier, with their digest checked before npm sees them, run this in the project's directory instead:

( set -eu
# POSIX shell — macOS, Linux or WSL. Not PowerShell. It runs in a subshell, so
# a failure stops the install without closing your terminal.
BASE=$(pwd)
FILE='zodiacs-engine-1.0.0.tgz'
# Run it in your project's directory. Without a package.json here, npm would
# install into the nearest parent directory that has one.
if test ! -f package.json; then
  echo "Stop: there is no package.json here. Run this in your project's directory, or create one first with: npm init -y" >&2
  exit 1
fi
if test -e "$FILE" || test -L "$FILE"; then
  echo "Stop: $FILE already exists here. Move or delete it, then run this again." >&2
  exit 1
fi
# A download that fails verification is removed, so the guard above does not
# then block the retry. Once npm takes over the archive stays: npm reports its
# own failures, and the file is what you would retry with.
trap 'status=$?; if test "$status" -ne 0; then rm -f "$BASE/$FILE"; fi; exit $status' EXIT

curl --disable --fail --silent --show-error --location --proto '=https' --max-time 120 \
  'https://raw.githubusercontent.com/zodiacs-org/engine/38d31854e5716454921b6ce8a211788a0984328e/artifacts/zodiacs-engine-1.0.0.tgz' -o "$FILE"

node --input-type=module <<'JS'
import { readFileSync } from 'node:fs';
import { createHash } from 'node:crypto';
const file = 'zodiacs-engine-1.0.0.tgz';
const expected = 'c4d3754de899fb98882331e6d7b9ce3ce77fb2072baeb002aa0ef8c77b0ab0f6';
const bytes = readFileSync(file);
const actual = createHash('sha256').update(bytes).digest('hex');
if (actual !== expected) {
  console.error(`Stop: this is not the published archive.\n  expected ${expected}\n  got      ${actual}`);
  console.error('Nothing was installed.');
  process.exit(1);
}
console.log(`Archive verified: ${actual}`);
JS

trap - EXIT
npm install --ignore-scripts "./$FILE"
echo "Installed @zodiacs/engine@1.0.0 from the verified archive."
)

References