@fedify/fedify
Version:
An ActivityPub server framework
180 lines (179 loc) • 6.52 kB
JavaScript
import "@js-temporal/polyfill";
import "urlpattern-polyfill";
globalThis.addEventListener = () => {};
import { getLogger } from "@logtape/logtape";
import "@opentelemetry/sdk-trace-base";
import "@opentelemetry/core";
import { RouterError } from "@fedify/uri-template";
import { lookupObject, traverseCollection } from "@fedify/vocab";
import { lookupWebFinger } from "@fedify/webfinger";
import { metrics, trace } from "@opentelemetry/api";
//#region ../fixture/dist/mod.js
const logger = getLogger(["fixture", "docloader"]);
/**
* A mock of the document loader. This does not make any actual HTTP requests
* towards the remote server, but looks up the local fixture files instead.
*
* For instance, `mockDocumentLoader("http://example.com/foo/bar")` will look up
* the file `testing/fixtures/http/example.com/foo/bar` (no suffix) and return
* its content as the response.
*/
async function mockDocumentLoader(resource, _options) {
const url = new URL(resource);
if ("navigator" in globalThis && navigator.userAgent === "Cloudflare-Workers") {
const testUrl = new URL(url);
testUrl.hostname += ".test";
const resp = await fetch(testUrl);
if (resp.ok) {
const document = await resp.json();
logger.debug("Successfully fetched fixture {resource}: {status} {statusText}\n{body}", {
resource,
status: resp.status,
statusText: resp.statusText,
body: document
});
return {
contextUrl: null,
document,
documentUrl: resource
};
}
const error = await resp.text();
logger.error("Failed to fetch fixture {resource}: {error}", {
resource,
error
});
throw new Error(error);
}
const fixturePath = `${"Deno" in globalThis ? "." : "@fedify/fixture"}/fixtures/${url.host}${url.pathname}.json`;
let document;
try {
document = (await import(fixturePath, { with: { type: "json" } })).default;
} catch (error) {
logger.error("Failed to read fixture file {path}: {error}", {
path: fixturePath,
error
});
throw error;
}
return {
contextUrl: null,
document,
documentUrl: resource
};
}
const testDefinitions = [];
//#endregion
//#region src/testing/context.ts
function createContext(values) {
const { federation, url = new URL("http://example.com/"), canonicalOrigin, data, documentLoader, contextLoader, meterProvider, tracerProvider, clone, getNodeInfoUri, getActorUri, getObjectUri, getCollectionUri, getOutboxUri, getInboxUri, getFollowingUri, getFollowersUri, getLikedUri, getFeaturedUri, getFeaturedTagsUri, parseUri, getActorKeyPairs, getDocumentLoader, lookupObject: lookupObject$1, traverseCollection: traverseCollection$1, lookupNodeInfo, lookupWebFinger: lookupWebFinger$1, sendActivity, routeActivity } = values;
function throwRouterError() {
throw new RouterError("Not implemented");
}
return {
federation,
data,
origin: url.origin,
canonicalOrigin: canonicalOrigin ?? url.origin,
host: url.host,
hostname: url.hostname,
documentLoader: documentLoader ?? mockDocumentLoader,
contextLoader: contextLoader ?? mockDocumentLoader,
meterProvider: meterProvider ?? metrics.getMeterProvider(),
tracerProvider: tracerProvider ?? trace.getTracerProvider(),
clone: clone ?? ((data) => createContext({
...values,
data
})),
getNodeInfoUri: getNodeInfoUri ?? throwRouterError,
getActorUri: getActorUri ?? throwRouterError,
getObjectUri: getObjectUri ?? throwRouterError,
getCollectionUri: getCollectionUri ?? throwRouterError,
getOutboxUri: getOutboxUri ?? throwRouterError,
getInboxUri: getInboxUri ?? throwRouterError,
getFollowingUri: getFollowingUri ?? throwRouterError,
getFollowersUri: getFollowersUri ?? throwRouterError,
getLikedUri: getLikedUri ?? throwRouterError,
getFeaturedUri: getFeaturedUri ?? throwRouterError,
getFeaturedTagsUri: getFeaturedTagsUri ?? throwRouterError,
parseUri: parseUri ?? ((_uri) => {
throw new Error("Not implemented");
}),
getDocumentLoader: getDocumentLoader ?? ((_params) => {
throw new Error("Not implemented");
}),
getActorKeyPairs: getActorKeyPairs ?? ((_handle) => Promise.resolve([])),
lookupObject: lookupObject$1 ?? ((uri, options = {}) => {
return lookupObject(uri, {
documentLoader: options.documentLoader ?? documentLoader ?? mockDocumentLoader,
contextLoader: options.contextLoader ?? contextLoader ?? mockDocumentLoader
});
}),
traverseCollection: traverseCollection$1 ?? ((collection, options = {}) => {
return traverseCollection(collection, {
documentLoader: options.documentLoader ?? documentLoader ?? mockDocumentLoader,
contextLoader: options.contextLoader ?? contextLoader ?? mockDocumentLoader
});
}),
lookupNodeInfo: lookupNodeInfo ?? ((_params) => {
throw new Error("Not implemented");
}),
lookupWebFinger: lookupWebFinger$1 ?? ((resource, options = {}) => {
return lookupWebFinger(resource, options);
}),
sendActivity: sendActivity ?? ((_params) => {
throw new Error("Not implemented");
}),
routeActivity: routeActivity ?? ((_params) => {
throw new Error("Not implemented");
})
};
}
function createRequestContext(args) {
return {
...createContext(args),
clone: args.clone ?? ((data) => createRequestContext({
...args,
data
})),
request: args.request ?? new Request(args.url),
url: args.url,
getActor: args.getActor ?? (() => Promise.resolve(null)),
getObject: args.getObject ?? (() => Promise.resolve(null)),
getSignedKey: args.getSignedKey ?? (() => Promise.resolve(null)),
getSignedKeyOwner: args.getSignedKeyOwner ?? (() => Promise.resolve(null)),
sendActivity: args.sendActivity ?? ((_params) => {
throw new Error("Not implemented");
})
};
}
function createInboxContext(args) {
return {
...createContext(args),
clone: args.clone ?? ((data) => createInboxContext({
...args,
data
})),
recipient: args.recipient ?? null,
forwardActivity: args.forwardActivity ?? ((_forwarder, _recipients, _options) => {
throw new Error("Not implemented");
})
};
}
function createOutboxContext(args) {
const forwardActivity = args.forwardActivity ?? ((_forwarder, _recipients, _options) => {
throw new Error("Not implemented");
});
return {
...createContext(args),
clone: args.clone ?? ((data) => createOutboxContext({
...args,
data
})),
identifier: args.identifier,
hasDeliveredActivity: args.hasDeliveredActivity ?? (() => false),
forwardActivity
};
}
//#endregion
export { testDefinitions as i, createOutboxContext as n, createRequestContext as r, createInboxContext as t };