@httpland/coop-middleware
Version:
HTTP cross-origin opener policy(COOP) middleware
38 lines (37 loc) • 1.37 kB
JavaScript
// Copyright 2023-latest the httpland authors. All rights reserved. MIT license.
// This module is browser compatible.
import { CrossOriginOpenerPolicyValue, PolicyHeader } from "./constants.js";
import { withHeader } from "./deps.js";
import { stringifyCrossOriginOpenerPolicy } from "./utils.js";
/** Create cross-origin opener policy middleware.
*
* @example
* ```ts
* import {
* coop,
* type Handler,
* } from "https://deno.land/x/coop_middleware@$VERSION/mod.ts";
* import { assert } from "https://deno.land/std/testing/asserts.ts";
*
* declare const request: Request;
* declare const handler: Handler;
*
* const middleware = coop();
* const response = await middleware(request, handler);
*
* assert(response.headers.has("cross-origin-opener-policy"));
* ```
*/
export function coop(options) {
const { policy: value = CrossOriginOpenerPolicyValue.SameOrigin, reportOnly, reportTo, } = options ?? {};
const fieldValue = stringifyCrossOriginOpenerPolicy({ value, reportTo });
const fieldName = reportOnly
? PolicyHeader.CrossOriginOpenerPolicyReportOnly
: PolicyHeader.CrossOriginOpenerPolicy;
return async (request, next) => {
const response = await next(request);
if (response.headers.has(fieldName))
return response;
return withHeader(response, fieldName, fieldValue);
};
}