UNPKG

@edge-store/server

Version:

Image Handling for React/Next.js

92 lines (88 loc) 3.26 kB
'use strict'; Object.defineProperty(exports, '__esModule', { value: true }); const API_ENDPOINT = process.env.EDGE_STORE_API_ENDPOINT ?? 'https://api.edge-store.com'; const DEFAULT_BASE_URL = process.env.EDGE_STORE_BASE_URL ?? 'https://files.edge-store.com'; function EdgeStoreProvider(options) { const { accessKey = process.env.EDGE_STORE_ACCESS_KEY, secretKey = process.env.EDGE_STORE_SECRET_KEY, baseUrl = process.env.EDGE_STORE_BASE_URL ?? DEFAULT_BASE_URL } = options ?? {}; return { init: async ({ ctx, router })=>{ if (!accessKey || !secretKey) { throw new Error('Missing EDGE_STORE_ACCESS_KEY or EDGE_STORE_SECRET_KEY'); } const token = await getToken({ accessKey, secretKey, ctx, router }); return { token }; }, getBaseUrl () { return baseUrl; }, requestUpload: async ({ route, fileInfo })=>{ const reqUploadResponse = await fetch(`${API_ENDPOINT}/request-upload`, { method: 'POST', body: JSON.stringify({ bucketName: fileInfo.routeName, bucketType: route._def.type, isPublic: fileInfo.isPublic, path: fileInfo.path, extension: fileInfo.extension, size: fileInfo.size, metadata: fileInfo.metadata }), headers: { 'Content-Type': 'application/json', Authorization: `Basic ${Buffer.from(`${accessKey}:${secretKey}`).toString('base64')}` } }); const json = await reqUploadResponse.json(); if (!json.signedUrl) { throw new Error(json); } return { uploadUrl: json.signedUrl, accessUrl: json.url }; } }; } const getToken = async (params)=>{ const reqRoutes = Object.entries(params.router.routes).reduce((acc, [routeName, route])=>{ acc[routeName] = { path: route._def.path.map((p)=>{ const paramEntries = Object.entries(p); if (paramEntries[0] === undefined) { throw new Error('Missing path param'); } const [key, value] = paramEntries[0]; return { key, value: value() }; }), accessControl: route._def.accessControl }; return acc; }, {}); const res = await fetch(`${API_ENDPOINT}/get-token`, { method: 'POST', body: JSON.stringify({ ctx: params.ctx, routes: reqRoutes }), headers: { 'Content-Type': 'application/json', Authorization: `Basic ${Buffer.from(`${params.accessKey}:${params.secretKey}`).toString('base64')}` } }); if (!res.ok) { throw new Error('Failed to get token'); } const { token } = await res.json(); return token; }; exports.EdgeStoreProvider = EdgeStoreProvider;