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
		
	
			
		
		
	
	
			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
 |