@medialane/sdk 0.211.0 → 0.212.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/{chunk-F7W6IWTL.js → chunk-CEPRY3SR.js} +9 -6
- package/dist/chunk-CEPRY3SR.js.map +1 -0
- package/dist/{chunk-ZVANOWIB.cjs → chunk-JCA5XMS6.cjs} +9 -5
- package/dist/chunk-JCA5XMS6.cjs.map +1 -0
- package/dist/index.cjs +32 -28
- package/dist/index.d.cts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/dist/server/index.cjs +32 -28
- package/dist/server/index.d.cts +6 -1
- package/dist/server/index.d.ts +6 -1
- package/dist/server/index.js +1 -1
- package/package.json +1 -1
- package/dist/chunk-F7W6IWTL.js.map +0 -1
- package/dist/chunk-ZVANOWIB.cjs.map +0 -1
|
@@ -620,13 +620,16 @@ function issueAccountSessionToken(secret, accountId, ttlSeconds = ACCOUNT_SESSIO
|
|
|
620
620
|
const payload = encodePayload({ accountId, iat, exp: iat + ttlSeconds });
|
|
621
621
|
return `${ACCOUNT_SESSION_PREFIX}${payload}.${sign(secret, ACCOUNT_SESSION_DOMAIN, payload)}`;
|
|
622
622
|
}
|
|
623
|
-
function
|
|
623
|
+
function readAccountSessionToken(secret, raw) {
|
|
624
624
|
const parts = splitToken(raw, ACCOUNT_SESSION_PREFIX);
|
|
625
625
|
if (!parts) return null;
|
|
626
626
|
if (!signatureMatches(secret, ACCOUNT_SESSION_DOMAIN, parts.payload, parts.signature)) return null;
|
|
627
627
|
const data = decodePayload(parts.payload);
|
|
628
|
-
if (!data?.accountId || !withinLifetime(data.iat, data.exp)) return null;
|
|
629
|
-
return data.accountId;
|
|
628
|
+
if (!data?.accountId || !data.iat || !withinLifetime(data.iat, data.exp)) return null;
|
|
629
|
+
return { accountId: data.accountId, issuedAt: data.iat };
|
|
630
|
+
}
|
|
631
|
+
function verifyAccountSessionToken(secret, raw) {
|
|
632
|
+
return readAccountSessionToken(secret, raw)?.accountId ?? null;
|
|
630
633
|
}
|
|
631
634
|
|
|
632
635
|
// src/utils/ipfs-gateway.ts
|
|
@@ -655,6 +658,6 @@ function resolveSafeImageContentType(contentType) {
|
|
|
655
658
|
}
|
|
656
659
|
var MAX_IPFS_GATEWAY_RESPONSE_BYTES = 25 * 1024 * 1024;
|
|
657
660
|
|
|
658
|
-
export { ACCOUNT_SESSION_COOKIE, ACCOUNT_SESSION_TTL_SECONDS, ALLOWED_IMAGE_CONTENT_TYPES, IDENTITY_TTL_SECONDS, IPFS_SAFE_CONTENT_TYPE_PREFIXES, MAX_IMAGE_PROXY_BYTES, MAX_IMAGE_REDIRECTS, MAX_IPFS_GATEWAY_RESPONSE_BYTES, createAppGateway, createAppSessionHandler, createImageProxyHandler, getBackendSignedUrl, isPrivateHost, isPrivateOrInsecureUrl, isPublicAppRoute, isSameOrigin, isValidIpfsCidPath, issueAccountSessionToken, issueSiwsToken, readBodyWithCap, resolveSafeImageContentType, uploadDirectoryToBackend, uploadFileToBackend, uploadJsonToBackend, validateUrl, verifyAccountSessionToken, verifySiwsToken };
|
|
659
|
-
//# sourceMappingURL=chunk-
|
|
660
|
-
//# sourceMappingURL=chunk-
|
|
661
|
+
export { ACCOUNT_SESSION_COOKIE, ACCOUNT_SESSION_TTL_SECONDS, ALLOWED_IMAGE_CONTENT_TYPES, IDENTITY_TTL_SECONDS, IPFS_SAFE_CONTENT_TYPE_PREFIXES, MAX_IMAGE_PROXY_BYTES, MAX_IMAGE_REDIRECTS, MAX_IPFS_GATEWAY_RESPONSE_BYTES, createAppGateway, createAppSessionHandler, createImageProxyHandler, getBackendSignedUrl, isPrivateHost, isPrivateOrInsecureUrl, isPublicAppRoute, isSameOrigin, isValidIpfsCidPath, issueAccountSessionToken, issueSiwsToken, readAccountSessionToken, readBodyWithCap, resolveSafeImageContentType, uploadDirectoryToBackend, uploadFileToBackend, uploadJsonToBackend, validateUrl, verifyAccountSessionToken, verifySiwsToken };
|
|
662
|
+
//# sourceMappingURL=chunk-CEPRY3SR.js.map
|
|
663
|
+
//# sourceMappingURL=chunk-CEPRY3SR.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/server/origin.ts","../src/server/app-gateway.ts","../src/server/app-session.ts","../src/server/ssrf-guard.ts","../src/server/image-proxy.ts","../src/server/backend-metadata.ts","../src/server/app-routes.ts","../src/server/siws-token.ts","../src/utils/ipfs-gateway.ts"],"names":["headers","json"],"mappings":";;;;;AAAO,SAAS,aAAa,GAAA,EAAuB;AAClD,EAAA,MAAM,MAAA,GAAS,GAAA,CAAI,OAAA,CAAQ,GAAA,CAAI,QAAQ,CAAA;AACvC,EAAA,IAAI,CAAC,QAAQ,OAAO,IAAA;AACpB,EAAA,MAAM,IAAA,GAAO,GAAA,CAAI,OAAA,CAAQ,GAAA,CAAI,MAAM,CAAA;AACnC,EAAA,IAAI;AACF,IAAA,OAAO,IAAI,GAAA,CAAI,MAAM,CAAA,CAAE,IAAA,KAAS,IAAA;AAAA,EAClC,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,KAAA;AAAA,EACT;AACF;;;ACNO,IAAM,sBAAA,GAAyB;AACtC,IAAM,uBAAA,GAA0B,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,EAAA;AAC/C,IAAM,gCAAgB,IAAI,GAAA,CAAI,CAAC,6BAAA,EAA+B,wBAAA,EAA0B,kBAAkB,CAAC,CAAA;AAC3G,IAAM,kBAAA,GAAqB,iDAAA;AAC3B,IAAM,uBAAA,uBAA8B,GAAA,CAAI;AAAA,EACtC,YAAA;AAAA,EAAc,YAAA;AAAA,EAAc,oBAAA;AAAA,EAAsB,qBAAA;AAAA,EAAuB,IAAA;AAAA,EAAM,UAAA;AAAA,EAC/E,mBAAA;AAAA,EAAqB,SAAA;AAAA,EAAW,MAAA;AAAA,EAAQ,gBAAA;AAAA,EAAkB,iBAAA;AAAA,EAAmB,QAAA;AAAA,EAC7E,WAAA;AAAA,EAAa,UAAA;AAAA,EAAY,cAAA;AAAA,EAAgB,mBAAA;AAAA,EAAqB;AAChE,CAAC,CAAA;AACD,IAAM,wBAAA,uBAA+B,GAAA,CAAI;AAAA,EACvC,YAAA;AAAA,EAAc,YAAA;AAAA,EAAc,mBAAA;AAAA,EAAqB,gBAAA;AAAA,EAAkB,kBAAA;AAAA,EAAoB;AACzF,CAAC,CAAA;AAaM,SAAS,UAAA,CAAW,KAAc,IAAA,EAA6B;AACpE,EAAA,MAAM,GAAA,GAAM,GAAA,CAAI,OAAA,CAAQ,GAAA,CAAI,QAAQ,CAAA;AACpC,EAAA,IAAI,CAAC,KAAK,OAAO,IAAA;AACjB,EAAA,KAAA,MAAW,IAAA,IAAQ,GAAA,CAAI,KAAA,CAAM,GAAG,CAAA,EAAG;AACjC,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,OAAA,CAAQ,GAAG,CAAA;AAC3B,IAAA,IAAI,OAAO,EAAA,IAAM,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,CAAE,IAAA,EAAK,KAAM,IAAA,SAAa,IAAA,CAAK,KAAA,CAAM,KAAK,CAAC,CAAA,CAAE,MAAK,IAAK,IAAA;AAAA,EAC1F;AACA,EAAA,OAAO,IAAA;AACT;AAEO,SAAS,aAAA,CAAc,KAAA,EAAe,MAAA,GAAS,uBAAA,EAAiC;AACrF,EAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,GAAA,CAAI,QAAA,KAAa,eAAe,UAAA,GAAa,EAAA;AACpE,EAAA,OAAO,GAAG,sBAAsB,CAAA,CAAA,EAAI,KAAK,CAAA,0CAAA,EAA6C,MAAM,GAAG,MAAM,CAAA,CAAA;AACvG;AAEA,SAAS,IAAA,CAAK,MAAe,MAAA,EAA0B;AACrD,EAAA,OAAO,QAAA,CAAS,IAAA,CAAK,IAAA,EAAM,EAAE,QAAQ,CAAA;AACvC;AAEO,SAAS,iBAAiB,MAAA,EAA+E;AAC9G,EAAA,MAAM,OAAA,GAAU,OAAO,SAAA,IAAa,KAAA;AACpC,EAAA,MAAM,IAAA,GAAO,MAAA,CAAO,UAAA,CAAW,OAAA,CAAQ,OAAO,EAAE,CAAA;AAEhD,EAAA,OAAO,eAAe,UAAA,CAAW,GAAA,EAAK,IAAA,EAAM;AAC1C,IAAA,IAAI,CAAC,YAAA,CAAa,GAAG,CAAA,EAAG,OAAO,KAAK,EAAE,KAAA,EAAO,uCAAA,EAAwC,EAAG,GAAG,CAAA;AAC3F,IAAA,IAAI,CAAC,OAAO,MAAA,EAAQ,OAAO,KAAK,EAAE,KAAA,EAAO,qBAAA,EAAsB,EAAG,GAAG,CAAA;AACrE,IAAA,IAAI,KAAK,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,KAAM,OAAO,CAAA,KAAM,IAAA,IAAQ,CAAA,KAAM,EAAE,GAAG,OAAO,IAAA,CAAK,EAAE,KAAA,EAAO,cAAA,IAAkB,GAAG,CAAA;AAErG,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,IAAA,CAAK,GAAG,CAAA;AAC5B,IAAA,MAAM,MAAA,GAAS,GAAA,CAAI,MAAA,CAAO,WAAA,EAAY;AACtC,IAAA,IAAI,CAAA,CAAE,MAAA,CAAO,KAAA,CAAM,MAAM,KAAK,EAAC,EAAG,IAAA,CAAK,CAAC,EAAA,KAAO,EAAA,CAAG,IAAA,CAAK,MAAM,CAAC,CAAA,EAAG;AAC/D,MAAA,OAAO,IAAA,CAAK,EAAE,KAAA,EAAO,CAAA,kBAAA,EAAqB,MAAM,CAAA,KAAA,EAAQ,MAAM,CAAA,CAAA,EAAG,EAAG,GAAG,CAAA;AAAA,IACzE;AAEA,IAAA,MAAMA,QAAAA,GAAU,IAAI,OAAA,EAAQ;AAC5B,IAAA,GAAA,CAAI,OAAA,CAAQ,OAAA,CAAQ,CAAC,CAAA,EAAG,CAAA,KAAM;AAC5B,MAAA,IAAI,CAAC,uBAAA,CAAwB,GAAA,CAAI,CAAA,CAAE,WAAA,EAAa,CAAA,EAAGA,QAAAA,CAAQ,GAAA,CAAI,CAAA,EAAG,CAAC,CAAA;AAAA,IACrE,CAAC,CAAA;AACD,IAAAA,QAAAA,CAAQ,GAAA,CAAI,WAAA,EAAa,MAAA,CAAO,MAAM,CAAA;AACtC,IAAAA,QAAAA,CAAQ,GAAA,CAAI,UAAA,EAAY,MAAA,CAAO,KAAK,CAAA;AACpC,IAAA,IAAI,OAAO,SAAA,EAAWA,SAAQ,GAAA,CAAI,cAAA,EAAgB,OAAO,SAAS,CAAA;AAClE,IAAA,MAAM,OAAA,GAAU,UAAA,CAAW,GAAA,EAAK,sBAAsB,CAAA;AACtD,IAAA,IAAI,OAAA,EAASA,QAAAA,CAAQ,GAAA,CAAI,qBAAqB,OAAO,CAAA;AAErD,IAAA,MAAM,MAAA,GAAS,IAAI,GAAA,CAAI,GAAA,CAAI,GAAG,CAAA,CAAE,MAAA;AAChC,IAAA,MAAM,MAAA,GAAS,CAAA,EAAG,IAAI,CAAA,IAAA,EAAO,IAAA,CAAK,GAAA,CAAI,kBAAkB,CAAA,CAAE,IAAA,CAAK,GAAG,CAAC,CAAA,EAAG,MAAM,CAAA,CAAA;AAC5E,IAAA,MAAM,OAAA,GAAU,MAAA,KAAW,KAAA,IAAS,MAAA,KAAW,MAAA;AAE/C,IAAA,IAAI,GAAA;AACJ,IAAA,IAAI;AACF,MAAA,GAAA,GAAM,MAAM,QAAQ,MAAA,EAAQ;AAAA,QAC1B,MAAA;AAAA,QACA,OAAA,EAAAA,QAAAA;AAAA,QACA,IAAA,EAAM,OAAA,GAAU,MAAM,GAAA,CAAI,aAAY,GAAI,KAAA,CAAA;AAAA,QAC1C,KAAA,EAAO,UAAA;AAAA,QACP,QAAA,EAAU,QAAA;AAAA,QACV,MAAA,EAAQ,WAAA,CAAY,OAAA,CAAQ,MAAA,CAAO,aAAa,IAAM;AAAA,OACvD,CAAA;AAAA,IACH,SAAS,CAAA,EAAG;AACV,MAAA,IAAI,CAAA,YAAa,YAAA,IAAgB,CAAA,CAAE,IAAA,KAAS,cAAA,EAAgB;AAC1D,QAAA,OAAO,IAAA,CAAK,EAAE,KAAA,EAAO,sCAAA,IAA0C,GAAG,CAAA;AAAA,MACpE;AACA,MAAA,OAAO,IAAA,CAAK,EAAE,KAAA,EAAO,qBAAA,IAAyB,GAAG,CAAA;AAAA,IACnD;AAEA,IAAA,MAAM,GAAA,GAAM,IAAI,OAAA,EAAQ;AACxB,IAAA,GAAA,CAAI,OAAA,CAAQ,OAAA,CAAQ,CAAC,CAAA,EAAG,CAAA,KAAM;AAC5B,MAAA,IAAI,CAAC,wBAAA,CAAyB,GAAA,CAAI,CAAA,CAAE,WAAA,EAAa,CAAA,EAAG,GAAA,CAAI,GAAA,CAAI,CAAA,EAAG,CAAC,CAAA;AAAA,IAClE,CAAC,CAAA;AAED,IAAA,IAAI,WAAW,MAAA,IAAU,GAAA,CAAI,MAAM,aAAA,CAAc,GAAA,CAAI,MAAM,CAAA,EAAG;AAC5D,MAAA,MAAM,IAAA,GAAO,MAAM,GAAA,CAAI,IAAA,EAAK;AAC5B,MAAA,IAAI,IAAA,GAAuC,IAAA;AAC3C,MAAA,IAAI;AACF,QAAA,IAAA,GAAO,IAAA,CAAK,MAAM,IAAI,CAAA;AAAA,MACxB,CAAA,CAAA,MAAQ;AACN,QAAA,IAAA,GAAO,IAAA;AAAA,MACT;AACA,MAAA,IAAI,CAAC,IAAA,EAAM,OAAO,IAAI,QAAA,CAAS,IAAA,EAAM,EAAE,MAAA,EAAQ,GAAA,CAAI,MAAA,EAAQ,OAAA,EAAS,GAAA,EAAK,CAAA;AACzE,MAAA,MAAM,QAAQ,OAAO,IAAA,CAAK,YAAA,KAAiB,QAAA,GAAW,KAAK,YAAA,GAAe,IAAA;AAC1E,MAAA,OAAO,IAAA,CAAK,YAAA;AACZ,MAAA,OAAO,IAAA,CAAK,KAAA;AACZ,MAAA,GAAA,CAAI,GAAA,CAAI,gBAAgB,kBAAkB,CAAA;AAC1C,MAAA,IAAI,OAAO,GAAA,CAAI,MAAA,CAAO,YAAA,EAAc,aAAA,CAAc,KAAK,CAAC,CAAA;AACxD,MAAA,OAAO,IAAI,QAAA,CAAS,IAAA,CAAK,SAAA,CAAU,IAAI,CAAA,EAAG,EAAE,MAAA,EAAQ,GAAA,CAAI,MAAA,EAAQ,OAAA,EAAS,GAAA,EAAK,CAAA;AAAA,IAChF;AAEA,IAAA,IAAI,WAAW,KAAA,IAAS,GAAA,CAAI,EAAA,IAAM,CAAC,YAAY,MAAA,CAAO,aAAA,IAAiB,EAAC,EAAG,KAAK,CAAC,EAAA,KAAO,GAAG,IAAA,CAAK,MAAM,CAAC,CAAA,EAAG;AACxG,MAAA,GAAA,CAAI,GAAA,CAAI,iBAAiB,kBAAkB,CAAA;AAAA,IAC7C;AACA,IAAA,OAAO,IAAI,QAAA,CAAS,GAAA,CAAI,IAAA,EAAM,EAAE,QAAQ,GAAA,CAAI,MAAA,EAAQ,OAAA,EAAS,GAAA,EAAK,CAAA;AAAA,EACpE,CAAA;AACF;;;AC5GA,SAAS,SAAA,GAAsB;AAC7B,EAAA,MAAM,GAAA,GAAM,QAAA,CAAS,IAAA,CAAK,IAAI,CAAA;AAC9B,EAAA,GAAA,CAAI,QAAQ,MAAA,CAAO,YAAA,EAAc,aAAA,CAAc,EAAA,EAAI,CAAC,CAAC,CAAA;AACrD,EAAA,OAAO,GAAA;AACT;AAEO,SAAS,wBAAwB,MAAA,EAGtC;AACA,EAAA,MAAM,OAAA,GAAU,OAAO,SAAA,IAAa,KAAA;AACpC,EAAA,MAAM,IAAA,GAAO,MAAA,CAAO,UAAA,CAAW,OAAA,CAAQ,OAAO,EAAE,CAAA;AAChD,EAAA,OAAO;AAAA,IACL,MAAM,IAAI,GAAA,EAAK;AACb,MAAA,MAAM,OAAA,GAAU,UAAA,CAAW,GAAA,EAAK,sBAAsB,CAAA;AACtD,MAAA,IAAI,CAAC,OAAA,EAAS,OAAO,QAAA,CAAS,KAAK,IAAI,CAAA;AACvC,MAAA,MAAM,GAAA,GAAM,MAAM,OAAA,CAAQ,CAAA,EAAG,IAAI,CAAA,YAAA,CAAA,EAAgB;AAAA,QAC/C,OAAA,EAAS;AAAA,UACP,WAAA,EAAa,OAAO,MAAA,IAAU,EAAA;AAAA,UAC9B,YAAY,MAAA,CAAO,KAAA;AAAA,UACnB,GAAI,OAAO,SAAA,GAAY,EAAE,gBAAgB,MAAA,CAAO,SAAA,KAAc,EAAC;AAAA,UAC/D,mBAAA,EAAqB;AAAA,SACvB;AAAA,QACA,KAAA,EAAO;AAAA,OACR,CAAA;AACD,MAAA,IAAI,IAAI,MAAA,KAAW,GAAA,IAAO,IAAI,MAAA,KAAW,GAAA,SAAY,SAAA,EAAU;AAC/D,MAAA,IAAI,CAAC,GAAA,CAAI,EAAA,EAAI,OAAO,QAAA,CAAS,IAAA,CAAK,EAAE,KAAA,EAAO,sBAAA,EAAuB,EAAG,EAAE,MAAA,EAAQ,KAAK,CAAA;AACpF,MAAA,OAAO,QAAA,CAAS,IAAA,CAAK,MAAM,GAAA,CAAI,MAAM,CAAA;AAAA,IACvC,CAAA;AAAA,IACA,MAAM,MAAA,GAAS;AACb,MAAA,OAAO,SAAA,EAAU;AAAA,IACnB;AAAA,GACF;AACF;;;AC5CO,IAAM,2BAAA,uBAAkC,GAAA,CAAI;AAAA,EACjD,YAAA;AAAA,EACA,WAAA;AAAA,EACA,WAAA;AAAA,EACA,WAAA;AAAA,EACA,YAAA;AAAA,EACA,eAAA;AAAA,EACA,YAAA;AAAA,EACA,WAAA;AAAA,EACA;AACF,CAAC;AAEM,IAAM,mBAAA,GAAsB;AAE5B,IAAM,qBAAA,GAAwB,KAAK,IAAA,GAAO;AAEjD,SAAS,UAAU,EAAA,EAA6B;AAC9C,EAAA,MAAM,KAAA,GAAQ,EAAA,CAAG,KAAA,CAAM,GAAG,CAAA;AAC1B,EAAA,IAAI,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AAC/B,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,IAAI,CAAC,WAAA,CAAY,IAAA,CAAK,IAAI,GAAG,OAAO,IAAA;AACpC,IAAA,MAAM,CAAA,GAAI,OAAO,IAAI,CAAA;AACrB,IAAA,IAAI,CAAA,GAAI,KAAK,OAAO,IAAA;AACpB,IAAA,KAAA,CAAM,KAAK,CAAC,CAAA;AAAA,EACd;AACA,EAAA,OAAO,KAAA;AACT;AAEA,SAAS,cAAc,KAAA,EAA0B;AAC/C,EAAA,MAAM,CAAA,GAAI,MAAM,CAAC,CAAA;AACjB,EAAA,MAAM,CAAA,GAAI,MAAM,CAAC,CAAA;AACjB,EAAA,MAAM,CAAA,GAAI,MAAM,CAAC,CAAA;AACjB,EAAA,IAAI,CAAA,KAAM,GAAG,OAAO,IAAA;AACpB,EAAA,IAAI,CAAA,KAAM,IAAI,OAAO,IAAA;AACrB,EAAA,IAAI,MAAM,GAAA,IAAO,CAAA,IAAK,EAAA,IAAM,CAAA,IAAK,KAAK,OAAO,IAAA;AAC7C,EAAA,IAAI,CAAA,KAAM,KAAK,OAAO,IAAA;AACtB,EAAA,IAAI,CAAA,KAAM,GAAA,IAAO,CAAA,KAAM,GAAA,EAAK,OAAO,IAAA;AACnC,EAAA,IAAI,MAAM,GAAA,IAAO,CAAA,IAAK,EAAA,IAAM,CAAA,IAAK,IAAI,OAAO,IAAA;AAC5C,EAAA,IAAI,MAAM,GAAA,IAAO,CAAA,KAAM,CAAA,IAAK,CAAA,KAAM,GAAG,OAAO,IAAA;AAC5C,EAAA,IAAI,CAAA,KAAM,GAAA,IAAO,CAAA,KAAM,GAAA,EAAK,OAAO,IAAA;AACnC,EAAA,IAAI,MAAM,GAAA,KAAQ,CAAA,KAAM,EAAA,IAAM,CAAA,KAAM,KAAK,OAAO,IAAA;AAChD,EAAA,IAAI,CAAA,IAAK,KAAK,OAAO,IAAA;AACrB,EAAA,OAAO,KAAA;AACT;AAEA,SAAS,WAAW,KAAA,EAAgC;AAClD,EAAA,IAAI,EAAA,GAAK,KAAA;AAET,EAAA,IAAI,UAAA,GAA8B,IAAA;AAClC,EAAA,MAAM,MAAA,GAAS,EAAA,CAAG,KAAA,CAAM,uCAAuC,CAAA;AAC/D,EAAA,IAAI,MAAA,IAAU,EAAA,CAAG,QAAA,CAAS,GAAG,CAAA,EAAG;AAC9B,IAAA,UAAA,GAAa,SAAA,CAAU,MAAA,CAAO,CAAC,CAAE,CAAA;AACjC,IAAA,IAAI,CAAC,YAAY,OAAO,IAAA;AACxB,IAAA,EAAA,GAAK,EAAA,CAAG,MAAM,CAAA,EAAG,EAAA,CAAG,SAAS,MAAA,CAAO,CAAC,CAAA,CAAG,MAAM,CAAA,GAAI,KAAA;AAAA,EACpD;AAEA,EAAA,MAAM,KAAA,GAAQ,EAAA,CAAG,KAAA,CAAM,IAAI,CAAA;AAC3B,EAAA,IAAI,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG,OAAO,IAAA;AAE7B,EAAA,MAAM,IAAA,GAAO,KAAA,CAAM,CAAC,CAAA,GAAI,KAAA,CAAM,CAAC,CAAA,CAAE,KAAA,CAAM,GAAG,CAAA,CAAE,MAAA,CAAO,OAAO,IAAI,EAAC;AAC/D,EAAA,MAAM,OAAO,KAAA,CAAM,MAAA,KAAW,CAAA,IAAK,KAAA,CAAM,CAAC,CAAA,GAAI,KAAA,CAAM,CAAC,CAAA,CAAE,MAAM,GAAG,CAAA,CAAE,MAAA,CAAO,OAAO,IAAI,EAAC;AAErF,EAAA,IAAI,MAAA;AACJ,EAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AACtB,IAAA,MAAA,GAAS,IAAA;AACT,IAAA,IAAI,MAAA,CAAO,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AAAA,EAClC,CAAA,MAAO;AACL,IAAA,MAAM,OAAA,GAAU,CAAA,GAAI,IAAA,CAAK,MAAA,GAAS,IAAA,CAAK,MAAA;AACvC,IAAA,IAAI,OAAA,GAAU,GAAG,OAAO,IAAA;AACxB,IAAA,MAAA,GAAS,CAAC,GAAG,IAAA,EAAM,GAAG,KAAA,CAAM,OAAO,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA,EAAG,GAAG,IAAI,CAAA;AAAA,EACzD;AACA,EAAA,IAAI,MAAA,CAAO,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AAEhC,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,IAAA,IAAI,CAAC,oBAAA,CAAqB,IAAA,CAAK,KAAK,GAAG,OAAO,IAAA;AAC9C,IAAA,MAAM,CAAA,GAAI,QAAA,CAAS,KAAA,EAAO,EAAE,CAAA;AAC5B,IAAA,KAAA,CAAM,IAAA,CAAM,CAAA,IAAK,CAAA,GAAK,GAAA,EAAM,IAAI,GAAI,CAAA;AAAA,EACtC;AAEA,EAAA,IAAI,UAAA,EAAY;AACd,IAAA,KAAA,CAAM,EAAE,CAAA,GAAI,UAAA,CAAW,CAAC,CAAA;AACxB,IAAA,KAAA,CAAM,EAAE,CAAA,GAAI,UAAA,CAAW,CAAC,CAAA;AACxB,IAAA,KAAA,CAAM,EAAE,CAAA,GAAI,UAAA,CAAW,CAAC,CAAA;AACxB,IAAA,KAAA,CAAM,EAAE,CAAA,GAAI,UAAA,CAAW,CAAC,CAAA;AAAA,EAC1B;AAEA,EAAA,OAAO,KAAA;AACT;AAEA,SAAS,cAAc,KAAA,EAA0B;AAC/C,EAAA,IAAI,MAAM,KAAA,CAAM,CAAC,MAAM,CAAA,KAAM,CAAC,GAAG,OAAO,IAAA;AACxC,EAAA,IAAI,KAAA,CAAM,KAAA,CAAM,CAAA,EAAG,EAAE,EAAE,KAAA,CAAM,CAAC,CAAA,KAAM,CAAA,KAAM,CAAC,CAAA,IAAK,KAAA,CAAM,EAAE,CAAA,KAAM,GAAG,OAAO,IAAA;AACxE,EAAA,IAAA,CAAK,KAAA,CAAM,CAAC,CAAA,GAAK,GAAA,MAAU,KAAM,OAAO,IAAA;AACxC,EAAA,IAAI,KAAA,CAAM,CAAC,CAAA,KAAM,GAAA,IAAA,CAAS,MAAM,CAAC,CAAA,GAAK,GAAA,MAAU,GAAA,EAAM,OAAO,IAAA;AAE7D,EAAA,IAAI,MAAM,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,CAAE,KAAA,CAAM,CAAC,CAAA,KAAM,CAAA,KAAM,CAAC,CAAA,IAAK,MAAM,EAAE,CAAA,KAAM,OAAQ,KAAA,CAAM,EAAE,MAAM,GAAA,EAAM;AACxF,IAAA,OAAO,aAAA,CAAc,KAAA,CAAM,KAAA,CAAM,EAAE,CAAC,CAAA;AAAA,EACtC;AACA,EAAA,IAAI,MAAM,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,CAAE,MAAM,CAAC,CAAA,KAAM,CAAA,KAAM,CAAC,GAAG,OAAO,aAAA,CAAc,KAAA,CAAM,KAAA,CAAM,EAAE,CAAC,CAAA;AAClF,EAAA,IAAI,KAAA,CAAM,CAAC,CAAA,KAAM,CAAA,IAAQ,KAAA,CAAM,CAAC,CAAA,KAAM,GAAA,IAAQ,KAAA,CAAM,CAAC,CAAA,KAAM,GAAA,IAAQ,KAAA,CAAM,CAAC,CAAA,KAAM,GAAA,IAAQ,KAAA,CAAM,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,CAAE,KAAA,CAAM,CAAC,CAAA,KAAM,CAAA,KAAM,CAAC,CAAA,EAAG;AAChI,IAAA,OAAO,aAAA,CAAc,KAAA,CAAM,KAAA,CAAM,EAAE,CAAC,CAAA;AAAA,EACtC;AACA,EAAA,IAAI,KAAA,CAAM,CAAC,CAAA,KAAM,EAAA,IAAQ,MAAM,CAAC,CAAA,KAAM,CAAA,EAAM,OAAO,aAAA,CAAc,KAAA,CAAM,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA;AAClF,EAAA,IAAI,KAAA,CAAM,CAAC,CAAA,KAAM,GAAA,IAAA,CAAS,MAAM,CAAC,CAAA,GAAK,GAAA,MAAU,GAAA,EAAM,OAAO,IAAA;AAC7D,EAAA,IAAI,KAAA,CAAM,CAAC,CAAA,KAAM,GAAA,EAAM,OAAO,IAAA;AAC9B,EAAA,OAAO,KAAA;AACT;AAEA,SAAS,YAAY,IAAA,EAA6B;AAChD,EAAA,IAAI,gBAAA,CAAiB,IAAA,CAAK,IAAI,CAAA,EAAG,OAAO,SAAS,IAAA,CAAK,KAAA,CAAM,CAAC,CAAA,EAAG,EAAE,CAAA;AAClE,EAAA,IAAI,YAAY,IAAA,CAAK,IAAI,GAAG,OAAO,QAAA,CAAS,MAAM,CAAC,CAAA;AACnD,EAAA,IAAI,QAAQ,IAAA,CAAK,IAAI,GAAG,OAAO,QAAA,CAAS,MAAM,EAAE,CAAA;AAChD,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,yBAAyB,IAAA,EAA6B;AAC7D,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,IAAA,EAAK,CAAE,MAAM,GAAG,CAAA;AACnC,EAAA,IAAI,MAAM,MAAA,GAAS,CAAA,IAAK,KAAA,CAAM,MAAA,GAAS,GAAG,OAAO,IAAA;AAEjD,EAAA,MAAM,SAAmB,EAAC;AAC1B,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,MAAM,KAAA,GAAQ,YAAY,IAAI,CAAA;AAC9B,IAAA,IAAI,KAAA,KAAU,IAAA,IAAQ,KAAA,GAAQ,CAAA,EAAG,OAAO,IAAA;AACxC,IAAA,MAAA,CAAO,KAAK,KAAK,CAAA;AAAA,EACnB;AAEA,EAAA,MAAM,OAAA,GAAU,MAAA,CAAO,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA;AAClC,EAAA,IAAI,QAAQ,IAAA,CAAK,CAAC,MAAM,CAAA,GAAI,GAAG,GAAG,OAAO,IAAA;AAEzC,EAAA,MAAM,IAAA,GAAO,MAAA,CAAO,MAAA,CAAO,MAAA,GAAS,CAAC,CAAA;AACrC,EAAA,MAAM,SAAA,GAAY,IAAI,OAAA,CAAQ,MAAA;AAC9B,EAAA,IAAI,IAAA,GAAO,CAAA,KAAM,CAAA,GAAI,SAAA,CAAA,GAAa,GAAG,OAAO,IAAA;AAE5C,EAAA,MAAM,KAAA,GAAQ,CAAC,GAAG,OAAO,CAAA;AACzB,EAAA,KAAA,IAAS,CAAA,GAAI,SAAA,GAAY,CAAA,EAAG,CAAA,IAAK,CAAA,EAAG,CAAA,EAAA,EAAK,KAAA,CAAM,IAAA,CAAM,IAAA,KAAU,CAAA,GAAI,CAAA,GAAM,GAAI,CAAA;AAE7E,EAAA,OAAO,KAAA,CAAM,KAAK,GAAG,CAAA;AACvB;AAEA,IAAM,iBAAA,uBAAwB,GAAA,CAAI;AAAA,EAChC,WAAA;AAAA,EACA,0BAAA;AAAA,EACA;AACF,CAAC,CAAA;AAEM,SAAS,cAAc,QAAA,EAA2B;AACvD,EAAA,MAAM,OAAO,QAAA,CAAS,WAAA,EAAY,CAAE,OAAA,CAAQ,YAAY,EAAE,CAAA;AAE1D,EAAA,IAAI,iBAAA,CAAkB,GAAA,CAAI,IAAI,CAAA,EAAG,OAAO,IAAA;AACxC,EAAA,IAAI,IAAA,CAAK,QAAA,CAAS,QAAQ,CAAA,IAAK,IAAA,CAAK,QAAA,CAAS,WAAW,CAAA,IAAK,IAAA,CAAK,QAAA,CAAS,YAAY,CAAA,EAAG,OAAO,IAAA;AAEjG,EAAA,MAAM,SAAA,GAAY,wBAAA,CAAyB,IAAI,CAAA,IAAK,IAAA;AAEpD,EAAA,MAAM,EAAA,GAAK,UAAU,SAAS,CAAA;AAC9B,EAAA,IAAI,EAAA,EAAI,OAAO,aAAA,CAAc,EAAE,CAAA;AAE/B,EAAA,MAAM,EAAA,GAAK,WAAW,SAAS,CAAA;AAC/B,EAAA,IAAI,EAAA,EAAI,OAAO,aAAA,CAAc,EAAE,CAAA;AAE/B,EAAA,OAAO,KAAA;AACT;AAEO,SAAS,WAAA,CACd,GAAA,EACA,OAAA,GAAsC,EAAC,EACW;AAClD,EAAA,MAAM,YAAA,GAAe,QAAQ,YAAA,IAAgB,IAAA;AAE7C,EAAA,IAAI,MAAA;AACJ,EAAA,IAAI;AACF,IAAA,MAAA,GAAS,IAAI,IAAI,GAAG,CAAA;AAAA,EACtB,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,EAAE,KAAA,EAAO,aAAA,EAAe,MAAA,EAAQ,GAAA,EAAI;AAAA,EAC7C;AAEA,EAAA,IAAI,YAAA,IAAgB,MAAA,CAAO,QAAA,KAAa,QAAA,EAAU;AAChD,IAAA,OAAO,EAAE,KAAA,EAAO,yBAAA,EAA2B,MAAA,EAAQ,GAAA,EAAI;AAAA,EACzD;AAEA,EAAA,IAAI,CAAC,YAAA,IAAgB,MAAA,CAAO,aAAa,QAAA,IAAY,MAAA,CAAO,aAAa,OAAA,EAAS;AAChF,IAAA,OAAO,EAAE,KAAA,EAAO,kCAAA,EAAoC,MAAA,EAAQ,GAAA,EAAI;AAAA,EAClE;AAEA,EAAA,IAAI,MAAA,CAAO,QAAA,IAAY,MAAA,CAAO,QAAA,EAAU;AACtC,IAAA,OAAO,EAAE,KAAA,EAAO,6BAAA,EAA+B,MAAA,EAAQ,GAAA,EAAI;AAAA,EAC7D;AAEA,EAAA,IAAI,aAAA,CAAc,MAAA,CAAO,QAAQ,CAAA,EAAG;AAClC,IAAA,OAAO,EAAE,KAAA,EAAO,iBAAA,EAAmB,MAAA,EAAQ,GAAA,EAAI;AAAA,EACjD;AAEA,EAAA,OAAO,EAAE,KAAK,MAAA,EAAO;AACvB;AAEO,SAAS,sBAAA,CAAuB,GAAA,EAAa,YAAA,GAAe,IAAA,EAAe;AAChF,EAAA,OAAO,OAAA,IAAW,WAAA,CAAY,GAAA,EAAK,EAAE,cAAc,CAAA;AACrD;;;ACpLA,IAAM,kBAAA,GACJ,oEAAA;AAEF,SAAS,SAAA,CAAU,SAAiB,MAAA,EAA0B;AAC5D,EAAA,OAAO,QAAA,CAAS,KAAK,EAAE,KAAA,EAAO,SAAQ,EAAG,EAAE,QAAQ,CAAA;AACrD;AASA,eAAsB,eAAA,CAAgB,KAAe,QAAA,EAAuC;AAC1F,EAAA,MAAM,WAAW,MAAA,CAAO,GAAA,CAAI,QAAQ,GAAA,CAAI,gBAAgB,KAAK,CAAC,CAAA;AAC9D,EAAA,IAAI,WAAW,QAAA,EAAU;AACvB,IAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,KAAA,EAAO,iBAAA,EAAmB,QAAQ,GAAA,EAAI;AAAA,EAC5D;AAEA,EAAA,MAAM,MAAA,GAAS,GAAA,CAAI,IAAA,EAAM,SAAA,EAAU;AACnC,EAAA,IAAI,CAAC,QAAQ,OAAO,EAAE,IAAI,KAAA,EAAO,KAAA,EAAO,qBAAA,EAAuB,MAAA,EAAQ,GAAA,EAAI;AAE3E,EAAA,MAAM,SAAuB,EAAC;AAC9B,EAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,EAAA,WAAS;AACP,IAAA,MAAM,EAAE,IAAA,EAAM,KAAA,EAAM,GAAI,MAAM,OAAO,IAAA,EAAK;AAC1C,IAAA,IAAI,IAAA,EAAM;AACV,IAAA,IAAI,CAAC,KAAA,EAAO;AACZ,IAAA,KAAA,IAAS,KAAA,CAAM,UAAA;AACf,IAAA,IAAI,QAAQ,QAAA,EAAU;AACpB,MAAA,MAAM,MAAA,CAAO,MAAA,EAAO,CAAE,KAAA,CAAM,MAAM;AAAA,MAAC,CAAC,CAAA;AACpC,MAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,KAAA,EAAO,iBAAA,EAAmB,QAAQ,GAAA,EAAI;AAAA,IAC5D;AACA,IAAA,MAAA,CAAO,KAAK,KAAK,CAAA;AAAA,EACnB;AAEA,EAAA,MAAM,IAAA,GAAO,IAAI,UAAA,CAAW,KAAK,CAAA;AACjC,EAAA,IAAI,MAAA,GAAS,CAAA;AACb,EAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,IAAA,IAAA,CAAK,GAAA,CAAI,OAAO,MAAM,CAAA;AACtB,IAAA,MAAA,IAAU,KAAA,CAAM,UAAA;AAAA,EAClB;AACA,EAAA,OAAO,EAAE,EAAA,EAAI,IAAA,EAAM,IAAA,EAAK;AAC1B;AAEO,SAAS,wBACd,MAAA,EACqC;AACrC,EAAA,MAAM,OAAA,GAAU,OAAO,SAAA,IAAa,KAAA;AACpC,EAAA,MAAM,SAAA,GAAY,OAAO,SAAA,IAAa,kBAAA;AACtC,EAAA,MAAM,aAAA,GAAgB,OAAO,OAAA,GAAU,IAAI,IAAI,MAAA,CAAO,OAAA,CAAQ,UAAU,CAAA,CAAE,MAAA,GAAS,IAAA;AAEnF,EAAA,SAAS,WAAW,GAAA,EAAkC;AACpD,IAAA,MAAMA,QAAAA,GAAkC,EAAE,YAAA,EAAc,SAAA,EAAU;AAClE,IAAA,IAAI,CAAC,MAAA,CAAO,OAAA,IAAW,GAAA,CAAI,MAAA,KAAW,eAAe,OAAOA,QAAAA;AAC5D,IAAA,IAAI,MAAA,CAAO,QAAQ,MAAA,EAAQA,SAAQ,WAAW,CAAA,GAAI,OAAO,OAAA,CAAQ,MAAA;AACjE,IAAAA,QAAAA,CAAQ,UAAU,CAAA,GAAI,MAAA,CAAO,OAAA,CAAQ,KAAA;AACrC,IAAA,IAAI,MAAA,CAAO,QAAQ,SAAA,EAAWA,SAAQ,cAAc,CAAA,GAAI,OAAO,OAAA,CAAQ,SAAA;AACvE,IAAA,OAAOA,QAAAA;AAAA,EACT;AAEA,EAAA,eAAe,sBAAsB,QAAA,EAAoC;AACvE,IAAA,IAAI;AACF,MAAA,MAAM,SAAA,GAAY,MAAM,MAAA,CAAO,eAAA,CAAgB,QAAQ,CAAA;AAEvD,MAAA,IAAI,SAAA,CAAU,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AACnC,MAAA,OAAO,UAAU,IAAA,CAAK,CAAC,OAAA,KAAY,aAAA,CAAc,OAAO,CAAC,CAAA;AAAA,IAC3D,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AAEA,EAAA,eAAe,SAAA,CAAU,KAAU,QAAA,EAAqC;AACtE,IAAA,IAAI,QAAA,GAAW,CAAA,EAAG,MAAM,IAAI,MAAM,oBAAoB,CAAA;AAEtD,IAAA,IAAI,MAAM,qBAAA,CAAsB,GAAA,CAAI,QAAQ,CAAA,EAAG;AAC7C,MAAA,MAAM,IAAI,MAAM,iDAAiD,CAAA;AAAA,IACnE;AAEA,IAAA,MAAM,GAAA,GAAM,MAAM,OAAA,CAAQ,GAAA,CAAI,UAAS,EAAG;AAAA,MACxC,QAAA,EAAU,QAAA;AAAA,MACV,OAAA,EAAS,WAAW,GAAG;AAAA,KACxB,CAAA;AAED,IAAA,IAAI,GAAA,CAAI,MAAA,IAAU,GAAA,IAAO,GAAA,CAAI,SAAS,GAAA,EAAK;AACzC,MAAA,MAAM,QAAA,GAAW,GAAA,CAAI,OAAA,CAAQ,GAAA,CAAI,UAAU,CAAA;AAC3C,MAAA,IAAI,CAAC,QAAA,EAAU,MAAM,IAAI,MAAM,kCAAkC,CAAA;AAEjE,MAAA,MAAM,IAAA,GAAO,IAAI,GAAA,CAAI,QAAA,EAAU,GAAG,CAAA;AAClC,MAAA,MAAM,SAAA,GAAY,WAAA,CAAY,IAAA,CAAK,QAAA,EAAU,CAAA;AAC7C,MAAA,IAAI,OAAA,IAAW,WAAW,MAAM,IAAI,MAAM,CAAA,kBAAA,EAAqB,SAAA,CAAU,KAAK,CAAA,CAAE,CAAA;AAEhF,MAAA,OAAO,SAAA,CAAU,SAAA,CAAU,GAAA,EAAK,QAAA,GAAW,CAAC,CAAA;AAAA,IAC9C;AAEA,IAAA,OAAO,GAAA;AAAA,EACT;AAEA,EAAA,OAAO,eAAe,iBAAiB,GAAA,EAAiC;AACtE,IAAA,MAAM,GAAA,GAAM,IAAI,GAAA,CAAI,GAAA,CAAI,GAAG,CAAA,CAAE,YAAA,CAAa,IAAI,KAAK,CAAA;AACnD,IAAA,IAAI,CAAC,GAAA,EAAK,OAAO,SAAA,CAAU,eAAe,GAAG,CAAA;AAE7C,IAAA,MAAM,SAAA,GAAY,YAAY,GAAG,CAAA;AACjC,IAAA,IAAI,WAAW,SAAA,EAAW,OAAO,UAAU,SAAA,CAAU,KAAA,EAAO,UAAU,MAAM,CAAA;AAE5E,IAAA,IAAI,QAAA;AACJ,IAAA,IAAI;AACF,MAAA,MAAM,iBAAiB,aAAA,IAAiB,uCAAA,CAAwC,IAAA,CAAK,SAAA,CAAU,IAAI,QAAQ,CAAA;AAC3G,MAAA,QAAA,GAAW,MAAM,SAAA;AAAA,QACf,cAAA,GAAiB,IAAI,GAAA,CAAI,SAAA,CAAU,IAAI,QAAA,EAAU,aAAa,IAAI,SAAA,CAAU,GAAA;AAAA,QAC5E;AAAA,OACF;AAAA,IACF,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,SAAA,CAAU,yBAAyB,GAAG,CAAA;AAAA,IAC/C;AAEA,IAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,MAAA,OAAO,UAAU,CAAA,kBAAA,EAAqB,QAAA,CAAS,MAAM,CAAA,CAAA,EAAI,SAAS,MAAM,CAAA;AAAA,IAC1E;AAEA,IAAA,MAAM,WAAA,GAAc,QAAA,CAAS,OAAA,CAAQ,GAAA,CAAI,cAAc,CAAA,IAAK,EAAA;AAC5D,IAAA,MAAM,QAAA,GAAW,YAAY,KAAA,CAAM,GAAG,EAAE,CAAC,CAAA,CAAG,IAAA,EAAK,CAAE,WAAA,EAAY;AAC/D,IAAA,IAAI,CAAC,2BAAA,CAA4B,GAAA,CAAI,QAAQ,CAAA,EAAG;AAC9C,MAAA,OAAO,SAAA,CAAU,gBAAgB,GAAG,CAAA;AAAA,IACtC;AAEA,IAAA,MAAM,MAAA,GAAS,MAAM,eAAA,CAAgB,QAAA,EAAU,qBAAqB,CAAA;AACpE,IAAA,IAAI,CAAC,OAAO,EAAA,EAAI,OAAO,UAAU,MAAA,CAAO,KAAA,EAAQ,OAAO,MAAO,CAAA;AAE9D,IAAA,OAAO,IAAI,QAAA,CAAS,MAAA,CAAO,IAAA,EAA6B;AAAA,MACtD,MAAA,EAAQ,GAAA;AAAA,MACR,OAAA,EAAS;AAAA,QACP,cAAA,EAAgB,WAAA;AAAA,QAChB,wBAAA,EAA0B,SAAA;AAAA,QAC1B,yBAAA,EACE,8EAAA;AAAA,QACF,eAAA,EAAiB,sEAAA;AAAA,QACjB,6BAAA,EAA+B;AAAA;AACjC,KACD,CAAA;AAAA,EACH,CAAA;AACF;;;ACzJA,SAAS,QAAA,CAAS,QAA+B,IAAA,EAAsB;AACrE,EAAA,OAAO,CAAA,EAAG,OAAO,UAAA,CAAW,OAAA,CAAQ,OAAO,EAAE,CAAC,gBAAgB,IAAI,CAAA,CAAA;AACpE;AAEA,SAAS,OAAA,CAAQ,QAA+B,KAAA,EAAwD;AACtG,EAAA,OAAO,EAAE,WAAA,EAAa,MAAA,CAAO,MAAA,EAAQ,GAAG,KAAA,EAAM;AAChD;AAOA,eAAsB,mBAAA,CAAoB,QAA+BC,KAAAA,EAA6C;AACpH,EAAA,MAAM,GAAA,GAAM,OAAO,MAAA,CAAO,SAAA,IAAa,OAAO,QAAA,CAAS,MAAA,EAAQ,QAAQ,CAAA,EAAG;AAAA,IACxE,MAAA,EAAQ,MAAA;AAAA,IACR,SAAS,OAAA,CAAQ,MAAA,EAAQ,EAAE,cAAA,EAAgB,oBAAoB,CAAA;AAAA,IAC/D,IAAA,EAAM,IAAA,CAAK,SAAA,CAAUA,KAAI;AAAA,GAC1B,CAAA;AACD,EAAA,MAAM,IAAA,GAAQ,MAAM,GAAA,CAAI,IAAA,GAAO,KAAA,CAAM,OAAO,EAAC,CAAE,CAAA;AAC/C,EAAA,IAAI,CAAC,GAAA,CAAI,EAAA,IAAM,CAAC,IAAA,CAAK,IAAA,EAAM,MAAM,IAAI,KAAA,CAAM,IAAA,CAAK,KAAA,IAAS,wBAAwB,CAAA;AACjF,EAAA,OAAO,EAAE,KAAK,IAAA,CAAK,IAAA,CAAK,KAAK,GAAA,EAAK,IAAA,CAAK,KAAK,GAAA,EAAI;AAClD;AAEA,eAAsB,mBAAA,CAAoB,QAA+B,IAAA,EAA0C;AACjH,EAAA,MAAM,IAAA,GAAO,IAAI,QAAA,EAAS;AAC1B,EAAA,IAAA,CAAK,MAAA,CAAO,MAAA,EAAQ,IAAA,EAAM,IAAA,CAAK,IAAI,CAAA;AACnC,EAAA,MAAM,GAAA,GAAM,OAAO,MAAA,CAAO,SAAA,IAAa,OAAO,QAAA,CAAS,MAAA,EAAQ,aAAa,CAAA,EAAG;AAAA,IAC7E,MAAA,EAAQ,MAAA;AAAA,IACR,OAAA,EAAS,QAAQ,MAAM,CAAA;AAAA,IACvB,IAAA,EAAM;AAAA,GACP,CAAA;AACD,EAAA,MAAM,IAAA,GAAQ,MAAM,GAAA,CAAI,IAAA,GAAO,KAAA,CAAM,OAAO,EAAC,CAAE,CAAA;AAC/C,EAAA,IAAI,CAAC,GAAA,CAAI,EAAA,IAAM,CAAC,IAAA,CAAK,IAAA,EAAM,MAAM,IAAI,KAAA,CAAM,IAAA,CAAK,KAAA,IAAS,oBAAoB,CAAA;AAC7E,EAAA,OAAO,EAAE,KAAK,IAAA,CAAK,IAAA,CAAK,KAAK,GAAA,EAAK,IAAA,CAAK,KAAK,GAAA,EAAI;AAClD;AAEA,eAAsB,wBAAA,CACpB,QACA,KAAA,EAC2C;AAC3C,EAAA,MAAM,GAAA,GAAM,OAAO,MAAA,CAAO,SAAA,IAAa,OAAO,QAAA,CAAS,MAAA,EAAQ,kBAAkB,CAAA,EAAG;AAAA,IAClF,MAAA,EAAQ,MAAA;AAAA,IACR,SAAS,OAAA,CAAQ,MAAA,EAAQ,EAAE,cAAA,EAAgB,oBAAoB,CAAA;AAAA,IAC/D,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,EAAE,OAAO;AAAA,GAC/B,CAAA;AACD,EAAA,MAAM,IAAA,GAAQ,MAAM,GAAA,CAAI,IAAA,GAAO,KAAA,CAAM,OAAO,EAAC,CAAE,CAAA;AAI/C,EAAA,IAAI,CAAC,GAAA,CAAI,EAAA,IAAM,CAAC,IAAA,CAAK,IAAA,EAAM,MAAM,IAAI,KAAA,CAAM,IAAA,CAAK,KAAA,IAAS,sBAAsB,CAAA;AAC/E,EAAA,OAAO,IAAA,CAAK,IAAA;AACd;AAEA,eAAsB,mBAAA,CACpB,MAAA,EACA,IAAA,GAAuC,OAAA,EACtB;AACjB,EAAA,MAAM,GAAA,GAAM,MAAA,CAAO,MAAA,CAAO,SAAA,IAAa,KAAA,EAAO,CAAA,EAAG,QAAA,CAAS,MAAA,EAAQ,YAAY,CAAC,CAAA,MAAA,EAAS,IAAI,CAAA,CAAA,EAAI;AAAA,IAC9F,MAAA,EAAQ,KAAA;AAAA,IACR,OAAA,EAAS,QAAQ,MAAM;AAAA,GACxB,CAAA;AACD,EAAA,MAAM,IAAA,GAAQ,MAAM,GAAA,CAAI,IAAA,GAAO,KAAA,CAAM,OAAO,EAAC,CAAE,CAAA;AAC/C,EAAA,IAAI,CAAC,GAAA,CAAI,EAAA,IAAM,CAAC,IAAA,CAAK,IAAA,EAAM,MAAM,IAAI,KAAA,CAAM,IAAA,CAAK,KAAA,IAAS,6BAA6B,CAAA;AACtF,EAAA,OAAO,KAAK,IAAA,CAAK,GAAA;AACnB;;;ACxEA,IAAM,GAAA,GAAM,OAAA;AAEZ,IAAM,aAAA,GAA0C;AAAA,EAC9C,GAAA,EAAK;AAAA,IACH,QAAA;AAAA,IAAU,UAAU,GAAG,CAAA,CAAA;AAAA,IAAI,CAAA,aAAA,EAAgB,GAAG,CAAA,CAAA,EAAI,GAAG,CAAA,CAAA;AAAA,IAAI,eAAe,GAAG,CAAA,CAAA;AAAA,IAAI,mBAAmB,GAAG,CAAA,CAAA;AAAA,IAAI,uBAAA;AAAA,IACzG,QAAA;AAAA,IAAU,gBAAgB,GAAG,CAAA,CAAA;AAAA,IAAI,CAAA,OAAA,EAAU,GAAG,CAAA,CAAA,EAAI,GAAG,CAAA,CAAA;AAAA,IAAI,CAAA,OAAA,EAAU,GAAG,CAAA,CAAA,EAAI,GAAG,CAAA,2BAAA,CAAA;AAAA,IAA+B,CAAA,OAAA,EAAU,GAAG,CAAA,CAAA,EAAI,GAAG,aAAa,GAAG,CAAA,CAAA;AAAA,IAChJ,aAAA;AAAA,IAAe,eAAe,GAAG,CAAA,CAAA;AAAA,IAAI,eAAe,GAAG,CAAA,OAAA,CAAA;AAAA,IAAW,eAAe,GAAG,CAAA,QAAA,CAAA;AAAA,IACpF,YAAA;AAAA,IAAc,cAAc,GAAG,CAAA,CAAA;AAAA,IAAI,QAAA;AAAA,IAAU,kBAAA;AAAA,IAC7C,UAAA;AAAA,IAAY,YAAY,GAAG,CAAA,QAAA,CAAA;AAAA,IAAY,wBAAwB,GAAG,CAAA,CAAA;AAAA,IAAI,YAAY,GAAG,CAAA,OAAA,CAAA;AAAA,IACrF,OAAA;AAAA,IAAS,cAAA;AAAA,IAAgB,cAAA;AAAA,IAAgB,SAAS,GAAG,CAAA,CAAA;AAAA,IAAI,SAAS,GAAG,CAAA,WAAA,CAAA;AAAA,IAAe,OAAO,GAAG,CAAA,WAAA,CAAA;AAAA,IAC9F,OAAA;AAAA,IAAS,SAAS,GAAG,CAAA,CAAA;AAAA,IAAI,SAAS,GAAG,CAAA,MAAA,CAAA;AAAA,IAAU,SAAS,GAAG,CAAA,MAAA,CAAA;AAAA,IAC3D,SAAA;AAAA,IAAW,gBAAA;AAAA,IAAkB,eAAA;AAAA,IAAiB,WAAW,GAAG,CAAA,CAAA;AAAA,IAAI,WAAW,GAAG,CAAA,OAAA,CAAA;AAAA,IAC9E,CAAA,KAAA,EAAQ,GAAG,CAAA,CAAA,EAAI,GAAG,CAAA,CAAA;AAAA,IAAI,CAAA,KAAA,EAAQ,GAAG,CAAA,CAAA,EAAI,GAAG,WAAW,GAAG,CAAA,CAAA;AAAA,IAAI,CAAA,QAAA,EAAW,GAAG,CAAA,CAAA,EAAI,GAAG,CAAA,CAAA;AAAA,IAAI,WAAW,GAAG,CAAA,MAAA,CAAA;AAAA,IAAU,CAAA,MAAA,EAAS,GAAG,CAAA,CAAA,EAAI,GAAG,CAAA,CAAA;AAAA,IAC9H,OAAA;AAAA,IAAS,QAAA;AAAA,IAAU,gBAAgB,GAAG,CAAA,CAAA;AAAA,IACtC,oBAAA;AAAA,IAAsB,sBAAsB,GAAG,CAAA,CAAA;AAAA,IAAI,sBAAsB,GAAG,CAAA,KAAA,CAAA;AAAA,IAC5E,uBAAA;AAAA,IAAyB,yBAAyB,GAAG,CAAA,CAAA;AAAA,IAAI,sBAAA;AAAA,IAAwB,wBAAwB,GAAG,CAAA,CAAA;AAAA,IAC5G,mBAAA;AAAA,IACA,CAAA,MAAA,EAAS,GAAG,CAAA,CAAA,EAAI,GAAG,IAAI,GAAG,CAAA,MAAA;AAAA,GAC5B,CAAE,IAAI,CAAC,CAAA,KAAM,IAAI,MAAA,CAAO,CAAA,CAAA,EAAI,CAAC,CAAA,CAAA,CAAG,CAAC,CAAA;AAAA,EACjC,IAAA,EAAM;AAAA,IACJ,gEAAA;AAAA,IACA,0BAAA;AAAA,IACA;AAAA,GACF,CAAE,IAAI,CAAC,CAAA,KAAM,IAAI,MAAA,CAAO,CAAA,CAAA,EAAI,CAAC,CAAA,CAAA,CAAG,CAAC;AACnC,CAAA;AAEO,SAAS,gBAAA,CAAiB,QAAgB,IAAA,EAAuB;AACtE,EAAA,IAAI,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA,CAAE,KAAK,CAAC,CAAA,KAAM,CAAA,KAAM,GAAA,IAAO,CAAA,KAAM,IAAA,IAAQ,CAAA,KAAM,EAAE,GAAG,OAAO,KAAA;AAC7E,EAAA,OAAA,CAAQ,aAAA,CAAc,MAAA,CAAO,WAAA,EAAa,CAAA,IAAK,EAAC,EAAG,IAAA,CAAK,CAAC,EAAA,KAAO,EAAA,CAAG,IAAA,CAAK,IAAI,CAAC,CAAA;AAC/E;ACxBA,IAAM,eAAA,GAAkB,OAAA;AACxB,IAAM,sBAAA,GAAyB,kBAAA;AAE/B,IAAM,eAAA,GAAkB,kBAAA;AACxB,IAAM,sBAAA,GAAyB,oBAAA;AAExB,IAAM,oBAAA,GAAuB;AAC7B,IAAM,2BAAA,GAA8B,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK;AAE1D,IAAM,kBAAA,GAAqB,EAAA;AAoB3B,IAAM,OAAA,GAAU,IAAI,WAAA,EAAY;AAChC,IAAM,OAAA,GAAU,IAAI,WAAA,EAAY;AAEhC,SAAS,MAAM,KAAA,EAA2B;AACxC,EAAA,IAAI,GAAA,GAAM,EAAA;AACV,EAAA,KAAA,MAAW,CAAA,IAAK,OAAO,GAAA,IAAO,CAAA,CAAE,SAAS,EAAE,CAAA,CAAE,QAAA,CAAS,CAAA,EAAG,GAAG,CAAA;AAC5D,EAAA,OAAO,GAAA;AACT;AAEA,SAAS,IAAA,CAAK,MAAA,EAAgB,MAAA,EAAgB,OAAA,EAAyB;AACrE,EAAA,OAAO,KAAA,CAAM,IAAA,CAAK,MAAA,EAAQ,OAAA,CAAQ,OAAO,MAAM,CAAA,EAAG,OAAA,CAAQ,MAAA,CAAO,GAAG,MAAM,CAAA,CAAA,EAAI,OAAO,CAAA,CAAE,CAAC,CAAC,CAAA;AAC3F;AAEA,SAAS,kBAAA,CAAmB,GAAW,CAAA,EAAoB;AACzD,EAAA,IAAI,CAAA,CAAE,MAAA,KAAW,CAAA,CAAE,MAAA,EAAQ,OAAO,KAAA;AAClC,EAAA,IAAI,IAAA,GAAO,CAAA;AACX,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,MAAA,EAAQ,CAAA,EAAA,EAAK,IAAA,IAAQ,CAAA,CAAE,UAAA,CAAW,CAAC,CAAA,GAAI,CAAA,CAAE,WAAW,CAAC,CAAA;AAC3E,EAAA,OAAO,IAAA,KAAS,CAAA;AAClB;AAEA,SAAS,gBAAA,CAAiB,MAAA,EAAgB,MAAA,EAAgB,OAAA,EAAiB,QAAA,EAA2B;AACpG,EAAA,OAAO,mBAAmB,QAAA,EAAU,IAAA,CAAK,MAAA,EAAQ,MAAA,EAAQ,OAAO,CAAC,CAAA;AACnE;AAEA,SAAS,cAAc,KAAA,EAAwB;AAC7C,EAAA,OAAO,cAAA,CAAe,OAAO,OAAA,CAAQ,MAAA,CAAO,KAAK,SAAA,CAAU,KAAK,CAAC,CAAC,CAAA;AACpE;AAEA,SAAS,cAAiB,OAAA,EAA2B;AACnD,EAAA,IAAI;AACF,IAAA,OAAO,IAAA,CAAK,MAAM,OAAA,CAAQ,MAAA,CAAO,eAAe,MAAA,CAAO,OAAO,CAAC,CAAC,CAAA;AAAA,EAClE,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAEA,SAAS,UAAA,CAAW,KAAa,MAAA,EAA+D;AAC9F,EAAA,IAAI,CAAC,GAAA,CAAI,UAAA,CAAW,MAAM,GAAG,OAAO,IAAA;AACpC,EAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,KAAA,CAAM,MAAA,CAAO,MAAM,CAAA;AACrC,EAAA,MAAM,GAAA,GAAM,KAAA,CAAM,WAAA,CAAY,GAAG,CAAA;AACjC,EAAA,IAAI,GAAA,KAAQ,IAAI,OAAO,IAAA;AACvB,EAAA,OAAO,EAAE,OAAA,EAAS,KAAA,CAAM,KAAA,CAAM,CAAA,EAAG,GAAG,CAAA,EAAG,SAAA,EAAW,KAAA,CAAM,KAAA,CAAM,GAAA,GAAM,CAAC,CAAA,EAAE;AACzE;AAEA,SAAS,cAAA,CAAe,KAAyB,GAAA,EAAkC;AACjF,EAAA,IAAI,CAAC,GAAA,IAAO,CAAC,GAAA,EAAK,OAAO,KAAA;AACzB,EAAA,MAAM,MAAM,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,GAAA,KAAQ,GAAI,CAAA;AACxC,EAAA,OAAO,GAAA,IAAO,GAAA,IAAO,GAAA,IAAO,GAAA,GAAM,kBAAA;AACpC;AAEO,SAAS,cAAA,CACd,MAAA,EACA,KAAA,EACA,MAAA,EACA,aAAqB,oBAAA,EACb;AACR,EAAA,MAAM,MAAM,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,GAAA,KAAQ,GAAI,CAAA;AACxC,EAAA,MAAM,OAAA,GAAU,aAAA,CAAc,EAAE,GAAA,EAAK,MAAA,EAAQ,OAAO,GAAA,EAAK,GAAA,EAAK,GAAA,GAAM,UAAA,EAAY,CAAA;AAChF,EAAA,OAAO,CAAA,EAAG,eAAe,CAAA,EAAG,OAAO,IAAI,IAAA,CAAK,MAAA,EAAQ,eAAA,EAAiB,OAAO,CAAC,CAAA,CAAA;AAC/E;AAEO,SAAS,eAAA,CAAgB,QAAgB,GAAA,EAAkC;AAChF,EAAA,MAAM,KAAA,GAAQ,UAAA,CAAW,GAAA,EAAK,eAAe,CAAA;AAC7C,EAAA,IAAI,CAAC,OAAO,OAAO,IAAA;AACnB,EAAA,IAAI,CAAC,iBAAiB,MAAA,EAAQ,eAAA,EAAiB,MAAM,OAAA,EAAS,KAAA,CAAM,SAAS,CAAA,EAAG,OAAO,IAAA;AAEvF,EAAA,MAAM,IAAA,GAAO,aAAA,CAA+B,KAAA,CAAM,OAAO,CAAA;AACzD,EAAA,IAAI,CAAC,IAAA,EAAM,GAAA,IAAO,CAAC,cAAA,CAAe,KAAK,GAAA,EAAK,IAAA,CAAK,GAAG,CAAA,EAAG,OAAO,IAAA;AAE9D,EAAA,OAAO,EAAE,OAAA,EAAS,IAAA,CAAK,KAAK,KAAA,EAAO,IAAA,CAAK,SAAS,UAAA,EAAW;AAC9D;AAEO,SAAS,wBAAA,CACd,MAAA,EACA,SAAA,EACA,UAAA,GAAqB,2BAAA,EACb;AACR,EAAA,MAAM,MAAM,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,GAAA,KAAQ,GAAI,CAAA;AACxC,EAAA,MAAM,OAAA,GAAU,cAAc,EAAE,SAAA,EAAW,KAAK,GAAA,EAAK,GAAA,GAAM,YAAY,CAAA;AACvE,EAAA,OAAO,CAAA,EAAG,sBAAsB,CAAA,EAAG,OAAO,IAAI,IAAA,CAAK,MAAA,EAAQ,sBAAA,EAAwB,OAAO,CAAC,CAAA,CAAA;AAC7F;AAGO,SAAS,uBAAA,CAAwB,QAAgB,GAAA,EAA6D;AACnH,EAAA,MAAM,KAAA,GAAQ,UAAA,CAAW,GAAA,EAAK,sBAAsB,CAAA;AACpD,EAAA,IAAI,CAAC,OAAO,OAAO,IAAA;AACnB,EAAA,IAAI,CAAC,iBAAiB,MAAA,EAAQ,sBAAA,EAAwB,MAAM,OAAA,EAAS,KAAA,CAAM,SAAS,CAAA,EAAG,OAAO,IAAA;AAE9F,EAAA,MAAM,IAAA,GAAO,aAAA,CAAqC,KAAA,CAAM,OAAO,CAAA;AAC/D,EAAA,IAAI,CAAC,IAAA,EAAM,SAAA,IAAa,CAAC,IAAA,CAAK,GAAA,IAAO,CAAC,cAAA,CAAe,IAAA,CAAK,GAAA,EAAK,IAAA,CAAK,GAAG,GAAG,OAAO,IAAA;AAEjF,EAAA,OAAO,EAAE,SAAA,EAAW,IAAA,CAAK,SAAA,EAAW,QAAA,EAAU,KAAK,GAAA,EAAI;AACzD;AAEO,SAAS,yBAAA,CAA0B,QAAgB,GAAA,EAA4B;AACpF,EAAA,OAAO,uBAAA,CAAwB,MAAA,EAAQ,GAAG,CAAA,EAAG,SAAA,IAAa,IAAA;AAC5D;;;AClIA,IAAM,gBAAA,GAAmB,8DAAA;AAElB,SAAS,mBAAmB,OAAA,EAA0B;AAC3D,EAAA,IAAI,CAAC,gBAAA,CAAiB,IAAA,CAAK,OAAO,GAAG,OAAO,KAAA;AAC5C,EAAA,IAAI,QAAQ,KAAA,CAAM,GAAG,EAAE,QAAA,CAAS,IAAI,GAAG,OAAO,KAAA;AAC9C,EAAA,OAAO,IAAA;AACT;AAEO,IAAM,+BAAA,GAAkC;AAAA,EAC7C,YAAA;AAAA,EAAc,WAAA;AAAA,EAAa,WAAA;AAAA,EAAa,YAAA;AAAA,EAAc,YAAA;AAAA,EAAc,eAAA;AAAA,EACpE,QAAA;AAAA,EAAU,QAAA;AAAA,EAAU,QAAA;AAAA,EAAU,OAAA;AAAA,EAAS,kBAAA;AAAA,EAAoB;AAC7D;AAEO,SAAS,4BAA4B,WAAA,EAA6B;AACvE,EAAA,OAAO,+BAAA,CAAgC,KAAK,CAAC,CAAA,KAAM,YAAY,UAAA,CAAW,CAAC,CAAC,CAAA,GACxE,WAAA,GACA,0BAAA;AACN;AAEO,IAAM,+BAAA,GAAkC,KAAK,IAAA,GAAO","file":"chunk-CEPRY3SR.js","sourcesContent":["export function isSameOrigin(req: Request): boolean {\n const origin = req.headers.get(\"origin\");\n if (!origin) return true;\n const host = req.headers.get(\"host\");\n try {\n return new URL(origin).host === host;\n } catch {\n return false;\n }\n}\n","import type { FetchLike } from \"../utils/fetch.js\";\nimport { isSameOrigin } from \"./origin.js\";\n\nexport const ACCOUNT_SESSION_COOKIE = \"ml_account_session\";\nconst SESSION_MAX_AGE_SECONDS = 30 * 24 * 60 * 60;\nconst SIGN_IN_PATHS = new Set([\"auth/email/register-account\", \"auth/email/verify-code\", \"auth/siws/verify\"]);\nconst EDGE_CACHE_CONTROL = \"public, s-maxage=30, stale-while-revalidate=120\";\nconst DROPPED_REQUEST_HEADERS = new Set([\n \"connection\", \"keep-alive\", \"proxy-authenticate\", \"proxy-authorization\", \"te\", \"trailers\",\n \"transfer-encoding\", \"upgrade\", \"host\", \"content-length\", \"accept-encoding\", \"cookie\",\n \"x-api-key\", \"x-app-id\", \"x-app-secret\", \"x-account-session\", \"authorization\",\n]);\nconst DROPPED_RESPONSE_HEADERS = new Set([\n \"connection\", \"keep-alive\", \"transfer-encoding\", \"content-length\", \"content-encoding\", \"set-cookie\",\n]);\n\nexport interface AppGatewayConfig {\n appId: string;\n backendUrl: string;\n apiKey: string | undefined;\n appSecret?: string;\n allow: Record<string, RegExp[]>;\n cacheableGets?: RegExp[];\n timeoutMs?: number;\n fetchImpl?: FetchLike;\n}\n\nexport function readCookie(req: Request, name: string): string | null {\n const raw = req.headers.get(\"cookie\");\n if (!raw) return null;\n for (const part of raw.split(\";\")) {\n const eq = part.indexOf(\"=\");\n if (eq !== -1 && part.slice(0, eq).trim() === name) return part.slice(eq + 1).trim() || null;\n }\n return null;\n}\n\nexport function sessionCookie(value: string, maxAge = SESSION_MAX_AGE_SECONDS): string {\n const secure = process.env.NODE_ENV === \"production\" ? \"; Secure\" : \"\";\n return `${ACCOUNT_SESSION_COOKIE}=${value}; Path=/; HttpOnly; SameSite=Lax; Max-Age=${maxAge}${secure}`;\n}\n\nfunction json(body: unknown, status: number): Response {\n return Response.json(body, { status });\n}\n\nexport function createAppGateway(config: AppGatewayConfig): (req: Request, path: string[]) => Promise<Response> {\n const doFetch = config.fetchImpl ?? fetch;\n const base = config.backendUrl.replace(/\\/$/, \"\");\n\n return async function appGateway(req, path) {\n if (!isSameOrigin(req)) return json({ error: \"Cross-origin requests are not allowed\" }, 403);\n if (!config.apiKey) return json({ error: \"Service unavailable\" }, 500);\n if (path.some((s) => s === \".\" || s === \"..\" || s === \"\")) return json({ error: \"Invalid path\" }, 400);\n\n const joined = path.join(\"/\");\n const method = req.method.toUpperCase();\n if (!(config.allow[method] ?? []).some((re) => re.test(joined))) {\n return json({ error: `Path not allowed: ${method} /v1/${joined}` }, 403);\n }\n\n const headers = new Headers();\n req.headers.forEach((v, k) => {\n if (!DROPPED_REQUEST_HEADERS.has(k.toLowerCase())) headers.set(k, v);\n });\n headers.set(\"x-api-key\", config.apiKey);\n headers.set(\"x-app-id\", config.appId);\n if (config.appSecret) headers.set(\"x-app-secret\", config.appSecret);\n const session = readCookie(req, ACCOUNT_SESSION_COOKIE);\n if (session) headers.set(\"x-account-session\", session);\n\n const search = new URL(req.url).search;\n const target = `${base}/v1/${path.map(encodeURIComponent).join(\"/\")}${search}`;\n const hasBody = method !== \"GET\" && method !== \"HEAD\";\n\n let res: Response;\n try {\n res = await doFetch(target, {\n method,\n headers,\n body: hasBody ? await req.arrayBuffer() : undefined,\n cache: \"no-store\",\n redirect: \"manual\",\n signal: AbortSignal.timeout(config.timeoutMs ?? 55_000),\n });\n } catch (e) {\n if (e instanceof DOMException && e.name === \"TimeoutError\") {\n return json({ error: \"The service took too long to respond\" }, 504);\n }\n return json({ error: \"Service unavailable\" }, 502);\n }\n\n const out = new Headers();\n res.headers.forEach((v, k) => {\n if (!DROPPED_RESPONSE_HEADERS.has(k.toLowerCase())) out.set(k, v);\n });\n\n if (method === \"POST\" && res.ok && SIGN_IN_PATHS.has(joined)) {\n const text = await res.text();\n let body: Record<string, unknown> | null = null;\n try {\n body = JSON.parse(text) as Record<string, unknown>;\n } catch {\n body = null;\n }\n if (!body) return new Response(text, { status: res.status, headers: out });\n const token = typeof body.accountToken === \"string\" ? body.accountToken : null;\n delete body.accountToken;\n delete body.token;\n out.set(\"content-type\", \"application/json\");\n if (token) out.append(\"set-cookie\", sessionCookie(token));\n return new Response(JSON.stringify(body), { status: res.status, headers: out });\n }\n\n if (method === \"GET\" && res.ok && !session && (config.cacheableGets ?? []).some((re) => re.test(joined))) {\n out.set(\"cache-control\", EDGE_CACHE_CONTROL);\n }\n return new Response(res.body, { status: res.status, headers: out });\n };\n}\n","import type { FetchLike } from \"../utils/fetch.js\";\nimport { readCookie, sessionCookie, ACCOUNT_SESSION_COOKIE } from \"./app-gateway.js\";\n\nexport interface AppSessionConfig {\n appId: string;\n backendUrl: string;\n apiKey: string | undefined;\n appSecret?: string;\n fetchImpl?: FetchLike;\n}\n\nfunction signedOut(): Response {\n const res = Response.json(null);\n res.headers.append(\"set-cookie\", sessionCookie(\"\", 0));\n return res;\n}\n\nexport function createAppSessionHandler(config: AppSessionConfig): {\n GET(req: Request): Promise<Response>;\n DELETE(req: Request): Promise<Response>;\n} {\n const doFetch = config.fetchImpl ?? fetch;\n const base = config.backendUrl.replace(/\\/$/, \"\");\n return {\n async GET(req) {\n const session = readCookie(req, ACCOUNT_SESSION_COOKIE);\n if (!session) return Response.json(null);\n const res = await doFetch(`${base}/v1/users/me`, {\n headers: {\n \"x-api-key\": config.apiKey ?? \"\",\n \"x-app-id\": config.appId,\n ...(config.appSecret ? { \"x-app-secret\": config.appSecret } : {}),\n \"x-account-session\": session,\n },\n cache: \"no-store\",\n });\n if (res.status === 401 || res.status === 403) return signedOut();\n if (!res.ok) return Response.json({ error: \"Session check failed\" }, { status: 502 });\n return Response.json(await res.json());\n },\n async DELETE() {\n return signedOut();\n },\n };\n}\n","export const ALLOWED_IMAGE_CONTENT_TYPES = new Set([\n \"image/jpeg\",\n \"image/jpg\",\n \"image/png\",\n \"image/gif\",\n \"image/webp\",\n \"image/svg+xml\",\n \"image/avif\",\n \"image/bmp\",\n \"image/tiff\",\n]);\n\nexport const MAX_IMAGE_REDIRECTS = 5;\n\nexport const MAX_IMAGE_PROXY_BYTES = 15 * 1024 * 1024;\n\nfunction parseIpv4(ip: string): number[] | null {\n const parts = ip.split(\".\");\n if (parts.length !== 4) return null;\n const bytes: number[] = [];\n for (const part of parts) {\n if (!/^\\d{1,3}$/.test(part)) return null;\n const n = Number(part);\n if (n > 255) return null;\n bytes.push(n);\n }\n return bytes;\n}\n\nfunction isPrivateIpv4(bytes: number[]): boolean {\n const a = bytes[0]!;\n const b = bytes[1]!;\n const c = bytes[2]!;\n if (a === 0) return true;\n if (a === 10) return true;\n if (a === 100 && b >= 64 && b <= 127) return true;\n if (a === 127) return true;\n if (a === 169 && b === 254) return true;\n if (a === 172 && b >= 16 && b <= 31) return true;\n if (a === 192 && b === 0 && c === 0) return true;\n if (a === 192 && b === 168) return true;\n if (a === 198 && (b === 18 || b === 19)) return true;\n if (a >= 224) return true;\n return false;\n}\n\nfunction expandIpv6(rawIp: string): number[] | null {\n let ip = rawIp;\n\n let embeddedV4: number[] | null = null;\n const v4Tail = ip.match(/(\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3})$/);\n if (v4Tail && ip.includes(\":\")) {\n embeddedV4 = parseIpv4(v4Tail[1]!);\n if (!embeddedV4) return null;\n ip = ip.slice(0, ip.length - v4Tail[1]!.length) + \"0:0\";\n }\n\n const sides = ip.split(\"::\");\n if (sides.length > 2) return null;\n\n const head = sides[0] ? sides[0].split(\":\").filter(Boolean) : [];\n const tail = sides.length === 2 && sides[1] ? sides[1].split(\":\").filter(Boolean) : [];\n\n let groups: string[];\n if (sides.length === 1) {\n groups = head;\n if (groups.length !== 8) return null;\n } else {\n const missing = 8 - head.length - tail.length;\n if (missing < 0) return null;\n groups = [...head, ...Array(missing).fill(\"0\"), ...tail];\n }\n if (groups.length !== 8) return null;\n\n const bytes: number[] = [];\n for (const group of groups) {\n if (!/^[0-9a-fA-F]{1,4}$/.test(group)) return null;\n const n = parseInt(group, 16);\n bytes.push((n >> 8) & 0xff, n & 0xff);\n }\n\n if (embeddedV4) {\n bytes[12] = embeddedV4[0]!;\n bytes[13] = embeddedV4[1]!;\n bytes[14] = embeddedV4[2]!;\n bytes[15] = embeddedV4[3]!;\n }\n\n return bytes;\n}\n\nfunction isPrivateIpv6(bytes: number[]): boolean {\n if (bytes.every((b) => b === 0)) return true;\n if (bytes.slice(0, 15).every((b) => b === 0) && bytes[15] === 1) return true;\n if ((bytes[0]! & 0xfe) === 0xfc) return true;\n if (bytes[0] === 0xfe && (bytes[1]! & 0xc0) === 0x80) return true;\n\n if (bytes.slice(0, 10).every((b) => b === 0) && bytes[10] === 0xff && bytes[11] === 0xff) {\n return isPrivateIpv4(bytes.slice(12));\n }\n if (bytes.slice(0, 12).every((b) => b === 0)) return isPrivateIpv4(bytes.slice(12));\n if (bytes[0] === 0x00 && bytes[1] === 0x64 && bytes[2] === 0xff && bytes[3] === 0x9b && bytes.slice(4, 12).every((b) => b === 0)) {\n return isPrivateIpv4(bytes.slice(12));\n }\n if (bytes[0] === 0x20 && bytes[1] === 0x02) return isPrivateIpv4(bytes.slice(2, 6));\n if (bytes[0] === 0xfe && (bytes[1]! & 0xc0) === 0xc0) return true;\n if (bytes[0] === 0xff) return true;\n return false;\n}\n\nfunction parseNumber(part: string): number | null {\n if (/^0x[0-9a-f]+$/i.test(part)) return parseInt(part.slice(2), 16);\n if (/^0[0-7]+$/.test(part)) return parseInt(part, 8);\n if (/^\\d+$/.test(part)) return parseInt(part, 10);\n return null;\n}\n\nfunction normalizeNumericHostname(host: string): string | null {\n const parts = host.trim().split(\".\");\n if (parts.length < 1 || parts.length > 4) return null;\n\n const values: number[] = [];\n for (const part of parts) {\n const value = parseNumber(part);\n if (value === null || value < 0) return null;\n values.push(value);\n }\n\n const leading = values.slice(0, -1);\n if (leading.some((v) => v > 255)) return null;\n\n const tail = values[values.length - 1]!;\n const tailBytes = 4 - leading.length;\n if (tail > 2 ** (8 * tailBytes) - 1) return null;\n\n const bytes = [...leading];\n for (let i = tailBytes - 1; i >= 0; i--) bytes.push((tail >>> (8 * i)) & 0xff);\n\n return bytes.join(\".\");\n}\n\nconst BLOCKED_HOSTNAMES = new Set([\n \"localhost\",\n \"metadata.google.internal\",\n \"metadata.azure.internal\",\n]);\n\nexport function isPrivateHost(hostname: string): boolean {\n const host = hostname.toLowerCase().replace(/^\\[|\\]$/g, \"\");\n\n if (BLOCKED_HOSTNAMES.has(host)) return true;\n if (host.endsWith(\".local\") || host.endsWith(\".internal\") || host.endsWith(\".localhost\")) return true;\n\n const candidate = normalizeNumericHostname(host) ?? host;\n\n const v4 = parseIpv4(candidate);\n if (v4) return isPrivateIpv4(v4);\n\n const v6 = expandIpv6(candidate);\n if (v6) return isPrivateIpv6(v6);\n\n return false;\n}\n\nexport function validateUrl(\n raw: string,\n options: { requireHttps?: boolean } = {},\n): { url: URL } | { error: string; status: number } {\n const requireHttps = options.requireHttps ?? true;\n\n let parsed: URL;\n try {\n parsed = new URL(raw);\n } catch {\n return { error: \"Invalid url\", status: 400 };\n }\n\n if (requireHttps && parsed.protocol !== \"https:\") {\n return { error: \"Only https URLs allowed\", status: 400 };\n }\n\n if (!requireHttps && parsed.protocol !== \"https:\" && parsed.protocol !== \"http:\") {\n return { error: \"Only http and https URLs allowed\", status: 400 };\n }\n\n if (parsed.username || parsed.password) {\n return { error: \"URL credentials not allowed\", status: 400 };\n }\n\n if (isPrivateHost(parsed.hostname)) {\n return { error: \"URL not allowed\", status: 400 };\n }\n\n return { url: parsed };\n}\n\nexport function isPrivateOrInsecureUrl(raw: string, requireHttps = true): boolean {\n return \"error\" in validateUrl(raw, { requireHttps });\n}\n","import type { FetchLike } from \"../utils/fetch.js\";\nimport {\n ALLOWED_IMAGE_CONTENT_TYPES,\n MAX_IMAGE_PROXY_BYTES,\n MAX_IMAGE_REDIRECTS,\n isPrivateHost,\n validateUrl,\n} from \"./ssrf-guard.js\";\nimport type { AppGatewayConfig } from \"./app-gateway.js\";\n\nexport interface ImageProxyConfig {\n\n resolveHostname: (hostname: string) => Promise<string[]>;\n fetchImpl?: FetchLike;\n userAgent?: string;\n backend?: Pick<AppGatewayConfig, \"appId\" | \"backendUrl\" | \"apiKey\" | \"appSecret\">;\n}\n\nconst DEFAULT_USER_AGENT =\n \"Mozilla/5.0 (compatible; Medialane/1.0; +https://www.medialane.io)\";\n\nfunction jsonError(message: string, status: number): Response {\n return Response.json({ error: message }, { status });\n}\n\nexport interface CappedBody {\n ok: boolean;\n body?: Uint8Array;\n error?: string;\n status?: number;\n}\n\nexport async function readBodyWithCap(res: Response, maxBytes: number): Promise<CappedBody> {\n const declared = Number(res.headers.get(\"content-length\") ?? 0);\n if (declared > maxBytes) {\n return { ok: false, error: \"Image too large\", status: 413 };\n }\n\n const reader = res.body?.getReader();\n if (!reader) return { ok: false, error: \"Empty response body\", status: 502 };\n\n const chunks: Uint8Array[] = [];\n let total = 0;\n for (;;) {\n const { done, value } = await reader.read();\n if (done) break;\n if (!value) continue;\n total += value.byteLength;\n if (total > maxBytes) {\n await reader.cancel().catch(() => {});\n return { ok: false, error: \"Image too large\", status: 413 };\n }\n chunks.push(value);\n }\n\n const body = new Uint8Array(total);\n let offset = 0;\n for (const chunk of chunks) {\n body.set(chunk, offset);\n offset += chunk.byteLength;\n }\n return { ok: true, body };\n}\n\nexport function createImageProxyHandler(\n config: ImageProxyConfig,\n): (req: Request) => Promise<Response> {\n const doFetch = config.fetchImpl ?? fetch;\n const userAgent = config.userAgent ?? DEFAULT_USER_AGENT;\n const backendOrigin = config.backend ? new URL(config.backend.backendUrl).origin : null;\n\n function headersFor(url: URL): Record<string, string> {\n const headers: Record<string, string> = { \"User-Agent\": userAgent };\n if (!config.backend || url.origin !== backendOrigin) return headers;\n if (config.backend.apiKey) headers[\"x-api-key\"] = config.backend.apiKey;\n headers[\"x-app-id\"] = config.backend.appId;\n if (config.backend.appSecret) headers[\"x-app-secret\"] = config.backend.appSecret;\n return headers;\n }\n\n async function resolvesToPrivateHost(hostname: string): Promise<boolean> {\n try {\n const addresses = await config.resolveHostname(hostname);\n\n if (addresses.length === 0) return true;\n return addresses.some((address) => isPrivateHost(address));\n } catch {\n return true;\n }\n }\n\n async function safeFetch(url: URL, hopsLeft: number): Promise<Response> {\n if (hopsLeft < 0) throw new Error(\"Too many redirects\");\n\n if (await resolvesToPrivateHost(url.hostname)) {\n throw new Error(\"Blocked: hostname resolves to a private address\");\n }\n\n const res = await doFetch(url.toString(), {\n redirect: \"manual\",\n headers: headersFor(url),\n });\n\n if (res.status >= 300 && res.status < 400) {\n const location = res.headers.get(\"location\");\n if (!location) throw new Error(\"Redirect with no Location header\");\n\n const next = new URL(location, url);\n const validated = validateUrl(next.toString());\n if (\"error\" in validated) throw new Error(`Redirect blocked: ${validated.error}`);\n\n return safeFetch(validated.url, hopsLeft - 1);\n }\n\n return res;\n }\n\n return async function handleImageProxy(req: Request): Promise<Response> {\n const raw = new URL(req.url).searchParams.get(\"url\");\n if (!raw) return jsonError(\"Missing url\", 400);\n\n const validated = validateUrl(raw);\n if (\"error\" in validated) return jsonError(validated.error, validated.status);\n\n let upstream: Response;\n try {\n const isBackendImage = backendOrigin && /^\\/media\\/[^/]+\\/[^/]+\\/[^/]+\\/image$/.test(validated.url.pathname);\n upstream = await safeFetch(\n isBackendImage ? new URL(validated.url.pathname, backendOrigin) : validated.url,\n MAX_IMAGE_REDIRECTS,\n );\n } catch {\n return jsonError(\"Failed to fetch image\", 502);\n }\n\n if (!upstream.ok) {\n return jsonError(`Upstream returned ${upstream.status}`, upstream.status);\n }\n\n const contentType = upstream.headers.get(\"content-type\") ?? \"\";\n const baseType = contentType.split(\";\")[0]!.trim().toLowerCase();\n if (!ALLOWED_IMAGE_CONTENT_TYPES.has(baseType)) {\n return jsonError(\"Not an image\", 400);\n }\n\n const capped = await readBodyWithCap(upstream, MAX_IMAGE_PROXY_BYTES);\n if (!capped.ok) return jsonError(capped.error!, capped.status!);\n\n return new Response(capped.body as unknown as BodyInit, {\n status: 200,\n headers: {\n \"Content-Type\": contentType,\n \"X-Content-Type-Options\": \"nosniff\",\n \"Content-Security-Policy\":\n \"default-src 'none'; img-src 'self' data:; style-src 'unsafe-inline'; sandbox\",\n \"Cache-Control\": \"public, max-age=86400, s-maxage=86400, stale-while-revalidate=604800\",\n \"Access-Control-Allow-Origin\": \"*\",\n },\n });\n };\n}\n","import type { FetchLike } from \"../utils/fetch.js\";\nexport interface BackendMetadataConfig {\n backendUrl: string;\n apiKey: string;\n fetchImpl?: FetchLike;\n}\n\nfunction endpoint(config: BackendMetadataConfig, path: string): string {\n return `${config.backendUrl.replace(/\\/$/, \"\")}/v1/metadata/${path}`;\n}\n\nfunction headers(config: BackendMetadataConfig, extra?: Record<string, string>): Record<string, string> {\n return { \"x-api-key\": config.apiKey, ...extra };\n}\n\nexport interface BackendUploadResult {\n cid: string;\n uri: string;\n}\n\nexport async function uploadJsonToBackend(config: BackendMetadataConfig, json: unknown): Promise<BackendUploadResult> {\n const res = await (config.fetchImpl ?? fetch)(endpoint(config, \"upload\"), {\n method: \"POST\",\n headers: headers(config, { \"Content-Type\": \"application/json\" }),\n body: JSON.stringify(json),\n });\n const data = (await res.json().catch(() => ({}))) as { data?: { cid: string; url: string }; error?: string };\n if (!res.ok || !data.data) throw new Error(data.error ?? \"Metadata upload failed\");\n return { cid: data.data.cid, uri: data.data.url };\n}\n\nexport async function uploadFileToBackend(config: BackendMetadataConfig, file: File): Promise<BackendUploadResult> {\n const form = new FormData();\n form.append(\"file\", file, file.name);\n const res = await (config.fetchImpl ?? fetch)(endpoint(config, \"upload-file\"), {\n method: \"POST\",\n headers: headers(config),\n body: form,\n });\n const data = (await res.json().catch(() => ({}))) as { data?: { cid: string; url: string }; error?: string };\n if (!res.ok || !data.data) throw new Error(data.error ?? \"File upload failed\");\n return { cid: data.data.cid, uri: data.data.url };\n}\n\nexport async function uploadDirectoryToBackend(\n config: BackendMetadataConfig,\n files: { name: string; content: unknown }[],\n): Promise<{ cid: string; baseUri: string }> {\n const res = await (config.fetchImpl ?? fetch)(endpoint(config, \"upload-directory\"), {\n method: \"POST\",\n headers: headers(config, { \"Content-Type\": \"application/json\" }),\n body: JSON.stringify({ files }),\n });\n const data = (await res.json().catch(() => ({}))) as {\n data?: { cid: string; baseUri: string };\n error?: string;\n };\n if (!res.ok || !data.data) throw new Error(data.error ?? \"Directory pin failed\");\n return data.data;\n}\n\nexport async function getBackendSignedUrl(\n config: BackendMetadataConfig,\n kind: \"image\" | \"document\" | \"media\" = \"image\",\n): Promise<string> {\n const res = await (config.fetchImpl ?? fetch)(`${endpoint(config, \"signed-url\")}?kind=${kind}`, {\n method: \"GET\",\n headers: headers(config),\n });\n const data = (await res.json().catch(() => ({}))) as { data?: { url: string }; error?: string };\n if (!res.ok || !data.data) throw new Error(data.error ?? \"Failed to create upload URL\");\n return data.data.url;\n}\n","const SEG = \"[^/]+\";\n\nconst PUBLIC_ROUTES: Record<string, RegExp[]> = {\n GET: [\n \"orders\", `orders/${SEG}`, `orders/token/${SEG}/${SEG}`, `orders/user/${SEG}`, `orders/received/${SEG}`, \"orders/counter-offers\",\n \"tokens\", `tokens/owned/${SEG}`, `tokens/${SEG}/${SEG}`, `tokens/${SEG}/${SEG}/(history|comments|remixes)`, `tokens/${SEG}/${SEG}/balances/${SEG}`,\n \"collections\", `collections/${SEG}`, `collections/${SEG}/tokens`, `collections/${SEG}/profile`,\n \"activities\", `activities/${SEG}`, \"search\", \"metadata/resolve\",\n \"creators\", `creators/${SEG}/profile`, `creators/by-username/${SEG}`, `creators/${SEG}/hidden`,\n \"coins\", \"coins/prices\", \"coins/claims\", `coins/${SEG}`, `coins/${SEG}/guarantees`, `pop/${SEG}/claim-info`,\n \"drops\", `drops/${SEG}`, `drops/${SEG}/mints`, `drops/${SEG}/state`,\n \"rewards\", \"rewards/config\", \"rewards/batch\", `rewards/${SEG}`, `rewards/${SEG}/events`,\n `club/${SEG}/${SEG}`, `club/${SEG}/${SEG}/member/${SEG}`, `tickets/${SEG}/${SEG}`, `tickets/${SEG}/count`, `ipnft/${SEG}/${SEG}`,\n \"stats\", \"prices\", `remix-offers/${SEG}`,\n \"sponsorship/offers\", `sponsorship/offers/${SEG}`, `sponsorship/offers/${SEG}/bids`,\n \"sponsorship/proposals\", `sponsorship/proposals/${SEG}`, \"sponsorship/licenses\", `sponsorship/licenses/${SEG}`,\n \"auth/email/exists\",\n `media/${SEG}/${SEG}/${SEG}/image`,\n ].map((p) => new RegExp(`^${p}$`)),\n POST: [\n \"auth/email/(request-code|verify-code|register-account|confirm)\",\n \"auth/siws/(nonce|verify)\",\n \"users/register\",\n ].map((p) => new RegExp(`^${p}$`)),\n};\n\nexport function isPublicAppRoute(method: string, path: string): boolean {\n if (path.split(\"/\").some((s) => s === \".\" || s === \"..\" || s === \"\")) return false;\n return (PUBLIC_ROUTES[method.toUpperCase()] ?? []).some((re) => re.test(path));\n}\n","import { hmac } from \"@noble/hashes/hmac.js\";\nimport { sha256 } from \"@noble/hashes/sha2.js\";\nimport { base64urlnopad } from \"@scure/base\";\nimport type { Chain } from \"../chains.js\";\n\nconst IDENTITY_PREFIX = \"siws_\";\nconst ACCOUNT_SESSION_PREFIX = \"account_session_\";\n\nconst IDENTITY_DOMAIN = \"siws-identity-v1\";\nconst ACCOUNT_SESSION_DOMAIN = \"account-session-v1\";\n\nexport const IDENTITY_TTL_SECONDS = 86_400;\nexport const ACCOUNT_SESSION_TTL_SECONDS = 30 * 24 * 60 * 60;\n\nconst CLOCK_SKEW_SECONDS = 60;\n\nexport interface SiwsIdentity {\n address: string;\n chain: Chain;\n}\n\ninterface IdentityPayload {\n sub?: string;\n chain?: Chain;\n iat?: number;\n exp?: number;\n}\n\ninterface AccountSessionPayload {\n accountId?: string;\n iat?: number;\n exp?: number;\n}\n\nconst encoder = new TextEncoder();\nconst decoder = new TextDecoder();\n\nfunction toHex(bytes: Uint8Array): string {\n let out = \"\";\n for (const b of bytes) out += b.toString(16).padStart(2, \"0\");\n return out;\n}\n\nfunction sign(secret: string, domain: string, payload: string): string {\n return toHex(hmac(sha256, encoder.encode(secret), encoder.encode(`${domain}.${payload}`)));\n}\n\nfunction constantTimeEquals(a: string, b: string): boolean {\n if (a.length !== b.length) return false;\n let diff = 0;\n for (let i = 0; i < a.length; i++) diff |= a.charCodeAt(i) ^ b.charCodeAt(i);\n return diff === 0;\n}\n\nfunction signatureMatches(secret: string, domain: string, payload: string, provided: string): boolean {\n return constantTimeEquals(provided, sign(secret, domain, payload));\n}\n\nfunction encodePayload(value: unknown): string {\n return base64urlnopad.encode(encoder.encode(JSON.stringify(value)));\n}\n\nfunction decodePayload<T>(payload: string): T | null {\n try {\n return JSON.parse(decoder.decode(base64urlnopad.decode(payload))) as T;\n } catch {\n return null;\n }\n}\n\nfunction splitToken(raw: string, prefix: string): { payload: string; signature: string } | null {\n if (!raw.startsWith(prefix)) return null;\n const inner = raw.slice(prefix.length);\n const dot = inner.lastIndexOf(\".\");\n if (dot === -1) return null;\n return { payload: inner.slice(0, dot), signature: inner.slice(dot + 1) };\n}\n\nfunction withinLifetime(iat: number | undefined, exp: number | undefined): boolean {\n if (!iat || !exp) return false;\n const now = Math.floor(Date.now() / 1000);\n return exp >= now && iat <= now + CLOCK_SKEW_SECONDS;\n}\n\nexport function issueSiwsToken(\n secret: string,\n chain: Chain,\n wallet: string,\n ttlSeconds: number = IDENTITY_TTL_SECONDS,\n): string {\n const iat = Math.floor(Date.now() / 1000);\n const payload = encodePayload({ sub: wallet, chain, iat, exp: iat + ttlSeconds });\n return `${IDENTITY_PREFIX}${payload}.${sign(secret, IDENTITY_DOMAIN, payload)}`;\n}\n\nexport function verifySiwsToken(secret: string, raw: string): SiwsIdentity | null {\n const parts = splitToken(raw, IDENTITY_PREFIX);\n if (!parts) return null;\n if (!signatureMatches(secret, IDENTITY_DOMAIN, parts.payload, parts.signature)) return null;\n\n const data = decodePayload<IdentityPayload>(parts.payload);\n if (!data?.sub || !withinLifetime(data.iat, data.exp)) return null;\n\n return { address: data.sub, chain: data.chain ?? \"STARKNET\" };\n}\n\nexport function issueAccountSessionToken(\n secret: string,\n accountId: string,\n ttlSeconds: number = ACCOUNT_SESSION_TTL_SECONDS,\n): string {\n const iat = Math.floor(Date.now() / 1000);\n const payload = encodePayload({ accountId, iat, exp: iat + ttlSeconds });\n return `${ACCOUNT_SESSION_PREFIX}${payload}.${sign(secret, ACCOUNT_SESSION_DOMAIN, payload)}`;\n}\n\n/** The account a valid session token is for, and when it was issued (seconds since the epoch). */\nexport function readAccountSessionToken(secret: string, raw: string): { accountId: string; issuedAt: number } | null {\n const parts = splitToken(raw, ACCOUNT_SESSION_PREFIX);\n if (!parts) return null;\n if (!signatureMatches(secret, ACCOUNT_SESSION_DOMAIN, parts.payload, parts.signature)) return null;\n\n const data = decodePayload<AccountSessionPayload>(parts.payload);\n if (!data?.accountId || !data.iat || !withinLifetime(data.iat, data.exp)) return null;\n\n return { accountId: data.accountId, issuedAt: data.iat };\n}\n\nexport function verifyAccountSessionToken(secret: string, raw: string): string | null {\n return readAccountSessionToken(secret, raw)?.accountId ?? null;\n}\n","const CID_PATH_PATTERN = /^(Qm[1-9A-HJ-NP-Za-km-z]{44,}|b[a-z2-7]{58,})(\\/[\\w.\\-/]*)?$/;\n\nexport function isValidIpfsCidPath(cidPath: string): boolean {\n if (!CID_PATH_PATTERN.test(cidPath)) return false;\n if (cidPath.split(\"/\").includes(\"..\")) return false;\n return true;\n}\n\nexport const IPFS_SAFE_CONTENT_TYPE_PREFIXES = [\n \"image/jpeg\", \"image/png\", \"image/gif\", \"image/webp\", \"image/avif\", \"image/svg+xml\",\n \"video/\", \"audio/\", \"model/\", \"font/\", \"application/json\", \"application/octet-stream\",\n] as const;\n\nexport function resolveSafeImageContentType(contentType: string): string {\n return IPFS_SAFE_CONTENT_TYPE_PREFIXES.some((p) => contentType.startsWith(p))\n ? contentType\n : \"application/octet-stream\";\n}\n\nexport const MAX_IPFS_GATEWAY_RESPONSE_BYTES = 25 * 1024 * 1024;\n"]}
|
|
@@ -622,13 +622,16 @@ function issueAccountSessionToken(secret, accountId, ttlSeconds = ACCOUNT_SESSIO
|
|
|
622
622
|
const payload = encodePayload({ accountId, iat, exp: iat + ttlSeconds });
|
|
623
623
|
return `${ACCOUNT_SESSION_PREFIX}${payload}.${sign(secret, ACCOUNT_SESSION_DOMAIN, payload)}`;
|
|
624
624
|
}
|
|
625
|
-
function
|
|
625
|
+
function readAccountSessionToken(secret, raw) {
|
|
626
626
|
const parts = splitToken(raw, ACCOUNT_SESSION_PREFIX);
|
|
627
627
|
if (!parts) return null;
|
|
628
628
|
if (!signatureMatches(secret, ACCOUNT_SESSION_DOMAIN, parts.payload, parts.signature)) return null;
|
|
629
629
|
const data = decodePayload(parts.payload);
|
|
630
|
-
if (!data?.accountId || !withinLifetime(data.iat, data.exp)) return null;
|
|
631
|
-
return data.accountId;
|
|
630
|
+
if (!data?.accountId || !data.iat || !withinLifetime(data.iat, data.exp)) return null;
|
|
631
|
+
return { accountId: data.accountId, issuedAt: data.iat };
|
|
632
|
+
}
|
|
633
|
+
function verifyAccountSessionToken(secret, raw) {
|
|
634
|
+
return readAccountSessionToken(secret, raw)?.accountId ?? null;
|
|
632
635
|
}
|
|
633
636
|
|
|
634
637
|
// src/utils/ipfs-gateway.ts
|
|
@@ -676,6 +679,7 @@ exports.isSameOrigin = isSameOrigin;
|
|
|
676
679
|
exports.isValidIpfsCidPath = isValidIpfsCidPath;
|
|
677
680
|
exports.issueAccountSessionToken = issueAccountSessionToken;
|
|
678
681
|
exports.issueSiwsToken = issueSiwsToken;
|
|
682
|
+
exports.readAccountSessionToken = readAccountSessionToken;
|
|
679
683
|
exports.readBodyWithCap = readBodyWithCap;
|
|
680
684
|
exports.resolveSafeImageContentType = resolveSafeImageContentType;
|
|
681
685
|
exports.uploadDirectoryToBackend = uploadDirectoryToBackend;
|
|
@@ -684,5 +688,5 @@ exports.uploadJsonToBackend = uploadJsonToBackend;
|
|
|
684
688
|
exports.validateUrl = validateUrl;
|
|
685
689
|
exports.verifyAccountSessionToken = verifyAccountSessionToken;
|
|
686
690
|
exports.verifySiwsToken = verifySiwsToken;
|
|
687
|
-
//# sourceMappingURL=chunk-
|
|
688
|
-
//# sourceMappingURL=chunk-
|
|
691
|
+
//# sourceMappingURL=chunk-JCA5XMS6.cjs.map
|
|
692
|
+
//# sourceMappingURL=chunk-JCA5XMS6.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/server/origin.ts","../src/server/app-gateway.ts","../src/server/app-session.ts","../src/server/ssrf-guard.ts","../src/server/image-proxy.ts","../src/server/backend-metadata.ts","../src/server/app-routes.ts","../src/server/siws-token.ts","../src/utils/ipfs-gateway.ts"],"names":["headers","json","hmac","sha256","base64urlnopad"],"mappings":"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","file":"chunk-JCA5XMS6.cjs","sourcesContent":["export function isSameOrigin(req: Request): boolean {\n const origin = req.headers.get(\"origin\");\n if (!origin) return true;\n const host = req.headers.get(\"host\");\n try {\n return new URL(origin).host === host;\n } catch {\n return false;\n }\n}\n","import type { FetchLike } from \"../utils/fetch.js\";\nimport { isSameOrigin } from \"./origin.js\";\n\nexport const ACCOUNT_SESSION_COOKIE = \"ml_account_session\";\nconst SESSION_MAX_AGE_SECONDS = 30 * 24 * 60 * 60;\nconst SIGN_IN_PATHS = new Set([\"auth/email/register-account\", \"auth/email/verify-code\", \"auth/siws/verify\"]);\nconst EDGE_CACHE_CONTROL = \"public, s-maxage=30, stale-while-revalidate=120\";\nconst DROPPED_REQUEST_HEADERS = new Set([\n \"connection\", \"keep-alive\", \"proxy-authenticate\", \"proxy-authorization\", \"te\", \"trailers\",\n \"transfer-encoding\", \"upgrade\", \"host\", \"content-length\", \"accept-encoding\", \"cookie\",\n \"x-api-key\", \"x-app-id\", \"x-app-secret\", \"x-account-session\", \"authorization\",\n]);\nconst DROPPED_RESPONSE_HEADERS = new Set([\n \"connection\", \"keep-alive\", \"transfer-encoding\", \"content-length\", \"content-encoding\", \"set-cookie\",\n]);\n\nexport interface AppGatewayConfig {\n appId: string;\n backendUrl: string;\n apiKey: string | undefined;\n appSecret?: string;\n allow: Record<string, RegExp[]>;\n cacheableGets?: RegExp[];\n timeoutMs?: number;\n fetchImpl?: FetchLike;\n}\n\nexport function readCookie(req: Request, name: string): string | null {\n const raw = req.headers.get(\"cookie\");\n if (!raw) return null;\n for (const part of raw.split(\";\")) {\n const eq = part.indexOf(\"=\");\n if (eq !== -1 && part.slice(0, eq).trim() === name) return part.slice(eq + 1).trim() || null;\n }\n return null;\n}\n\nexport function sessionCookie(value: string, maxAge = SESSION_MAX_AGE_SECONDS): string {\n const secure = process.env.NODE_ENV === \"production\" ? \"; Secure\" : \"\";\n return `${ACCOUNT_SESSION_COOKIE}=${value}; Path=/; HttpOnly; SameSite=Lax; Max-Age=${maxAge}${secure}`;\n}\n\nfunction json(body: unknown, status: number): Response {\n return Response.json(body, { status });\n}\n\nexport function createAppGateway(config: AppGatewayConfig): (req: Request, path: string[]) => Promise<Response> {\n const doFetch = config.fetchImpl ?? fetch;\n const base = config.backendUrl.replace(/\\/$/, \"\");\n\n return async function appGateway(req, path) {\n if (!isSameOrigin(req)) return json({ error: \"Cross-origin requests are not allowed\" }, 403);\n if (!config.apiKey) return json({ error: \"Service unavailable\" }, 500);\n if (path.some((s) => s === \".\" || s === \"..\" || s === \"\")) return json({ error: \"Invalid path\" }, 400);\n\n const joined = path.join(\"/\");\n const method = req.method.toUpperCase();\n if (!(config.allow[method] ?? []).some((re) => re.test(joined))) {\n return json({ error: `Path not allowed: ${method} /v1/${joined}` }, 403);\n }\n\n const headers = new Headers();\n req.headers.forEach((v, k) => {\n if (!DROPPED_REQUEST_HEADERS.has(k.toLowerCase())) headers.set(k, v);\n });\n headers.set(\"x-api-key\", config.apiKey);\n headers.set(\"x-app-id\", config.appId);\n if (config.appSecret) headers.set(\"x-app-secret\", config.appSecret);\n const session = readCookie(req, ACCOUNT_SESSION_COOKIE);\n if (session) headers.set(\"x-account-session\", session);\n\n const search = new URL(req.url).search;\n const target = `${base}/v1/${path.map(encodeURIComponent).join(\"/\")}${search}`;\n const hasBody = method !== \"GET\" && method !== \"HEAD\";\n\n let res: Response;\n try {\n res = await doFetch(target, {\n method,\n headers,\n body: hasBody ? await req.arrayBuffer() : undefined,\n cache: \"no-store\",\n redirect: \"manual\",\n signal: AbortSignal.timeout(config.timeoutMs ?? 55_000),\n });\n } catch (e) {\n if (e instanceof DOMException && e.name === \"TimeoutError\") {\n return json({ error: \"The service took too long to respond\" }, 504);\n }\n return json({ error: \"Service unavailable\" }, 502);\n }\n\n const out = new Headers();\n res.headers.forEach((v, k) => {\n if (!DROPPED_RESPONSE_HEADERS.has(k.toLowerCase())) out.set(k, v);\n });\n\n if (method === \"POST\" && res.ok && SIGN_IN_PATHS.has(joined)) {\n const text = await res.text();\n let body: Record<string, unknown> | null = null;\n try {\n body = JSON.parse(text) as Record<string, unknown>;\n } catch {\n body = null;\n }\n if (!body) return new Response(text, { status: res.status, headers: out });\n const token = typeof body.accountToken === \"string\" ? body.accountToken : null;\n delete body.accountToken;\n delete body.token;\n out.set(\"content-type\", \"application/json\");\n if (token) out.append(\"set-cookie\", sessionCookie(token));\n return new Response(JSON.stringify(body), { status: res.status, headers: out });\n }\n\n if (method === \"GET\" && res.ok && !session && (config.cacheableGets ?? []).some((re) => re.test(joined))) {\n out.set(\"cache-control\", EDGE_CACHE_CONTROL);\n }\n return new Response(res.body, { status: res.status, headers: out });\n };\n}\n","import type { FetchLike } from \"../utils/fetch.js\";\nimport { readCookie, sessionCookie, ACCOUNT_SESSION_COOKIE } from \"./app-gateway.js\";\n\nexport interface AppSessionConfig {\n appId: string;\n backendUrl: string;\n apiKey: string | undefined;\n appSecret?: string;\n fetchImpl?: FetchLike;\n}\n\nfunction signedOut(): Response {\n const res = Response.json(null);\n res.headers.append(\"set-cookie\", sessionCookie(\"\", 0));\n return res;\n}\n\nexport function createAppSessionHandler(config: AppSessionConfig): {\n GET(req: Request): Promise<Response>;\n DELETE(req: Request): Promise<Response>;\n} {\n const doFetch = config.fetchImpl ?? fetch;\n const base = config.backendUrl.replace(/\\/$/, \"\");\n return {\n async GET(req) {\n const session = readCookie(req, ACCOUNT_SESSION_COOKIE);\n if (!session) return Response.json(null);\n const res = await doFetch(`${base}/v1/users/me`, {\n headers: {\n \"x-api-key\": config.apiKey ?? \"\",\n \"x-app-id\": config.appId,\n ...(config.appSecret ? { \"x-app-secret\": config.appSecret } : {}),\n \"x-account-session\": session,\n },\n cache: \"no-store\",\n });\n if (res.status === 401 || res.status === 403) return signedOut();\n if (!res.ok) return Response.json({ error: \"Session check failed\" }, { status: 502 });\n return Response.json(await res.json());\n },\n async DELETE() {\n return signedOut();\n },\n };\n}\n","export const ALLOWED_IMAGE_CONTENT_TYPES = new Set([\n \"image/jpeg\",\n \"image/jpg\",\n \"image/png\",\n \"image/gif\",\n \"image/webp\",\n \"image/svg+xml\",\n \"image/avif\",\n \"image/bmp\",\n \"image/tiff\",\n]);\n\nexport const MAX_IMAGE_REDIRECTS = 5;\n\nexport const MAX_IMAGE_PROXY_BYTES = 15 * 1024 * 1024;\n\nfunction parseIpv4(ip: string): number[] | null {\n const parts = ip.split(\".\");\n if (parts.length !== 4) return null;\n const bytes: number[] = [];\n for (const part of parts) {\n if (!/^\\d{1,3}$/.test(part)) return null;\n const n = Number(part);\n if (n > 255) return null;\n bytes.push(n);\n }\n return bytes;\n}\n\nfunction isPrivateIpv4(bytes: number[]): boolean {\n const a = bytes[0]!;\n const b = bytes[1]!;\n const c = bytes[2]!;\n if (a === 0) return true;\n if (a === 10) return true;\n if (a === 100 && b >= 64 && b <= 127) return true;\n if (a === 127) return true;\n if (a === 169 && b === 254) return true;\n if (a === 172 && b >= 16 && b <= 31) return true;\n if (a === 192 && b === 0 && c === 0) return true;\n if (a === 192 && b === 168) return true;\n if (a === 198 && (b === 18 || b === 19)) return true;\n if (a >= 224) return true;\n return false;\n}\n\nfunction expandIpv6(rawIp: string): number[] | null {\n let ip = rawIp;\n\n let embeddedV4: number[] | null = null;\n const v4Tail = ip.match(/(\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3})$/);\n if (v4Tail && ip.includes(\":\")) {\n embeddedV4 = parseIpv4(v4Tail[1]!);\n if (!embeddedV4) return null;\n ip = ip.slice(0, ip.length - v4Tail[1]!.length) + \"0:0\";\n }\n\n const sides = ip.split(\"::\");\n if (sides.length > 2) return null;\n\n const head = sides[0] ? sides[0].split(\":\").filter(Boolean) : [];\n const tail = sides.length === 2 && sides[1] ? sides[1].split(\":\").filter(Boolean) : [];\n\n let groups: string[];\n if (sides.length === 1) {\n groups = head;\n if (groups.length !== 8) return null;\n } else {\n const missing = 8 - head.length - tail.length;\n if (missing < 0) return null;\n groups = [...head, ...Array(missing).fill(\"0\"), ...tail];\n }\n if (groups.length !== 8) return null;\n\n const bytes: number[] = [];\n for (const group of groups) {\n if (!/^[0-9a-fA-F]{1,4}$/.test(group)) return null;\n const n = parseInt(group, 16);\n bytes.push((n >> 8) & 0xff, n & 0xff);\n }\n\n if (embeddedV4) {\n bytes[12] = embeddedV4[0]!;\n bytes[13] = embeddedV4[1]!;\n bytes[14] = embeddedV4[2]!;\n bytes[15] = embeddedV4[3]!;\n }\n\n return bytes;\n}\n\nfunction isPrivateIpv6(bytes: number[]): boolean {\n if (bytes.every((b) => b === 0)) return true;\n if (bytes.slice(0, 15).every((b) => b === 0) && bytes[15] === 1) return true;\n if ((bytes[0]! & 0xfe) === 0xfc) return true;\n if (bytes[0] === 0xfe && (bytes[1]! & 0xc0) === 0x80) return true;\n\n if (bytes.slice(0, 10).every((b) => b === 0) && bytes[10] === 0xff && bytes[11] === 0xff) {\n return isPrivateIpv4(bytes.slice(12));\n }\n if (bytes.slice(0, 12).every((b) => b === 0)) return isPrivateIpv4(bytes.slice(12));\n if (bytes[0] === 0x00 && bytes[1] === 0x64 && bytes[2] === 0xff && bytes[3] === 0x9b && bytes.slice(4, 12).every((b) => b === 0)) {\n return isPrivateIpv4(bytes.slice(12));\n }\n if (bytes[0] === 0x20 && bytes[1] === 0x02) return isPrivateIpv4(bytes.slice(2, 6));\n if (bytes[0] === 0xfe && (bytes[1]! & 0xc0) === 0xc0) return true;\n if (bytes[0] === 0xff) return true;\n return false;\n}\n\nfunction parseNumber(part: string): number | null {\n if (/^0x[0-9a-f]+$/i.test(part)) return parseInt(part.slice(2), 16);\n if (/^0[0-7]+$/.test(part)) return parseInt(part, 8);\n if (/^\\d+$/.test(part)) return parseInt(part, 10);\n return null;\n}\n\nfunction normalizeNumericHostname(host: string): string | null {\n const parts = host.trim().split(\".\");\n if (parts.length < 1 || parts.length > 4) return null;\n\n const values: number[] = [];\n for (const part of parts) {\n const value = parseNumber(part);\n if (value === null || value < 0) return null;\n values.push(value);\n }\n\n const leading = values.slice(0, -1);\n if (leading.some((v) => v > 255)) return null;\n\n const tail = values[values.length - 1]!;\n const tailBytes = 4 - leading.length;\n if (tail > 2 ** (8 * tailBytes) - 1) return null;\n\n const bytes = [...leading];\n for (let i = tailBytes - 1; i >= 0; i--) bytes.push((tail >>> (8 * i)) & 0xff);\n\n return bytes.join(\".\");\n}\n\nconst BLOCKED_HOSTNAMES = new Set([\n \"localhost\",\n \"metadata.google.internal\",\n \"metadata.azure.internal\",\n]);\n\nexport function isPrivateHost(hostname: string): boolean {\n const host = hostname.toLowerCase().replace(/^\\[|\\]$/g, \"\");\n\n if (BLOCKED_HOSTNAMES.has(host)) return true;\n if (host.endsWith(\".local\") || host.endsWith(\".internal\") || host.endsWith(\".localhost\")) return true;\n\n const candidate = normalizeNumericHostname(host) ?? host;\n\n const v4 = parseIpv4(candidate);\n if (v4) return isPrivateIpv4(v4);\n\n const v6 = expandIpv6(candidate);\n if (v6) return isPrivateIpv6(v6);\n\n return false;\n}\n\nexport function validateUrl(\n raw: string,\n options: { requireHttps?: boolean } = {},\n): { url: URL } | { error: string; status: number } {\n const requireHttps = options.requireHttps ?? true;\n\n let parsed: URL;\n try {\n parsed = new URL(raw);\n } catch {\n return { error: \"Invalid url\", status: 400 };\n }\n\n if (requireHttps && parsed.protocol !== \"https:\") {\n return { error: \"Only https URLs allowed\", status: 400 };\n }\n\n if (!requireHttps && parsed.protocol !== \"https:\" && parsed.protocol !== \"http:\") {\n return { error: \"Only http and https URLs allowed\", status: 400 };\n }\n\n if (parsed.username || parsed.password) {\n return { error: \"URL credentials not allowed\", status: 400 };\n }\n\n if (isPrivateHost(parsed.hostname)) {\n return { error: \"URL not allowed\", status: 400 };\n }\n\n return { url: parsed };\n}\n\nexport function isPrivateOrInsecureUrl(raw: string, requireHttps = true): boolean {\n return \"error\" in validateUrl(raw, { requireHttps });\n}\n","import type { FetchLike } from \"../utils/fetch.js\";\nimport {\n ALLOWED_IMAGE_CONTENT_TYPES,\n MAX_IMAGE_PROXY_BYTES,\n MAX_IMAGE_REDIRECTS,\n isPrivateHost,\n validateUrl,\n} from \"./ssrf-guard.js\";\nimport type { AppGatewayConfig } from \"./app-gateway.js\";\n\nexport interface ImageProxyConfig {\n\n resolveHostname: (hostname: string) => Promise<string[]>;\n fetchImpl?: FetchLike;\n userAgent?: string;\n backend?: Pick<AppGatewayConfig, \"appId\" | \"backendUrl\" | \"apiKey\" | \"appSecret\">;\n}\n\nconst DEFAULT_USER_AGENT =\n \"Mozilla/5.0 (compatible; Medialane/1.0; +https://www.medialane.io)\";\n\nfunction jsonError(message: string, status: number): Response {\n return Response.json({ error: message }, { status });\n}\n\nexport interface CappedBody {\n ok: boolean;\n body?: Uint8Array;\n error?: string;\n status?: number;\n}\n\nexport async function readBodyWithCap(res: Response, maxBytes: number): Promise<CappedBody> {\n const declared = Number(res.headers.get(\"content-length\") ?? 0);\n if (declared > maxBytes) {\n return { ok: false, error: \"Image too large\", status: 413 };\n }\n\n const reader = res.body?.getReader();\n if (!reader) return { ok: false, error: \"Empty response body\", status: 502 };\n\n const chunks: Uint8Array[] = [];\n let total = 0;\n for (;;) {\n const { done, value } = await reader.read();\n if (done) break;\n if (!value) continue;\n total += value.byteLength;\n if (total > maxBytes) {\n await reader.cancel().catch(() => {});\n return { ok: false, error: \"Image too large\", status: 413 };\n }\n chunks.push(value);\n }\n\n const body = new Uint8Array(total);\n let offset = 0;\n for (const chunk of chunks) {\n body.set(chunk, offset);\n offset += chunk.byteLength;\n }\n return { ok: true, body };\n}\n\nexport function createImageProxyHandler(\n config: ImageProxyConfig,\n): (req: Request) => Promise<Response> {\n const doFetch = config.fetchImpl ?? fetch;\n const userAgent = config.userAgent ?? DEFAULT_USER_AGENT;\n const backendOrigin = config.backend ? new URL(config.backend.backendUrl).origin : null;\n\n function headersFor(url: URL): Record<string, string> {\n const headers: Record<string, string> = { \"User-Agent\": userAgent };\n if (!config.backend || url.origin !== backendOrigin) return headers;\n if (config.backend.apiKey) headers[\"x-api-key\"] = config.backend.apiKey;\n headers[\"x-app-id\"] = config.backend.appId;\n if (config.backend.appSecret) headers[\"x-app-secret\"] = config.backend.appSecret;\n return headers;\n }\n\n async function resolvesToPrivateHost(hostname: string): Promise<boolean> {\n try {\n const addresses = await config.resolveHostname(hostname);\n\n if (addresses.length === 0) return true;\n return addresses.some((address) => isPrivateHost(address));\n } catch {\n return true;\n }\n }\n\n async function safeFetch(url: URL, hopsLeft: number): Promise<Response> {\n if (hopsLeft < 0) throw new Error(\"Too many redirects\");\n\n if (await resolvesToPrivateHost(url.hostname)) {\n throw new Error(\"Blocked: hostname resolves to a private address\");\n }\n\n const res = await doFetch(url.toString(), {\n redirect: \"manual\",\n headers: headersFor(url),\n });\n\n if (res.status >= 300 && res.status < 400) {\n const location = res.headers.get(\"location\");\n if (!location) throw new Error(\"Redirect with no Location header\");\n\n const next = new URL(location, url);\n const validated = validateUrl(next.toString());\n if (\"error\" in validated) throw new Error(`Redirect blocked: ${validated.error}`);\n\n return safeFetch(validated.url, hopsLeft - 1);\n }\n\n return res;\n }\n\n return async function handleImageProxy(req: Request): Promise<Response> {\n const raw = new URL(req.url).searchParams.get(\"url\");\n if (!raw) return jsonError(\"Missing url\", 400);\n\n const validated = validateUrl(raw);\n if (\"error\" in validated) return jsonError(validated.error, validated.status);\n\n let upstream: Response;\n try {\n const isBackendImage = backendOrigin && /^\\/media\\/[^/]+\\/[^/]+\\/[^/]+\\/image$/.test(validated.url.pathname);\n upstream = await safeFetch(\n isBackendImage ? new URL(validated.url.pathname, backendOrigin) : validated.url,\n MAX_IMAGE_REDIRECTS,\n );\n } catch {\n return jsonError(\"Failed to fetch image\", 502);\n }\n\n if (!upstream.ok) {\n return jsonError(`Upstream returned ${upstream.status}`, upstream.status);\n }\n\n const contentType = upstream.headers.get(\"content-type\") ?? \"\";\n const baseType = contentType.split(\";\")[0]!.trim().toLowerCase();\n if (!ALLOWED_IMAGE_CONTENT_TYPES.has(baseType)) {\n return jsonError(\"Not an image\", 400);\n }\n\n const capped = await readBodyWithCap(upstream, MAX_IMAGE_PROXY_BYTES);\n if (!capped.ok) return jsonError(capped.error!, capped.status!);\n\n return new Response(capped.body as unknown as BodyInit, {\n status: 200,\n headers: {\n \"Content-Type\": contentType,\n \"X-Content-Type-Options\": \"nosniff\",\n \"Content-Security-Policy\":\n \"default-src 'none'; img-src 'self' data:; style-src 'unsafe-inline'; sandbox\",\n \"Cache-Control\": \"public, max-age=86400, s-maxage=86400, stale-while-revalidate=604800\",\n \"Access-Control-Allow-Origin\": \"*\",\n },\n });\n };\n}\n","import type { FetchLike } from \"../utils/fetch.js\";\nexport interface BackendMetadataConfig {\n backendUrl: string;\n apiKey: string;\n fetchImpl?: FetchLike;\n}\n\nfunction endpoint(config: BackendMetadataConfig, path: string): string {\n return `${config.backendUrl.replace(/\\/$/, \"\")}/v1/metadata/${path}`;\n}\n\nfunction headers(config: BackendMetadataConfig, extra?: Record<string, string>): Record<string, string> {\n return { \"x-api-key\": config.apiKey, ...extra };\n}\n\nexport interface BackendUploadResult {\n cid: string;\n uri: string;\n}\n\nexport async function uploadJsonToBackend(config: BackendMetadataConfig, json: unknown): Promise<BackendUploadResult> {\n const res = await (config.fetchImpl ?? fetch)(endpoint(config, \"upload\"), {\n method: \"POST\",\n headers: headers(config, { \"Content-Type\": \"application/json\" }),\n body: JSON.stringify(json),\n });\n const data = (await res.json().catch(() => ({}))) as { data?: { cid: string; url: string }; error?: string };\n if (!res.ok || !data.data) throw new Error(data.error ?? \"Metadata upload failed\");\n return { cid: data.data.cid, uri: data.data.url };\n}\n\nexport async function uploadFileToBackend(config: BackendMetadataConfig, file: File): Promise<BackendUploadResult> {\n const form = new FormData();\n form.append(\"file\", file, file.name);\n const res = await (config.fetchImpl ?? fetch)(endpoint(config, \"upload-file\"), {\n method: \"POST\",\n headers: headers(config),\n body: form,\n });\n const data = (await res.json().catch(() => ({}))) as { data?: { cid: string; url: string }; error?: string };\n if (!res.ok || !data.data) throw new Error(data.error ?? \"File upload failed\");\n return { cid: data.data.cid, uri: data.data.url };\n}\n\nexport async function uploadDirectoryToBackend(\n config: BackendMetadataConfig,\n files: { name: string; content: unknown }[],\n): Promise<{ cid: string; baseUri: string }> {\n const res = await (config.fetchImpl ?? fetch)(endpoint(config, \"upload-directory\"), {\n method: \"POST\",\n headers: headers(config, { \"Content-Type\": \"application/json\" }),\n body: JSON.stringify({ files }),\n });\n const data = (await res.json().catch(() => ({}))) as {\n data?: { cid: string; baseUri: string };\n error?: string;\n };\n if (!res.ok || !data.data) throw new Error(data.error ?? \"Directory pin failed\");\n return data.data;\n}\n\nexport async function getBackendSignedUrl(\n config: BackendMetadataConfig,\n kind: \"image\" | \"document\" | \"media\" = \"image\",\n): Promise<string> {\n const res = await (config.fetchImpl ?? fetch)(`${endpoint(config, \"signed-url\")}?kind=${kind}`, {\n method: \"GET\",\n headers: headers(config),\n });\n const data = (await res.json().catch(() => ({}))) as { data?: { url: string }; error?: string };\n if (!res.ok || !data.data) throw new Error(data.error ?? \"Failed to create upload URL\");\n return data.data.url;\n}\n","const SEG = \"[^/]+\";\n\nconst PUBLIC_ROUTES: Record<string, RegExp[]> = {\n GET: [\n \"orders\", `orders/${SEG}`, `orders/token/${SEG}/${SEG}`, `orders/user/${SEG}`, `orders/received/${SEG}`, \"orders/counter-offers\",\n \"tokens\", `tokens/owned/${SEG}`, `tokens/${SEG}/${SEG}`, `tokens/${SEG}/${SEG}/(history|comments|remixes)`, `tokens/${SEG}/${SEG}/balances/${SEG}`,\n \"collections\", `collections/${SEG}`, `collections/${SEG}/tokens`, `collections/${SEG}/profile`,\n \"activities\", `activities/${SEG}`, \"search\", \"metadata/resolve\",\n \"creators\", `creators/${SEG}/profile`, `creators/by-username/${SEG}`, `creators/${SEG}/hidden`,\n \"coins\", \"coins/prices\", \"coins/claims\", `coins/${SEG}`, `coins/${SEG}/guarantees`, `pop/${SEG}/claim-info`,\n \"drops\", `drops/${SEG}`, `drops/${SEG}/mints`, `drops/${SEG}/state`,\n \"rewards\", \"rewards/config\", \"rewards/batch\", `rewards/${SEG}`, `rewards/${SEG}/events`,\n `club/${SEG}/${SEG}`, `club/${SEG}/${SEG}/member/${SEG}`, `tickets/${SEG}/${SEG}`, `tickets/${SEG}/count`, `ipnft/${SEG}/${SEG}`,\n \"stats\", \"prices\", `remix-offers/${SEG}`,\n \"sponsorship/offers\", `sponsorship/offers/${SEG}`, `sponsorship/offers/${SEG}/bids`,\n \"sponsorship/proposals\", `sponsorship/proposals/${SEG}`, \"sponsorship/licenses\", `sponsorship/licenses/${SEG}`,\n \"auth/email/exists\",\n `media/${SEG}/${SEG}/${SEG}/image`,\n ].map((p) => new RegExp(`^${p}$`)),\n POST: [\n \"auth/email/(request-code|verify-code|register-account|confirm)\",\n \"auth/siws/(nonce|verify)\",\n \"users/register\",\n ].map((p) => new RegExp(`^${p}$`)),\n};\n\nexport function isPublicAppRoute(method: string, path: string): boolean {\n if (path.split(\"/\").some((s) => s === \".\" || s === \"..\" || s === \"\")) return false;\n return (PUBLIC_ROUTES[method.toUpperCase()] ?? []).some((re) => re.test(path));\n}\n","import { hmac } from \"@noble/hashes/hmac.js\";\nimport { sha256 } from \"@noble/hashes/sha2.js\";\nimport { base64urlnopad } from \"@scure/base\";\nimport type { Chain } from \"../chains.js\";\n\nconst IDENTITY_PREFIX = \"siws_\";\nconst ACCOUNT_SESSION_PREFIX = \"account_session_\";\n\nconst IDENTITY_DOMAIN = \"siws-identity-v1\";\nconst ACCOUNT_SESSION_DOMAIN = \"account-session-v1\";\n\nexport const IDENTITY_TTL_SECONDS = 86_400;\nexport const ACCOUNT_SESSION_TTL_SECONDS = 30 * 24 * 60 * 60;\n\nconst CLOCK_SKEW_SECONDS = 60;\n\nexport interface SiwsIdentity {\n address: string;\n chain: Chain;\n}\n\ninterface IdentityPayload {\n sub?: string;\n chain?: Chain;\n iat?: number;\n exp?: number;\n}\n\ninterface AccountSessionPayload {\n accountId?: string;\n iat?: number;\n exp?: number;\n}\n\nconst encoder = new TextEncoder();\nconst decoder = new TextDecoder();\n\nfunction toHex(bytes: Uint8Array): string {\n let out = \"\";\n for (const b of bytes) out += b.toString(16).padStart(2, \"0\");\n return out;\n}\n\nfunction sign(secret: string, domain: string, payload: string): string {\n return toHex(hmac(sha256, encoder.encode(secret), encoder.encode(`${domain}.${payload}`)));\n}\n\nfunction constantTimeEquals(a: string, b: string): boolean {\n if (a.length !== b.length) return false;\n let diff = 0;\n for (let i = 0; i < a.length; i++) diff |= a.charCodeAt(i) ^ b.charCodeAt(i);\n return diff === 0;\n}\n\nfunction signatureMatches(secret: string, domain: string, payload: string, provided: string): boolean {\n return constantTimeEquals(provided, sign(secret, domain, payload));\n}\n\nfunction encodePayload(value: unknown): string {\n return base64urlnopad.encode(encoder.encode(JSON.stringify(value)));\n}\n\nfunction decodePayload<T>(payload: string): T | null {\n try {\n return JSON.parse(decoder.decode(base64urlnopad.decode(payload))) as T;\n } catch {\n return null;\n }\n}\n\nfunction splitToken(raw: string, prefix: string): { payload: string; signature: string } | null {\n if (!raw.startsWith(prefix)) return null;\n const inner = raw.slice(prefix.length);\n const dot = inner.lastIndexOf(\".\");\n if (dot === -1) return null;\n return { payload: inner.slice(0, dot), signature: inner.slice(dot + 1) };\n}\n\nfunction withinLifetime(iat: number | undefined, exp: number | undefined): boolean {\n if (!iat || !exp) return false;\n const now = Math.floor(Date.now() / 1000);\n return exp >= now && iat <= now + CLOCK_SKEW_SECONDS;\n}\n\nexport function issueSiwsToken(\n secret: string,\n chain: Chain,\n wallet: string,\n ttlSeconds: number = IDENTITY_TTL_SECONDS,\n): string {\n const iat = Math.floor(Date.now() / 1000);\n const payload = encodePayload({ sub: wallet, chain, iat, exp: iat + ttlSeconds });\n return `${IDENTITY_PREFIX}${payload}.${sign(secret, IDENTITY_DOMAIN, payload)}`;\n}\n\nexport function verifySiwsToken(secret: string, raw: string): SiwsIdentity | null {\n const parts = splitToken(raw, IDENTITY_PREFIX);\n if (!parts) return null;\n if (!signatureMatches(secret, IDENTITY_DOMAIN, parts.payload, parts.signature)) return null;\n\n const data = decodePayload<IdentityPayload>(parts.payload);\n if (!data?.sub || !withinLifetime(data.iat, data.exp)) return null;\n\n return { address: data.sub, chain: data.chain ?? \"STARKNET\" };\n}\n\nexport function issueAccountSessionToken(\n secret: string,\n accountId: string,\n ttlSeconds: number = ACCOUNT_SESSION_TTL_SECONDS,\n): string {\n const iat = Math.floor(Date.now() / 1000);\n const payload = encodePayload({ accountId, iat, exp: iat + ttlSeconds });\n return `${ACCOUNT_SESSION_PREFIX}${payload}.${sign(secret, ACCOUNT_SESSION_DOMAIN, payload)}`;\n}\n\n/** The account a valid session token is for, and when it was issued (seconds since the epoch). */\nexport function readAccountSessionToken(secret: string, raw: string): { accountId: string; issuedAt: number } | null {\n const parts = splitToken(raw, ACCOUNT_SESSION_PREFIX);\n if (!parts) return null;\n if (!signatureMatches(secret, ACCOUNT_SESSION_DOMAIN, parts.payload, parts.signature)) return null;\n\n const data = decodePayload<AccountSessionPayload>(parts.payload);\n if (!data?.accountId || !data.iat || !withinLifetime(data.iat, data.exp)) return null;\n\n return { accountId: data.accountId, issuedAt: data.iat };\n}\n\nexport function verifyAccountSessionToken(secret: string, raw: string): string | null {\n return readAccountSessionToken(secret, raw)?.accountId ?? null;\n}\n","const CID_PATH_PATTERN = /^(Qm[1-9A-HJ-NP-Za-km-z]{44,}|b[a-z2-7]{58,})(\\/[\\w.\\-/]*)?$/;\n\nexport function isValidIpfsCidPath(cidPath: string): boolean {\n if (!CID_PATH_PATTERN.test(cidPath)) return false;\n if (cidPath.split(\"/\").includes(\"..\")) return false;\n return true;\n}\n\nexport const IPFS_SAFE_CONTENT_TYPE_PREFIXES = [\n \"image/jpeg\", \"image/png\", \"image/gif\", \"image/webp\", \"image/avif\", \"image/svg+xml\",\n \"video/\", \"audio/\", \"model/\", \"font/\", \"application/json\", \"application/octet-stream\",\n] as const;\n\nexport function resolveSafeImageContentType(contentType: string): string {\n return IPFS_SAFE_CONTENT_TYPE_PREFIXES.some((p) => contentType.startsWith(p))\n ? contentType\n : \"application/octet-stream\";\n}\n\nexport const MAX_IPFS_GATEWAY_RESPONSE_BYTES = 25 * 1024 * 1024;\n"]}
|
package/dist/index.cjs
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
3
|
var chunkMEJ47LC3_cjs = require('./chunk-MEJ47LC3.cjs');
|
|
4
|
-
var
|
|
4
|
+
var chunkJCA5XMS6_cjs = require('./chunk-JCA5XMS6.cjs');
|
|
5
5
|
var chunk3V3L2R5O_cjs = require('./chunk-3V3L2R5O.cjs');
|
|
6
6
|
var chunkH2NJB3AK_cjs = require('./chunk-H2NJB3AK.cjs');
|
|
7
7
|
require('./chunk-W76AZ5WC.cjs');
|
|
@@ -253,111 +253,115 @@ Object.defineProperty(exports, "u256ToBigInt", {
|
|
|
253
253
|
});
|
|
254
254
|
Object.defineProperty(exports, "ACCOUNT_SESSION_COOKIE", {
|
|
255
255
|
enumerable: true,
|
|
256
|
-
get: function () { return
|
|
256
|
+
get: function () { return chunkJCA5XMS6_cjs.ACCOUNT_SESSION_COOKIE; }
|
|
257
257
|
});
|
|
258
258
|
Object.defineProperty(exports, "ACCOUNT_SESSION_TTL_SECONDS", {
|
|
259
259
|
enumerable: true,
|
|
260
|
-
get: function () { return
|
|
260
|
+
get: function () { return chunkJCA5XMS6_cjs.ACCOUNT_SESSION_TTL_SECONDS; }
|
|
261
261
|
});
|
|
262
262
|
Object.defineProperty(exports, "ALLOWED_IMAGE_CONTENT_TYPES", {
|
|
263
263
|
enumerable: true,
|
|
264
|
-
get: function () { return
|
|
264
|
+
get: function () { return chunkJCA5XMS6_cjs.ALLOWED_IMAGE_CONTENT_TYPES; }
|
|
265
265
|
});
|
|
266
266
|
Object.defineProperty(exports, "IDENTITY_TTL_SECONDS", {
|
|
267
267
|
enumerable: true,
|
|
268
|
-
get: function () { return
|
|
268
|
+
get: function () { return chunkJCA5XMS6_cjs.IDENTITY_TTL_SECONDS; }
|
|
269
269
|
});
|
|
270
270
|
Object.defineProperty(exports, "IPFS_SAFE_CONTENT_TYPE_PREFIXES", {
|
|
271
271
|
enumerable: true,
|
|
272
|
-
get: function () { return
|
|
272
|
+
get: function () { return chunkJCA5XMS6_cjs.IPFS_SAFE_CONTENT_TYPE_PREFIXES; }
|
|
273
273
|
});
|
|
274
274
|
Object.defineProperty(exports, "MAX_IMAGE_PROXY_BYTES", {
|
|
275
275
|
enumerable: true,
|
|
276
|
-
get: function () { return
|
|
276
|
+
get: function () { return chunkJCA5XMS6_cjs.MAX_IMAGE_PROXY_BYTES; }
|
|
277
277
|
});
|
|
278
278
|
Object.defineProperty(exports, "MAX_IMAGE_REDIRECTS", {
|
|
279
279
|
enumerable: true,
|
|
280
|
-
get: function () { return
|
|
280
|
+
get: function () { return chunkJCA5XMS6_cjs.MAX_IMAGE_REDIRECTS; }
|
|
281
281
|
});
|
|
282
282
|
Object.defineProperty(exports, "MAX_IPFS_GATEWAY_RESPONSE_BYTES", {
|
|
283
283
|
enumerable: true,
|
|
284
|
-
get: function () { return
|
|
284
|
+
get: function () { return chunkJCA5XMS6_cjs.MAX_IPFS_GATEWAY_RESPONSE_BYTES; }
|
|
285
285
|
});
|
|
286
286
|
Object.defineProperty(exports, "createAppGateway", {
|
|
287
287
|
enumerable: true,
|
|
288
|
-
get: function () { return
|
|
288
|
+
get: function () { return chunkJCA5XMS6_cjs.createAppGateway; }
|
|
289
289
|
});
|
|
290
290
|
Object.defineProperty(exports, "createAppSessionHandler", {
|
|
291
291
|
enumerable: true,
|
|
292
|
-
get: function () { return
|
|
292
|
+
get: function () { return chunkJCA5XMS6_cjs.createAppSessionHandler; }
|
|
293
293
|
});
|
|
294
294
|
Object.defineProperty(exports, "createImageProxyHandler", {
|
|
295
295
|
enumerable: true,
|
|
296
|
-
get: function () { return
|
|
296
|
+
get: function () { return chunkJCA5XMS6_cjs.createImageProxyHandler; }
|
|
297
297
|
});
|
|
298
298
|
Object.defineProperty(exports, "getBackendSignedUrl", {
|
|
299
299
|
enumerable: true,
|
|
300
|
-
get: function () { return
|
|
300
|
+
get: function () { return chunkJCA5XMS6_cjs.getBackendSignedUrl; }
|
|
301
301
|
});
|
|
302
302
|
Object.defineProperty(exports, "isPrivateHost", {
|
|
303
303
|
enumerable: true,
|
|
304
|
-
get: function () { return
|
|
304
|
+
get: function () { return chunkJCA5XMS6_cjs.isPrivateHost; }
|
|
305
305
|
});
|
|
306
306
|
Object.defineProperty(exports, "isPrivateOrInsecureUrl", {
|
|
307
307
|
enumerable: true,
|
|
308
|
-
get: function () { return
|
|
308
|
+
get: function () { return chunkJCA5XMS6_cjs.isPrivateOrInsecureUrl; }
|
|
309
309
|
});
|
|
310
310
|
Object.defineProperty(exports, "isPublicAppRoute", {
|
|
311
311
|
enumerable: true,
|
|
312
|
-
get: function () { return
|
|
312
|
+
get: function () { return chunkJCA5XMS6_cjs.isPublicAppRoute; }
|
|
313
313
|
});
|
|
314
314
|
Object.defineProperty(exports, "isSameOrigin", {
|
|
315
315
|
enumerable: true,
|
|
316
|
-
get: function () { return
|
|
316
|
+
get: function () { return chunkJCA5XMS6_cjs.isSameOrigin; }
|
|
317
317
|
});
|
|
318
318
|
Object.defineProperty(exports, "isValidIpfsCidPath", {
|
|
319
319
|
enumerable: true,
|
|
320
|
-
get: function () { return
|
|
320
|
+
get: function () { return chunkJCA5XMS6_cjs.isValidIpfsCidPath; }
|
|
321
321
|
});
|
|
322
322
|
Object.defineProperty(exports, "issueAccountSessionToken", {
|
|
323
323
|
enumerable: true,
|
|
324
|
-
get: function () { return
|
|
324
|
+
get: function () { return chunkJCA5XMS6_cjs.issueAccountSessionToken; }
|
|
325
325
|
});
|
|
326
326
|
Object.defineProperty(exports, "issueSiwsToken", {
|
|
327
327
|
enumerable: true,
|
|
328
|
-
get: function () { return
|
|
328
|
+
get: function () { return chunkJCA5XMS6_cjs.issueSiwsToken; }
|
|
329
|
+
});
|
|
330
|
+
Object.defineProperty(exports, "readAccountSessionToken", {
|
|
331
|
+
enumerable: true,
|
|
332
|
+
get: function () { return chunkJCA5XMS6_cjs.readAccountSessionToken; }
|
|
329
333
|
});
|
|
330
334
|
Object.defineProperty(exports, "readBodyWithCap", {
|
|
331
335
|
enumerable: true,
|
|
332
|
-
get: function () { return
|
|
336
|
+
get: function () { return chunkJCA5XMS6_cjs.readBodyWithCap; }
|
|
333
337
|
});
|
|
334
338
|
Object.defineProperty(exports, "resolveSafeImageContentType", {
|
|
335
339
|
enumerable: true,
|
|
336
|
-
get: function () { return
|
|
340
|
+
get: function () { return chunkJCA5XMS6_cjs.resolveSafeImageContentType; }
|
|
337
341
|
});
|
|
338
342
|
Object.defineProperty(exports, "uploadDirectoryToBackend", {
|
|
339
343
|
enumerable: true,
|
|
340
|
-
get: function () { return
|
|
344
|
+
get: function () { return chunkJCA5XMS6_cjs.uploadDirectoryToBackend; }
|
|
341
345
|
});
|
|
342
346
|
Object.defineProperty(exports, "uploadFileToBackend", {
|
|
343
347
|
enumerable: true,
|
|
344
|
-
get: function () { return
|
|
348
|
+
get: function () { return chunkJCA5XMS6_cjs.uploadFileToBackend; }
|
|
345
349
|
});
|
|
346
350
|
Object.defineProperty(exports, "uploadJsonToBackend", {
|
|
347
351
|
enumerable: true,
|
|
348
|
-
get: function () { return
|
|
352
|
+
get: function () { return chunkJCA5XMS6_cjs.uploadJsonToBackend; }
|
|
349
353
|
});
|
|
350
354
|
Object.defineProperty(exports, "validateUrl", {
|
|
351
355
|
enumerable: true,
|
|
352
|
-
get: function () { return
|
|
356
|
+
get: function () { return chunkJCA5XMS6_cjs.validateUrl; }
|
|
353
357
|
});
|
|
354
358
|
Object.defineProperty(exports, "verifyAccountSessionToken", {
|
|
355
359
|
enumerable: true,
|
|
356
|
-
get: function () { return
|
|
360
|
+
get: function () { return chunkJCA5XMS6_cjs.verifyAccountSessionToken; }
|
|
357
361
|
});
|
|
358
362
|
Object.defineProperty(exports, "verifySiwsToken", {
|
|
359
363
|
enumerable: true,
|
|
360
|
-
get: function () { return
|
|
364
|
+
get: function () { return chunkJCA5XMS6_cjs.verifySiwsToken; }
|
|
361
365
|
});
|
|
362
366
|
Object.defineProperty(exports, "ApiClient", {
|
|
363
367
|
enumerable: true,
|
package/dist/index.d.cts
CHANGED
|
@@ -4,7 +4,7 @@ import { S as ServiceDefinition, a as ServiceCapability } from './passkey-errors
|
|
|
4
4
|
export { A as AcceptSponsorshipBidIntentParams, b as AcceptSponsorshipProposalIntentParams, c as AccountApi, d as ActivityType, e as ApiActivitiesQuery, f as ApiActivity, g as ApiActivityPrice, h as ApiAdminCollectionClaim, i as ApiBusinessProvisioning, j as ApiChain, k as ApiCheckoutIntentResult, l as ApiCoin, m as ApiCoinClaimResult, n as ApiCoinPrice, o as ApiCoinPrices, p as ApiCoinsQuery, q as ApiCollection, r as ApiCollectionClaim, s as ApiCollectionProfile, t as ApiCollectionSlugClaim, u as ApiCollectionsListQuery, v as ApiCollectionsQuery, w as ApiComment, x as ApiCounterOffersQuery, y as ApiCreatorListResult, z as ApiCreatorProfile, B as ApiCreditPayment, C as ApiDrop, D as ApiDropFee, E as ApiDropListStatus, F as ApiDropMint, G as ApiEmissionCall, H as ApiEmissionResult, I as ApiFundingInstructions, J as ApiFundingIntent, K as ApiFundingMethod, L as ApiFundingStatus, M as ApiFundingSubmit, N as ApiIntent, O as ApiIntentCreated, P as ApiIpNftTokenData, Q as ApiMeta, R as ApiMetadataSignedUrl, T as ApiMetadataUpload, U as ApiOrder, V as ApiOrderConsideration, W as ApiOrderOffer, X as ApiOrderPrice, Y as ApiOrderTokenMeta, Z as ApiOrderTxHash, _ as ApiOrdersQuery, $ as ApiPlatformStats, a0 as ApiPointEvent, a1 as ApiPortalKey, a2 as ApiPortalKeyCreated, a3 as ApiPortalMe, a4 as ApiPricing, a5 as ApiPricingRule, a6 as ApiPublicRemix, a7 as ApiRemixOffer, a8 as ApiRemixOfferPrice, a9 as ApiRemixOffersQuery, aa as ApiReportTargetType, ab as ApiResponse, ac as ApiRewardsBadge, ad as ApiRewardsBatchEntry, ae as ApiRewardsConfig, af as ApiRewardsLeaderboardEntry, ag as ApiRewardsLevel, ah as ApiSearchCollectionResult, ai as ApiSearchCreatorResult, aj as ApiSearchResult, ak as ApiSearchTokenResult, al as ApiSession, am as ApiSponsorshipBid, an as ApiSponsorshipLicense, ao as ApiSponsorshipLicensesQuery, ap as ApiSponsorshipOffer, aq as ApiSponsorshipOffersQuery, ar as ApiSponsorshipProposal, as as ApiSponsorshipProposalsQuery, at as ApiSubmitReport, au as ApiSwapQuote, av as ApiSwapQuoteRequest, aw as ApiTierOnchain, ax as ApiToken, ay as ApiTokenBalance, az as ApiTokenMetadata, aA as ApiTokensQuery, aB as ApiTxSyncResult, aC as ApiUserRewards, aD as ApiUserWallet, aE as ApiUsernameClaim, aF as ApiWalletActivity, aG as AutoRemixOfferParams, aH as CancelOrderIntentParams, aI as ChainFilter, aJ as CheckoutIntentItem, aK as CollectionServiceId, aL as CollectionSort, aM as CollectionTokensSort, aN as ConfirmRemixOfferParams, aO as ConfirmSelfRemixParams, aP as CreateCheckoutIntentParams, aQ as CreateCoinIntentParams, aR as CreateCollectionIntentParams, aS as CreateCommentIntentParams, aT as CreateCounterOfferIntentParams, aU as CreateDropClaimIntentParams, aV as CreateDropManageIntentParams, aW as CreateFundingTransferIntentParams, aX as CreateGenesisMintIntentParams, aY as CreateListingIntentParams, aZ as CreateMintIntentParams, a_ as CreatePopBurnIntentParams, a$ as CreatePopClaimIntentParams, b0 as CreatePopManageIntentParams, b1 as CreateRemixOfferParams, b2 as CreateSponsorshipOfferIntentParams, b3 as CreateSponsorshipProposalIntentParams, b4 as CreateSwapIntentParams, b5 as CreateTierIntentParams, b6 as CreateTransferCollectionOwnershipIntentParams, b7 as CreateTransferNftIntentParams, b8 as CreateTransferTokenIntentParams, b9 as CreateWalletManageIntentParams, ba as DeviceKeyMissingError, bb as DropManageAction, bc as DropTermsBody, bd as EmissionParams, be as EnforcementDeclaration, bf as FactoryFamilyServiceId, bg as FulfillOrderIntentParams, bh as IPType, bi as IntentCall, bj as IntentParamsByKind, bk as IntentStatus, bl as IntentType, bm as IpAttribute, bn as IpNftMetadata, bo as LaunchCoinIntentParams, bp as MakeOfferIntentParams, bq as OPEN_LICENSES, br as OpenLicense, bs as OrderStatus, bt as PasskeyCancelledError, bu as PasskeyUnsupportedError, bv as PasskeyUnsupportedReason, bw as PlaceSponsorshipBidIntentParams, bx as PopManageAction, by as RegisteredUser, bz as RejectSponsorshipProposalIntentParams, bA as RemixOfferStatus, bB as RetractSponsorshipBidIntentParams, bC as ServiceEventDeclaration, bD as SetSponsorshipOfferOpenIntentParams, bE as SortOrder, bF as TierServiceId, bG as UpdateCollectionProfileInput, bH as WalletManageAction, bI as WalletRecovery, bJ as WithdrawSponsorshipProposalIntentParams } from './passkey-errors-BcJWGxSV.cjs';
|
|
5
5
|
import { C as Chain } from './chains-CmwjZVU7.cjs';
|
|
6
6
|
export { a as CHAINS, b as ChainCoordinates, c as CoordinatesByChain, D as DEFAULT_CHAIN, E as EvmCoordinates, S as SolanaCoordinates, d as StarknetCoordinates, e as StellarCoordinates, g as getCoordinates, f as getStarknetCoordinates } from './chains-CmwjZVU7.cjs';
|
|
7
|
-
export { ACCOUNT_SESSION_COOKIE, ACCOUNT_SESSION_TTL_SECONDS, ALLOWED_IMAGE_CONTENT_TYPES, AppGatewayConfig, AppSessionConfig, BackendMetadataConfig, BackendUploadResult, CappedBody, IDENTITY_TTL_SECONDS, IPFS_SAFE_CONTENT_TYPE_PREFIXES, ImageProxyConfig, MAX_IMAGE_PROXY_BYTES, MAX_IMAGE_REDIRECTS, MAX_IPFS_GATEWAY_RESPONSE_BYTES, SiwsIdentity, createAppGateway, createAppSessionHandler, createImageProxyHandler, getBackendSignedUrl, isPrivateHost, isPrivateOrInsecureUrl, isPublicAppRoute, isSameOrigin, isValidIpfsCidPath, issueAccountSessionToken, issueSiwsToken, readBodyWithCap, resolveSafeImageContentType, uploadDirectoryToBackend, uploadFileToBackend, uploadJsonToBackend, validateUrl, verifyAccountSessionToken, verifySiwsToken } from './server/index.cjs';
|
|
7
|
+
export { ACCOUNT_SESSION_COOKIE, ACCOUNT_SESSION_TTL_SECONDS, ALLOWED_IMAGE_CONTENT_TYPES, AppGatewayConfig, AppSessionConfig, BackendMetadataConfig, BackendUploadResult, CappedBody, IDENTITY_TTL_SECONDS, IPFS_SAFE_CONTENT_TYPE_PREFIXES, ImageProxyConfig, MAX_IMAGE_PROXY_BYTES, MAX_IMAGE_REDIRECTS, MAX_IPFS_GATEWAY_RESPONSE_BYTES, SiwsIdentity, createAppGateway, createAppSessionHandler, createImageProxyHandler, getBackendSignedUrl, isPrivateHost, isPrivateOrInsecureUrl, isPublicAppRoute, isSameOrigin, isValidIpfsCidPath, issueAccountSessionToken, issueSiwsToken, readAccountSessionToken, readBodyWithCap, resolveSafeImageContentType, uploadDirectoryToBackend, uploadFileToBackend, uploadJsonToBackend, validateUrl, verifyAccountSessionToken, verifySiwsToken } from './server/index.cjs';
|
|
8
8
|
export { A as AdapterTxResult, a as AssetRef, C as CreateCollectionInput, I as IssuanceAdapter, M as MintInput, O as OrderRef, R as RegisterOrderParams, V as VenueAdapter } from './types-BftPOVEJ.cjs';
|
|
9
9
|
import 'zod';
|
|
10
10
|
import './responses-BpnS-Io9.cjs';
|
package/dist/index.d.ts
CHANGED
|
@@ -4,7 +4,7 @@ import { S as ServiceDefinition, a as ServiceCapability } from './passkey-errors
|
|
|
4
4
|
export { A as AcceptSponsorshipBidIntentParams, b as AcceptSponsorshipProposalIntentParams, c as AccountApi, d as ActivityType, e as ApiActivitiesQuery, f as ApiActivity, g as ApiActivityPrice, h as ApiAdminCollectionClaim, i as ApiBusinessProvisioning, j as ApiChain, k as ApiCheckoutIntentResult, l as ApiCoin, m as ApiCoinClaimResult, n as ApiCoinPrice, o as ApiCoinPrices, p as ApiCoinsQuery, q as ApiCollection, r as ApiCollectionClaim, s as ApiCollectionProfile, t as ApiCollectionSlugClaim, u as ApiCollectionsListQuery, v as ApiCollectionsQuery, w as ApiComment, x as ApiCounterOffersQuery, y as ApiCreatorListResult, z as ApiCreatorProfile, B as ApiCreditPayment, C as ApiDrop, D as ApiDropFee, E as ApiDropListStatus, F as ApiDropMint, G as ApiEmissionCall, H as ApiEmissionResult, I as ApiFundingInstructions, J as ApiFundingIntent, K as ApiFundingMethod, L as ApiFundingStatus, M as ApiFundingSubmit, N as ApiIntent, O as ApiIntentCreated, P as ApiIpNftTokenData, Q as ApiMeta, R as ApiMetadataSignedUrl, T as ApiMetadataUpload, U as ApiOrder, V as ApiOrderConsideration, W as ApiOrderOffer, X as ApiOrderPrice, Y as ApiOrderTokenMeta, Z as ApiOrderTxHash, _ as ApiOrdersQuery, $ as ApiPlatformStats, a0 as ApiPointEvent, a1 as ApiPortalKey, a2 as ApiPortalKeyCreated, a3 as ApiPortalMe, a4 as ApiPricing, a5 as ApiPricingRule, a6 as ApiPublicRemix, a7 as ApiRemixOffer, a8 as ApiRemixOfferPrice, a9 as ApiRemixOffersQuery, aa as ApiReportTargetType, ab as ApiResponse, ac as ApiRewardsBadge, ad as ApiRewardsBatchEntry, ae as ApiRewardsConfig, af as ApiRewardsLeaderboardEntry, ag as ApiRewardsLevel, ah as ApiSearchCollectionResult, ai as ApiSearchCreatorResult, aj as ApiSearchResult, ak as ApiSearchTokenResult, al as ApiSession, am as ApiSponsorshipBid, an as ApiSponsorshipLicense, ao as ApiSponsorshipLicensesQuery, ap as ApiSponsorshipOffer, aq as ApiSponsorshipOffersQuery, ar as ApiSponsorshipProposal, as as ApiSponsorshipProposalsQuery, at as ApiSubmitReport, au as ApiSwapQuote, av as ApiSwapQuoteRequest, aw as ApiTierOnchain, ax as ApiToken, ay as ApiTokenBalance, az as ApiTokenMetadata, aA as ApiTokensQuery, aB as ApiTxSyncResult, aC as ApiUserRewards, aD as ApiUserWallet, aE as ApiUsernameClaim, aF as ApiWalletActivity, aG as AutoRemixOfferParams, aH as CancelOrderIntentParams, aI as ChainFilter, aJ as CheckoutIntentItem, aK as CollectionServiceId, aL as CollectionSort, aM as CollectionTokensSort, aN as ConfirmRemixOfferParams, aO as ConfirmSelfRemixParams, aP as CreateCheckoutIntentParams, aQ as CreateCoinIntentParams, aR as CreateCollectionIntentParams, aS as CreateCommentIntentParams, aT as CreateCounterOfferIntentParams, aU as CreateDropClaimIntentParams, aV as CreateDropManageIntentParams, aW as CreateFundingTransferIntentParams, aX as CreateGenesisMintIntentParams, aY as CreateListingIntentParams, aZ as CreateMintIntentParams, a_ as CreatePopBurnIntentParams, a$ as CreatePopClaimIntentParams, b0 as CreatePopManageIntentParams, b1 as CreateRemixOfferParams, b2 as CreateSponsorshipOfferIntentParams, b3 as CreateSponsorshipProposalIntentParams, b4 as CreateSwapIntentParams, b5 as CreateTierIntentParams, b6 as CreateTransferCollectionOwnershipIntentParams, b7 as CreateTransferNftIntentParams, b8 as CreateTransferTokenIntentParams, b9 as CreateWalletManageIntentParams, ba as DeviceKeyMissingError, bb as DropManageAction, bc as DropTermsBody, bd as EmissionParams, be as EnforcementDeclaration, bf as FactoryFamilyServiceId, bg as FulfillOrderIntentParams, bh as IPType, bi as IntentCall, bj as IntentParamsByKind, bk as IntentStatus, bl as IntentType, bm as IpAttribute, bn as IpNftMetadata, bo as LaunchCoinIntentParams, bp as MakeOfferIntentParams, bq as OPEN_LICENSES, br as OpenLicense, bs as OrderStatus, bt as PasskeyCancelledError, bu as PasskeyUnsupportedError, bv as PasskeyUnsupportedReason, bw as PlaceSponsorshipBidIntentParams, bx as PopManageAction, by as RegisteredUser, bz as RejectSponsorshipProposalIntentParams, bA as RemixOfferStatus, bB as RetractSponsorshipBidIntentParams, bC as ServiceEventDeclaration, bD as SetSponsorshipOfferOpenIntentParams, bE as SortOrder, bF as TierServiceId, bG as UpdateCollectionProfileInput, bH as WalletManageAction, bI as WalletRecovery, bJ as WithdrawSponsorshipProposalIntentParams } from './passkey-errors-BXclgAtu.js';
|
|
5
5
|
import { C as Chain } from './chains-CmwjZVU7.js';
|
|
6
6
|
export { a as CHAINS, b as ChainCoordinates, c as CoordinatesByChain, D as DEFAULT_CHAIN, E as EvmCoordinates, S as SolanaCoordinates, d as StarknetCoordinates, e as StellarCoordinates, g as getCoordinates, f as getStarknetCoordinates } from './chains-CmwjZVU7.js';
|
|
7
|
-
export { ACCOUNT_SESSION_COOKIE, ACCOUNT_SESSION_TTL_SECONDS, ALLOWED_IMAGE_CONTENT_TYPES, AppGatewayConfig, AppSessionConfig, BackendMetadataConfig, BackendUploadResult, CappedBody, IDENTITY_TTL_SECONDS, IPFS_SAFE_CONTENT_TYPE_PREFIXES, ImageProxyConfig, MAX_IMAGE_PROXY_BYTES, MAX_IMAGE_REDIRECTS, MAX_IPFS_GATEWAY_RESPONSE_BYTES, SiwsIdentity, createAppGateway, createAppSessionHandler, createImageProxyHandler, getBackendSignedUrl, isPrivateHost, isPrivateOrInsecureUrl, isPublicAppRoute, isSameOrigin, isValidIpfsCidPath, issueAccountSessionToken, issueSiwsToken, readBodyWithCap, resolveSafeImageContentType, uploadDirectoryToBackend, uploadFileToBackend, uploadJsonToBackend, validateUrl, verifyAccountSessionToken, verifySiwsToken } from './server/index.js';
|
|
7
|
+
export { ACCOUNT_SESSION_COOKIE, ACCOUNT_SESSION_TTL_SECONDS, ALLOWED_IMAGE_CONTENT_TYPES, AppGatewayConfig, AppSessionConfig, BackendMetadataConfig, BackendUploadResult, CappedBody, IDENTITY_TTL_SECONDS, IPFS_SAFE_CONTENT_TYPE_PREFIXES, ImageProxyConfig, MAX_IMAGE_PROXY_BYTES, MAX_IMAGE_REDIRECTS, MAX_IPFS_GATEWAY_RESPONSE_BYTES, SiwsIdentity, createAppGateway, createAppSessionHandler, createImageProxyHandler, getBackendSignedUrl, isPrivateHost, isPrivateOrInsecureUrl, isPublicAppRoute, isSameOrigin, isValidIpfsCidPath, issueAccountSessionToken, issueSiwsToken, readAccountSessionToken, readBodyWithCap, resolveSafeImageContentType, uploadDirectoryToBackend, uploadFileToBackend, uploadJsonToBackend, validateUrl, verifyAccountSessionToken, verifySiwsToken } from './server/index.js';
|
|
8
8
|
export { A as AdapterTxResult, a as AssetRef, C as CreateCollectionInput, I as IssuanceAdapter, M as MintInput, O as OrderRef, R as RegisterOrderParams, V as VenueAdapter } from './types-BW6ktwcT.js';
|
|
9
9
|
import 'zod';
|
|
10
10
|
import './responses-BpnS-Io9.js';
|
package/dist/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
export { SUPPORTED_URL_CHAINS, assetHref, chainFromSlug, chainSlug, coinHref, collectionHref, dropHref, encodeU256, getService, getServicesByCapability, hasCapability, isServiceId, listServices, profileHref, resolveConfig, resolveFeeConfig, stringifyBigInts, u256ToBigInt } from './chunk-GV4A2WNO.js';
|
|
2
|
-
export { ACCOUNT_SESSION_COOKIE, ACCOUNT_SESSION_TTL_SECONDS, ALLOWED_IMAGE_CONTENT_TYPES, IDENTITY_TTL_SECONDS, IPFS_SAFE_CONTENT_TYPE_PREFIXES, MAX_IMAGE_PROXY_BYTES, MAX_IMAGE_REDIRECTS, MAX_IPFS_GATEWAY_RESPONSE_BYTES, createAppGateway, createAppSessionHandler, createImageProxyHandler, getBackendSignedUrl, isPrivateHost, isPrivateOrInsecureUrl, isPublicAppRoute, isSameOrigin, isValidIpfsCidPath, issueAccountSessionToken, issueSiwsToken, readBodyWithCap, resolveSafeImageContentType, uploadDirectoryToBackend, uploadFileToBackend, uploadJsonToBackend, validateUrl, verifyAccountSessionToken, verifySiwsToken } from './chunk-
|
|
2
|
+
export { ACCOUNT_SESSION_COOKIE, ACCOUNT_SESSION_TTL_SECONDS, ALLOWED_IMAGE_CONTENT_TYPES, IDENTITY_TTL_SECONDS, IPFS_SAFE_CONTENT_TYPE_PREFIXES, MAX_IMAGE_PROXY_BYTES, MAX_IMAGE_REDIRECTS, MAX_IPFS_GATEWAY_RESPONSE_BYTES, createAppGateway, createAppSessionHandler, createImageProxyHandler, getBackendSignedUrl, isPrivateHost, isPrivateOrInsecureUrl, isPublicAppRoute, isSameOrigin, isValidIpfsCidPath, issueAccountSessionToken, issueSiwsToken, readAccountSessionToken, readBodyWithCap, resolveSafeImageContentType, uploadDirectoryToBackend, uploadFileToBackend, uploadJsonToBackend, validateUrl, verifyAccountSessionToken, verifySiwsToken } from './chunk-CEPRY3SR.js';
|
|
3
3
|
export { ApiClient, DEFAULT_CURRENCY, DeviceKeyMissingError, MedialaneApiError, MedialaneError, PasskeyCancelledError, PasskeyUnsupportedError, STARKNET_COLLECTION_1155_CONTRACT, STARKNET_COLLECTION_721_CONTRACT, STARKNET_CREATOR_COIN_FACTORY_CONTRACT, STARKNET_DATA_TOKENIZATION_721_CONTRACT, STARKNET_DROP_FACTORY_CONTRACT, STARKNET_DROP_FACTORY_START_BLOCK, STARKNET_GENESIS_MINT_CONTRACT, STARKNET_GENESIS_NFT_URI, STARKNET_IP_CLUB_FACTORY_CONTRACT, STARKNET_IP_SPONSORSHIP_CONTRACT, STARKNET_IP_TICKETS_FACTORY_CONTRACT, STARKNET_MARKETPLACE_1155_CONTRACT, STARKNET_MARKETPLACE_721_CONTRACT, STARKNET_NFTCOMMENTS_CONTRACT, STARKNET_POP_FACTORY_CONTRACT, STARKNET_POP_FACTORY_START_BLOCK, SUPPORTED_TOKENS, UserFacingError, formatAmount, getListableTokens, getTokenByAddress, getTokenBySymbol, normalizeAddress, normalizeHash, parseAmount, shortenAddress } from './chunk-3SIT2PCD.js';
|
|
4
4
|
export { CHAINS, DEFAULT_CHAIN, getCoordinates, getStarknetCoordinates } from './chunk-5KY6P434.js';
|
|
5
5
|
import './chunk-WRBXQPRL.js';
|
package/dist/server/index.cjs
CHANGED
|
@@ -1,117 +1,121 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var chunkJCA5XMS6_cjs = require('../chunk-JCA5XMS6.cjs');
|
|
4
4
|
require('../chunk-Q7SFCCGT.cjs');
|
|
5
5
|
|
|
6
6
|
|
|
7
7
|
|
|
8
8
|
Object.defineProperty(exports, "ACCOUNT_SESSION_COOKIE", {
|
|
9
9
|
enumerable: true,
|
|
10
|
-
get: function () { return
|
|
10
|
+
get: function () { return chunkJCA5XMS6_cjs.ACCOUNT_SESSION_COOKIE; }
|
|
11
11
|
});
|
|
12
12
|
Object.defineProperty(exports, "ACCOUNT_SESSION_TTL_SECONDS", {
|
|
13
13
|
enumerable: true,
|
|
14
|
-
get: function () { return
|
|
14
|
+
get: function () { return chunkJCA5XMS6_cjs.ACCOUNT_SESSION_TTL_SECONDS; }
|
|
15
15
|
});
|
|
16
16
|
Object.defineProperty(exports, "ALLOWED_IMAGE_CONTENT_TYPES", {
|
|
17
17
|
enumerable: true,
|
|
18
|
-
get: function () { return
|
|
18
|
+
get: function () { return chunkJCA5XMS6_cjs.ALLOWED_IMAGE_CONTENT_TYPES; }
|
|
19
19
|
});
|
|
20
20
|
Object.defineProperty(exports, "IDENTITY_TTL_SECONDS", {
|
|
21
21
|
enumerable: true,
|
|
22
|
-
get: function () { return
|
|
22
|
+
get: function () { return chunkJCA5XMS6_cjs.IDENTITY_TTL_SECONDS; }
|
|
23
23
|
});
|
|
24
24
|
Object.defineProperty(exports, "IPFS_SAFE_CONTENT_TYPE_PREFIXES", {
|
|
25
25
|
enumerable: true,
|
|
26
|
-
get: function () { return
|
|
26
|
+
get: function () { return chunkJCA5XMS6_cjs.IPFS_SAFE_CONTENT_TYPE_PREFIXES; }
|
|
27
27
|
});
|
|
28
28
|
Object.defineProperty(exports, "MAX_IMAGE_PROXY_BYTES", {
|
|
29
29
|
enumerable: true,
|
|
30
|
-
get: function () { return
|
|
30
|
+
get: function () { return chunkJCA5XMS6_cjs.MAX_IMAGE_PROXY_BYTES; }
|
|
31
31
|
});
|
|
32
32
|
Object.defineProperty(exports, "MAX_IMAGE_REDIRECTS", {
|
|
33
33
|
enumerable: true,
|
|
34
|
-
get: function () { return
|
|
34
|
+
get: function () { return chunkJCA5XMS6_cjs.MAX_IMAGE_REDIRECTS; }
|
|
35
35
|
});
|
|
36
36
|
Object.defineProperty(exports, "MAX_IPFS_GATEWAY_RESPONSE_BYTES", {
|
|
37
37
|
enumerable: true,
|
|
38
|
-
get: function () { return
|
|
38
|
+
get: function () { return chunkJCA5XMS6_cjs.MAX_IPFS_GATEWAY_RESPONSE_BYTES; }
|
|
39
39
|
});
|
|
40
40
|
Object.defineProperty(exports, "createAppGateway", {
|
|
41
41
|
enumerable: true,
|
|
42
|
-
get: function () { return
|
|
42
|
+
get: function () { return chunkJCA5XMS6_cjs.createAppGateway; }
|
|
43
43
|
});
|
|
44
44
|
Object.defineProperty(exports, "createAppSessionHandler", {
|
|
45
45
|
enumerable: true,
|
|
46
|
-
get: function () { return
|
|
46
|
+
get: function () { return chunkJCA5XMS6_cjs.createAppSessionHandler; }
|
|
47
47
|
});
|
|
48
48
|
Object.defineProperty(exports, "createImageProxyHandler", {
|
|
49
49
|
enumerable: true,
|
|
50
|
-
get: function () { return
|
|
50
|
+
get: function () { return chunkJCA5XMS6_cjs.createImageProxyHandler; }
|
|
51
51
|
});
|
|
52
52
|
Object.defineProperty(exports, "getBackendSignedUrl", {
|
|
53
53
|
enumerable: true,
|
|
54
|
-
get: function () { return
|
|
54
|
+
get: function () { return chunkJCA5XMS6_cjs.getBackendSignedUrl; }
|
|
55
55
|
});
|
|
56
56
|
Object.defineProperty(exports, "isPrivateHost", {
|
|
57
57
|
enumerable: true,
|
|
58
|
-
get: function () { return
|
|
58
|
+
get: function () { return chunkJCA5XMS6_cjs.isPrivateHost; }
|
|
59
59
|
});
|
|
60
60
|
Object.defineProperty(exports, "isPrivateOrInsecureUrl", {
|
|
61
61
|
enumerable: true,
|
|
62
|
-
get: function () { return
|
|
62
|
+
get: function () { return chunkJCA5XMS6_cjs.isPrivateOrInsecureUrl; }
|
|
63
63
|
});
|
|
64
64
|
Object.defineProperty(exports, "isPublicAppRoute", {
|
|
65
65
|
enumerable: true,
|
|
66
|
-
get: function () { return
|
|
66
|
+
get: function () { return chunkJCA5XMS6_cjs.isPublicAppRoute; }
|
|
67
67
|
});
|
|
68
68
|
Object.defineProperty(exports, "isSameOrigin", {
|
|
69
69
|
enumerable: true,
|
|
70
|
-
get: function () { return
|
|
70
|
+
get: function () { return chunkJCA5XMS6_cjs.isSameOrigin; }
|
|
71
71
|
});
|
|
72
72
|
Object.defineProperty(exports, "isValidIpfsCidPath", {
|
|
73
73
|
enumerable: true,
|
|
74
|
-
get: function () { return
|
|
74
|
+
get: function () { return chunkJCA5XMS6_cjs.isValidIpfsCidPath; }
|
|
75
75
|
});
|
|
76
76
|
Object.defineProperty(exports, "issueAccountSessionToken", {
|
|
77
77
|
enumerable: true,
|
|
78
|
-
get: function () { return
|
|
78
|
+
get: function () { return chunkJCA5XMS6_cjs.issueAccountSessionToken; }
|
|
79
79
|
});
|
|
80
80
|
Object.defineProperty(exports, "issueSiwsToken", {
|
|
81
81
|
enumerable: true,
|
|
82
|
-
get: function () { return
|
|
82
|
+
get: function () { return chunkJCA5XMS6_cjs.issueSiwsToken; }
|
|
83
|
+
});
|
|
84
|
+
Object.defineProperty(exports, "readAccountSessionToken", {
|
|
85
|
+
enumerable: true,
|
|
86
|
+
get: function () { return chunkJCA5XMS6_cjs.readAccountSessionToken; }
|
|
83
87
|
});
|
|
84
88
|
Object.defineProperty(exports, "readBodyWithCap", {
|
|
85
89
|
enumerable: true,
|
|
86
|
-
get: function () { return
|
|
90
|
+
get: function () { return chunkJCA5XMS6_cjs.readBodyWithCap; }
|
|
87
91
|
});
|
|
88
92
|
Object.defineProperty(exports, "resolveSafeImageContentType", {
|
|
89
93
|
enumerable: true,
|
|
90
|
-
get: function () { return
|
|
94
|
+
get: function () { return chunkJCA5XMS6_cjs.resolveSafeImageContentType; }
|
|
91
95
|
});
|
|
92
96
|
Object.defineProperty(exports, "uploadDirectoryToBackend", {
|
|
93
97
|
enumerable: true,
|
|
94
|
-
get: function () { return
|
|
98
|
+
get: function () { return chunkJCA5XMS6_cjs.uploadDirectoryToBackend; }
|
|
95
99
|
});
|
|
96
100
|
Object.defineProperty(exports, "uploadFileToBackend", {
|
|
97
101
|
enumerable: true,
|
|
98
|
-
get: function () { return
|
|
102
|
+
get: function () { return chunkJCA5XMS6_cjs.uploadFileToBackend; }
|
|
99
103
|
});
|
|
100
104
|
Object.defineProperty(exports, "uploadJsonToBackend", {
|
|
101
105
|
enumerable: true,
|
|
102
|
-
get: function () { return
|
|
106
|
+
get: function () { return chunkJCA5XMS6_cjs.uploadJsonToBackend; }
|
|
103
107
|
});
|
|
104
108
|
Object.defineProperty(exports, "validateUrl", {
|
|
105
109
|
enumerable: true,
|
|
106
|
-
get: function () { return
|
|
110
|
+
get: function () { return chunkJCA5XMS6_cjs.validateUrl; }
|
|
107
111
|
});
|
|
108
112
|
Object.defineProperty(exports, "verifyAccountSessionToken", {
|
|
109
113
|
enumerable: true,
|
|
110
|
-
get: function () { return
|
|
114
|
+
get: function () { return chunkJCA5XMS6_cjs.verifyAccountSessionToken; }
|
|
111
115
|
});
|
|
112
116
|
Object.defineProperty(exports, "verifySiwsToken", {
|
|
113
117
|
enumerable: true,
|
|
114
|
-
get: function () { return
|
|
118
|
+
get: function () { return chunkJCA5XMS6_cjs.verifySiwsToken; }
|
|
115
119
|
});
|
|
116
120
|
//# sourceMappingURL=index.cjs.map
|
|
117
121
|
//# sourceMappingURL=index.cjs.map
|
package/dist/server/index.d.cts
CHANGED
|
@@ -88,6 +88,11 @@ interface SiwsIdentity {
|
|
|
88
88
|
declare function issueSiwsToken(secret: string, chain: Chain, wallet: string, ttlSeconds?: number): string;
|
|
89
89
|
declare function verifySiwsToken(secret: string, raw: string): SiwsIdentity | null;
|
|
90
90
|
declare function issueAccountSessionToken(secret: string, accountId: string, ttlSeconds?: number): string;
|
|
91
|
+
/** The account a valid session token is for, and when it was issued (seconds since the epoch). */
|
|
92
|
+
declare function readAccountSessionToken(secret: string, raw: string): {
|
|
93
|
+
accountId: string;
|
|
94
|
+
issuedAt: number;
|
|
95
|
+
} | null;
|
|
91
96
|
declare function verifyAccountSessionToken(secret: string, raw: string): string | null;
|
|
92
97
|
|
|
93
98
|
declare function isValidIpfsCidPath(cidPath: string): boolean;
|
|
@@ -95,4 +100,4 @@ declare const IPFS_SAFE_CONTENT_TYPE_PREFIXES: readonly ["image/jpeg", "image/pn
|
|
|
95
100
|
declare function resolveSafeImageContentType(contentType: string): string;
|
|
96
101
|
declare const MAX_IPFS_GATEWAY_RESPONSE_BYTES: number;
|
|
97
102
|
|
|
98
|
-
export { ACCOUNT_SESSION_COOKIE, ACCOUNT_SESSION_TTL_SECONDS, ALLOWED_IMAGE_CONTENT_TYPES, type AppGatewayConfig, type AppSessionConfig, type BackendMetadataConfig, type BackendUploadResult, type CappedBody, IDENTITY_TTL_SECONDS, IPFS_SAFE_CONTENT_TYPE_PREFIXES, type ImageProxyConfig, MAX_IMAGE_PROXY_BYTES, MAX_IMAGE_REDIRECTS, MAX_IPFS_GATEWAY_RESPONSE_BYTES, type SiwsIdentity, createAppGateway, createAppSessionHandler, createImageProxyHandler, getBackendSignedUrl, isPrivateHost, isPrivateOrInsecureUrl, isPublicAppRoute, isSameOrigin, isValidIpfsCidPath, issueAccountSessionToken, issueSiwsToken, readBodyWithCap, resolveSafeImageContentType, uploadDirectoryToBackend, uploadFileToBackend, uploadJsonToBackend, validateUrl, verifyAccountSessionToken, verifySiwsToken };
|
|
103
|
+
export { ACCOUNT_SESSION_COOKIE, ACCOUNT_SESSION_TTL_SECONDS, ALLOWED_IMAGE_CONTENT_TYPES, type AppGatewayConfig, type AppSessionConfig, type BackendMetadataConfig, type BackendUploadResult, type CappedBody, IDENTITY_TTL_SECONDS, IPFS_SAFE_CONTENT_TYPE_PREFIXES, type ImageProxyConfig, MAX_IMAGE_PROXY_BYTES, MAX_IMAGE_REDIRECTS, MAX_IPFS_GATEWAY_RESPONSE_BYTES, type SiwsIdentity, createAppGateway, createAppSessionHandler, createImageProxyHandler, getBackendSignedUrl, isPrivateHost, isPrivateOrInsecureUrl, isPublicAppRoute, isSameOrigin, isValidIpfsCidPath, issueAccountSessionToken, issueSiwsToken, readAccountSessionToken, readBodyWithCap, resolveSafeImageContentType, uploadDirectoryToBackend, uploadFileToBackend, uploadJsonToBackend, validateUrl, verifyAccountSessionToken, verifySiwsToken };
|
package/dist/server/index.d.ts
CHANGED
|
@@ -88,6 +88,11 @@ interface SiwsIdentity {
|
|
|
88
88
|
declare function issueSiwsToken(secret: string, chain: Chain, wallet: string, ttlSeconds?: number): string;
|
|
89
89
|
declare function verifySiwsToken(secret: string, raw: string): SiwsIdentity | null;
|
|
90
90
|
declare function issueAccountSessionToken(secret: string, accountId: string, ttlSeconds?: number): string;
|
|
91
|
+
/** The account a valid session token is for, and when it was issued (seconds since the epoch). */
|
|
92
|
+
declare function readAccountSessionToken(secret: string, raw: string): {
|
|
93
|
+
accountId: string;
|
|
94
|
+
issuedAt: number;
|
|
95
|
+
} | null;
|
|
91
96
|
declare function verifyAccountSessionToken(secret: string, raw: string): string | null;
|
|
92
97
|
|
|
93
98
|
declare function isValidIpfsCidPath(cidPath: string): boolean;
|
|
@@ -95,4 +100,4 @@ declare const IPFS_SAFE_CONTENT_TYPE_PREFIXES: readonly ["image/jpeg", "image/pn
|
|
|
95
100
|
declare function resolveSafeImageContentType(contentType: string): string;
|
|
96
101
|
declare const MAX_IPFS_GATEWAY_RESPONSE_BYTES: number;
|
|
97
102
|
|
|
98
|
-
export { ACCOUNT_SESSION_COOKIE, ACCOUNT_SESSION_TTL_SECONDS, ALLOWED_IMAGE_CONTENT_TYPES, type AppGatewayConfig, type AppSessionConfig, type BackendMetadataConfig, type BackendUploadResult, type CappedBody, IDENTITY_TTL_SECONDS, IPFS_SAFE_CONTENT_TYPE_PREFIXES, type ImageProxyConfig, MAX_IMAGE_PROXY_BYTES, MAX_IMAGE_REDIRECTS, MAX_IPFS_GATEWAY_RESPONSE_BYTES, type SiwsIdentity, createAppGateway, createAppSessionHandler, createImageProxyHandler, getBackendSignedUrl, isPrivateHost, isPrivateOrInsecureUrl, isPublicAppRoute, isSameOrigin, isValidIpfsCidPath, issueAccountSessionToken, issueSiwsToken, readBodyWithCap, resolveSafeImageContentType, uploadDirectoryToBackend, uploadFileToBackend, uploadJsonToBackend, validateUrl, verifyAccountSessionToken, verifySiwsToken };
|
|
103
|
+
export { ACCOUNT_SESSION_COOKIE, ACCOUNT_SESSION_TTL_SECONDS, ALLOWED_IMAGE_CONTENT_TYPES, type AppGatewayConfig, type AppSessionConfig, type BackendMetadataConfig, type BackendUploadResult, type CappedBody, IDENTITY_TTL_SECONDS, IPFS_SAFE_CONTENT_TYPE_PREFIXES, type ImageProxyConfig, MAX_IMAGE_PROXY_BYTES, MAX_IMAGE_REDIRECTS, MAX_IPFS_GATEWAY_RESPONSE_BYTES, type SiwsIdentity, createAppGateway, createAppSessionHandler, createImageProxyHandler, getBackendSignedUrl, isPrivateHost, isPrivateOrInsecureUrl, isPublicAppRoute, isSameOrigin, isValidIpfsCidPath, issueAccountSessionToken, issueSiwsToken, readAccountSessionToken, readBodyWithCap, resolveSafeImageContentType, uploadDirectoryToBackend, uploadFileToBackend, uploadJsonToBackend, validateUrl, verifyAccountSessionToken, verifySiwsToken };
|
package/dist/server/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export { ACCOUNT_SESSION_COOKIE, ACCOUNT_SESSION_TTL_SECONDS, ALLOWED_IMAGE_CONTENT_TYPES, IDENTITY_TTL_SECONDS, IPFS_SAFE_CONTENT_TYPE_PREFIXES, MAX_IMAGE_PROXY_BYTES, MAX_IMAGE_REDIRECTS, MAX_IPFS_GATEWAY_RESPONSE_BYTES, createAppGateway, createAppSessionHandler, createImageProxyHandler, getBackendSignedUrl, isPrivateHost, isPrivateOrInsecureUrl, isPublicAppRoute, isSameOrigin, isValidIpfsCidPath, issueAccountSessionToken, issueSiwsToken, readBodyWithCap, resolveSafeImageContentType, uploadDirectoryToBackend, uploadFileToBackend, uploadJsonToBackend, validateUrl, verifyAccountSessionToken, verifySiwsToken } from '../chunk-
|
|
1
|
+
export { ACCOUNT_SESSION_COOKIE, ACCOUNT_SESSION_TTL_SECONDS, ALLOWED_IMAGE_CONTENT_TYPES, IDENTITY_TTL_SECONDS, IPFS_SAFE_CONTENT_TYPE_PREFIXES, MAX_IMAGE_PROXY_BYTES, MAX_IMAGE_REDIRECTS, MAX_IPFS_GATEWAY_RESPONSE_BYTES, createAppGateway, createAppSessionHandler, createImageProxyHandler, getBackendSignedUrl, isPrivateHost, isPrivateOrInsecureUrl, isPublicAppRoute, isSameOrigin, isValidIpfsCidPath, issueAccountSessionToken, issueSiwsToken, readAccountSessionToken, readBodyWithCap, resolveSafeImageContentType, uploadDirectoryToBackend, uploadFileToBackend, uploadJsonToBackend, validateUrl, verifyAccountSessionToken, verifySiwsToken } from '../chunk-CEPRY3SR.js';
|
|
2
2
|
import '../chunk-PZ5AY32C.js';
|
|
3
3
|
//# sourceMappingURL=index.js.map
|
|
4
4
|
//# sourceMappingURL=index.js.map
|
package/package.json
CHANGED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/server/origin.ts","../src/server/app-gateway.ts","../src/server/app-session.ts","../src/server/ssrf-guard.ts","../src/server/image-proxy.ts","../src/server/backend-metadata.ts","../src/server/app-routes.ts","../src/server/siws-token.ts","../src/utils/ipfs-gateway.ts"],"names":["headers","json"],"mappings":"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","file":"chunk-F7W6IWTL.js","sourcesContent":["export function isSameOrigin(req: Request): boolean {\n const origin = req.headers.get(\"origin\");\n if (!origin) return true;\n const host = req.headers.get(\"host\");\n try {\n return new URL(origin).host === host;\n } catch {\n return false;\n }\n}\n","import type { FetchLike } from \"../utils/fetch.js\";\nimport { isSameOrigin } from \"./origin.js\";\n\nexport const ACCOUNT_SESSION_COOKIE = \"ml_account_session\";\nconst SESSION_MAX_AGE_SECONDS = 30 * 24 * 60 * 60;\nconst SIGN_IN_PATHS = new Set([\"auth/email/register-account\", \"auth/email/verify-code\", \"auth/siws/verify\"]);\nconst EDGE_CACHE_CONTROL = \"public, s-maxage=30, stale-while-revalidate=120\";\nconst DROPPED_REQUEST_HEADERS = new Set([\n \"connection\", \"keep-alive\", \"proxy-authenticate\", \"proxy-authorization\", \"te\", \"trailers\",\n \"transfer-encoding\", \"upgrade\", \"host\", \"content-length\", \"accept-encoding\", \"cookie\",\n \"x-api-key\", \"x-app-id\", \"x-app-secret\", \"x-account-session\", \"authorization\",\n]);\nconst DROPPED_RESPONSE_HEADERS = new Set([\n \"connection\", \"keep-alive\", \"transfer-encoding\", \"content-length\", \"content-encoding\", \"set-cookie\",\n]);\n\nexport interface AppGatewayConfig {\n appId: string;\n backendUrl: string;\n apiKey: string | undefined;\n appSecret?: string;\n allow: Record<string, RegExp[]>;\n cacheableGets?: RegExp[];\n timeoutMs?: number;\n fetchImpl?: FetchLike;\n}\n\nexport function readCookie(req: Request, name: string): string | null {\n const raw = req.headers.get(\"cookie\");\n if (!raw) return null;\n for (const part of raw.split(\";\")) {\n const eq = part.indexOf(\"=\");\n if (eq !== -1 && part.slice(0, eq).trim() === name) return part.slice(eq + 1).trim() || null;\n }\n return null;\n}\n\nexport function sessionCookie(value: string, maxAge = SESSION_MAX_AGE_SECONDS): string {\n const secure = process.env.NODE_ENV === \"production\" ? \"; Secure\" : \"\";\n return `${ACCOUNT_SESSION_COOKIE}=${value}; Path=/; HttpOnly; SameSite=Lax; Max-Age=${maxAge}${secure}`;\n}\n\nfunction json(body: unknown, status: number): Response {\n return Response.json(body, { status });\n}\n\nexport function createAppGateway(config: AppGatewayConfig): (req: Request, path: string[]) => Promise<Response> {\n const doFetch = config.fetchImpl ?? fetch;\n const base = config.backendUrl.replace(/\\/$/, \"\");\n\n return async function appGateway(req, path) {\n if (!isSameOrigin(req)) return json({ error: \"Cross-origin requests are not allowed\" }, 403);\n if (!config.apiKey) return json({ error: \"Service unavailable\" }, 500);\n if (path.some((s) => s === \".\" || s === \"..\" || s === \"\")) return json({ error: \"Invalid path\" }, 400);\n\n const joined = path.join(\"/\");\n const method = req.method.toUpperCase();\n if (!(config.allow[method] ?? []).some((re) => re.test(joined))) {\n return json({ error: `Path not allowed: ${method} /v1/${joined}` }, 403);\n }\n\n const headers = new Headers();\n req.headers.forEach((v, k) => {\n if (!DROPPED_REQUEST_HEADERS.has(k.toLowerCase())) headers.set(k, v);\n });\n headers.set(\"x-api-key\", config.apiKey);\n headers.set(\"x-app-id\", config.appId);\n if (config.appSecret) headers.set(\"x-app-secret\", config.appSecret);\n const session = readCookie(req, ACCOUNT_SESSION_COOKIE);\n if (session) headers.set(\"x-account-session\", session);\n\n const search = new URL(req.url).search;\n const target = `${base}/v1/${path.map(encodeURIComponent).join(\"/\")}${search}`;\n const hasBody = method !== \"GET\" && method !== \"HEAD\";\n\n let res: Response;\n try {\n res = await doFetch(target, {\n method,\n headers,\n body: hasBody ? await req.arrayBuffer() : undefined,\n cache: \"no-store\",\n redirect: \"manual\",\n signal: AbortSignal.timeout(config.timeoutMs ?? 55_000),\n });\n } catch (e) {\n if (e instanceof DOMException && e.name === \"TimeoutError\") {\n return json({ error: \"The service took too long to respond\" }, 504);\n }\n return json({ error: \"Service unavailable\" }, 502);\n }\n\n const out = new Headers();\n res.headers.forEach((v, k) => {\n if (!DROPPED_RESPONSE_HEADERS.has(k.toLowerCase())) out.set(k, v);\n });\n\n if (method === \"POST\" && res.ok && SIGN_IN_PATHS.has(joined)) {\n const text = await res.text();\n let body: Record<string, unknown> | null = null;\n try {\n body = JSON.parse(text) as Record<string, unknown>;\n } catch {\n body = null;\n }\n if (!body) return new Response(text, { status: res.status, headers: out });\n const token = typeof body.accountToken === \"string\" ? body.accountToken : null;\n delete body.accountToken;\n delete body.token;\n out.set(\"content-type\", \"application/json\");\n if (token) out.append(\"set-cookie\", sessionCookie(token));\n return new Response(JSON.stringify(body), { status: res.status, headers: out });\n }\n\n if (method === \"GET\" && res.ok && !session && (config.cacheableGets ?? []).some((re) => re.test(joined))) {\n out.set(\"cache-control\", EDGE_CACHE_CONTROL);\n }\n return new Response(res.body, { status: res.status, headers: out });\n };\n}\n","import type { FetchLike } from \"../utils/fetch.js\";\nimport { readCookie, sessionCookie, ACCOUNT_SESSION_COOKIE } from \"./app-gateway.js\";\n\nexport interface AppSessionConfig {\n appId: string;\n backendUrl: string;\n apiKey: string | undefined;\n appSecret?: string;\n fetchImpl?: FetchLike;\n}\n\nfunction signedOut(): Response {\n const res = Response.json(null);\n res.headers.append(\"set-cookie\", sessionCookie(\"\", 0));\n return res;\n}\n\nexport function createAppSessionHandler(config: AppSessionConfig): {\n GET(req: Request): Promise<Response>;\n DELETE(req: Request): Promise<Response>;\n} {\n const doFetch = config.fetchImpl ?? fetch;\n const base = config.backendUrl.replace(/\\/$/, \"\");\n return {\n async GET(req) {\n const session = readCookie(req, ACCOUNT_SESSION_COOKIE);\n if (!session) return Response.json(null);\n const res = await doFetch(`${base}/v1/users/me`, {\n headers: {\n \"x-api-key\": config.apiKey ?? \"\",\n \"x-app-id\": config.appId,\n ...(config.appSecret ? { \"x-app-secret\": config.appSecret } : {}),\n \"x-account-session\": session,\n },\n cache: \"no-store\",\n });\n if (res.status === 401 || res.status === 403) return signedOut();\n if (!res.ok) return Response.json({ error: \"Session check failed\" }, { status: 502 });\n return Response.json(await res.json());\n },\n async DELETE() {\n return signedOut();\n },\n };\n}\n","export const ALLOWED_IMAGE_CONTENT_TYPES = new Set([\n \"image/jpeg\",\n \"image/jpg\",\n \"image/png\",\n \"image/gif\",\n \"image/webp\",\n \"image/svg+xml\",\n \"image/avif\",\n \"image/bmp\",\n \"image/tiff\",\n]);\n\nexport const MAX_IMAGE_REDIRECTS = 5;\n\nexport const MAX_IMAGE_PROXY_BYTES = 15 * 1024 * 1024;\n\nfunction parseIpv4(ip: string): number[] | null {\n const parts = ip.split(\".\");\n if (parts.length !== 4) return null;\n const bytes: number[] = [];\n for (const part of parts) {\n if (!/^\\d{1,3}$/.test(part)) return null;\n const n = Number(part);\n if (n > 255) return null;\n bytes.push(n);\n }\n return bytes;\n}\n\nfunction isPrivateIpv4(bytes: number[]): boolean {\n const a = bytes[0]!;\n const b = bytes[1]!;\n const c = bytes[2]!;\n if (a === 0) return true;\n if (a === 10) return true;\n if (a === 100 && b >= 64 && b <= 127) return true;\n if (a === 127) return true;\n if (a === 169 && b === 254) return true;\n if (a === 172 && b >= 16 && b <= 31) return true;\n if (a === 192 && b === 0 && c === 0) return true;\n if (a === 192 && b === 168) return true;\n if (a === 198 && (b === 18 || b === 19)) return true;\n if (a >= 224) return true;\n return false;\n}\n\nfunction expandIpv6(rawIp: string): number[] | null {\n let ip = rawIp;\n\n let embeddedV4: number[] | null = null;\n const v4Tail = ip.match(/(\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3})$/);\n if (v4Tail && ip.includes(\":\")) {\n embeddedV4 = parseIpv4(v4Tail[1]!);\n if (!embeddedV4) return null;\n ip = ip.slice(0, ip.length - v4Tail[1]!.length) + \"0:0\";\n }\n\n const sides = ip.split(\"::\");\n if (sides.length > 2) return null;\n\n const head = sides[0] ? sides[0].split(\":\").filter(Boolean) : [];\n const tail = sides.length === 2 && sides[1] ? sides[1].split(\":\").filter(Boolean) : [];\n\n let groups: string[];\n if (sides.length === 1) {\n groups = head;\n if (groups.length !== 8) return null;\n } else {\n const missing = 8 - head.length - tail.length;\n if (missing < 0) return null;\n groups = [...head, ...Array(missing).fill(\"0\"), ...tail];\n }\n if (groups.length !== 8) return null;\n\n const bytes: number[] = [];\n for (const group of groups) {\n if (!/^[0-9a-fA-F]{1,4}$/.test(group)) return null;\n const n = parseInt(group, 16);\n bytes.push((n >> 8) & 0xff, n & 0xff);\n }\n\n if (embeddedV4) {\n bytes[12] = embeddedV4[0]!;\n bytes[13] = embeddedV4[1]!;\n bytes[14] = embeddedV4[2]!;\n bytes[15] = embeddedV4[3]!;\n }\n\n return bytes;\n}\n\nfunction isPrivateIpv6(bytes: number[]): boolean {\n if (bytes.every((b) => b === 0)) return true;\n if (bytes.slice(0, 15).every((b) => b === 0) && bytes[15] === 1) return true;\n if ((bytes[0]! & 0xfe) === 0xfc) return true;\n if (bytes[0] === 0xfe && (bytes[1]! & 0xc0) === 0x80) return true;\n\n if (bytes.slice(0, 10).every((b) => b === 0) && bytes[10] === 0xff && bytes[11] === 0xff) {\n return isPrivateIpv4(bytes.slice(12));\n }\n if (bytes.slice(0, 12).every((b) => b === 0)) return isPrivateIpv4(bytes.slice(12));\n if (bytes[0] === 0x00 && bytes[1] === 0x64 && bytes[2] === 0xff && bytes[3] === 0x9b && bytes.slice(4, 12).every((b) => b === 0)) {\n return isPrivateIpv4(bytes.slice(12));\n }\n if (bytes[0] === 0x20 && bytes[1] === 0x02) return isPrivateIpv4(bytes.slice(2, 6));\n if (bytes[0] === 0xfe && (bytes[1]! & 0xc0) === 0xc0) return true;\n if (bytes[0] === 0xff) return true;\n return false;\n}\n\nfunction parseNumber(part: string): number | null {\n if (/^0x[0-9a-f]+$/i.test(part)) return parseInt(part.slice(2), 16);\n if (/^0[0-7]+$/.test(part)) return parseInt(part, 8);\n if (/^\\d+$/.test(part)) return parseInt(part, 10);\n return null;\n}\n\nfunction normalizeNumericHostname(host: string): string | null {\n const parts = host.trim().split(\".\");\n if (parts.length < 1 || parts.length > 4) return null;\n\n const values: number[] = [];\n for (const part of parts) {\n const value = parseNumber(part);\n if (value === null || value < 0) return null;\n values.push(value);\n }\n\n const leading = values.slice(0, -1);\n if (leading.some((v) => v > 255)) return null;\n\n const tail = values[values.length - 1]!;\n const tailBytes = 4 - leading.length;\n if (tail > 2 ** (8 * tailBytes) - 1) return null;\n\n const bytes = [...leading];\n for (let i = tailBytes - 1; i >= 0; i--) bytes.push((tail >>> (8 * i)) & 0xff);\n\n return bytes.join(\".\");\n}\n\nconst BLOCKED_HOSTNAMES = new Set([\n \"localhost\",\n \"metadata.google.internal\",\n \"metadata.azure.internal\",\n]);\n\nexport function isPrivateHost(hostname: string): boolean {\n const host = hostname.toLowerCase().replace(/^\\[|\\]$/g, \"\");\n\n if (BLOCKED_HOSTNAMES.has(host)) return true;\n if (host.endsWith(\".local\") || host.endsWith(\".internal\") || host.endsWith(\".localhost\")) return true;\n\n const candidate = normalizeNumericHostname(host) ?? host;\n\n const v4 = parseIpv4(candidate);\n if (v4) return isPrivateIpv4(v4);\n\n const v6 = expandIpv6(candidate);\n if (v6) return isPrivateIpv6(v6);\n\n return false;\n}\n\nexport function validateUrl(\n raw: string,\n options: { requireHttps?: boolean } = {},\n): { url: URL } | { error: string; status: number } {\n const requireHttps = options.requireHttps ?? true;\n\n let parsed: URL;\n try {\n parsed = new URL(raw);\n } catch {\n return { error: \"Invalid url\", status: 400 };\n }\n\n if (requireHttps && parsed.protocol !== \"https:\") {\n return { error: \"Only https URLs allowed\", status: 400 };\n }\n\n if (!requireHttps && parsed.protocol !== \"https:\" && parsed.protocol !== \"http:\") {\n return { error: \"Only http and https URLs allowed\", status: 400 };\n }\n\n if (parsed.username || parsed.password) {\n return { error: \"URL credentials not allowed\", status: 400 };\n }\n\n if (isPrivateHost(parsed.hostname)) {\n return { error: \"URL not allowed\", status: 400 };\n }\n\n return { url: parsed };\n}\n\nexport function isPrivateOrInsecureUrl(raw: string, requireHttps = true): boolean {\n return \"error\" in validateUrl(raw, { requireHttps });\n}\n","import type { FetchLike } from \"../utils/fetch.js\";\nimport {\n ALLOWED_IMAGE_CONTENT_TYPES,\n MAX_IMAGE_PROXY_BYTES,\n MAX_IMAGE_REDIRECTS,\n isPrivateHost,\n validateUrl,\n} from \"./ssrf-guard.js\";\nimport type { AppGatewayConfig } from \"./app-gateway.js\";\n\nexport interface ImageProxyConfig {\n\n resolveHostname: (hostname: string) => Promise<string[]>;\n fetchImpl?: FetchLike;\n userAgent?: string;\n backend?: Pick<AppGatewayConfig, \"appId\" | \"backendUrl\" | \"apiKey\" | \"appSecret\">;\n}\n\nconst DEFAULT_USER_AGENT =\n \"Mozilla/5.0 (compatible; Medialane/1.0; +https://www.medialane.io)\";\n\nfunction jsonError(message: string, status: number): Response {\n return Response.json({ error: message }, { status });\n}\n\nexport interface CappedBody {\n ok: boolean;\n body?: Uint8Array;\n error?: string;\n status?: number;\n}\n\nexport async function readBodyWithCap(res: Response, maxBytes: number): Promise<CappedBody> {\n const declared = Number(res.headers.get(\"content-length\") ?? 0);\n if (declared > maxBytes) {\n return { ok: false, error: \"Image too large\", status: 413 };\n }\n\n const reader = res.body?.getReader();\n if (!reader) return { ok: false, error: \"Empty response body\", status: 502 };\n\n const chunks: Uint8Array[] = [];\n let total = 0;\n for (;;) {\n const { done, value } = await reader.read();\n if (done) break;\n if (!value) continue;\n total += value.byteLength;\n if (total > maxBytes) {\n await reader.cancel().catch(() => {});\n return { ok: false, error: \"Image too large\", status: 413 };\n }\n chunks.push(value);\n }\n\n const body = new Uint8Array(total);\n let offset = 0;\n for (const chunk of chunks) {\n body.set(chunk, offset);\n offset += chunk.byteLength;\n }\n return { ok: true, body };\n}\n\nexport function createImageProxyHandler(\n config: ImageProxyConfig,\n): (req: Request) => Promise<Response> {\n const doFetch = config.fetchImpl ?? fetch;\n const userAgent = config.userAgent ?? DEFAULT_USER_AGENT;\n const backendOrigin = config.backend ? new URL(config.backend.backendUrl).origin : null;\n\n function headersFor(url: URL): Record<string, string> {\n const headers: Record<string, string> = { \"User-Agent\": userAgent };\n if (!config.backend || url.origin !== backendOrigin) return headers;\n if (config.backend.apiKey) headers[\"x-api-key\"] = config.backend.apiKey;\n headers[\"x-app-id\"] = config.backend.appId;\n if (config.backend.appSecret) headers[\"x-app-secret\"] = config.backend.appSecret;\n return headers;\n }\n\n async function resolvesToPrivateHost(hostname: string): Promise<boolean> {\n try {\n const addresses = await config.resolveHostname(hostname);\n\n if (addresses.length === 0) return true;\n return addresses.some((address) => isPrivateHost(address));\n } catch {\n return true;\n }\n }\n\n async function safeFetch(url: URL, hopsLeft: number): Promise<Response> {\n if (hopsLeft < 0) throw new Error(\"Too many redirects\");\n\n if (await resolvesToPrivateHost(url.hostname)) {\n throw new Error(\"Blocked: hostname resolves to a private address\");\n }\n\n const res = await doFetch(url.toString(), {\n redirect: \"manual\",\n headers: headersFor(url),\n });\n\n if (res.status >= 300 && res.status < 400) {\n const location = res.headers.get(\"location\");\n if (!location) throw new Error(\"Redirect with no Location header\");\n\n const next = new URL(location, url);\n const validated = validateUrl(next.toString());\n if (\"error\" in validated) throw new Error(`Redirect blocked: ${validated.error}`);\n\n return safeFetch(validated.url, hopsLeft - 1);\n }\n\n return res;\n }\n\n return async function handleImageProxy(req: Request): Promise<Response> {\n const raw = new URL(req.url).searchParams.get(\"url\");\n if (!raw) return jsonError(\"Missing url\", 400);\n\n const validated = validateUrl(raw);\n if (\"error\" in validated) return jsonError(validated.error, validated.status);\n\n let upstream: Response;\n try {\n const isBackendImage = backendOrigin && /^\\/media\\/[^/]+\\/[^/]+\\/[^/]+\\/image$/.test(validated.url.pathname);\n upstream = await safeFetch(\n isBackendImage ? new URL(validated.url.pathname, backendOrigin) : validated.url,\n MAX_IMAGE_REDIRECTS,\n );\n } catch {\n return jsonError(\"Failed to fetch image\", 502);\n }\n\n if (!upstream.ok) {\n return jsonError(`Upstream returned ${upstream.status}`, upstream.status);\n }\n\n const contentType = upstream.headers.get(\"content-type\") ?? \"\";\n const baseType = contentType.split(\";\")[0]!.trim().toLowerCase();\n if (!ALLOWED_IMAGE_CONTENT_TYPES.has(baseType)) {\n return jsonError(\"Not an image\", 400);\n }\n\n const capped = await readBodyWithCap(upstream, MAX_IMAGE_PROXY_BYTES);\n if (!capped.ok) return jsonError(capped.error!, capped.status!);\n\n return new Response(capped.body as unknown as BodyInit, {\n status: 200,\n headers: {\n \"Content-Type\": contentType,\n \"X-Content-Type-Options\": \"nosniff\",\n \"Content-Security-Policy\":\n \"default-src 'none'; img-src 'self' data:; style-src 'unsafe-inline'; sandbox\",\n \"Cache-Control\": \"public, max-age=86400, s-maxage=86400, stale-while-revalidate=604800\",\n \"Access-Control-Allow-Origin\": \"*\",\n },\n });\n };\n}\n","import type { FetchLike } from \"../utils/fetch.js\";\nexport interface BackendMetadataConfig {\n backendUrl: string;\n apiKey: string;\n fetchImpl?: FetchLike;\n}\n\nfunction endpoint(config: BackendMetadataConfig, path: string): string {\n return `${config.backendUrl.replace(/\\/$/, \"\")}/v1/metadata/${path}`;\n}\n\nfunction headers(config: BackendMetadataConfig, extra?: Record<string, string>): Record<string, string> {\n return { \"x-api-key\": config.apiKey, ...extra };\n}\n\nexport interface BackendUploadResult {\n cid: string;\n uri: string;\n}\n\nexport async function uploadJsonToBackend(config: BackendMetadataConfig, json: unknown): Promise<BackendUploadResult> {\n const res = await (config.fetchImpl ?? fetch)(endpoint(config, \"upload\"), {\n method: \"POST\",\n headers: headers(config, { \"Content-Type\": \"application/json\" }),\n body: JSON.stringify(json),\n });\n const data = (await res.json().catch(() => ({}))) as { data?: { cid: string; url: string }; error?: string };\n if (!res.ok || !data.data) throw new Error(data.error ?? \"Metadata upload failed\");\n return { cid: data.data.cid, uri: data.data.url };\n}\n\nexport async function uploadFileToBackend(config: BackendMetadataConfig, file: File): Promise<BackendUploadResult> {\n const form = new FormData();\n form.append(\"file\", file, file.name);\n const res = await (config.fetchImpl ?? fetch)(endpoint(config, \"upload-file\"), {\n method: \"POST\",\n headers: headers(config),\n body: form,\n });\n const data = (await res.json().catch(() => ({}))) as { data?: { cid: string; url: string }; error?: string };\n if (!res.ok || !data.data) throw new Error(data.error ?? \"File upload failed\");\n return { cid: data.data.cid, uri: data.data.url };\n}\n\nexport async function uploadDirectoryToBackend(\n config: BackendMetadataConfig,\n files: { name: string; content: unknown }[],\n): Promise<{ cid: string; baseUri: string }> {\n const res = await (config.fetchImpl ?? fetch)(endpoint(config, \"upload-directory\"), {\n method: \"POST\",\n headers: headers(config, { \"Content-Type\": \"application/json\" }),\n body: JSON.stringify({ files }),\n });\n const data = (await res.json().catch(() => ({}))) as {\n data?: { cid: string; baseUri: string };\n error?: string;\n };\n if (!res.ok || !data.data) throw new Error(data.error ?? \"Directory pin failed\");\n return data.data;\n}\n\nexport async function getBackendSignedUrl(\n config: BackendMetadataConfig,\n kind: \"image\" | \"document\" | \"media\" = \"image\",\n): Promise<string> {\n const res = await (config.fetchImpl ?? fetch)(`${endpoint(config, \"signed-url\")}?kind=${kind}`, {\n method: \"GET\",\n headers: headers(config),\n });\n const data = (await res.json().catch(() => ({}))) as { data?: { url: string }; error?: string };\n if (!res.ok || !data.data) throw new Error(data.error ?? \"Failed to create upload URL\");\n return data.data.url;\n}\n","const SEG = \"[^/]+\";\n\nconst PUBLIC_ROUTES: Record<string, RegExp[]> = {\n GET: [\n \"orders\", `orders/${SEG}`, `orders/token/${SEG}/${SEG}`, `orders/user/${SEG}`, `orders/received/${SEG}`, \"orders/counter-offers\",\n \"tokens\", `tokens/owned/${SEG}`, `tokens/${SEG}/${SEG}`, `tokens/${SEG}/${SEG}/(history|comments|remixes)`, `tokens/${SEG}/${SEG}/balances/${SEG}`,\n \"collections\", `collections/${SEG}`, `collections/${SEG}/tokens`, `collections/${SEG}/profile`,\n \"activities\", `activities/${SEG}`, \"search\", \"metadata/resolve\",\n \"creators\", `creators/${SEG}/profile`, `creators/by-username/${SEG}`, `creators/${SEG}/hidden`,\n \"coins\", \"coins/prices\", \"coins/claims\", `coins/${SEG}`, `coins/${SEG}/guarantees`, `pop/${SEG}/claim-info`,\n \"drops\", `drops/${SEG}`, `drops/${SEG}/mints`, `drops/${SEG}/state`,\n \"rewards\", \"rewards/config\", \"rewards/batch\", `rewards/${SEG}`, `rewards/${SEG}/events`,\n `club/${SEG}/${SEG}`, `club/${SEG}/${SEG}/member/${SEG}`, `tickets/${SEG}/${SEG}`, `tickets/${SEG}/count`, `ipnft/${SEG}/${SEG}`,\n \"stats\", \"prices\", `remix-offers/${SEG}`,\n \"sponsorship/offers\", `sponsorship/offers/${SEG}`, `sponsorship/offers/${SEG}/bids`,\n \"sponsorship/proposals\", `sponsorship/proposals/${SEG}`, \"sponsorship/licenses\", `sponsorship/licenses/${SEG}`,\n \"auth/email/exists\",\n `media/${SEG}/${SEG}/${SEG}/image`,\n ].map((p) => new RegExp(`^${p}$`)),\n POST: [\n \"auth/email/(request-code|verify-code|register-account|confirm)\",\n \"auth/siws/(nonce|verify)\",\n \"users/register\",\n ].map((p) => new RegExp(`^${p}$`)),\n};\n\nexport function isPublicAppRoute(method: string, path: string): boolean {\n if (path.split(\"/\").some((s) => s === \".\" || s === \"..\" || s === \"\")) return false;\n return (PUBLIC_ROUTES[method.toUpperCase()] ?? []).some((re) => re.test(path));\n}\n","import { hmac } from \"@noble/hashes/hmac.js\";\nimport { sha256 } from \"@noble/hashes/sha2.js\";\nimport { base64urlnopad } from \"@scure/base\";\nimport type { Chain } from \"../chains.js\";\n\nconst IDENTITY_PREFIX = \"siws_\";\nconst ACCOUNT_SESSION_PREFIX = \"account_session_\";\n\nconst IDENTITY_DOMAIN = \"siws-identity-v1\";\nconst ACCOUNT_SESSION_DOMAIN = \"account-session-v1\";\n\nexport const IDENTITY_TTL_SECONDS = 86_400;\nexport const ACCOUNT_SESSION_TTL_SECONDS = 30 * 24 * 60 * 60;\n\nconst CLOCK_SKEW_SECONDS = 60;\n\nexport interface SiwsIdentity {\n address: string;\n chain: Chain;\n}\n\ninterface IdentityPayload {\n sub?: string;\n chain?: Chain;\n iat?: number;\n exp?: number;\n}\n\ninterface AccountSessionPayload {\n accountId?: string;\n iat?: number;\n exp?: number;\n}\n\nconst encoder = new TextEncoder();\nconst decoder = new TextDecoder();\n\nfunction toHex(bytes: Uint8Array): string {\n let out = \"\";\n for (const b of bytes) out += b.toString(16).padStart(2, \"0\");\n return out;\n}\n\nfunction sign(secret: string, domain: string, payload: string): string {\n return toHex(hmac(sha256, encoder.encode(secret), encoder.encode(`${domain}.${payload}`)));\n}\n\nfunction constantTimeEquals(a: string, b: string): boolean {\n if (a.length !== b.length) return false;\n let diff = 0;\n for (let i = 0; i < a.length; i++) diff |= a.charCodeAt(i) ^ b.charCodeAt(i);\n return diff === 0;\n}\n\nfunction signatureMatches(secret: string, domain: string, payload: string, provided: string): boolean {\n return constantTimeEquals(provided, sign(secret, domain, payload));\n}\n\nfunction encodePayload(value: unknown): string {\n return base64urlnopad.encode(encoder.encode(JSON.stringify(value)));\n}\n\nfunction decodePayload<T>(payload: string): T | null {\n try {\n return JSON.parse(decoder.decode(base64urlnopad.decode(payload))) as T;\n } catch {\n return null;\n }\n}\n\nfunction splitToken(raw: string, prefix: string): { payload: string; signature: string } | null {\n if (!raw.startsWith(prefix)) return null;\n const inner = raw.slice(prefix.length);\n const dot = inner.lastIndexOf(\".\");\n if (dot === -1) return null;\n return { payload: inner.slice(0, dot), signature: inner.slice(dot + 1) };\n}\n\nfunction withinLifetime(iat: number | undefined, exp: number | undefined): boolean {\n if (!iat || !exp) return false;\n const now = Math.floor(Date.now() / 1000);\n return exp >= now && iat <= now + CLOCK_SKEW_SECONDS;\n}\n\nexport function issueSiwsToken(\n secret: string,\n chain: Chain,\n wallet: string,\n ttlSeconds: number = IDENTITY_TTL_SECONDS,\n): string {\n const iat = Math.floor(Date.now() / 1000);\n const payload = encodePayload({ sub: wallet, chain, iat, exp: iat + ttlSeconds });\n return `${IDENTITY_PREFIX}${payload}.${sign(secret, IDENTITY_DOMAIN, payload)}`;\n}\n\nexport function verifySiwsToken(secret: string, raw: string): SiwsIdentity | null {\n const parts = splitToken(raw, IDENTITY_PREFIX);\n if (!parts) return null;\n if (!signatureMatches(secret, IDENTITY_DOMAIN, parts.payload, parts.signature)) return null;\n\n const data = decodePayload<IdentityPayload>(parts.payload);\n if (!data?.sub || !withinLifetime(data.iat, data.exp)) return null;\n\n return { address: data.sub, chain: data.chain ?? \"STARKNET\" };\n}\n\nexport function issueAccountSessionToken(\n secret: string,\n accountId: string,\n ttlSeconds: number = ACCOUNT_SESSION_TTL_SECONDS,\n): string {\n const iat = Math.floor(Date.now() / 1000);\n const payload = encodePayload({ accountId, iat, exp: iat + ttlSeconds });\n return `${ACCOUNT_SESSION_PREFIX}${payload}.${sign(secret, ACCOUNT_SESSION_DOMAIN, payload)}`;\n}\n\nexport function verifyAccountSessionToken(secret: string, raw: string): string | null {\n const parts = splitToken(raw, ACCOUNT_SESSION_PREFIX);\n if (!parts) return null;\n if (!signatureMatches(secret, ACCOUNT_SESSION_DOMAIN, parts.payload, parts.signature)) return null;\n\n const data = decodePayload<AccountSessionPayload>(parts.payload);\n if (!data?.accountId || !withinLifetime(data.iat, data.exp)) return null;\n\n return data.accountId;\n}\n","const CID_PATH_PATTERN = /^(Qm[1-9A-HJ-NP-Za-km-z]{44,}|b[a-z2-7]{58,})(\\/[\\w.\\-/]*)?$/;\n\nexport function isValidIpfsCidPath(cidPath: string): boolean {\n if (!CID_PATH_PATTERN.test(cidPath)) return false;\n if (cidPath.split(\"/\").includes(\"..\")) return false;\n return true;\n}\n\nexport const IPFS_SAFE_CONTENT_TYPE_PREFIXES = [\n \"image/jpeg\", \"image/png\", \"image/gif\", \"image/webp\", \"image/avif\", \"image/svg+xml\",\n \"video/\", \"audio/\", \"model/\", \"font/\", \"application/json\", \"application/octet-stream\",\n] as const;\n\nexport function resolveSafeImageContentType(contentType: string): string {\n return IPFS_SAFE_CONTENT_TYPE_PREFIXES.some((p) => contentType.startsWith(p))\n ? contentType\n : \"application/octet-stream\";\n}\n\nexport const MAX_IPFS_GATEWAY_RESPONSE_BYTES = 25 * 1024 * 1024;\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/server/origin.ts","../src/server/app-gateway.ts","../src/server/app-session.ts","../src/server/ssrf-guard.ts","../src/server/image-proxy.ts","../src/server/backend-metadata.ts","../src/server/app-routes.ts","../src/server/siws-token.ts","../src/utils/ipfs-gateway.ts"],"names":["headers","json","hmac","sha256","base64urlnopad"],"mappings":"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","file":"chunk-ZVANOWIB.cjs","sourcesContent":["export function isSameOrigin(req: Request): boolean {\n const origin = req.headers.get(\"origin\");\n if (!origin) return true;\n const host = req.headers.get(\"host\");\n try {\n return new URL(origin).host === host;\n } catch {\n return false;\n }\n}\n","import type { FetchLike } from \"../utils/fetch.js\";\nimport { isSameOrigin } from \"./origin.js\";\n\nexport const ACCOUNT_SESSION_COOKIE = \"ml_account_session\";\nconst SESSION_MAX_AGE_SECONDS = 30 * 24 * 60 * 60;\nconst SIGN_IN_PATHS = new Set([\"auth/email/register-account\", \"auth/email/verify-code\", \"auth/siws/verify\"]);\nconst EDGE_CACHE_CONTROL = \"public, s-maxage=30, stale-while-revalidate=120\";\nconst DROPPED_REQUEST_HEADERS = new Set([\n \"connection\", \"keep-alive\", \"proxy-authenticate\", \"proxy-authorization\", \"te\", \"trailers\",\n \"transfer-encoding\", \"upgrade\", \"host\", \"content-length\", \"accept-encoding\", \"cookie\",\n \"x-api-key\", \"x-app-id\", \"x-app-secret\", \"x-account-session\", \"authorization\",\n]);\nconst DROPPED_RESPONSE_HEADERS = new Set([\n \"connection\", \"keep-alive\", \"transfer-encoding\", \"content-length\", \"content-encoding\", \"set-cookie\",\n]);\n\nexport interface AppGatewayConfig {\n appId: string;\n backendUrl: string;\n apiKey: string | undefined;\n appSecret?: string;\n allow: Record<string, RegExp[]>;\n cacheableGets?: RegExp[];\n timeoutMs?: number;\n fetchImpl?: FetchLike;\n}\n\nexport function readCookie(req: Request, name: string): string | null {\n const raw = req.headers.get(\"cookie\");\n if (!raw) return null;\n for (const part of raw.split(\";\")) {\n const eq = part.indexOf(\"=\");\n if (eq !== -1 && part.slice(0, eq).trim() === name) return part.slice(eq + 1).trim() || null;\n }\n return null;\n}\n\nexport function sessionCookie(value: string, maxAge = SESSION_MAX_AGE_SECONDS): string {\n const secure = process.env.NODE_ENV === \"production\" ? \"; Secure\" : \"\";\n return `${ACCOUNT_SESSION_COOKIE}=${value}; Path=/; HttpOnly; SameSite=Lax; Max-Age=${maxAge}${secure}`;\n}\n\nfunction json(body: unknown, status: number): Response {\n return Response.json(body, { status });\n}\n\nexport function createAppGateway(config: AppGatewayConfig): (req: Request, path: string[]) => Promise<Response> {\n const doFetch = config.fetchImpl ?? fetch;\n const base = config.backendUrl.replace(/\\/$/, \"\");\n\n return async function appGateway(req, path) {\n if (!isSameOrigin(req)) return json({ error: \"Cross-origin requests are not allowed\" }, 403);\n if (!config.apiKey) return json({ error: \"Service unavailable\" }, 500);\n if (path.some((s) => s === \".\" || s === \"..\" || s === \"\")) return json({ error: \"Invalid path\" }, 400);\n\n const joined = path.join(\"/\");\n const method = req.method.toUpperCase();\n if (!(config.allow[method] ?? []).some((re) => re.test(joined))) {\n return json({ error: `Path not allowed: ${method} /v1/${joined}` }, 403);\n }\n\n const headers = new Headers();\n req.headers.forEach((v, k) => {\n if (!DROPPED_REQUEST_HEADERS.has(k.toLowerCase())) headers.set(k, v);\n });\n headers.set(\"x-api-key\", config.apiKey);\n headers.set(\"x-app-id\", config.appId);\n if (config.appSecret) headers.set(\"x-app-secret\", config.appSecret);\n const session = readCookie(req, ACCOUNT_SESSION_COOKIE);\n if (session) headers.set(\"x-account-session\", session);\n\n const search = new URL(req.url).search;\n const target = `${base}/v1/${path.map(encodeURIComponent).join(\"/\")}${search}`;\n const hasBody = method !== \"GET\" && method !== \"HEAD\";\n\n let res: Response;\n try {\n res = await doFetch(target, {\n method,\n headers,\n body: hasBody ? await req.arrayBuffer() : undefined,\n cache: \"no-store\",\n redirect: \"manual\",\n signal: AbortSignal.timeout(config.timeoutMs ?? 55_000),\n });\n } catch (e) {\n if (e instanceof DOMException && e.name === \"TimeoutError\") {\n return json({ error: \"The service took too long to respond\" }, 504);\n }\n return json({ error: \"Service unavailable\" }, 502);\n }\n\n const out = new Headers();\n res.headers.forEach((v, k) => {\n if (!DROPPED_RESPONSE_HEADERS.has(k.toLowerCase())) out.set(k, v);\n });\n\n if (method === \"POST\" && res.ok && SIGN_IN_PATHS.has(joined)) {\n const text = await res.text();\n let body: Record<string, unknown> | null = null;\n try {\n body = JSON.parse(text) as Record<string, unknown>;\n } catch {\n body = null;\n }\n if (!body) return new Response(text, { status: res.status, headers: out });\n const token = typeof body.accountToken === \"string\" ? body.accountToken : null;\n delete body.accountToken;\n delete body.token;\n out.set(\"content-type\", \"application/json\");\n if (token) out.append(\"set-cookie\", sessionCookie(token));\n return new Response(JSON.stringify(body), { status: res.status, headers: out });\n }\n\n if (method === \"GET\" && res.ok && !session && (config.cacheableGets ?? []).some((re) => re.test(joined))) {\n out.set(\"cache-control\", EDGE_CACHE_CONTROL);\n }\n return new Response(res.body, { status: res.status, headers: out });\n };\n}\n","import type { FetchLike } from \"../utils/fetch.js\";\nimport { readCookie, sessionCookie, ACCOUNT_SESSION_COOKIE } from \"./app-gateway.js\";\n\nexport interface AppSessionConfig {\n appId: string;\n backendUrl: string;\n apiKey: string | undefined;\n appSecret?: string;\n fetchImpl?: FetchLike;\n}\n\nfunction signedOut(): Response {\n const res = Response.json(null);\n res.headers.append(\"set-cookie\", sessionCookie(\"\", 0));\n return res;\n}\n\nexport function createAppSessionHandler(config: AppSessionConfig): {\n GET(req: Request): Promise<Response>;\n DELETE(req: Request): Promise<Response>;\n} {\n const doFetch = config.fetchImpl ?? fetch;\n const base = config.backendUrl.replace(/\\/$/, \"\");\n return {\n async GET(req) {\n const session = readCookie(req, ACCOUNT_SESSION_COOKIE);\n if (!session) return Response.json(null);\n const res = await doFetch(`${base}/v1/users/me`, {\n headers: {\n \"x-api-key\": config.apiKey ?? \"\",\n \"x-app-id\": config.appId,\n ...(config.appSecret ? { \"x-app-secret\": config.appSecret } : {}),\n \"x-account-session\": session,\n },\n cache: \"no-store\",\n });\n if (res.status === 401 || res.status === 403) return signedOut();\n if (!res.ok) return Response.json({ error: \"Session check failed\" }, { status: 502 });\n return Response.json(await res.json());\n },\n async DELETE() {\n return signedOut();\n },\n };\n}\n","export const ALLOWED_IMAGE_CONTENT_TYPES = new Set([\n \"image/jpeg\",\n \"image/jpg\",\n \"image/png\",\n \"image/gif\",\n \"image/webp\",\n \"image/svg+xml\",\n \"image/avif\",\n \"image/bmp\",\n \"image/tiff\",\n]);\n\nexport const MAX_IMAGE_REDIRECTS = 5;\n\nexport const MAX_IMAGE_PROXY_BYTES = 15 * 1024 * 1024;\n\nfunction parseIpv4(ip: string): number[] | null {\n const parts = ip.split(\".\");\n if (parts.length !== 4) return null;\n const bytes: number[] = [];\n for (const part of parts) {\n if (!/^\\d{1,3}$/.test(part)) return null;\n const n = Number(part);\n if (n > 255) return null;\n bytes.push(n);\n }\n return bytes;\n}\n\nfunction isPrivateIpv4(bytes: number[]): boolean {\n const a = bytes[0]!;\n const b = bytes[1]!;\n const c = bytes[2]!;\n if (a === 0) return true;\n if (a === 10) return true;\n if (a === 100 && b >= 64 && b <= 127) return true;\n if (a === 127) return true;\n if (a === 169 && b === 254) return true;\n if (a === 172 && b >= 16 && b <= 31) return true;\n if (a === 192 && b === 0 && c === 0) return true;\n if (a === 192 && b === 168) return true;\n if (a === 198 && (b === 18 || b === 19)) return true;\n if (a >= 224) return true;\n return false;\n}\n\nfunction expandIpv6(rawIp: string): number[] | null {\n let ip = rawIp;\n\n let embeddedV4: number[] | null = null;\n const v4Tail = ip.match(/(\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3})$/);\n if (v4Tail && ip.includes(\":\")) {\n embeddedV4 = parseIpv4(v4Tail[1]!);\n if (!embeddedV4) return null;\n ip = ip.slice(0, ip.length - v4Tail[1]!.length) + \"0:0\";\n }\n\n const sides = ip.split(\"::\");\n if (sides.length > 2) return null;\n\n const head = sides[0] ? sides[0].split(\":\").filter(Boolean) : [];\n const tail = sides.length === 2 && sides[1] ? sides[1].split(\":\").filter(Boolean) : [];\n\n let groups: string[];\n if (sides.length === 1) {\n groups = head;\n if (groups.length !== 8) return null;\n } else {\n const missing = 8 - head.length - tail.length;\n if (missing < 0) return null;\n groups = [...head, ...Array(missing).fill(\"0\"), ...tail];\n }\n if (groups.length !== 8) return null;\n\n const bytes: number[] = [];\n for (const group of groups) {\n if (!/^[0-9a-fA-F]{1,4}$/.test(group)) return null;\n const n = parseInt(group, 16);\n bytes.push((n >> 8) & 0xff, n & 0xff);\n }\n\n if (embeddedV4) {\n bytes[12] = embeddedV4[0]!;\n bytes[13] = embeddedV4[1]!;\n bytes[14] = embeddedV4[2]!;\n bytes[15] = embeddedV4[3]!;\n }\n\n return bytes;\n}\n\nfunction isPrivateIpv6(bytes: number[]): boolean {\n if (bytes.every((b) => b === 0)) return true;\n if (bytes.slice(0, 15).every((b) => b === 0) && bytes[15] === 1) return true;\n if ((bytes[0]! & 0xfe) === 0xfc) return true;\n if (bytes[0] === 0xfe && (bytes[1]! & 0xc0) === 0x80) return true;\n\n if (bytes.slice(0, 10).every((b) => b === 0) && bytes[10] === 0xff && bytes[11] === 0xff) {\n return isPrivateIpv4(bytes.slice(12));\n }\n if (bytes.slice(0, 12).every((b) => b === 0)) return isPrivateIpv4(bytes.slice(12));\n if (bytes[0] === 0x00 && bytes[1] === 0x64 && bytes[2] === 0xff && bytes[3] === 0x9b && bytes.slice(4, 12).every((b) => b === 0)) {\n return isPrivateIpv4(bytes.slice(12));\n }\n if (bytes[0] === 0x20 && bytes[1] === 0x02) return isPrivateIpv4(bytes.slice(2, 6));\n if (bytes[0] === 0xfe && (bytes[1]! & 0xc0) === 0xc0) return true;\n if (bytes[0] === 0xff) return true;\n return false;\n}\n\nfunction parseNumber(part: string): number | null {\n if (/^0x[0-9a-f]+$/i.test(part)) return parseInt(part.slice(2), 16);\n if (/^0[0-7]+$/.test(part)) return parseInt(part, 8);\n if (/^\\d+$/.test(part)) return parseInt(part, 10);\n return null;\n}\n\nfunction normalizeNumericHostname(host: string): string | null {\n const parts = host.trim().split(\".\");\n if (parts.length < 1 || parts.length > 4) return null;\n\n const values: number[] = [];\n for (const part of parts) {\n const value = parseNumber(part);\n if (value === null || value < 0) return null;\n values.push(value);\n }\n\n const leading = values.slice(0, -1);\n if (leading.some((v) => v > 255)) return null;\n\n const tail = values[values.length - 1]!;\n const tailBytes = 4 - leading.length;\n if (tail > 2 ** (8 * tailBytes) - 1) return null;\n\n const bytes = [...leading];\n for (let i = tailBytes - 1; i >= 0; i--) bytes.push((tail >>> (8 * i)) & 0xff);\n\n return bytes.join(\".\");\n}\n\nconst BLOCKED_HOSTNAMES = new Set([\n \"localhost\",\n \"metadata.google.internal\",\n \"metadata.azure.internal\",\n]);\n\nexport function isPrivateHost(hostname: string): boolean {\n const host = hostname.toLowerCase().replace(/^\\[|\\]$/g, \"\");\n\n if (BLOCKED_HOSTNAMES.has(host)) return true;\n if (host.endsWith(\".local\") || host.endsWith(\".internal\") || host.endsWith(\".localhost\")) return true;\n\n const candidate = normalizeNumericHostname(host) ?? host;\n\n const v4 = parseIpv4(candidate);\n if (v4) return isPrivateIpv4(v4);\n\n const v6 = expandIpv6(candidate);\n if (v6) return isPrivateIpv6(v6);\n\n return false;\n}\n\nexport function validateUrl(\n raw: string,\n options: { requireHttps?: boolean } = {},\n): { url: URL } | { error: string; status: number } {\n const requireHttps = options.requireHttps ?? true;\n\n let parsed: URL;\n try {\n parsed = new URL(raw);\n } catch {\n return { error: \"Invalid url\", status: 400 };\n }\n\n if (requireHttps && parsed.protocol !== \"https:\") {\n return { error: \"Only https URLs allowed\", status: 400 };\n }\n\n if (!requireHttps && parsed.protocol !== \"https:\" && parsed.protocol !== \"http:\") {\n return { error: \"Only http and https URLs allowed\", status: 400 };\n }\n\n if (parsed.username || parsed.password) {\n return { error: \"URL credentials not allowed\", status: 400 };\n }\n\n if (isPrivateHost(parsed.hostname)) {\n return { error: \"URL not allowed\", status: 400 };\n }\n\n return { url: parsed };\n}\n\nexport function isPrivateOrInsecureUrl(raw: string, requireHttps = true): boolean {\n return \"error\" in validateUrl(raw, { requireHttps });\n}\n","import type { FetchLike } from \"../utils/fetch.js\";\nimport {\n ALLOWED_IMAGE_CONTENT_TYPES,\n MAX_IMAGE_PROXY_BYTES,\n MAX_IMAGE_REDIRECTS,\n isPrivateHost,\n validateUrl,\n} from \"./ssrf-guard.js\";\nimport type { AppGatewayConfig } from \"./app-gateway.js\";\n\nexport interface ImageProxyConfig {\n\n resolveHostname: (hostname: string) => Promise<string[]>;\n fetchImpl?: FetchLike;\n userAgent?: string;\n backend?: Pick<AppGatewayConfig, \"appId\" | \"backendUrl\" | \"apiKey\" | \"appSecret\">;\n}\n\nconst DEFAULT_USER_AGENT =\n \"Mozilla/5.0 (compatible; Medialane/1.0; +https://www.medialane.io)\";\n\nfunction jsonError(message: string, status: number): Response {\n return Response.json({ error: message }, { status });\n}\n\nexport interface CappedBody {\n ok: boolean;\n body?: Uint8Array;\n error?: string;\n status?: number;\n}\n\nexport async function readBodyWithCap(res: Response, maxBytes: number): Promise<CappedBody> {\n const declared = Number(res.headers.get(\"content-length\") ?? 0);\n if (declared > maxBytes) {\n return { ok: false, error: \"Image too large\", status: 413 };\n }\n\n const reader = res.body?.getReader();\n if (!reader) return { ok: false, error: \"Empty response body\", status: 502 };\n\n const chunks: Uint8Array[] = [];\n let total = 0;\n for (;;) {\n const { done, value } = await reader.read();\n if (done) break;\n if (!value) continue;\n total += value.byteLength;\n if (total > maxBytes) {\n await reader.cancel().catch(() => {});\n return { ok: false, error: \"Image too large\", status: 413 };\n }\n chunks.push(value);\n }\n\n const body = new Uint8Array(total);\n let offset = 0;\n for (const chunk of chunks) {\n body.set(chunk, offset);\n offset += chunk.byteLength;\n }\n return { ok: true, body };\n}\n\nexport function createImageProxyHandler(\n config: ImageProxyConfig,\n): (req: Request) => Promise<Response> {\n const doFetch = config.fetchImpl ?? fetch;\n const userAgent = config.userAgent ?? DEFAULT_USER_AGENT;\n const backendOrigin = config.backend ? new URL(config.backend.backendUrl).origin : null;\n\n function headersFor(url: URL): Record<string, string> {\n const headers: Record<string, string> = { \"User-Agent\": userAgent };\n if (!config.backend || url.origin !== backendOrigin) return headers;\n if (config.backend.apiKey) headers[\"x-api-key\"] = config.backend.apiKey;\n headers[\"x-app-id\"] = config.backend.appId;\n if (config.backend.appSecret) headers[\"x-app-secret\"] = config.backend.appSecret;\n return headers;\n }\n\n async function resolvesToPrivateHost(hostname: string): Promise<boolean> {\n try {\n const addresses = await config.resolveHostname(hostname);\n\n if (addresses.length === 0) return true;\n return addresses.some((address) => isPrivateHost(address));\n } catch {\n return true;\n }\n }\n\n async function safeFetch(url: URL, hopsLeft: number): Promise<Response> {\n if (hopsLeft < 0) throw new Error(\"Too many redirects\");\n\n if (await resolvesToPrivateHost(url.hostname)) {\n throw new Error(\"Blocked: hostname resolves to a private address\");\n }\n\n const res = await doFetch(url.toString(), {\n redirect: \"manual\",\n headers: headersFor(url),\n });\n\n if (res.status >= 300 && res.status < 400) {\n const location = res.headers.get(\"location\");\n if (!location) throw new Error(\"Redirect with no Location header\");\n\n const next = new URL(location, url);\n const validated = validateUrl(next.toString());\n if (\"error\" in validated) throw new Error(`Redirect blocked: ${validated.error}`);\n\n return safeFetch(validated.url, hopsLeft - 1);\n }\n\n return res;\n }\n\n return async function handleImageProxy(req: Request): Promise<Response> {\n const raw = new URL(req.url).searchParams.get(\"url\");\n if (!raw) return jsonError(\"Missing url\", 400);\n\n const validated = validateUrl(raw);\n if (\"error\" in validated) return jsonError(validated.error, validated.status);\n\n let upstream: Response;\n try {\n const isBackendImage = backendOrigin && /^\\/media\\/[^/]+\\/[^/]+\\/[^/]+\\/image$/.test(validated.url.pathname);\n upstream = await safeFetch(\n isBackendImage ? new URL(validated.url.pathname, backendOrigin) : validated.url,\n MAX_IMAGE_REDIRECTS,\n );\n } catch {\n return jsonError(\"Failed to fetch image\", 502);\n }\n\n if (!upstream.ok) {\n return jsonError(`Upstream returned ${upstream.status}`, upstream.status);\n }\n\n const contentType = upstream.headers.get(\"content-type\") ?? \"\";\n const baseType = contentType.split(\";\")[0]!.trim().toLowerCase();\n if (!ALLOWED_IMAGE_CONTENT_TYPES.has(baseType)) {\n return jsonError(\"Not an image\", 400);\n }\n\n const capped = await readBodyWithCap(upstream, MAX_IMAGE_PROXY_BYTES);\n if (!capped.ok) return jsonError(capped.error!, capped.status!);\n\n return new Response(capped.body as unknown as BodyInit, {\n status: 200,\n headers: {\n \"Content-Type\": contentType,\n \"X-Content-Type-Options\": \"nosniff\",\n \"Content-Security-Policy\":\n \"default-src 'none'; img-src 'self' data:; style-src 'unsafe-inline'; sandbox\",\n \"Cache-Control\": \"public, max-age=86400, s-maxage=86400, stale-while-revalidate=604800\",\n \"Access-Control-Allow-Origin\": \"*\",\n },\n });\n };\n}\n","import type { FetchLike } from \"../utils/fetch.js\";\nexport interface BackendMetadataConfig {\n backendUrl: string;\n apiKey: string;\n fetchImpl?: FetchLike;\n}\n\nfunction endpoint(config: BackendMetadataConfig, path: string): string {\n return `${config.backendUrl.replace(/\\/$/, \"\")}/v1/metadata/${path}`;\n}\n\nfunction headers(config: BackendMetadataConfig, extra?: Record<string, string>): Record<string, string> {\n return { \"x-api-key\": config.apiKey, ...extra };\n}\n\nexport interface BackendUploadResult {\n cid: string;\n uri: string;\n}\n\nexport async function uploadJsonToBackend(config: BackendMetadataConfig, json: unknown): Promise<BackendUploadResult> {\n const res = await (config.fetchImpl ?? fetch)(endpoint(config, \"upload\"), {\n method: \"POST\",\n headers: headers(config, { \"Content-Type\": \"application/json\" }),\n body: JSON.stringify(json),\n });\n const data = (await res.json().catch(() => ({}))) as { data?: { cid: string; url: string }; error?: string };\n if (!res.ok || !data.data) throw new Error(data.error ?? \"Metadata upload failed\");\n return { cid: data.data.cid, uri: data.data.url };\n}\n\nexport async function uploadFileToBackend(config: BackendMetadataConfig, file: File): Promise<BackendUploadResult> {\n const form = new FormData();\n form.append(\"file\", file, file.name);\n const res = await (config.fetchImpl ?? fetch)(endpoint(config, \"upload-file\"), {\n method: \"POST\",\n headers: headers(config),\n body: form,\n });\n const data = (await res.json().catch(() => ({}))) as { data?: { cid: string; url: string }; error?: string };\n if (!res.ok || !data.data) throw new Error(data.error ?? \"File upload failed\");\n return { cid: data.data.cid, uri: data.data.url };\n}\n\nexport async function uploadDirectoryToBackend(\n config: BackendMetadataConfig,\n files: { name: string; content: unknown }[],\n): Promise<{ cid: string; baseUri: string }> {\n const res = await (config.fetchImpl ?? fetch)(endpoint(config, \"upload-directory\"), {\n method: \"POST\",\n headers: headers(config, { \"Content-Type\": \"application/json\" }),\n body: JSON.stringify({ files }),\n });\n const data = (await res.json().catch(() => ({}))) as {\n data?: { cid: string; baseUri: string };\n error?: string;\n };\n if (!res.ok || !data.data) throw new Error(data.error ?? \"Directory pin failed\");\n return data.data;\n}\n\nexport async function getBackendSignedUrl(\n config: BackendMetadataConfig,\n kind: \"image\" | \"document\" | \"media\" = \"image\",\n): Promise<string> {\n const res = await (config.fetchImpl ?? fetch)(`${endpoint(config, \"signed-url\")}?kind=${kind}`, {\n method: \"GET\",\n headers: headers(config),\n });\n const data = (await res.json().catch(() => ({}))) as { data?: { url: string }; error?: string };\n if (!res.ok || !data.data) throw new Error(data.error ?? \"Failed to create upload URL\");\n return data.data.url;\n}\n","const SEG = \"[^/]+\";\n\nconst PUBLIC_ROUTES: Record<string, RegExp[]> = {\n GET: [\n \"orders\", `orders/${SEG}`, `orders/token/${SEG}/${SEG}`, `orders/user/${SEG}`, `orders/received/${SEG}`, \"orders/counter-offers\",\n \"tokens\", `tokens/owned/${SEG}`, `tokens/${SEG}/${SEG}`, `tokens/${SEG}/${SEG}/(history|comments|remixes)`, `tokens/${SEG}/${SEG}/balances/${SEG}`,\n \"collections\", `collections/${SEG}`, `collections/${SEG}/tokens`, `collections/${SEG}/profile`,\n \"activities\", `activities/${SEG}`, \"search\", \"metadata/resolve\",\n \"creators\", `creators/${SEG}/profile`, `creators/by-username/${SEG}`, `creators/${SEG}/hidden`,\n \"coins\", \"coins/prices\", \"coins/claims\", `coins/${SEG}`, `coins/${SEG}/guarantees`, `pop/${SEG}/claim-info`,\n \"drops\", `drops/${SEG}`, `drops/${SEG}/mints`, `drops/${SEG}/state`,\n \"rewards\", \"rewards/config\", \"rewards/batch\", `rewards/${SEG}`, `rewards/${SEG}/events`,\n `club/${SEG}/${SEG}`, `club/${SEG}/${SEG}/member/${SEG}`, `tickets/${SEG}/${SEG}`, `tickets/${SEG}/count`, `ipnft/${SEG}/${SEG}`,\n \"stats\", \"prices\", `remix-offers/${SEG}`,\n \"sponsorship/offers\", `sponsorship/offers/${SEG}`, `sponsorship/offers/${SEG}/bids`,\n \"sponsorship/proposals\", `sponsorship/proposals/${SEG}`, \"sponsorship/licenses\", `sponsorship/licenses/${SEG}`,\n \"auth/email/exists\",\n `media/${SEG}/${SEG}/${SEG}/image`,\n ].map((p) => new RegExp(`^${p}$`)),\n POST: [\n \"auth/email/(request-code|verify-code|register-account|confirm)\",\n \"auth/siws/(nonce|verify)\",\n \"users/register\",\n ].map((p) => new RegExp(`^${p}$`)),\n};\n\nexport function isPublicAppRoute(method: string, path: string): boolean {\n if (path.split(\"/\").some((s) => s === \".\" || s === \"..\" || s === \"\")) return false;\n return (PUBLIC_ROUTES[method.toUpperCase()] ?? []).some((re) => re.test(path));\n}\n","import { hmac } from \"@noble/hashes/hmac.js\";\nimport { sha256 } from \"@noble/hashes/sha2.js\";\nimport { base64urlnopad } from \"@scure/base\";\nimport type { Chain } from \"../chains.js\";\n\nconst IDENTITY_PREFIX = \"siws_\";\nconst ACCOUNT_SESSION_PREFIX = \"account_session_\";\n\nconst IDENTITY_DOMAIN = \"siws-identity-v1\";\nconst ACCOUNT_SESSION_DOMAIN = \"account-session-v1\";\n\nexport const IDENTITY_TTL_SECONDS = 86_400;\nexport const ACCOUNT_SESSION_TTL_SECONDS = 30 * 24 * 60 * 60;\n\nconst CLOCK_SKEW_SECONDS = 60;\n\nexport interface SiwsIdentity {\n address: string;\n chain: Chain;\n}\n\ninterface IdentityPayload {\n sub?: string;\n chain?: Chain;\n iat?: number;\n exp?: number;\n}\n\ninterface AccountSessionPayload {\n accountId?: string;\n iat?: number;\n exp?: number;\n}\n\nconst encoder = new TextEncoder();\nconst decoder = new TextDecoder();\n\nfunction toHex(bytes: Uint8Array): string {\n let out = \"\";\n for (const b of bytes) out += b.toString(16).padStart(2, \"0\");\n return out;\n}\n\nfunction sign(secret: string, domain: string, payload: string): string {\n return toHex(hmac(sha256, encoder.encode(secret), encoder.encode(`${domain}.${payload}`)));\n}\n\nfunction constantTimeEquals(a: string, b: string): boolean {\n if (a.length !== b.length) return false;\n let diff = 0;\n for (let i = 0; i < a.length; i++) diff |= a.charCodeAt(i) ^ b.charCodeAt(i);\n return diff === 0;\n}\n\nfunction signatureMatches(secret: string, domain: string, payload: string, provided: string): boolean {\n return constantTimeEquals(provided, sign(secret, domain, payload));\n}\n\nfunction encodePayload(value: unknown): string {\n return base64urlnopad.encode(encoder.encode(JSON.stringify(value)));\n}\n\nfunction decodePayload<T>(payload: string): T | null {\n try {\n return JSON.parse(decoder.decode(base64urlnopad.decode(payload))) as T;\n } catch {\n return null;\n }\n}\n\nfunction splitToken(raw: string, prefix: string): { payload: string; signature: string } | null {\n if (!raw.startsWith(prefix)) return null;\n const inner = raw.slice(prefix.length);\n const dot = inner.lastIndexOf(\".\");\n if (dot === -1) return null;\n return { payload: inner.slice(0, dot), signature: inner.slice(dot + 1) };\n}\n\nfunction withinLifetime(iat: number | undefined, exp: number | undefined): boolean {\n if (!iat || !exp) return false;\n const now = Math.floor(Date.now() / 1000);\n return exp >= now && iat <= now + CLOCK_SKEW_SECONDS;\n}\n\nexport function issueSiwsToken(\n secret: string,\n chain: Chain,\n wallet: string,\n ttlSeconds: number = IDENTITY_TTL_SECONDS,\n): string {\n const iat = Math.floor(Date.now() / 1000);\n const payload = encodePayload({ sub: wallet, chain, iat, exp: iat + ttlSeconds });\n return `${IDENTITY_PREFIX}${payload}.${sign(secret, IDENTITY_DOMAIN, payload)}`;\n}\n\nexport function verifySiwsToken(secret: string, raw: string): SiwsIdentity | null {\n const parts = splitToken(raw, IDENTITY_PREFIX);\n if (!parts) return null;\n if (!signatureMatches(secret, IDENTITY_DOMAIN, parts.payload, parts.signature)) return null;\n\n const data = decodePayload<IdentityPayload>(parts.payload);\n if (!data?.sub || !withinLifetime(data.iat, data.exp)) return null;\n\n return { address: data.sub, chain: data.chain ?? \"STARKNET\" };\n}\n\nexport function issueAccountSessionToken(\n secret: string,\n accountId: string,\n ttlSeconds: number = ACCOUNT_SESSION_TTL_SECONDS,\n): string {\n const iat = Math.floor(Date.now() / 1000);\n const payload = encodePayload({ accountId, iat, exp: iat + ttlSeconds });\n return `${ACCOUNT_SESSION_PREFIX}${payload}.${sign(secret, ACCOUNT_SESSION_DOMAIN, payload)}`;\n}\n\nexport function verifyAccountSessionToken(secret: string, raw: string): string | null {\n const parts = splitToken(raw, ACCOUNT_SESSION_PREFIX);\n if (!parts) return null;\n if (!signatureMatches(secret, ACCOUNT_SESSION_DOMAIN, parts.payload, parts.signature)) return null;\n\n const data = decodePayload<AccountSessionPayload>(parts.payload);\n if (!data?.accountId || !withinLifetime(data.iat, data.exp)) return null;\n\n return data.accountId;\n}\n","const CID_PATH_PATTERN = /^(Qm[1-9A-HJ-NP-Za-km-z]{44,}|b[a-z2-7]{58,})(\\/[\\w.\\-/]*)?$/;\n\nexport function isValidIpfsCidPath(cidPath: string): boolean {\n if (!CID_PATH_PATTERN.test(cidPath)) return false;\n if (cidPath.split(\"/\").includes(\"..\")) return false;\n return true;\n}\n\nexport const IPFS_SAFE_CONTENT_TYPE_PREFIXES = [\n \"image/jpeg\", \"image/png\", \"image/gif\", \"image/webp\", \"image/avif\", \"image/svg+xml\",\n \"video/\", \"audio/\", \"model/\", \"font/\", \"application/json\", \"application/octet-stream\",\n] as const;\n\nexport function resolveSafeImageContentType(contentType: string): string {\n return IPFS_SAFE_CONTENT_TYPE_PREFIXES.some((p) => contentType.startsWith(p))\n ? contentType\n : \"application/octet-stream\";\n}\n\nexport const MAX_IPFS_GATEWAY_RESPONSE_BYTES = 25 * 1024 * 1024;\n"]}
|