@gigadrive/network-config 3.3.1 → 3.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.mts +187 -1
- package/dist/index.d.ts +187 -1
- package/dist/index.js +286 -21
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +285 -21
- package/dist/index.mjs.map +1 -1
- package/dist/nextjs-adapter.d.mts +7 -33
- package/dist/nextjs-adapter.d.ts +6 -34
- package/dist/nextjs-adapter.js +311 -21
- package/dist/nextjs-adapter.js.map +1 -1
- package/dist/nextjs-adapter.mjs +311 -22
- package/dist/nextjs-adapter.mjs.map +1 -1
- package/dist/nextjs-cache-components-handler.d.mts +20 -0
- package/dist/nextjs-cache-components-handler.d.ts +20 -0
- package/dist/nextjs-cache-components-handler.js +200 -0
- package/dist/nextjs-cache-components-handler.js.map +1 -0
- package/dist/nextjs-cache-components-handler.mjs +177 -0
- package/dist/nextjs-cache-components-handler.mjs.map +1 -0
- package/dist/nextjs-cache-handler.d.mts +12 -0
- package/dist/nextjs-cache-handler.d.ts +12 -0
- package/dist/nextjs-cache-handler.js +141 -0
- package/dist/nextjs-cache-handler.js.map +1 -0
- package/dist/nextjs-cache-handler.mjs +118 -0
- package/dist/nextjs-cache-handler.mjs.map +1 -0
- package/dist/nextjs-image-loader.d.mts +9 -0
- package/dist/nextjs-image-loader.d.ts +9 -0
- package/dist/nextjs-image-loader.js +36 -0
- package/dist/nextjs-image-loader.js.map +1 -0
- package/dist/nextjs-image-loader.mjs +15 -0
- package/dist/nextjs-image-loader.mjs.map +1 -0
- package/dist/v4/schema.json +85 -0
- package/package.json +19 -3
- package/src/v4/schema.json +85 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/nextjs-cache-components-handler.ts","../src/nextjs-runtime-cache-client.ts"],"sourcesContent":["import {\n getRuntimeCacheTagExpiration,\n readRuntimeCache,\n revalidateRuntimeCacheTags,\n writeRuntimeCache,\n} from './nextjs-runtime-cache-client';\n\ninterface CacheComponentEntry {\n value: ReadableStream<Uint8Array>;\n tags: string[];\n stale: number;\n timestamp: number;\n expire: number;\n revalidate: number;\n}\n\ninterface SerializedCacheComponentEntry extends Omit<CacheComponentEntry, 'value'> {\n value: Uint8Array;\n}\n\nconst pendingWrites = new Map<string, Promise<void>>();\n\nconst streamToBytes = async (stream: ReadableStream<Uint8Array>): Promise<Uint8Array> => {\n const chunks: Uint8Array[] = [];\n let size = 0;\n const reader = stream.getReader();\n while (true) {\n const result = await reader.read();\n if (result.done) break;\n chunks.push(result.value);\n size += result.value.byteLength;\n }\n const bytes = new Uint8Array(size);\n let offset = 0;\n for (const chunk of chunks) {\n bytes.set(chunk, offset);\n offset += chunk.byteLength;\n }\n return bytes;\n};\n\n/** Shared Network cache handler for Next.js Cache Components and `use cache`. */\nconst cacheHandler = {\n async get(cacheKey: string, softTags: string[]): Promise<CacheComponentEntry | undefined> {\n await pendingWrites.get(cacheKey);\n const value = (await readRuntimeCache('component', cacheKey)) as SerializedCacheComponentEntry | undefined;\n if (!value || !(value.value instanceof Uint8Array)) return undefined;\n const expiration = await getRuntimeCacheTagExpiration('component', softTags);\n if (expiration > value.timestamp) return undefined;\n return {\n ...value,\n value: new ReadableStream<Uint8Array>({\n start(controller) {\n controller.enqueue(value.value);\n controller.close();\n },\n }),\n };\n },\n\n async set(cacheKey: string, pendingEntry: Promise<CacheComponentEntry>): Promise<void> {\n const write = (async () => {\n const entry = await pendingEntry;\n const value = await streamToBytes(entry.value);\n await writeRuntimeCache('component', cacheKey, { ...entry, value }, entry.tags);\n })();\n pendingWrites.set(cacheKey, write);\n try {\n await write;\n } finally {\n if (pendingWrites.get(cacheKey) === write) pendingWrites.delete(cacheKey);\n }\n },\n\n async refreshTags(): Promise<void> {},\n\n getExpiration(tags: string[]): Promise<number> {\n return getRuntimeCacheTagExpiration('component', tags);\n },\n\n updateTags(tags: string[], durations?: { expire?: number }): Promise<void> {\n return revalidateRuntimeCacheTags('component', tags, durations);\n },\n};\n\nexport default cacheHandler;\n","interface RuntimeCacheEnvelope {\n value: unknown;\n}\n\ninterface AccessTokenResponse {\n access_token: string;\n expires_in?: number;\n}\n\nlet cachedToken: { value: string; expiresAt: number } | undefined;\n\nconst apiBaseUrl = (): string => (process.env.GIGADRIVE_API_URL ?? 'https://api.gigadrive.network').replace(/\\/$/, '');\n\nconst encodeBinary = (value: unknown, seen = new WeakSet<object>()): unknown => {\n if (value instanceof Uint8Array) {\n return { __gigadriveType: 'bytes', value: Buffer.from(value).toString('base64') };\n }\n if (value instanceof ArrayBuffer) {\n return { __gigadriveType: 'bytes', value: Buffer.from(value).toString('base64') };\n }\n if (Array.isArray(value)) return value.map((item) => encodeBinary(item, seen));\n if (typeof value !== 'object' || value === null) return value;\n if (seen.has(value)) throw new Error('Next.js cache entry contains a circular value');\n seen.add(value);\n const result: Record<string, unknown> = {};\n for (const [key, item] of Object.entries(value)) result[key] = encodeBinary(item, seen);\n seen.delete(value);\n return result;\n};\n\nconst decodeBinary = (value: unknown): unknown => {\n if (Array.isArray(value)) return value.map(decodeBinary);\n if (typeof value !== 'object' || value === null) return value;\n const record = value as Record<string, unknown>;\n if (record.__gigadriveType === 'bytes' && typeof record.value === 'string')\n return Buffer.from(record.value, 'base64');\n return Object.fromEntries(Object.entries(record).map(([key, item]) => [key, decodeBinary(item)]));\n};\n\nconst getAccessToken = async (): Promise<string> => {\n if (cachedToken && cachedToken.expiresAt > Date.now() + 30_000) return cachedToken.value;\n const clientId = process.env.GIGADRIVE_CLIENT_ID;\n const clientSecret = process.env.GIGADRIVE_CLIENT_SECRET;\n if (!clientId || !clientSecret) throw new Error('Gigadrive workload credentials are unavailable');\n\n const response = await fetch(`${apiBaseUrl()}/oauth2/token`, {\n method: 'POST',\n headers: {\n authorization: `Basic ${Buffer.from(`${clientId}:${clientSecret}`).toString('base64')}`,\n 'content-type': 'application/x-www-form-urlencoded',\n },\n body: 'grant_type=client_credentials',\n });\n if (!response.ok) throw new Error(`Gigadrive workload authentication failed with status ${response.status}`);\n const token = (await response.json()) as AccessTokenResponse;\n if (!token.access_token) throw new Error('Gigadrive workload authentication returned no access token');\n cachedToken = {\n value: token.access_token,\n expiresAt: Date.now() + Math.max(60, token.expires_in ?? 300) * 1000,\n };\n return token.access_token;\n};\n\nconst request = async (pathname: string, init: RequestInit, attempt = 0): Promise<Response> => {\n const token = await getAccessToken();\n try {\n const response = await fetch(`${apiBaseUrl()}${pathname}`, {\n ...init,\n headers: {\n authorization: `Bearer ${token}`,\n 'content-type': 'application/json',\n 'x-gigadrive-deployment-id': process.env.GIGADRIVE_DEPLOYMENT_ID ?? process.env.NEBULA_DEPLOYMENT_ID ?? '',\n 'x-gigadrive-build-id': process.env.NEXT_BUILD_ID ?? '',\n ...init.headers,\n },\n });\n if (response.status === 401 && attempt === 0) {\n cachedToken = undefined;\n return request(pathname, init, attempt + 1);\n }\n if (response.status >= 500 && attempt < 2) return request(pathname, init, attempt + 1);\n return response;\n } catch (error) {\n if (attempt < 2) return request(pathname, init, attempt + 1);\n throw error;\n }\n};\n\nconst cachePath = (kind: string, key: string): string =>\n `/internal/runtime-cache/v1/entries/${encodeURIComponent(kind)}/${encodeURIComponent(key)}`;\n\nexport const readRuntimeCache = async (kind: string, key: string): Promise<unknown | undefined> => {\n try {\n const response = await request(cachePath(kind, key), { method: 'GET' });\n if (response.status === 404) return undefined;\n if (!response.ok) return undefined;\n const envelope = (await response.json()) as RuntimeCacheEnvelope;\n return decodeBinary(envelope.value);\n } catch {\n return undefined;\n }\n};\n\nexport const writeRuntimeCache = async (\n kind: string,\n key: string,\n value: unknown,\n tags: readonly string[] = []\n): Promise<void> => {\n const response = await request(cachePath(kind, key), {\n method: 'PUT',\n body: JSON.stringify({ value: encodeBinary(value), tags }),\n });\n if (!response.ok) throw new Error(`Gigadrive runtime cache write failed with status ${response.status}`);\n};\n\nexport const revalidateRuntimeCacheTags = async (\n kind: string,\n tags: readonly string[],\n durations?: { expire?: number }\n): Promise<void> => {\n const response = await request('/internal/runtime-cache/v1/tags/revalidate', {\n method: 'POST',\n body: JSON.stringify({ kind, tags, durations }),\n });\n if (!response.ok) throw new Error(`Gigadrive runtime cache revalidation failed with status ${response.status}`);\n};\n\nexport const getRuntimeCacheTagExpiration = async (kind: string, tags: readonly string[]): Promise<number> => {\n try {\n const response = await request('/internal/runtime-cache/v1/tags/expiration', {\n method: 'POST',\n body: JSON.stringify({ kind, tags }),\n });\n if (!response.ok) return 0;\n const value = (await response.json()) as { expiration?: unknown };\n return typeof value.expiration === 'number' ? value.expiration : 0;\n } catch {\n return 0;\n }\n};\n\nexport const resetRuntimeCacheClientForTests = (): void => {\n cachedToken = undefined;\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACSA,IAAI;AAEJ,IAAM,aAAa,OAAe,QAAQ,IAAI,qBAAqB,iCAAiC,QAAQ,OAAO,EAAE;AAErH,IAAM,eAAe,CAAC,OAAgB,OAAO,oBAAI,QAAgB,MAAe;AAC9E,MAAI,iBAAiB,YAAY;AAC/B,WAAO,EAAE,iBAAiB,SAAS,OAAO,OAAO,KAAK,KAAK,EAAE,SAAS,QAAQ,EAAE;AAAA,EAClF;AACA,MAAI,iBAAiB,aAAa;AAChC,WAAO,EAAE,iBAAiB,SAAS,OAAO,OAAO,KAAK,KAAK,EAAE,SAAS,QAAQ,EAAE;AAAA,EAClF;AACA,MAAI,MAAM,QAAQ,KAAK,EAAG,QAAO,MAAM,IAAI,CAAC,SAAS,aAAa,MAAM,IAAI,CAAC;AAC7E,MAAI,OAAO,UAAU,YAAY,UAAU,KAAM,QAAO;AACxD,MAAI,KAAK,IAAI,KAAK,EAAG,OAAM,IAAI,MAAM,+CAA+C;AACpF,OAAK,IAAI,KAAK;AACd,QAAM,SAAkC,CAAC;AACzC,aAAW,CAAC,KAAK,IAAI,KAAK,OAAO,QAAQ,KAAK,EAAG,QAAO,GAAG,IAAI,aAAa,MAAM,IAAI;AACtF,OAAK,OAAO,KAAK;AACjB,SAAO;AACT;AAEA,IAAM,eAAe,CAAC,UAA4B;AAChD,MAAI,MAAM,QAAQ,KAAK,EAAG,QAAO,MAAM,IAAI,YAAY;AACvD,MAAI,OAAO,UAAU,YAAY,UAAU,KAAM,QAAO;AACxD,QAAM,SAAS;AACf,MAAI,OAAO,oBAAoB,WAAW,OAAO,OAAO,UAAU;AAChE,WAAO,OAAO,KAAK,OAAO,OAAO,QAAQ;AAC3C,SAAO,OAAO,YAAY,OAAO,QAAQ,MAAM,EAAE,IAAI,CAAC,CAAC,KAAK,IAAI,MAAM,CAAC,KAAK,aAAa,IAAI,CAAC,CAAC,CAAC;AAClG;AAEA,IAAM,iBAAiB,YAA6B;AAClD,MAAI,eAAe,YAAY,YAAY,KAAK,IAAI,IAAI,IAAQ,QAAO,YAAY;AACnF,QAAM,WAAW,QAAQ,IAAI;AAC7B,QAAM,eAAe,QAAQ,IAAI;AACjC,MAAI,CAAC,YAAY,CAAC,aAAc,OAAM,IAAI,MAAM,gDAAgD;AAEhG,QAAM,WAAW,MAAM,MAAM,GAAG,WAAW,CAAC,iBAAiB;AAAA,IAC3D,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,eAAe,SAAS,OAAO,KAAK,GAAG,QAAQ,IAAI,YAAY,EAAE,EAAE,SAAS,QAAQ,CAAC;AAAA,MACrF,gBAAgB;AAAA,IAClB;AAAA,IACA,MAAM;AAAA,EACR,CAAC;AACD,MAAI,CAAC,SAAS,GAAI,OAAM,IAAI,MAAM,wDAAwD,SAAS,MAAM,EAAE;AAC3G,QAAM,QAAS,MAAM,SAAS,KAAK;AACnC,MAAI,CAAC,MAAM,aAAc,OAAM,IAAI,MAAM,4DAA4D;AACrG,gBAAc;AAAA,IACZ,OAAO,MAAM;AAAA,IACb,WAAW,KAAK,IAAI,IAAI,KAAK,IAAI,IAAI,MAAM,cAAc,GAAG,IAAI;AAAA,EAClE;AACA,SAAO,MAAM;AACf;AAEA,IAAM,UAAU,OAAO,UAAkB,MAAmB,UAAU,MAAyB;AAC7F,QAAM,QAAQ,MAAM,eAAe;AACnC,MAAI;AACF,UAAM,WAAW,MAAM,MAAM,GAAG,WAAW,CAAC,GAAG,QAAQ,IAAI;AAAA,MACzD,GAAG;AAAA,MACH,SAAS;AAAA,QACP,eAAe,UAAU,KAAK;AAAA,QAC9B,gBAAgB;AAAA,QAChB,6BAA6B,QAAQ,IAAI,2BAA2B,QAAQ,IAAI,wBAAwB;AAAA,QACxG,wBAAwB,QAAQ,IAAI,iBAAiB;AAAA,QACrD,GAAG,KAAK;AAAA,MACV;AAAA,IACF,CAAC;AACD,QAAI,SAAS,WAAW,OAAO,YAAY,GAAG;AAC5C,oBAAc;AACd,aAAO,QAAQ,UAAU,MAAM,UAAU,CAAC;AAAA,IAC5C;AACA,QAAI,SAAS,UAAU,OAAO,UAAU,EAAG,QAAO,QAAQ,UAAU,MAAM,UAAU,CAAC;AACrF,WAAO;AAAA,EACT,SAAS,OAAO;AACd,QAAI,UAAU,EAAG,QAAO,QAAQ,UAAU,MAAM,UAAU,CAAC;AAC3D,UAAM;AAAA,EACR;AACF;AAEA,IAAM,YAAY,CAAC,MAAc,QAC/B,sCAAsC,mBAAmB,IAAI,CAAC,IAAI,mBAAmB,GAAG,CAAC;AAEpF,IAAM,mBAAmB,OAAO,MAAc,QAA8C;AACjG,MAAI;AACF,UAAM,WAAW,MAAM,QAAQ,UAAU,MAAM,GAAG,GAAG,EAAE,QAAQ,MAAM,CAAC;AACtE,QAAI,SAAS,WAAW,IAAK,QAAO;AACpC,QAAI,CAAC,SAAS,GAAI,QAAO;AACzB,UAAM,WAAY,MAAM,SAAS,KAAK;AACtC,WAAO,aAAa,SAAS,KAAK;AAAA,EACpC,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEO,IAAM,oBAAoB,OAC/B,MACA,KACA,OACA,OAA0B,CAAC,MACT;AAClB,QAAM,WAAW,MAAM,QAAQ,UAAU,MAAM,GAAG,GAAG;AAAA,IACnD,QAAQ;AAAA,IACR,MAAM,KAAK,UAAU,EAAE,OAAO,aAAa,KAAK,GAAG,KAAK,CAAC;AAAA,EAC3D,CAAC;AACD,MAAI,CAAC,SAAS,GAAI,OAAM,IAAI,MAAM,oDAAoD,SAAS,MAAM,EAAE;AACzG;AAEO,IAAM,6BAA6B,OACxC,MACA,MACA,cACkB;AAClB,QAAM,WAAW,MAAM,QAAQ,8CAA8C;AAAA,IAC3E,QAAQ;AAAA,IACR,MAAM,KAAK,UAAU,EAAE,MAAM,MAAM,UAAU,CAAC;AAAA,EAChD,CAAC;AACD,MAAI,CAAC,SAAS,GAAI,OAAM,IAAI,MAAM,2DAA2D,SAAS,MAAM,EAAE;AAChH;AAEO,IAAM,+BAA+B,OAAO,MAAc,SAA6C;AAC5G,MAAI;AACF,UAAM,WAAW,MAAM,QAAQ,8CAA8C;AAAA,MAC3E,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,EAAE,MAAM,KAAK,CAAC;AAAA,IACrC,CAAC;AACD,QAAI,CAAC,SAAS,GAAI,QAAO;AACzB,UAAM,QAAS,MAAM,SAAS,KAAK;AACnC,WAAO,OAAO,MAAM,eAAe,WAAW,MAAM,aAAa;AAAA,EACnE,QAAQ;AACN,WAAO;AAAA,EACT;AACF;;;ADxHA,IAAM,gBAAgB,oBAAI,IAA2B;AAErD,IAAM,gBAAgB,OAAO,WAA4D;AACvF,QAAM,SAAuB,CAAC;AAC9B,MAAI,OAAO;AACX,QAAM,SAAS,OAAO,UAAU;AAChC,SAAO,MAAM;AACX,UAAM,SAAS,MAAM,OAAO,KAAK;AACjC,QAAI,OAAO,KAAM;AACjB,WAAO,KAAK,OAAO,KAAK;AACxB,YAAQ,OAAO,MAAM;AAAA,EACvB;AACA,QAAM,QAAQ,IAAI,WAAW,IAAI;AACjC,MAAI,SAAS;AACb,aAAW,SAAS,QAAQ;AAC1B,UAAM,IAAI,OAAO,MAAM;AACvB,cAAU,MAAM;AAAA,EAClB;AACA,SAAO;AACT;AAGA,IAAM,eAAe;AAAA,EACnB,MAAM,IAAI,UAAkB,UAA8D;AACxF,UAAM,cAAc,IAAI,QAAQ;AAChC,UAAM,QAAS,MAAM,iBAAiB,aAAa,QAAQ;AAC3D,QAAI,CAAC,SAAS,EAAE,MAAM,iBAAiB,YAAa,QAAO;AAC3D,UAAM,aAAa,MAAM,6BAA6B,aAAa,QAAQ;AAC3E,QAAI,aAAa,MAAM,UAAW,QAAO;AACzC,WAAO;AAAA,MACL,GAAG;AAAA,MACH,OAAO,IAAI,eAA2B;AAAA,QACpC,MAAM,YAAY;AAChB,qBAAW,QAAQ,MAAM,KAAK;AAC9B,qBAAW,MAAM;AAAA,QACnB;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,MAAM,IAAI,UAAkB,cAA2D;AACrF,UAAM,SAAS,YAAY;AACzB,YAAM,QAAQ,MAAM;AACpB,YAAM,QAAQ,MAAM,cAAc,MAAM,KAAK;AAC7C,YAAM,kBAAkB,aAAa,UAAU,EAAE,GAAG,OAAO,MAAM,GAAG,MAAM,IAAI;AAAA,IAChF,GAAG;AACH,kBAAc,IAAI,UAAU,KAAK;AACjC,QAAI;AACF,YAAM;AAAA,IACR,UAAE;AACA,UAAI,cAAc,IAAI,QAAQ,MAAM,MAAO,eAAc,OAAO,QAAQ;AAAA,IAC1E;AAAA,EACF;AAAA,EAEA,MAAM,cAA6B;AAAA,EAAC;AAAA,EAEpC,cAAc,MAAiC;AAC7C,WAAO,6BAA6B,aAAa,IAAI;AAAA,EACvD;AAAA,EAEA,WAAW,MAAgB,WAAgD;AACzE,WAAO,2BAA2B,aAAa,MAAM,SAAS;AAAA,EAChE;AACF;AAEA,IAAO,0CAAQ;","names":[]}
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
// src/nextjs-runtime-cache-client.ts
|
|
2
|
+
var cachedToken;
|
|
3
|
+
var apiBaseUrl = () => (process.env.GIGADRIVE_API_URL ?? "https://api.gigadrive.network").replace(/\/$/, "");
|
|
4
|
+
var encodeBinary = (value, seen = /* @__PURE__ */ new WeakSet()) => {
|
|
5
|
+
if (value instanceof Uint8Array) {
|
|
6
|
+
return { __gigadriveType: "bytes", value: Buffer.from(value).toString("base64") };
|
|
7
|
+
}
|
|
8
|
+
if (value instanceof ArrayBuffer) {
|
|
9
|
+
return { __gigadriveType: "bytes", value: Buffer.from(value).toString("base64") };
|
|
10
|
+
}
|
|
11
|
+
if (Array.isArray(value)) return value.map((item) => encodeBinary(item, seen));
|
|
12
|
+
if (typeof value !== "object" || value === null) return value;
|
|
13
|
+
if (seen.has(value)) throw new Error("Next.js cache entry contains a circular value");
|
|
14
|
+
seen.add(value);
|
|
15
|
+
const result = {};
|
|
16
|
+
for (const [key, item] of Object.entries(value)) result[key] = encodeBinary(item, seen);
|
|
17
|
+
seen.delete(value);
|
|
18
|
+
return result;
|
|
19
|
+
};
|
|
20
|
+
var decodeBinary = (value) => {
|
|
21
|
+
if (Array.isArray(value)) return value.map(decodeBinary);
|
|
22
|
+
if (typeof value !== "object" || value === null) return value;
|
|
23
|
+
const record = value;
|
|
24
|
+
if (record.__gigadriveType === "bytes" && typeof record.value === "string")
|
|
25
|
+
return Buffer.from(record.value, "base64");
|
|
26
|
+
return Object.fromEntries(Object.entries(record).map(([key, item]) => [key, decodeBinary(item)]));
|
|
27
|
+
};
|
|
28
|
+
var getAccessToken = async () => {
|
|
29
|
+
if (cachedToken && cachedToken.expiresAt > Date.now() + 3e4) return cachedToken.value;
|
|
30
|
+
const clientId = process.env.GIGADRIVE_CLIENT_ID;
|
|
31
|
+
const clientSecret = process.env.GIGADRIVE_CLIENT_SECRET;
|
|
32
|
+
if (!clientId || !clientSecret) throw new Error("Gigadrive workload credentials are unavailable");
|
|
33
|
+
const response = await fetch(`${apiBaseUrl()}/oauth2/token`, {
|
|
34
|
+
method: "POST",
|
|
35
|
+
headers: {
|
|
36
|
+
authorization: `Basic ${Buffer.from(`${clientId}:${clientSecret}`).toString("base64")}`,
|
|
37
|
+
"content-type": "application/x-www-form-urlencoded"
|
|
38
|
+
},
|
|
39
|
+
body: "grant_type=client_credentials"
|
|
40
|
+
});
|
|
41
|
+
if (!response.ok) throw new Error(`Gigadrive workload authentication failed with status ${response.status}`);
|
|
42
|
+
const token = await response.json();
|
|
43
|
+
if (!token.access_token) throw new Error("Gigadrive workload authentication returned no access token");
|
|
44
|
+
cachedToken = {
|
|
45
|
+
value: token.access_token,
|
|
46
|
+
expiresAt: Date.now() + Math.max(60, token.expires_in ?? 300) * 1e3
|
|
47
|
+
};
|
|
48
|
+
return token.access_token;
|
|
49
|
+
};
|
|
50
|
+
var request = async (pathname, init, attempt = 0) => {
|
|
51
|
+
const token = await getAccessToken();
|
|
52
|
+
try {
|
|
53
|
+
const response = await fetch(`${apiBaseUrl()}${pathname}`, {
|
|
54
|
+
...init,
|
|
55
|
+
headers: {
|
|
56
|
+
authorization: `Bearer ${token}`,
|
|
57
|
+
"content-type": "application/json",
|
|
58
|
+
"x-gigadrive-deployment-id": process.env.GIGADRIVE_DEPLOYMENT_ID ?? process.env.NEBULA_DEPLOYMENT_ID ?? "",
|
|
59
|
+
"x-gigadrive-build-id": process.env.NEXT_BUILD_ID ?? "",
|
|
60
|
+
...init.headers
|
|
61
|
+
}
|
|
62
|
+
});
|
|
63
|
+
if (response.status === 401 && attempt === 0) {
|
|
64
|
+
cachedToken = void 0;
|
|
65
|
+
return request(pathname, init, attempt + 1);
|
|
66
|
+
}
|
|
67
|
+
if (response.status >= 500 && attempt < 2) return request(pathname, init, attempt + 1);
|
|
68
|
+
return response;
|
|
69
|
+
} catch (error) {
|
|
70
|
+
if (attempt < 2) return request(pathname, init, attempt + 1);
|
|
71
|
+
throw error;
|
|
72
|
+
}
|
|
73
|
+
};
|
|
74
|
+
var cachePath = (kind, key) => `/internal/runtime-cache/v1/entries/${encodeURIComponent(kind)}/${encodeURIComponent(key)}`;
|
|
75
|
+
var readRuntimeCache = async (kind, key) => {
|
|
76
|
+
try {
|
|
77
|
+
const response = await request(cachePath(kind, key), { method: "GET" });
|
|
78
|
+
if (response.status === 404) return void 0;
|
|
79
|
+
if (!response.ok) return void 0;
|
|
80
|
+
const envelope = await response.json();
|
|
81
|
+
return decodeBinary(envelope.value);
|
|
82
|
+
} catch {
|
|
83
|
+
return void 0;
|
|
84
|
+
}
|
|
85
|
+
};
|
|
86
|
+
var writeRuntimeCache = async (kind, key, value, tags = []) => {
|
|
87
|
+
const response = await request(cachePath(kind, key), {
|
|
88
|
+
method: "PUT",
|
|
89
|
+
body: JSON.stringify({ value: encodeBinary(value), tags })
|
|
90
|
+
});
|
|
91
|
+
if (!response.ok) throw new Error(`Gigadrive runtime cache write failed with status ${response.status}`);
|
|
92
|
+
};
|
|
93
|
+
var revalidateRuntimeCacheTags = async (kind, tags, durations) => {
|
|
94
|
+
const response = await request("/internal/runtime-cache/v1/tags/revalidate", {
|
|
95
|
+
method: "POST",
|
|
96
|
+
body: JSON.stringify({ kind, tags, durations })
|
|
97
|
+
});
|
|
98
|
+
if (!response.ok) throw new Error(`Gigadrive runtime cache revalidation failed with status ${response.status}`);
|
|
99
|
+
};
|
|
100
|
+
var getRuntimeCacheTagExpiration = async (kind, tags) => {
|
|
101
|
+
try {
|
|
102
|
+
const response = await request("/internal/runtime-cache/v1/tags/expiration", {
|
|
103
|
+
method: "POST",
|
|
104
|
+
body: JSON.stringify({ kind, tags })
|
|
105
|
+
});
|
|
106
|
+
if (!response.ok) return 0;
|
|
107
|
+
const value = await response.json();
|
|
108
|
+
return typeof value.expiration === "number" ? value.expiration : 0;
|
|
109
|
+
} catch {
|
|
110
|
+
return 0;
|
|
111
|
+
}
|
|
112
|
+
};
|
|
113
|
+
|
|
114
|
+
// src/nextjs-cache-components-handler.ts
|
|
115
|
+
var pendingWrites = /* @__PURE__ */ new Map();
|
|
116
|
+
var streamToBytes = async (stream) => {
|
|
117
|
+
const chunks = [];
|
|
118
|
+
let size = 0;
|
|
119
|
+
const reader = stream.getReader();
|
|
120
|
+
while (true) {
|
|
121
|
+
const result = await reader.read();
|
|
122
|
+
if (result.done) break;
|
|
123
|
+
chunks.push(result.value);
|
|
124
|
+
size += result.value.byteLength;
|
|
125
|
+
}
|
|
126
|
+
const bytes = new Uint8Array(size);
|
|
127
|
+
let offset = 0;
|
|
128
|
+
for (const chunk of chunks) {
|
|
129
|
+
bytes.set(chunk, offset);
|
|
130
|
+
offset += chunk.byteLength;
|
|
131
|
+
}
|
|
132
|
+
return bytes;
|
|
133
|
+
};
|
|
134
|
+
var cacheHandler = {
|
|
135
|
+
async get(cacheKey, softTags) {
|
|
136
|
+
await pendingWrites.get(cacheKey);
|
|
137
|
+
const value = await readRuntimeCache("component", cacheKey);
|
|
138
|
+
if (!value || !(value.value instanceof Uint8Array)) return void 0;
|
|
139
|
+
const expiration = await getRuntimeCacheTagExpiration("component", softTags);
|
|
140
|
+
if (expiration > value.timestamp) return void 0;
|
|
141
|
+
return {
|
|
142
|
+
...value,
|
|
143
|
+
value: new ReadableStream({
|
|
144
|
+
start(controller) {
|
|
145
|
+
controller.enqueue(value.value);
|
|
146
|
+
controller.close();
|
|
147
|
+
}
|
|
148
|
+
})
|
|
149
|
+
};
|
|
150
|
+
},
|
|
151
|
+
async set(cacheKey, pendingEntry) {
|
|
152
|
+
const write = (async () => {
|
|
153
|
+
const entry = await pendingEntry;
|
|
154
|
+
const value = await streamToBytes(entry.value);
|
|
155
|
+
await writeRuntimeCache("component", cacheKey, { ...entry, value }, entry.tags);
|
|
156
|
+
})();
|
|
157
|
+
pendingWrites.set(cacheKey, write);
|
|
158
|
+
try {
|
|
159
|
+
await write;
|
|
160
|
+
} finally {
|
|
161
|
+
if (pendingWrites.get(cacheKey) === write) pendingWrites.delete(cacheKey);
|
|
162
|
+
}
|
|
163
|
+
},
|
|
164
|
+
async refreshTags() {
|
|
165
|
+
},
|
|
166
|
+
getExpiration(tags) {
|
|
167
|
+
return getRuntimeCacheTagExpiration("component", tags);
|
|
168
|
+
},
|
|
169
|
+
updateTags(tags, durations) {
|
|
170
|
+
return revalidateRuntimeCacheTags("component", tags, durations);
|
|
171
|
+
}
|
|
172
|
+
};
|
|
173
|
+
var nextjs_cache_components_handler_default = cacheHandler;
|
|
174
|
+
export {
|
|
175
|
+
nextjs_cache_components_handler_default as default
|
|
176
|
+
};
|
|
177
|
+
//# sourceMappingURL=nextjs-cache-components-handler.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/nextjs-runtime-cache-client.ts","../src/nextjs-cache-components-handler.ts"],"sourcesContent":["interface RuntimeCacheEnvelope {\n value: unknown;\n}\n\ninterface AccessTokenResponse {\n access_token: string;\n expires_in?: number;\n}\n\nlet cachedToken: { value: string; expiresAt: number } | undefined;\n\nconst apiBaseUrl = (): string => (process.env.GIGADRIVE_API_URL ?? 'https://api.gigadrive.network').replace(/\\/$/, '');\n\nconst encodeBinary = (value: unknown, seen = new WeakSet<object>()): unknown => {\n if (value instanceof Uint8Array) {\n return { __gigadriveType: 'bytes', value: Buffer.from(value).toString('base64') };\n }\n if (value instanceof ArrayBuffer) {\n return { __gigadriveType: 'bytes', value: Buffer.from(value).toString('base64') };\n }\n if (Array.isArray(value)) return value.map((item) => encodeBinary(item, seen));\n if (typeof value !== 'object' || value === null) return value;\n if (seen.has(value)) throw new Error('Next.js cache entry contains a circular value');\n seen.add(value);\n const result: Record<string, unknown> = {};\n for (const [key, item] of Object.entries(value)) result[key] = encodeBinary(item, seen);\n seen.delete(value);\n return result;\n};\n\nconst decodeBinary = (value: unknown): unknown => {\n if (Array.isArray(value)) return value.map(decodeBinary);\n if (typeof value !== 'object' || value === null) return value;\n const record = value as Record<string, unknown>;\n if (record.__gigadriveType === 'bytes' && typeof record.value === 'string')\n return Buffer.from(record.value, 'base64');\n return Object.fromEntries(Object.entries(record).map(([key, item]) => [key, decodeBinary(item)]));\n};\n\nconst getAccessToken = async (): Promise<string> => {\n if (cachedToken && cachedToken.expiresAt > Date.now() + 30_000) return cachedToken.value;\n const clientId = process.env.GIGADRIVE_CLIENT_ID;\n const clientSecret = process.env.GIGADRIVE_CLIENT_SECRET;\n if (!clientId || !clientSecret) throw new Error('Gigadrive workload credentials are unavailable');\n\n const response = await fetch(`${apiBaseUrl()}/oauth2/token`, {\n method: 'POST',\n headers: {\n authorization: `Basic ${Buffer.from(`${clientId}:${clientSecret}`).toString('base64')}`,\n 'content-type': 'application/x-www-form-urlencoded',\n },\n body: 'grant_type=client_credentials',\n });\n if (!response.ok) throw new Error(`Gigadrive workload authentication failed with status ${response.status}`);\n const token = (await response.json()) as AccessTokenResponse;\n if (!token.access_token) throw new Error('Gigadrive workload authentication returned no access token');\n cachedToken = {\n value: token.access_token,\n expiresAt: Date.now() + Math.max(60, token.expires_in ?? 300) * 1000,\n };\n return token.access_token;\n};\n\nconst request = async (pathname: string, init: RequestInit, attempt = 0): Promise<Response> => {\n const token = await getAccessToken();\n try {\n const response = await fetch(`${apiBaseUrl()}${pathname}`, {\n ...init,\n headers: {\n authorization: `Bearer ${token}`,\n 'content-type': 'application/json',\n 'x-gigadrive-deployment-id': process.env.GIGADRIVE_DEPLOYMENT_ID ?? process.env.NEBULA_DEPLOYMENT_ID ?? '',\n 'x-gigadrive-build-id': process.env.NEXT_BUILD_ID ?? '',\n ...init.headers,\n },\n });\n if (response.status === 401 && attempt === 0) {\n cachedToken = undefined;\n return request(pathname, init, attempt + 1);\n }\n if (response.status >= 500 && attempt < 2) return request(pathname, init, attempt + 1);\n return response;\n } catch (error) {\n if (attempt < 2) return request(pathname, init, attempt + 1);\n throw error;\n }\n};\n\nconst cachePath = (kind: string, key: string): string =>\n `/internal/runtime-cache/v1/entries/${encodeURIComponent(kind)}/${encodeURIComponent(key)}`;\n\nexport const readRuntimeCache = async (kind: string, key: string): Promise<unknown | undefined> => {\n try {\n const response = await request(cachePath(kind, key), { method: 'GET' });\n if (response.status === 404) return undefined;\n if (!response.ok) return undefined;\n const envelope = (await response.json()) as RuntimeCacheEnvelope;\n return decodeBinary(envelope.value);\n } catch {\n return undefined;\n }\n};\n\nexport const writeRuntimeCache = async (\n kind: string,\n key: string,\n value: unknown,\n tags: readonly string[] = []\n): Promise<void> => {\n const response = await request(cachePath(kind, key), {\n method: 'PUT',\n body: JSON.stringify({ value: encodeBinary(value), tags }),\n });\n if (!response.ok) throw new Error(`Gigadrive runtime cache write failed with status ${response.status}`);\n};\n\nexport const revalidateRuntimeCacheTags = async (\n kind: string,\n tags: readonly string[],\n durations?: { expire?: number }\n): Promise<void> => {\n const response = await request('/internal/runtime-cache/v1/tags/revalidate', {\n method: 'POST',\n body: JSON.stringify({ kind, tags, durations }),\n });\n if (!response.ok) throw new Error(`Gigadrive runtime cache revalidation failed with status ${response.status}`);\n};\n\nexport const getRuntimeCacheTagExpiration = async (kind: string, tags: readonly string[]): Promise<number> => {\n try {\n const response = await request('/internal/runtime-cache/v1/tags/expiration', {\n method: 'POST',\n body: JSON.stringify({ kind, tags }),\n });\n if (!response.ok) return 0;\n const value = (await response.json()) as { expiration?: unknown };\n return typeof value.expiration === 'number' ? value.expiration : 0;\n } catch {\n return 0;\n }\n};\n\nexport const resetRuntimeCacheClientForTests = (): void => {\n cachedToken = undefined;\n};\n","import {\n getRuntimeCacheTagExpiration,\n readRuntimeCache,\n revalidateRuntimeCacheTags,\n writeRuntimeCache,\n} from './nextjs-runtime-cache-client';\n\ninterface CacheComponentEntry {\n value: ReadableStream<Uint8Array>;\n tags: string[];\n stale: number;\n timestamp: number;\n expire: number;\n revalidate: number;\n}\n\ninterface SerializedCacheComponentEntry extends Omit<CacheComponentEntry, 'value'> {\n value: Uint8Array;\n}\n\nconst pendingWrites = new Map<string, Promise<void>>();\n\nconst streamToBytes = async (stream: ReadableStream<Uint8Array>): Promise<Uint8Array> => {\n const chunks: Uint8Array[] = [];\n let size = 0;\n const reader = stream.getReader();\n while (true) {\n const result = await reader.read();\n if (result.done) break;\n chunks.push(result.value);\n size += result.value.byteLength;\n }\n const bytes = new Uint8Array(size);\n let offset = 0;\n for (const chunk of chunks) {\n bytes.set(chunk, offset);\n offset += chunk.byteLength;\n }\n return bytes;\n};\n\n/** Shared Network cache handler for Next.js Cache Components and `use cache`. */\nconst cacheHandler = {\n async get(cacheKey: string, softTags: string[]): Promise<CacheComponentEntry | undefined> {\n await pendingWrites.get(cacheKey);\n const value = (await readRuntimeCache('component', cacheKey)) as SerializedCacheComponentEntry | undefined;\n if (!value || !(value.value instanceof Uint8Array)) return undefined;\n const expiration = await getRuntimeCacheTagExpiration('component', softTags);\n if (expiration > value.timestamp) return undefined;\n return {\n ...value,\n value: new ReadableStream<Uint8Array>({\n start(controller) {\n controller.enqueue(value.value);\n controller.close();\n },\n }),\n };\n },\n\n async set(cacheKey: string, pendingEntry: Promise<CacheComponentEntry>): Promise<void> {\n const write = (async () => {\n const entry = await pendingEntry;\n const value = await streamToBytes(entry.value);\n await writeRuntimeCache('component', cacheKey, { ...entry, value }, entry.tags);\n })();\n pendingWrites.set(cacheKey, write);\n try {\n await write;\n } finally {\n if (pendingWrites.get(cacheKey) === write) pendingWrites.delete(cacheKey);\n }\n },\n\n async refreshTags(): Promise<void> {},\n\n getExpiration(tags: string[]): Promise<number> {\n return getRuntimeCacheTagExpiration('component', tags);\n },\n\n updateTags(tags: string[], durations?: { expire?: number }): Promise<void> {\n return revalidateRuntimeCacheTags('component', tags, durations);\n },\n};\n\nexport default cacheHandler;\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
interface IncrementalCacheContext {
|
|
2
|
+
tags?: string[];
|
|
3
|
+
}
|
|
4
|
+
/** Shared Network cache handler for ISR, server responses, fetches, and image metadata. */
|
|
5
|
+
declare class GigadriveNextCacheHandler {
|
|
6
|
+
get(key: string): Promise<unknown | null>;
|
|
7
|
+
set(key: string, data: unknown, context: IncrementalCacheContext): Promise<void>;
|
|
8
|
+
revalidateTag(tags: string | string[]): Promise<void>;
|
|
9
|
+
resetRequestCache(): void;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export { GigadriveNextCacheHandler as default };
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
interface IncrementalCacheContext {
|
|
2
|
+
tags?: string[];
|
|
3
|
+
}
|
|
4
|
+
/** Shared Network cache handler for ISR, server responses, fetches, and image metadata. */
|
|
5
|
+
declare class GigadriveNextCacheHandler {
|
|
6
|
+
get(key: string): Promise<unknown | null>;
|
|
7
|
+
set(key: string, data: unknown, context: IncrementalCacheContext): Promise<void>;
|
|
8
|
+
revalidateTag(tags: string | string[]): Promise<void>;
|
|
9
|
+
resetRequestCache(): void;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export = GigadriveNextCacheHandler;
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
|
|
20
|
+
// src/nextjs-cache-handler.ts
|
|
21
|
+
var nextjs_cache_handler_exports = {};
|
|
22
|
+
__export(nextjs_cache_handler_exports, {
|
|
23
|
+
default: () => GigadriveNextCacheHandler
|
|
24
|
+
});
|
|
25
|
+
module.exports = __toCommonJS(nextjs_cache_handler_exports);
|
|
26
|
+
|
|
27
|
+
// src/nextjs-runtime-cache-client.ts
|
|
28
|
+
var cachedToken;
|
|
29
|
+
var apiBaseUrl = () => (process.env.GIGADRIVE_API_URL ?? "https://api.gigadrive.network").replace(/\/$/, "");
|
|
30
|
+
var encodeBinary = (value, seen = /* @__PURE__ */ new WeakSet()) => {
|
|
31
|
+
if (value instanceof Uint8Array) {
|
|
32
|
+
return { __gigadriveType: "bytes", value: Buffer.from(value).toString("base64") };
|
|
33
|
+
}
|
|
34
|
+
if (value instanceof ArrayBuffer) {
|
|
35
|
+
return { __gigadriveType: "bytes", value: Buffer.from(value).toString("base64") };
|
|
36
|
+
}
|
|
37
|
+
if (Array.isArray(value)) return value.map((item) => encodeBinary(item, seen));
|
|
38
|
+
if (typeof value !== "object" || value === null) return value;
|
|
39
|
+
if (seen.has(value)) throw new Error("Next.js cache entry contains a circular value");
|
|
40
|
+
seen.add(value);
|
|
41
|
+
const result = {};
|
|
42
|
+
for (const [key, item] of Object.entries(value)) result[key] = encodeBinary(item, seen);
|
|
43
|
+
seen.delete(value);
|
|
44
|
+
return result;
|
|
45
|
+
};
|
|
46
|
+
var decodeBinary = (value) => {
|
|
47
|
+
if (Array.isArray(value)) return value.map(decodeBinary);
|
|
48
|
+
if (typeof value !== "object" || value === null) return value;
|
|
49
|
+
const record = value;
|
|
50
|
+
if (record.__gigadriveType === "bytes" && typeof record.value === "string")
|
|
51
|
+
return Buffer.from(record.value, "base64");
|
|
52
|
+
return Object.fromEntries(Object.entries(record).map(([key, item]) => [key, decodeBinary(item)]));
|
|
53
|
+
};
|
|
54
|
+
var getAccessToken = async () => {
|
|
55
|
+
if (cachedToken && cachedToken.expiresAt > Date.now() + 3e4) return cachedToken.value;
|
|
56
|
+
const clientId = process.env.GIGADRIVE_CLIENT_ID;
|
|
57
|
+
const clientSecret = process.env.GIGADRIVE_CLIENT_SECRET;
|
|
58
|
+
if (!clientId || !clientSecret) throw new Error("Gigadrive workload credentials are unavailable");
|
|
59
|
+
const response = await fetch(`${apiBaseUrl()}/oauth2/token`, {
|
|
60
|
+
method: "POST",
|
|
61
|
+
headers: {
|
|
62
|
+
authorization: `Basic ${Buffer.from(`${clientId}:${clientSecret}`).toString("base64")}`,
|
|
63
|
+
"content-type": "application/x-www-form-urlencoded"
|
|
64
|
+
},
|
|
65
|
+
body: "grant_type=client_credentials"
|
|
66
|
+
});
|
|
67
|
+
if (!response.ok) throw new Error(`Gigadrive workload authentication failed with status ${response.status}`);
|
|
68
|
+
const token = await response.json();
|
|
69
|
+
if (!token.access_token) throw new Error("Gigadrive workload authentication returned no access token");
|
|
70
|
+
cachedToken = {
|
|
71
|
+
value: token.access_token,
|
|
72
|
+
expiresAt: Date.now() + Math.max(60, token.expires_in ?? 300) * 1e3
|
|
73
|
+
};
|
|
74
|
+
return token.access_token;
|
|
75
|
+
};
|
|
76
|
+
var request = async (pathname, init, attempt = 0) => {
|
|
77
|
+
const token = await getAccessToken();
|
|
78
|
+
try {
|
|
79
|
+
const response = await fetch(`${apiBaseUrl()}${pathname}`, {
|
|
80
|
+
...init,
|
|
81
|
+
headers: {
|
|
82
|
+
authorization: `Bearer ${token}`,
|
|
83
|
+
"content-type": "application/json",
|
|
84
|
+
"x-gigadrive-deployment-id": process.env.GIGADRIVE_DEPLOYMENT_ID ?? process.env.NEBULA_DEPLOYMENT_ID ?? "",
|
|
85
|
+
"x-gigadrive-build-id": process.env.NEXT_BUILD_ID ?? "",
|
|
86
|
+
...init.headers
|
|
87
|
+
}
|
|
88
|
+
});
|
|
89
|
+
if (response.status === 401 && attempt === 0) {
|
|
90
|
+
cachedToken = void 0;
|
|
91
|
+
return request(pathname, init, attempt + 1);
|
|
92
|
+
}
|
|
93
|
+
if (response.status >= 500 && attempt < 2) return request(pathname, init, attempt + 1);
|
|
94
|
+
return response;
|
|
95
|
+
} catch (error) {
|
|
96
|
+
if (attempt < 2) return request(pathname, init, attempt + 1);
|
|
97
|
+
throw error;
|
|
98
|
+
}
|
|
99
|
+
};
|
|
100
|
+
var cachePath = (kind, key) => `/internal/runtime-cache/v1/entries/${encodeURIComponent(kind)}/${encodeURIComponent(key)}`;
|
|
101
|
+
var readRuntimeCache = async (kind, key) => {
|
|
102
|
+
try {
|
|
103
|
+
const response = await request(cachePath(kind, key), { method: "GET" });
|
|
104
|
+
if (response.status === 404) return void 0;
|
|
105
|
+
if (!response.ok) return void 0;
|
|
106
|
+
const envelope = await response.json();
|
|
107
|
+
return decodeBinary(envelope.value);
|
|
108
|
+
} catch {
|
|
109
|
+
return void 0;
|
|
110
|
+
}
|
|
111
|
+
};
|
|
112
|
+
var writeRuntimeCache = async (kind, key, value, tags = []) => {
|
|
113
|
+
const response = await request(cachePath(kind, key), {
|
|
114
|
+
method: "PUT",
|
|
115
|
+
body: JSON.stringify({ value: encodeBinary(value), tags })
|
|
116
|
+
});
|
|
117
|
+
if (!response.ok) throw new Error(`Gigadrive runtime cache write failed with status ${response.status}`);
|
|
118
|
+
};
|
|
119
|
+
var revalidateRuntimeCacheTags = async (kind, tags, durations) => {
|
|
120
|
+
const response = await request("/internal/runtime-cache/v1/tags/revalidate", {
|
|
121
|
+
method: "POST",
|
|
122
|
+
body: JSON.stringify({ kind, tags, durations })
|
|
123
|
+
});
|
|
124
|
+
if (!response.ok) throw new Error(`Gigadrive runtime cache revalidation failed with status ${response.status}`);
|
|
125
|
+
};
|
|
126
|
+
|
|
127
|
+
// src/nextjs-cache-handler.ts
|
|
128
|
+
var GigadriveNextCacheHandler = class {
|
|
129
|
+
async get(key) {
|
|
130
|
+
return await readRuntimeCache("incremental", key) ?? null;
|
|
131
|
+
}
|
|
132
|
+
async set(key, data, context) {
|
|
133
|
+
await writeRuntimeCache("incremental", key, data, context.tags ?? []);
|
|
134
|
+
}
|
|
135
|
+
async revalidateTag(tags) {
|
|
136
|
+
await revalidateRuntimeCacheTags("incremental", Array.isArray(tags) ? tags : [tags]);
|
|
137
|
+
}
|
|
138
|
+
resetRequestCache() {
|
|
139
|
+
}
|
|
140
|
+
};
|
|
141
|
+
//# sourceMappingURL=nextjs-cache-handler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/nextjs-cache-handler.ts","../src/nextjs-runtime-cache-client.ts"],"sourcesContent":["import { readRuntimeCache, revalidateRuntimeCacheTags, writeRuntimeCache } from './nextjs-runtime-cache-client';\n\ninterface IncrementalCacheContext {\n tags?: string[];\n}\n\n/** Shared Network cache handler for ISR, server responses, fetches, and image metadata. */\nexport default class GigadriveNextCacheHandler {\n async get(key: string): Promise<unknown | null> {\n return (await readRuntimeCache('incremental', key)) ?? null;\n }\n\n async set(key: string, data: unknown, context: IncrementalCacheContext): Promise<void> {\n await writeRuntimeCache('incremental', key, data, context.tags ?? []);\n }\n\n async revalidateTag(tags: string | string[]): Promise<void> {\n await revalidateRuntimeCacheTags('incremental', Array.isArray(tags) ? tags : [tags]);\n }\n\n resetRequestCache(): void {}\n}\n","interface RuntimeCacheEnvelope {\n value: unknown;\n}\n\ninterface AccessTokenResponse {\n access_token: string;\n expires_in?: number;\n}\n\nlet cachedToken: { value: string; expiresAt: number } | undefined;\n\nconst apiBaseUrl = (): string => (process.env.GIGADRIVE_API_URL ?? 'https://api.gigadrive.network').replace(/\\/$/, '');\n\nconst encodeBinary = (value: unknown, seen = new WeakSet<object>()): unknown => {\n if (value instanceof Uint8Array) {\n return { __gigadriveType: 'bytes', value: Buffer.from(value).toString('base64') };\n }\n if (value instanceof ArrayBuffer) {\n return { __gigadriveType: 'bytes', value: Buffer.from(value).toString('base64') };\n }\n if (Array.isArray(value)) return value.map((item) => encodeBinary(item, seen));\n if (typeof value !== 'object' || value === null) return value;\n if (seen.has(value)) throw new Error('Next.js cache entry contains a circular value');\n seen.add(value);\n const result: Record<string, unknown> = {};\n for (const [key, item] of Object.entries(value)) result[key] = encodeBinary(item, seen);\n seen.delete(value);\n return result;\n};\n\nconst decodeBinary = (value: unknown): unknown => {\n if (Array.isArray(value)) return value.map(decodeBinary);\n if (typeof value !== 'object' || value === null) return value;\n const record = value as Record<string, unknown>;\n if (record.__gigadriveType === 'bytes' && typeof record.value === 'string')\n return Buffer.from(record.value, 'base64');\n return Object.fromEntries(Object.entries(record).map(([key, item]) => [key, decodeBinary(item)]));\n};\n\nconst getAccessToken = async (): Promise<string> => {\n if (cachedToken && cachedToken.expiresAt > Date.now() + 30_000) return cachedToken.value;\n const clientId = process.env.GIGADRIVE_CLIENT_ID;\n const clientSecret = process.env.GIGADRIVE_CLIENT_SECRET;\n if (!clientId || !clientSecret) throw new Error('Gigadrive workload credentials are unavailable');\n\n const response = await fetch(`${apiBaseUrl()}/oauth2/token`, {\n method: 'POST',\n headers: {\n authorization: `Basic ${Buffer.from(`${clientId}:${clientSecret}`).toString('base64')}`,\n 'content-type': 'application/x-www-form-urlencoded',\n },\n body: 'grant_type=client_credentials',\n });\n if (!response.ok) throw new Error(`Gigadrive workload authentication failed with status ${response.status}`);\n const token = (await response.json()) as AccessTokenResponse;\n if (!token.access_token) throw new Error('Gigadrive workload authentication returned no access token');\n cachedToken = {\n value: token.access_token,\n expiresAt: Date.now() + Math.max(60, token.expires_in ?? 300) * 1000,\n };\n return token.access_token;\n};\n\nconst request = async (pathname: string, init: RequestInit, attempt = 0): Promise<Response> => {\n const token = await getAccessToken();\n try {\n const response = await fetch(`${apiBaseUrl()}${pathname}`, {\n ...init,\n headers: {\n authorization: `Bearer ${token}`,\n 'content-type': 'application/json',\n 'x-gigadrive-deployment-id': process.env.GIGADRIVE_DEPLOYMENT_ID ?? process.env.NEBULA_DEPLOYMENT_ID ?? '',\n 'x-gigadrive-build-id': process.env.NEXT_BUILD_ID ?? '',\n ...init.headers,\n },\n });\n if (response.status === 401 && attempt === 0) {\n cachedToken = undefined;\n return request(pathname, init, attempt + 1);\n }\n if (response.status >= 500 && attempt < 2) return request(pathname, init, attempt + 1);\n return response;\n } catch (error) {\n if (attempt < 2) return request(pathname, init, attempt + 1);\n throw error;\n }\n};\n\nconst cachePath = (kind: string, key: string): string =>\n `/internal/runtime-cache/v1/entries/${encodeURIComponent(kind)}/${encodeURIComponent(key)}`;\n\nexport const readRuntimeCache = async (kind: string, key: string): Promise<unknown | undefined> => {\n try {\n const response = await request(cachePath(kind, key), { method: 'GET' });\n if (response.status === 404) return undefined;\n if (!response.ok) return undefined;\n const envelope = (await response.json()) as RuntimeCacheEnvelope;\n return decodeBinary(envelope.value);\n } catch {\n return undefined;\n }\n};\n\nexport const writeRuntimeCache = async (\n kind: string,\n key: string,\n value: unknown,\n tags: readonly string[] = []\n): Promise<void> => {\n const response = await request(cachePath(kind, key), {\n method: 'PUT',\n body: JSON.stringify({ value: encodeBinary(value), tags }),\n });\n if (!response.ok) throw new Error(`Gigadrive runtime cache write failed with status ${response.status}`);\n};\n\nexport const revalidateRuntimeCacheTags = async (\n kind: string,\n tags: readonly string[],\n durations?: { expire?: number }\n): Promise<void> => {\n const response = await request('/internal/runtime-cache/v1/tags/revalidate', {\n method: 'POST',\n body: JSON.stringify({ kind, tags, durations }),\n });\n if (!response.ok) throw new Error(`Gigadrive runtime cache revalidation failed with status ${response.status}`);\n};\n\nexport const getRuntimeCacheTagExpiration = async (kind: string, tags: readonly string[]): Promise<number> => {\n try {\n const response = await request('/internal/runtime-cache/v1/tags/expiration', {\n method: 'POST',\n body: JSON.stringify({ kind, tags }),\n });\n if (!response.ok) return 0;\n const value = (await response.json()) as { expiration?: unknown };\n return typeof value.expiration === 'number' ? value.expiration : 0;\n } catch {\n return 0;\n }\n};\n\nexport const resetRuntimeCacheClientForTests = (): void => {\n cachedToken = undefined;\n};\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
// src/nextjs-runtime-cache-client.ts
|
|
2
|
+
var cachedToken;
|
|
3
|
+
var apiBaseUrl = () => (process.env.GIGADRIVE_API_URL ?? "https://api.gigadrive.network").replace(/\/$/, "");
|
|
4
|
+
var encodeBinary = (value, seen = /* @__PURE__ */ new WeakSet()) => {
|
|
5
|
+
if (value instanceof Uint8Array) {
|
|
6
|
+
return { __gigadriveType: "bytes", value: Buffer.from(value).toString("base64") };
|
|
7
|
+
}
|
|
8
|
+
if (value instanceof ArrayBuffer) {
|
|
9
|
+
return { __gigadriveType: "bytes", value: Buffer.from(value).toString("base64") };
|
|
10
|
+
}
|
|
11
|
+
if (Array.isArray(value)) return value.map((item) => encodeBinary(item, seen));
|
|
12
|
+
if (typeof value !== "object" || value === null) return value;
|
|
13
|
+
if (seen.has(value)) throw new Error("Next.js cache entry contains a circular value");
|
|
14
|
+
seen.add(value);
|
|
15
|
+
const result = {};
|
|
16
|
+
for (const [key, item] of Object.entries(value)) result[key] = encodeBinary(item, seen);
|
|
17
|
+
seen.delete(value);
|
|
18
|
+
return result;
|
|
19
|
+
};
|
|
20
|
+
var decodeBinary = (value) => {
|
|
21
|
+
if (Array.isArray(value)) return value.map(decodeBinary);
|
|
22
|
+
if (typeof value !== "object" || value === null) return value;
|
|
23
|
+
const record = value;
|
|
24
|
+
if (record.__gigadriveType === "bytes" && typeof record.value === "string")
|
|
25
|
+
return Buffer.from(record.value, "base64");
|
|
26
|
+
return Object.fromEntries(Object.entries(record).map(([key, item]) => [key, decodeBinary(item)]));
|
|
27
|
+
};
|
|
28
|
+
var getAccessToken = async () => {
|
|
29
|
+
if (cachedToken && cachedToken.expiresAt > Date.now() + 3e4) return cachedToken.value;
|
|
30
|
+
const clientId = process.env.GIGADRIVE_CLIENT_ID;
|
|
31
|
+
const clientSecret = process.env.GIGADRIVE_CLIENT_SECRET;
|
|
32
|
+
if (!clientId || !clientSecret) throw new Error("Gigadrive workload credentials are unavailable");
|
|
33
|
+
const response = await fetch(`${apiBaseUrl()}/oauth2/token`, {
|
|
34
|
+
method: "POST",
|
|
35
|
+
headers: {
|
|
36
|
+
authorization: `Basic ${Buffer.from(`${clientId}:${clientSecret}`).toString("base64")}`,
|
|
37
|
+
"content-type": "application/x-www-form-urlencoded"
|
|
38
|
+
},
|
|
39
|
+
body: "grant_type=client_credentials"
|
|
40
|
+
});
|
|
41
|
+
if (!response.ok) throw new Error(`Gigadrive workload authentication failed with status ${response.status}`);
|
|
42
|
+
const token = await response.json();
|
|
43
|
+
if (!token.access_token) throw new Error("Gigadrive workload authentication returned no access token");
|
|
44
|
+
cachedToken = {
|
|
45
|
+
value: token.access_token,
|
|
46
|
+
expiresAt: Date.now() + Math.max(60, token.expires_in ?? 300) * 1e3
|
|
47
|
+
};
|
|
48
|
+
return token.access_token;
|
|
49
|
+
};
|
|
50
|
+
var request = async (pathname, init, attempt = 0) => {
|
|
51
|
+
const token = await getAccessToken();
|
|
52
|
+
try {
|
|
53
|
+
const response = await fetch(`${apiBaseUrl()}${pathname}`, {
|
|
54
|
+
...init,
|
|
55
|
+
headers: {
|
|
56
|
+
authorization: `Bearer ${token}`,
|
|
57
|
+
"content-type": "application/json",
|
|
58
|
+
"x-gigadrive-deployment-id": process.env.GIGADRIVE_DEPLOYMENT_ID ?? process.env.NEBULA_DEPLOYMENT_ID ?? "",
|
|
59
|
+
"x-gigadrive-build-id": process.env.NEXT_BUILD_ID ?? "",
|
|
60
|
+
...init.headers
|
|
61
|
+
}
|
|
62
|
+
});
|
|
63
|
+
if (response.status === 401 && attempt === 0) {
|
|
64
|
+
cachedToken = void 0;
|
|
65
|
+
return request(pathname, init, attempt + 1);
|
|
66
|
+
}
|
|
67
|
+
if (response.status >= 500 && attempt < 2) return request(pathname, init, attempt + 1);
|
|
68
|
+
return response;
|
|
69
|
+
} catch (error) {
|
|
70
|
+
if (attempt < 2) return request(pathname, init, attempt + 1);
|
|
71
|
+
throw error;
|
|
72
|
+
}
|
|
73
|
+
};
|
|
74
|
+
var cachePath = (kind, key) => `/internal/runtime-cache/v1/entries/${encodeURIComponent(kind)}/${encodeURIComponent(key)}`;
|
|
75
|
+
var readRuntimeCache = async (kind, key) => {
|
|
76
|
+
try {
|
|
77
|
+
const response = await request(cachePath(kind, key), { method: "GET" });
|
|
78
|
+
if (response.status === 404) return void 0;
|
|
79
|
+
if (!response.ok) return void 0;
|
|
80
|
+
const envelope = await response.json();
|
|
81
|
+
return decodeBinary(envelope.value);
|
|
82
|
+
} catch {
|
|
83
|
+
return void 0;
|
|
84
|
+
}
|
|
85
|
+
};
|
|
86
|
+
var writeRuntimeCache = async (kind, key, value, tags = []) => {
|
|
87
|
+
const response = await request(cachePath(kind, key), {
|
|
88
|
+
method: "PUT",
|
|
89
|
+
body: JSON.stringify({ value: encodeBinary(value), tags })
|
|
90
|
+
});
|
|
91
|
+
if (!response.ok) throw new Error(`Gigadrive runtime cache write failed with status ${response.status}`);
|
|
92
|
+
};
|
|
93
|
+
var revalidateRuntimeCacheTags = async (kind, tags, durations) => {
|
|
94
|
+
const response = await request("/internal/runtime-cache/v1/tags/revalidate", {
|
|
95
|
+
method: "POST",
|
|
96
|
+
body: JSON.stringify({ kind, tags, durations })
|
|
97
|
+
});
|
|
98
|
+
if (!response.ok) throw new Error(`Gigadrive runtime cache revalidation failed with status ${response.status}`);
|
|
99
|
+
};
|
|
100
|
+
|
|
101
|
+
// src/nextjs-cache-handler.ts
|
|
102
|
+
var GigadriveNextCacheHandler = class {
|
|
103
|
+
async get(key) {
|
|
104
|
+
return await readRuntimeCache("incremental", key) ?? null;
|
|
105
|
+
}
|
|
106
|
+
async set(key, data, context) {
|
|
107
|
+
await writeRuntimeCache("incremental", key, data, context.tags ?? []);
|
|
108
|
+
}
|
|
109
|
+
async revalidateTag(tags) {
|
|
110
|
+
await revalidateRuntimeCacheTags("incremental", Array.isArray(tags) ? tags : [tags]);
|
|
111
|
+
}
|
|
112
|
+
resetRequestCache() {
|
|
113
|
+
}
|
|
114
|
+
};
|
|
115
|
+
export {
|
|
116
|
+
GigadriveNextCacheHandler as default
|
|
117
|
+
};
|
|
118
|
+
//# sourceMappingURL=nextjs-cache-handler.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/nextjs-runtime-cache-client.ts","../src/nextjs-cache-handler.ts"],"sourcesContent":["interface RuntimeCacheEnvelope {\n value: unknown;\n}\n\ninterface AccessTokenResponse {\n access_token: string;\n expires_in?: number;\n}\n\nlet cachedToken: { value: string; expiresAt: number } | undefined;\n\nconst apiBaseUrl = (): string => (process.env.GIGADRIVE_API_URL ?? 'https://api.gigadrive.network').replace(/\\/$/, '');\n\nconst encodeBinary = (value: unknown, seen = new WeakSet<object>()): unknown => {\n if (value instanceof Uint8Array) {\n return { __gigadriveType: 'bytes', value: Buffer.from(value).toString('base64') };\n }\n if (value instanceof ArrayBuffer) {\n return { __gigadriveType: 'bytes', value: Buffer.from(value).toString('base64') };\n }\n if (Array.isArray(value)) return value.map((item) => encodeBinary(item, seen));\n if (typeof value !== 'object' || value === null) return value;\n if (seen.has(value)) throw new Error('Next.js cache entry contains a circular value');\n seen.add(value);\n const result: Record<string, unknown> = {};\n for (const [key, item] of Object.entries(value)) result[key] = encodeBinary(item, seen);\n seen.delete(value);\n return result;\n};\n\nconst decodeBinary = (value: unknown): unknown => {\n if (Array.isArray(value)) return value.map(decodeBinary);\n if (typeof value !== 'object' || value === null) return value;\n const record = value as Record<string, unknown>;\n if (record.__gigadriveType === 'bytes' && typeof record.value === 'string')\n return Buffer.from(record.value, 'base64');\n return Object.fromEntries(Object.entries(record).map(([key, item]) => [key, decodeBinary(item)]));\n};\n\nconst getAccessToken = async (): Promise<string> => {\n if (cachedToken && cachedToken.expiresAt > Date.now() + 30_000) return cachedToken.value;\n const clientId = process.env.GIGADRIVE_CLIENT_ID;\n const clientSecret = process.env.GIGADRIVE_CLIENT_SECRET;\n if (!clientId || !clientSecret) throw new Error('Gigadrive workload credentials are unavailable');\n\n const response = await fetch(`${apiBaseUrl()}/oauth2/token`, {\n method: 'POST',\n headers: {\n authorization: `Basic ${Buffer.from(`${clientId}:${clientSecret}`).toString('base64')}`,\n 'content-type': 'application/x-www-form-urlencoded',\n },\n body: 'grant_type=client_credentials',\n });\n if (!response.ok) throw new Error(`Gigadrive workload authentication failed with status ${response.status}`);\n const token = (await response.json()) as AccessTokenResponse;\n if (!token.access_token) throw new Error('Gigadrive workload authentication returned no access token');\n cachedToken = {\n value: token.access_token,\n expiresAt: Date.now() + Math.max(60, token.expires_in ?? 300) * 1000,\n };\n return token.access_token;\n};\n\nconst request = async (pathname: string, init: RequestInit, attempt = 0): Promise<Response> => {\n const token = await getAccessToken();\n try {\n const response = await fetch(`${apiBaseUrl()}${pathname}`, {\n ...init,\n headers: {\n authorization: `Bearer ${token}`,\n 'content-type': 'application/json',\n 'x-gigadrive-deployment-id': process.env.GIGADRIVE_DEPLOYMENT_ID ?? process.env.NEBULA_DEPLOYMENT_ID ?? '',\n 'x-gigadrive-build-id': process.env.NEXT_BUILD_ID ?? '',\n ...init.headers,\n },\n });\n if (response.status === 401 && attempt === 0) {\n cachedToken = undefined;\n return request(pathname, init, attempt + 1);\n }\n if (response.status >= 500 && attempt < 2) return request(pathname, init, attempt + 1);\n return response;\n } catch (error) {\n if (attempt < 2) return request(pathname, init, attempt + 1);\n throw error;\n }\n};\n\nconst cachePath = (kind: string, key: string): string =>\n `/internal/runtime-cache/v1/entries/${encodeURIComponent(kind)}/${encodeURIComponent(key)}`;\n\nexport const readRuntimeCache = async (kind: string, key: string): Promise<unknown | undefined> => {\n try {\n const response = await request(cachePath(kind, key), { method: 'GET' });\n if (response.status === 404) return undefined;\n if (!response.ok) return undefined;\n const envelope = (await response.json()) as RuntimeCacheEnvelope;\n return decodeBinary(envelope.value);\n } catch {\n return undefined;\n }\n};\n\nexport const writeRuntimeCache = async (\n kind: string,\n key: string,\n value: unknown,\n tags: readonly string[] = []\n): Promise<void> => {\n const response = await request(cachePath(kind, key), {\n method: 'PUT',\n body: JSON.stringify({ value: encodeBinary(value), tags }),\n });\n if (!response.ok) throw new Error(`Gigadrive runtime cache write failed with status ${response.status}`);\n};\n\nexport const revalidateRuntimeCacheTags = async (\n kind: string,\n tags: readonly string[],\n durations?: { expire?: number }\n): Promise<void> => {\n const response = await request('/internal/runtime-cache/v1/tags/revalidate', {\n method: 'POST',\n body: JSON.stringify({ kind, tags, durations }),\n });\n if (!response.ok) throw new Error(`Gigadrive runtime cache revalidation failed with status ${response.status}`);\n};\n\nexport const getRuntimeCacheTagExpiration = async (kind: string, tags: readonly string[]): Promise<number> => {\n try {\n const response = await request('/internal/runtime-cache/v1/tags/expiration', {\n method: 'POST',\n body: JSON.stringify({ kind, tags }),\n });\n if (!response.ok) return 0;\n const value = (await response.json()) as { expiration?: unknown };\n return typeof value.expiration === 'number' ? value.expiration : 0;\n } catch {\n return 0;\n }\n};\n\nexport const resetRuntimeCacheClientForTests = (): void => {\n cachedToken = undefined;\n};\n","import { readRuntimeCache, revalidateRuntimeCacheTags, writeRuntimeCache } from './nextjs-runtime-cache-client';\n\ninterface IncrementalCacheContext {\n tags?: string[];\n}\n\n/** Shared Network cache handler for ISR, server responses, fetches, and image metadata. */\nexport default class GigadriveNextCacheHandler {\n async get(key: string): Promise<unknown | null> {\n return (await readRuntimeCache('incremental', key)) ?? null;\n }\n\n async set(key: string, data: unknown, context: IncrementalCacheContext): Promise<void> {\n await writeRuntimeCache('incremental', key, data, context.tags ?? []);\n }\n\n async revalidateTag(tags: string | string[]): Promise<void> {\n await revalidateRuntimeCacheTags('incremental', Array.isArray(tags) ? tags : [tags]);\n }\n\n resetRequestCache(): void {}\n}\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
interface NextImageLoaderOptions {
|
|
2
|
+
src: string;
|
|
3
|
+
width: number;
|
|
4
|
+
quality?: number;
|
|
5
|
+
}
|
|
6
|
+
/** Builds the stable app-host URL consumed by Gigadrive's managed image optimizer. */
|
|
7
|
+
declare function gigadriveNextImageLoader({ src, width, quality }: NextImageLoaderOptions): string;
|
|
8
|
+
|
|
9
|
+
export { gigadriveNextImageLoader as default };
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
interface NextImageLoaderOptions {
|
|
2
|
+
src: string;
|
|
3
|
+
width: number;
|
|
4
|
+
quality?: number;
|
|
5
|
+
}
|
|
6
|
+
/** Builds the stable app-host URL consumed by Gigadrive's managed image optimizer. */
|
|
7
|
+
declare function gigadriveNextImageLoader({ src, width, quality }: NextImageLoaderOptions): string;
|
|
8
|
+
|
|
9
|
+
export = gigadriveNextImageLoader;
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
|
|
20
|
+
// src/nextjs-image-loader.ts
|
|
21
|
+
var nextjs_image_loader_exports = {};
|
|
22
|
+
__export(nextjs_image_loader_exports, {
|
|
23
|
+
default: () => gigadriveNextImageLoader
|
|
24
|
+
});
|
|
25
|
+
module.exports = __toCommonJS(nextjs_image_loader_exports);
|
|
26
|
+
var filenameHint = (source) => {
|
|
27
|
+
const pathname = source.startsWith("http://") || source.startsWith("https://") ? new URL(source).pathname : source;
|
|
28
|
+
const candidate = pathname.split("/").filter(Boolean).at(-1)?.split("?")[0] ?? "image";
|
|
29
|
+
return /\.[A-Za-z0-9]{2,5}$/.test(candidate) ? candidate : `${candidate || "image"}.image`;
|
|
30
|
+
};
|
|
31
|
+
function gigadriveNextImageLoader({ src, width, quality }) {
|
|
32
|
+
const parameters = new URLSearchParams({ width: String(width) });
|
|
33
|
+
if (quality !== void 0) parameters.set("quality", String(quality));
|
|
34
|
+
return `/_gigadrive/image/${encodeURIComponent(src)}/${encodeURIComponent(filenameHint(src))}?${parameters}`;
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=nextjs-image-loader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/nextjs-image-loader.ts"],"sourcesContent":["interface NextImageLoaderOptions {\n src: string;\n width: number;\n quality?: number;\n}\n\nconst filenameHint = (source: string): string => {\n const pathname = source.startsWith('http://') || source.startsWith('https://') ? new URL(source).pathname : source;\n const candidate = pathname.split('/').filter(Boolean).at(-1)?.split('?')[0] ?? 'image';\n return /\\.[A-Za-z0-9]{2,5}$/.test(candidate) ? candidate : `${candidate || 'image'}.image`;\n};\n\n/** Builds the stable app-host URL consumed by Gigadrive's managed image optimizer. */\nexport default function gigadriveNextImageLoader({ src, width, quality }: NextImageLoaderOptions): string {\n const parameters = new URLSearchParams({ width: String(width) });\n if (quality !== undefined) parameters.set('quality', String(quality));\n return `/_gigadrive/image/${encodeURIComponent(src)}/${encodeURIComponent(filenameHint(src))}?${parameters}`;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAMA,IAAM,eAAe,CAAC,WAA2B;AAC/C,QAAM,WAAW,OAAO,WAAW,SAAS,KAAK,OAAO,WAAW,UAAU,IAAI,IAAI,IAAI,MAAM,EAAE,WAAW;AAC5G,QAAM,YAAY,SAAS,MAAM,GAAG,EAAE,OAAO,OAAO,EAAE,GAAG,EAAE,GAAG,MAAM,GAAG,EAAE,CAAC,KAAK;AAC/E,SAAO,sBAAsB,KAAK,SAAS,IAAI,YAAY,GAAG,aAAa,OAAO;AACpF;AAGe,SAAR,yBAA0C,EAAE,KAAK,OAAO,QAAQ,GAAmC;AACxG,QAAM,aAAa,IAAI,gBAAgB,EAAE,OAAO,OAAO,KAAK,EAAE,CAAC;AAC/D,MAAI,YAAY,OAAW,YAAW,IAAI,WAAW,OAAO,OAAO,CAAC;AACpE,SAAO,qBAAqB,mBAAmB,GAAG,CAAC,IAAI,mBAAmB,aAAa,GAAG,CAAC,CAAC,IAAI,UAAU;AAC5G;","names":[]}
|