UNPKG

@connectrpc/connect-node

Version:

Connect is a family of libraries for building and consuming APIs on different languages and platforms, and [@connectrpc/connect](https://www.npmjs.com/package/@connectrpc/connect) brings type-safe APIs with Protobuf to TypeScript.

98 lines (97 loc) 3.08 kB
"use strict"; // Copyright 2021-2025 The Connect Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. Object.defineProperty(exports, "__esModule", { value: true }); exports.nodeHeaderToWebHeader = nodeHeaderToWebHeader; exports.webHeaderToNodeHeaders = webHeaderToNodeHeaders; /** * Convert a Node.js header object to a fetch API Headers object. * * This function works for Node.js incoming and outgoing headers, and for the * http and the http2 package. * * HTTP/2 pseudo-headers (:method, :path, etc.) are stripped. */ function nodeHeaderToWebHeader(nodeHeaders) { const header = new Headers(); for (const [k, v] of Object.entries(nodeHeaders)) { if (k.startsWith(":")) { continue; } if (v === undefined) { continue; } if (typeof v == "string") { header.append(k, v); } else if (typeof v == "number") { header.append(k, String(v)); } else { for (const e of v) { header.append(k, e); } } } return header; } function webHeaderToNodeHeaders(headersInit, defaultNodeHeaders) { if (headersInit === undefined && defaultNodeHeaders === undefined) { return undefined; } const o = Object.create(null); if (defaultNodeHeaders !== undefined) { for (const [key, value] of Object.entries(defaultNodeHeaders)) { if (Array.isArray(value)) { o[key] = value.concat(); } else if (value !== undefined) { o[key] = value; } } } if (headersInit !== undefined) { if (Array.isArray(headersInit)) { for (const [key, value] of headersInit) { appendWebHeader(o, key, value); } } else if ("forEach" in headersInit) { if (typeof headersInit.forEach == "function") { headersInit.forEach((value, key) => { appendWebHeader(o, key, value); }); } } else { for (const [key, value] of Object.entries(headersInit)) { appendWebHeader(o, key, value); } } } return o; } function appendWebHeader(o, key, value) { key = key.toLowerCase(); const existing = o[key]; if (Array.isArray(existing)) { existing.push(value); } else if (existing === undefined) { o[key] = value; } else { o[key] = [existing.toString(), value]; } }