New:Socket for Asana Is Now Available.Learn more
Sign In

@ramp-kit/server

Package Overview
Dependencies
Maintainers
1
Versions
4
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@ramp-kit/server - npm Package Compare versions

Comparing version
0.1.2
to
0.1.3
+13
-5
dist/index.d.ts
import { type Server } from "node:http";
import { type ProxyConfig } from "./proxy.js";
import { type MantecaProxyConfig, type ProxyConfig } from "./proxy.js";
import { type WebhookConfig } from "./webhooks.js";

@@ -8,3 +8,6 @@ export * from "./proxy.js";

export interface RampServerConfig {
proxy: ProxyConfig;
/** Etherfuse proxy (key held server-side). */
proxy?: ProxyConfig;
/** Manteca proxy (md-api-key held server-side). */
manteca?: MantecaProxyConfig;
/** Optional webhook receiver; omit to run proxy-only. */

@@ -14,3 +17,4 @@ webhooks?: WebhookConfig;

/**
* Standalone production backend:
* Standalone production backend — your app's ramp API. Partner keys stay
* here; your end users never see or need one.
*

@@ -25,2 +29,6 @@ * ```ts

* },
* manteca: {
* apiKey: process.env.MANTECA_API_KEY!,
* environment: "production",
* },
* webhooks: {

@@ -33,7 +41,7 @@ * etherfuseSecret: process.env.ETHERFUSE_WEBHOOK_SECRET!,

*
* The frontend then points the provider at this server:
* The frontend then points providers at this server with an empty key:
* `new EtherfuseProvider({ apiKey: "", baseUrl: "https://api.myapp.com/etherfuse" })`
* — the key never ships to the browser.
* `new MantecaProvider({ apiKey: "", baseUrl: "https://api.myapp.com/manteca" })`
*/
export declare function createRampServer(config: RampServerConfig): Server;
//# sourceMappingURL=index.d.ts.map

@@ -1,1 +0,1 @@

{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,KAAK,MAAM,EAAE,MAAM,WAAW,CAAC;AACtD,OAAO,EAAmB,KAAK,WAAW,EAAE,MAAM,YAAY,CAAC;AAC/D,OAAO,EAEL,KAAK,aAAa,EACnB,MAAM,eAAe,CAAC;AAEvB,cAAc,YAAY,CAAC;AAC3B,cAAc,eAAe,CAAC;AAC9B,cAAc,iBAAiB,CAAC;AAEhC,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,WAAW,CAAC;IACnB,yDAAyD;IACzD,QAAQ,CAAC,EAAE,aAAa,CAAC;CAC1B;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,gBAAgB,GAAG,MAAM,CAiBjE"}
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,KAAK,MAAM,EAAE,MAAM,WAAW,CAAC;AACtD,OAAO,EAGL,KAAK,kBAAkB,EACvB,KAAK,WAAW,EACjB,MAAM,YAAY,CAAC;AACpB,OAAO,EAEL,KAAK,aAAa,EACnB,MAAM,eAAe,CAAC;AAEvB,cAAc,YAAY,CAAC;AAC3B,cAAc,eAAe,CAAC;AAC9B,cAAc,iBAAiB,CAAC;AAEhC,MAAM,WAAW,gBAAgB;IAC/B,8CAA8C;IAC9C,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,mDAAmD;IACnD,OAAO,CAAC,EAAE,kBAAkB,CAAC;IAC7B,yDAAyD;IACzD,QAAQ,CAAC,EAAE,aAAa,CAAC;CAC1B;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,gBAAgB,GAAG,MAAM,CAqBjE"}
import { createServer } from "node:http";
import { createRampProxy } from "./proxy.js";
import { createMantecaProxy, createRampProxy, } from "./proxy.js";
import { createEtherfuseWebhookHandler, } from "./webhooks.js";

@@ -8,3 +8,4 @@ export * from "./proxy.js";

/**
* Standalone production backend:
* Standalone production backend — your app's ramp API. Partner keys stay
* here; your end users never see or need one.
*

@@ -19,2 +20,6 @@ * ```ts

* },
* manteca: {
* apiKey: process.env.MANTECA_API_KEY!,
* environment: "production",
* },
* webhooks: {

@@ -27,8 +32,11 @@ * etherfuseSecret: process.env.ETHERFUSE_WEBHOOK_SECRET!,

*
* The frontend then points the provider at this server:
* The frontend then points providers at this server with an empty key:
* `new EtherfuseProvider({ apiKey: "", baseUrl: "https://api.myapp.com/etherfuse" })`
* — the key never ships to the browser.
* `new MantecaProvider({ apiKey: "", baseUrl: "https://api.myapp.com/manteca" })`
*/
export function createRampServer(config) {
const proxy = createRampProxy(config.proxy);
const proxy = config.proxy ? createRampProxy(config.proxy) : undefined;
const manteca = config.manteca
? createMantecaProxy(config.manteca)
: undefined;
const webhooks = config.webhooks

@@ -41,4 +49,6 @@ ? createEtherfuseWebhookHandler(config.webhooks)

return;
if (await proxy(req, res))
if (proxy && (await proxy(req, res)))
return;
if (manteca && (await manteca(req, res)))
return;
res.writeHead(404, { "Content-Type": "application/json" });

@@ -45,0 +55,0 @@ res.end(JSON.stringify({ error: "Not found" }));

@@ -1,1 +0,1 @@

{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAe,MAAM,WAAW,CAAC;AACtD,OAAO,EAAE,eAAe,EAAoB,MAAM,YAAY,CAAC;AAC/D,OAAO,EACL,6BAA6B,GAE9B,MAAM,eAAe,CAAC;AAEvB,cAAc,YAAY,CAAC;AAC3B,cAAc,eAAe,CAAC;AAC9B,cAAc,iBAAiB,CAAC;AAQhC;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,UAAU,gBAAgB,CAAC,MAAwB;IACvD,MAAM,KAAK,GAAG,eAAe,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC5C,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ;QAC9B,CAAC,CAAC,6BAA6B,CAAC,MAAM,CAAC,QAAQ,CAAC;QAChD,CAAC,CAAC,SAAS,CAAC;IAEd,OAAO,YAAY,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;QACrC,IAAI,CAAC;YACH,IAAI,QAAQ,IAAI,CAAC,MAAM,QAAQ,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;gBAAE,OAAO;YACnD,IAAI,MAAM,KAAK,CAAC,GAAG,EAAE,GAAG,CAAC;gBAAE,OAAO;YAClC,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,CAAC;YAC3D,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC;QAClD,CAAC;QAAC,MAAM,CAAC;YACP,IAAI,CAAC,GAAG,CAAC,WAAW;gBAAE,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;YACzC,GAAG,CAAC,GAAG,EAAE,CAAC;QACZ,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC"}
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAe,MAAM,WAAW,CAAC;AACtD,OAAO,EACL,kBAAkB,EAClB,eAAe,GAGhB,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,6BAA6B,GAE9B,MAAM,eAAe,CAAC;AAEvB,cAAc,YAAY,CAAC;AAC3B,cAAc,eAAe,CAAC;AAC9B,cAAc,iBAAiB,CAAC;AAWhC;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,MAAM,UAAU,gBAAgB,CAAC,MAAwB;IACvD,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,eAAe,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACvE,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO;QAC5B,CAAC,CAAC,kBAAkB,CAAC,MAAM,CAAC,OAAO,CAAC;QACpC,CAAC,CAAC,SAAS,CAAC;IACd,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ;QAC9B,CAAC,CAAC,6BAA6B,CAAC,MAAM,CAAC,QAAQ,CAAC;QAChD,CAAC,CAAC,SAAS,CAAC;IAEd,OAAO,YAAY,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;QACrC,IAAI,CAAC;YACH,IAAI,QAAQ,IAAI,CAAC,MAAM,QAAQ,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;gBAAE,OAAO;YACnD,IAAI,KAAK,IAAI,CAAC,MAAM,KAAK,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;gBAAE,OAAO;YAC7C,IAAI,OAAO,IAAI,CAAC,MAAM,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;gBAAE,OAAO;YACjD,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,CAAC;YAC3D,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC;QAClD,CAAC;QAAC,MAAM,CAAC;YACP,IAAI,CAAC,GAAG,CAAC,WAAW;gBAAE,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;YACzC,GAAG,CAAC,GAAG,EAAE,CAAC;QACZ,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC"}

@@ -17,10 +17,27 @@ import type { IncomingMessage, ServerResponse } from "node:http";

}
export interface MantecaProxyConfig {
/** Manteca partner md-api-key — lives ONLY on this server. */
apiKey: string;
environment?: "sandbox" | "production";
upstreamUrl?: string;
/** Path prefix the frontend calls, stripped before forwarding. */
pathPrefix?: string;
fetchImpl?: typeof globalThis.fetch;
}
export declare function isAllowed(method: string, path: string, config: Pick<ProxyConfig, "environment" | "allowSimulation">): boolean;
export declare function isMantecaAllowed(method: string, path: string): boolean;
/**
* Node http handler that forwards allowlisted ramp calls to Etherfuse with
* the server-held API key. Mount it under `pathPrefix` (default /etherfuse)
* in any Node server, or use createRampServer() for a standalone one.
* Node http handler that forwards allowlisted Etherfuse calls with the
* server-held API key. Mount it under `pathPrefix` (default /etherfuse) in
* any Node server, or use createRampServer() for a standalone one.
*
* The key is injected here, server-side — browser callers never send it.
*/
export declare function createRampProxy(config: ProxyConfig): (req: IncomingMessage, res: ServerResponse) => Promise<boolean>;
/**
* Node http handler that forwards allowlisted Manteca calls with the
* server-held md-api-key. Mount it under `pathPrefix` (default /manteca).
*/
export declare function createMantecaProxy(config: MantecaProxyConfig): (req: IncomingMessage, res: ServerResponse) => Promise<boolean>;
export declare function readBody(req: IncomingMessage): Promise<string>;
//# sourceMappingURL=proxy.d.ts.map

@@ -1,1 +0,1 @@

{"version":3,"file":"proxy.d.ts","sourceRoot":"","sources":["../src/proxy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAEjE,MAAM,WAAW,WAAW;IAC1B,6DAA6D;IAC7D,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,SAAS,GAAG,YAAY,CAAC;IACvC,4CAA4C;IAC5C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,kEAAkE;IAClE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;OAGG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,SAAS,CAAC,EAAE,OAAO,UAAU,CAAC,KAAK,CAAC;CACrC;AA+BD,wBAAgB,SAAS,CACvB,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,IAAI,CAAC,WAAW,EAAE,aAAa,GAAG,iBAAiB,CAAC,GAC3D,OAAO,CAUT;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,WAAW,IAU/C,KAAK,eAAe,EACpB,KAAK,cAAc,KAClB,OAAO,CAAC,OAAO,CAAC,CAkCpB;AAED,wBAAgB,QAAQ,CAAC,GAAG,EAAE,eAAe,GAAG,OAAO,CAAC,MAAM,CAAC,CAO9D"}
{"version":3,"file":"proxy.d.ts","sourceRoot":"","sources":["../src/proxy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAEjE,MAAM,WAAW,WAAW;IAC1B,6DAA6D;IAC7D,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,SAAS,GAAG,YAAY,CAAC;IACvC,4CAA4C;IAC5C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,kEAAkE;IAClE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;OAGG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,SAAS,CAAC,EAAE,OAAO,UAAU,CAAC,KAAK,CAAC;CACrC;AAED,MAAM,WAAW,kBAAkB;IACjC,8DAA8D;IAC9D,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,SAAS,GAAG,YAAY,CAAC;IACvC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,kEAAkE;IAClE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,OAAO,UAAU,CAAC,KAAK,CAAC;CACrC;AA+CD,wBAAgB,SAAS,CACvB,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,IAAI,CAAC,WAAW,EAAE,aAAa,GAAG,iBAAiB,CAAC,GAC3D,OAAO,CAUT;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAKtE;AA+BD;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,WAAW,IAU/C,KAAK,eAAe,EACpB,KAAK,cAAc,KAClB,OAAO,CAAC,OAAO,CAAC,CAoBpB;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,kBAAkB,IAUzD,KAAK,eAAe,EACpB,KAAK,cAAc,KAClB,OAAO,CAAC,OAAO,CAAC,CAoBpB;AAED,wBAAgB,QAAQ,CAAC,GAAG,EAAE,eAAe,GAAG,OAAO,CAAC,MAAM,CAAC,CAO9D"}
const UUID = "[0-9a-fA-F-]{36}";
const HEX24 = "[0-9a-fA-F]{24}";
/**
* Endpoint allowlist: only what a ramp frontend legitimately needs.
* Everything else (KYB, org management, partner statements, webhooks
* Etherfuse endpoint allowlist: only what a ramp frontend legitimately
* needs. Everything else (KYB, org management, partner statements, webhooks
* management…) stays server-side only.

@@ -22,2 +23,16 @@ */

};
/**
* Manteca endpoint allowlist. User onboarding, company config and accounting
* stay server-side only.
*/
const MANTECA_RULES = [
{ method: "GET", pattern: /^\/info\/supported-assets$/ },
{ method: "GET", pattern: /^\/prices\/direct\/[A-Z0-9_]+$/ },
{ method: "GET", pattern: /^\/users\/[A-Za-z0-9_-]+$/ },
{ method: "GET", pattern: new RegExp(`^/synthetics/${HEX24}$`) },
{ method: "POST", pattern: /^\/price-locks$/ },
{ method: "POST", pattern: /^\/synthetics\/ramp-on$/ },
{ method: "POST", pattern: /^\/synthetics\/ramp-off$/ },
{ method: "POST", pattern: new RegExp(`^/synthetics/${HEX24}/cancel$`) },
];
export function isAllowed(method, path, config) {

@@ -32,6 +47,32 @@ if (config.environment !== "production" &&

}
export function isMantecaAllowed(method, path) {
const pathNoQuery = path.split("?")[0];
return MANTECA_RULES.some((r) => r.method === method && r.pattern.test(pathNoQuery));
}
/** Forward an allowlisted request upstream with the server-held credentials. */
async function forward(target, method, headers, req, res, fetchImpl) {
const body = method === "GET" ? undefined : await readBody(req);
try {
const upstreamRes = await fetchImpl(target, { method, headers, body });
const text = await upstreamRes.text();
res.writeHead(upstreamRes.status, {
"Content-Type": upstreamRes.headers.get("content-type") ?? "application/json",
});
res.end(text);
}
catch {
res.writeHead(502, { "Content-Type": "application/json" });
res.end(JSON.stringify({ error: "Upstream request failed" }));
}
}
function deny(res) {
res.writeHead(403, { "Content-Type": "application/json" });
res.end(JSON.stringify({ error: "Endpoint not allowed through proxy" }));
}
/**
* Node http handler that forwards allowlisted ramp calls to Etherfuse with
* the server-held API key. Mount it under `pathPrefix` (default /etherfuse)
* in any Node server, or use createRampServer() for a standalone one.
* Node http handler that forwards allowlisted Etherfuse calls with the
* server-held API key. Mount it under `pathPrefix` (default /etherfuse) in
* any Node server, or use createRampServer() for a standalone one.
*
* The key is injected here, server-side — browser callers never send it.
*/

@@ -52,26 +93,31 @@ export function createRampProxy(config) {

if (!isAllowed(method, path, config)) {
res.writeHead(403, { "Content-Type": "application/json" });
res.end(JSON.stringify({ error: "Endpoint not allowed through proxy" }));
deny(res);
return true;
}
const body = method === "GET" ? undefined : await readBody(req);
try {
const upstreamRes = await fetchImpl(`${upstream}${path}`, {
method,
headers: {
Authorization: config.apiKey,
"Content-Type": "application/json",
},
body,
});
const text = await upstreamRes.text();
res.writeHead(upstreamRes.status, {
"Content-Type": upstreamRes.headers.get("content-type") ?? "application/json",
});
res.end(text);
await forward(`${upstream}${path}`, method, { Authorization: config.apiKey, "Content-Type": "application/json" }, req, res, fetchImpl);
return true;
};
}
/**
* Node http handler that forwards allowlisted Manteca calls with the
* server-held md-api-key. Mount it under `pathPrefix` (default /manteca).
*/
export function createMantecaProxy(config) {
const prefix = config.pathPrefix ?? "/manteca";
const upstream = config.upstreamUrl ??
(config.environment === "production"
? "https://api.manteca.dev/crypto/v2"
: "https://sandbox.manteca.dev/crypto/v2");
const fetchImpl = config.fetchImpl ?? globalThis.fetch;
return async function handle(req, res) {
const url = req.url ?? "";
if (!url.startsWith(prefix + "/"))
return false;
const path = url.slice(prefix.length);
const method = (req.method ?? "GET").toUpperCase();
if (!isMantecaAllowed(method, path)) {
deny(res);
return true;
}
catch {
res.writeHead(502, { "Content-Type": "application/json" });
res.end(JSON.stringify({ error: "Upstream request failed" }));
}
await forward(`${upstream}${path}`, method, { "md-api-key": config.apiKey, "Content-Type": "application/json" }, req, res, fetchImpl);
return true;

@@ -78,0 +124,0 @@ };

@@ -1,1 +0,1 @@

{"version":3,"file":"proxy.js","sourceRoot":"","sources":["../src/proxy.ts"],"names":[],"mappings":"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"}
{"version":3,"file":"proxy.js","sourceRoot":"","sources":["../src/proxy.ts"],"names":[],"mappings":"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"}
{
"name": "@ramp-kit/server",
"version": "0.1.2",
"version": "0.1.3",
"description": "Zero-dependency production backend for @ramp-kit/core: server-side API-key proxy with strict endpoint allowlist, plus Etherfuse/Manteca webhook signature verification (HMAC-SHA256, RFC 8785 canonicalization)",

@@ -5,0 +5,0 @@ "type": "module",