super-jwt
Version:
Super-JWT helps to authenticate your users based on Superfluid streams using JSON Web Tokens (JWT)
72 lines • 3.28 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.authenticateWithStream = authenticateWithStream;
exports.verifyToken = verifyToken;
const graphql_request_1 = require("graphql-request");
const jsonwebtoken_1 = __importDefault(require("jsonwebtoken"));
const defaultSubgraphUrls = {
sepolia: "https://subgraph-endpoints.superfluid.dev/eth-sepolia/protocol-v1",
opsepolia: "https://subgraph-endpoints.superfluid.dev/optimism-sepolia/protocol-v1",
fuji: "https://subgraph-endpoints.superfluid.dev/avalanche-fuji/protocol-v1",
bsepolia: "https://base-sepolia.subgraph.x.superfluid.dev/",
scrsepolia: "https://subgraph-endpoints.superfluid.dev/scroll-sepolia/protocol-v1",
matic: "https://subgraph-endpoints.superfluid.dev/polygon-mainnet/protocol-v1",
mainnet: "https://subgraph-endpoints.superfluid.dev/eth-mainnet/protocol-v1",
xdai: "https://subgraph-endpoints.superfluid.dev/xdai-mainnet/protocol-v1",
optimism: "https://subgraph-endpoints.superfluid.dev/optimism-mainnet/protocol-v1",
avalanche: "https://subgraph-endpoints.superfluid.dev/avalanche-c/protocol-v1",
bsc: "https://subgraph-endpoints.superfluid.dev/bsc-mainnet/protocol-v1",
celo: "https://subgraph-endpoints.superfluid.dev/celo-mainnet/protocol-v1",
base: "https://subgraph-endpoints.superfluid.dev/base-mainnet/protocol-v1"
};
const STREAMS_QUERY = (0, graphql_request_1.gql) `
query GetStreams($first: Int, $where: Stream_filter) {
streams(first: $first, where: $where) {
id
}
}
`;
// Retrieve streams using the Superfluid subgraph
async function getStreams({ chain, ...streamWhereParams }) {
const subgraphUrl = defaultSubgraphUrls[chain];
if (!subgraphUrl)
throw new Error(`super-jwt: Chain ${chain} is not supported`);
try {
const { streams } = await (0, graphql_request_1.request)(subgraphUrl, STREAMS_QUERY, {
first: 1,
where: {
...streamWhereParams
}
});
return streams;
}
catch (err) {
console.warn(`super-jwt: Failed to retrieve streams: ${err}`);
return [];
}
}
async function authenticateWithStream(streamPayload, secret, jwtOptions) {
const requiredParams = ["chain", "sender", "receiver", "token"];
if (!requiredParams.every((param) => streamPayload.hasOwnProperty(param))) {
throw new Error("super-jwt: Missing required stream payload params: chain, sender, receiver, token");
}
const streams = await getStreams(streamPayload);
if (!streams || streams.length === 0) {
throw new Error("super-jwt: No stream found to authenticate between sender and receiver");
}
const jwtToken = jsonwebtoken_1.default.sign(streamPayload, secret, jwtOptions);
return { token: jwtToken, stream: streamPayload };
}
function verifyToken(jwtToken, secret) {
try {
const decoded = jsonwebtoken_1.default.verify(jwtToken, secret);
return decoded;
}
catch (err) {
throw new Error(`super-jwt: failed to verify token: ${err}`);
}
}
//# sourceMappingURL=index.js.map