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
		
	
| 
											9 months ago
										 | "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
 |