~ knotless Search/
↑↓ move↵ open⇧↵ all results

chadtmiller.com/pds.js

An atproto PDS in JavaScript, for Cloudflare Workers and Node

0
0
main
68 lines · 2.3 KB Raw History
// The sites gate in createServer: an experimental.sites.domain option composes the handler
// and browser in; absent, foreign hostnames behave as before.

import { mkdtempSync, rmSync } from 'node:fs';
import { tmpdir } from 'node:os';
import { join } from 'node:path';
import { afterEach, describe, expect, it } from 'vitest';
import { createServer } from '../src/index.js';

/** @type {Array<{close: () => Promise<void>}>} */
const servers = [];
/** @type {string[]} */
const dirs = [];

/** @param {{experimental?: {sites?: {domain?: string, apexName?: string}}}} [opts] */
async function makeServer(opts = {}) {
  const dir = mkdtempSync(join(tmpdir(), 'pdsjs-sites-wiring-'));
  dirs.push(dir);
  const server = await createServer({
    dbPath: join(dir, 'pds.db'),
    blobsDir: join(dir, 'blobs'),
    jwtSecret: 'wiring-test-secret',
    hostname: 'pds.example.com',
    ...opts,
  });
  servers.push(server);
  return server;
}

afterEach(async () => {
  for (const server of servers.splice(0)) {
    // close() rejects when listen() was never called; these tests only
    // construct the server.
    await server.close().catch(() => {});
  }
  for (const dir of dirs.splice(0))
    rmSync(dir, { recursive: true, force: true });
});

describe('node sites wiring', () => {
  it('leaves sites off without a domain', async () => {
    const { pds } = await makeServer();
    expect(pds.extensionFeatures.sites).toBe(false);

    const response = await pds.fetch(
      new Request('https://blog.example.com/nope'),
    );
    expect(response.status).toBe(404);
    expect(response.headers.get('access-control-allow-origin')).toBe('*');
  });

  it('composes handler and browser when the domain is set', async () => {
    const { pds } = await makeServer({
      experimental: { sites: { domain: 'example.com', apexName: 'www' } },
    });
    expect(pds.extensionFeatures.sites).toBe(true);

    const response = await pds.fetch(new Request('https://blog.example.com/'));
    expect(response.status).toBe(404);
    expect(await response.text()).toContain('Nothing is deployed here');
    expect(response.headers.get('access-control-allow-origin')).toBeNull();

    const health = await pds.fetch(
      new Request('https://pds.example.com/xrpc/_health'),
    );
    expect(health.status).toBe(200);
  });
});