You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

159 lines
5.3 KiB
JavaScript

"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
0 && (module.exports = {
arrayBufferToString: null,
stringToUint8Array: null,
encrypt: null,
decrypt: null,
generateRandomActionKeyRaw: null,
setReferenceManifestsSingleton: null,
getServerModuleMap: null,
getClientReferenceManifestSingleton: null,
getActionEncryptionKey: null
});
function _export(target, all) {
for(var name in all)Object.defineProperty(target, name, {
enumerable: true,
get: all[name]
});
}
_export(exports, {
arrayBufferToString: function() {
return arrayBufferToString;
},
stringToUint8Array: function() {
return stringToUint8Array;
},
encrypt: function() {
return encrypt;
},
decrypt: function() {
return decrypt;
},
generateRandomActionKeyRaw: function() {
return generateRandomActionKeyRaw;
},
setReferenceManifestsSingleton: function() {
return setReferenceManifestsSingleton;
},
getServerModuleMap: function() {
return getServerModuleMap;
},
getClientReferenceManifestSingleton: function() {
return getClientReferenceManifestSingleton;
},
getActionEncryptionKey: function() {
return getActionEncryptionKey;
}
});
// Keep the key in memory as it should never change during the lifetime of the server in
// both development and production.
let __next_loaded_action_key;
let __next_internal_development_raw_action_key;
function arrayBufferToString(buffer) {
const bytes = new Uint8Array(buffer);
const len = bytes.byteLength;
// @anonrig: V8 has a limit of 65535 arguments in a function.
// For len < 65535, this is faster.
// https://github.com/vercel/next.js/pull/56377#pullrequestreview-1656181623
if (len < 65535) {
return String.fromCharCode.apply(null, bytes);
}
let binary = "";
for(let i = 0; i < len; i++){
binary += String.fromCharCode(bytes[i]);
}
return binary;
}
function stringToUint8Array(binary) {
const len = binary.length;
const arr = new Uint8Array(len);
for(let i = 0; i < len; i++){
arr[i] = binary.charCodeAt(i);
}
return arr;
}
function encrypt(key, iv, data) {
return crypto.subtle.encrypt({
name: "AES-GCM",
iv
}, key, data);
}
function decrypt(key, iv, data) {
return crypto.subtle.decrypt({
name: "AES-GCM",
iv
}, key, data);
}
async function generateRandomActionKeyRaw(dev) {
// For development, we just keep one key in memory for all actions.
// This makes things faster.
if (dev) {
if (typeof __next_internal_development_raw_action_key !== "undefined") {
return __next_internal_development_raw_action_key;
}
}
const key = await crypto.subtle.generateKey({
name: "AES-GCM",
length: 256
}, true, [
"encrypt",
"decrypt"
]);
const exported = await crypto.subtle.exportKey("raw", key);
const b64 = btoa(arrayBufferToString(exported));
__next_loaded_action_key = key;
if (dev) {
__next_internal_development_raw_action_key = b64;
}
return b64;
}
// This is a global singleton that is used to encode/decode the action bound args from
// the closure. This can't be using a AsyncLocalStorage as it might happen on the module
// level. Since the client reference manifest won't be mutated, let's use a global singleton
// to keep it.
const SERVER_ACTION_MANIFESTS_SINGLETON = Symbol.for("next.server.action-manifests");
function setReferenceManifestsSingleton({ clientReferenceManifest, serverActionsManifest, serverModuleMap }) {
// @ts-ignore
globalThis[SERVER_ACTION_MANIFESTS_SINGLETON] = {
clientReferenceManifest,
serverActionsManifest,
serverModuleMap
};
}
function getServerModuleMap() {
const serverActionsManifestSingleton = globalThis[SERVER_ACTION_MANIFESTS_SINGLETON];
if (!serverActionsManifestSingleton) {
throw new Error("Missing manifest for Server Actions. This is a bug in Next.js");
}
return serverActionsManifestSingleton.serverModuleMap;
}
function getClientReferenceManifestSingleton() {
const serverActionsManifestSingleton = globalThis[SERVER_ACTION_MANIFESTS_SINGLETON];
if (!serverActionsManifestSingleton) {
throw new Error("Missing manifest for Server Actions. This is a bug in Next.js");
}
return serverActionsManifestSingleton.clientReferenceManifest;
}
async function getActionEncryptionKey() {
if (__next_loaded_action_key) {
return __next_loaded_action_key;
}
const serverActionsManifestSingleton = globalThis[SERVER_ACTION_MANIFESTS_SINGLETON];
if (!serverActionsManifestSingleton) {
throw new Error("Missing manifest for Server Actions. This is a bug in Next.js");
}
const rawKey = process.env.NEXT_SERVER_ACTIONS_ENCRYPTION_KEY || serverActionsManifestSingleton.serverActionsManifest.encryptionKey;
if (rawKey === undefined) {
throw new Error("Missing encryption key for Server Actions");
}
__next_loaded_action_key = await crypto.subtle.importKey("raw", stringToUint8Array(atob(rawKey)), "AES-GCM", true, [
"encrypt",
"decrypt"
]);
return __next_loaded_action_key;
}
//# sourceMappingURL=action-encryption-utils.js.map