diff --git a/crates/next-custom-transforms/src/transforms/server_actions.rs b/crates/next-custom-transforms/src/transforms/server_actions.rs index b938931a004cfe..f2c274eb477708 100644 --- a/crates/next-custom-transforms/src/transforms/server_actions.rs +++ b/crates/next-custom-transforms/src/transforms/server_actions.rs @@ -618,69 +618,23 @@ impl ServerActions { }); } - // export const $ACTION_myAction = async () => {} let mut new_params: Vec = vec![]; - let mut new_body: BlockStmtOrExpr = *arrow.body.take(); + // Add the collected closure variables as the first parameters to the + // function. They are unencrypted and passed into this function by the + // cache wrapper. if !ids_from_closure.is_empty() { - // First argument is the encrypted closure variables - new_params.push(Param { - span: DUMMY_SP, - decorators: vec![], - pat: Pat::Ident(IdentName::new("$$ACTION_CLOSURE_BOUND".into(), DUMMY_SP).into()), - }); - - // Also prepend the decryption decl into the body. - // var [arg1, arg2, arg3] = await decryptActionBoundArgs(actionId, - // $$ACTION_CLOSURE_BOUND) - let mut pats = vec![]; for i in 0..ids_from_closure.len() { - pats.push(Some(Pat::Ident( - Ident::new( + new_params.push(Param { + span: DUMMY_SP, + decorators: vec![], + pat: Ident::new( format!("$$ACTION_ARG_{i}").into(), DUMMY_SP, self.private_ctxt, ) .into(), - ))); - } - let args_decl = VarDecl { - span: DUMMY_SP, - kind: VarDeclKind::Var, - declare: false, - decls: vec![VarDeclarator { - span: DUMMY_SP, - name: Pat::Array(ArrayPat { - span: DUMMY_SP, - elems: pats, - optional: false, - type_ann: None, - }), - init: Some(Box::new(Expr::Ident( - quote_ident!("$$ACTION_CLOSURE_BOUND").into(), - ))), - definite: Default::default(), - }], - ..Default::default() - }; - - match &mut new_body { - BlockStmtOrExpr::BlockStmt(body) => { - body.stmts.insert(0, args_decl.into()); - } - BlockStmtOrExpr::Expr(body_expr) => { - new_body = BlockStmtOrExpr::BlockStmt(BlockStmt { - span: DUMMY_SP, - stmts: vec![ - args_decl.into(), - Stmt::Return(ReturnStmt { - span: DUMMY_SP, - arg: Some(body_expr.take()), - }), - ], - ..Default::default() - }); - } + }); } } @@ -708,7 +662,7 @@ impl ServerActions { ident: None, function: Box::new(Function { params: new_params, - body: match new_body { + body: match *arrow.body.take() { BlockStmtOrExpr::BlockStmt(body) => Some(body), BlockStmtOrExpr::Expr(expr) => Some(BlockStmt { span: DUMMY_SP, @@ -728,7 +682,7 @@ impl ServerActions { })), cache_type, &reference_id, - !ids_from_closure.is_empty(), + ids_from_closure.len(), )), definite: false, }], @@ -817,60 +771,24 @@ impl ServerActions { private_ctxt: self.private_ctxt, }); - // export async function $ACTION_myAction () {} let mut new_params: Vec = vec![]; - let mut new_body: Option = function.body.clone(); - // add params from closure collected ids + // Add the collected closure variables as the first parameters to the + // function. They are unencrypted and passed into this function by the + // cache wrapper. if !ids_from_closure.is_empty() { - // First argument is the encrypted closure variables - new_params.push(Param { - span: DUMMY_SP, - decorators: vec![], - pat: Pat::Ident(IdentName::new("$$ACTION_CLOSURE_BOUND".into(), DUMMY_SP).into()), - }); - - // Also prepend the decryption decl into the body. - // var [arg1, arg2, arg3] = await decryptActionBoundArgs(actionId, - // $$ACTION_CLOSURE_BOUND) - let mut pats = vec![]; for i in 0..ids_from_closure.len() { - pats.push(Some(Pat::Ident( - Ident::new( - // $$ACTION_ARG_0 - format!("$$ACTION_ARG_{i}").into(), - DUMMY_SP, - self.private_ctxt, - ) - .into(), - ))); - } - let args_decl = VarDecl { - span: DUMMY_SP, - kind: VarDeclKind::Var, - decls: vec![VarDeclarator { + new_params.push(Param { span: DUMMY_SP, - name: Pat::Array(ArrayPat { - span: DUMMY_SP, - elems: pats, - optional: false, - type_ann: None, - }), - init: Some(Box::new(Expr::Ident( - quote_ident!("$$ACTION_CLOSURE_BOUND").into(), - ))), - definite: Default::default(), - }], - ..Default::default() - }; - - if let Some(body) = &mut new_body { - body.stmts.insert(0, args_decl.into()); - } else { - new_body = Some(BlockStmt { - span: DUMMY_SP, - stmts: vec![args_decl.into()], - ..Default::default() + decorators: vec![], + pat: Pat::Ident( + Ident::new( + format!("$$ACTION_ARG_{i}").into(), + DUMMY_SP, + self.private_ctxt, + ) + .into(), + ), }); } } @@ -894,13 +812,12 @@ impl ServerActions { ident: fn_name.clone(), function: Box::new(Function { params: new_params, - body: new_body, ..*function.take() }), })), cache_type, &reference_id, - !ids_from_closure.is_empty(), + ids_from_closure.len(), )), definite: false, }], @@ -2254,8 +2171,8 @@ fn retain_names_from_declared_idents( *child_names = retained_names; } -fn wrap_cache_expr(expr: Box, name: &str, id: &str, has_bound_args: bool) -> Box { - // expr -> $$cache__("name", "id", expr) +fn wrap_cache_expr(expr: Box, name: &str, id: &str, bound_args_len: usize) -> Box { + // expr -> $$cache__("name", "id", 0, expr) Box::new(Expr::Call(CallExpr { span: DUMMY_SP, callee: quote_ident!("$$cache__").as_callee(), @@ -2268,7 +2185,7 @@ fn wrap_cache_expr(expr: Box, name: &str, id: &str, has_bound_args: bool) spread: None, expr: Box::new(id.into()), }, - Bool::from(has_bound_args).as_arg(), + Number::from(bound_args_len).as_arg(), expr.as_arg(), ], ..Default::default() diff --git a/crates/next-custom-transforms/tests/fixture/server-actions/server/33/output.js b/crates/next-custom-transforms/tests/fixture/server-actions/server/33/output.js index 93f0dbba0b6958..f97b915e454ca6 100644 --- a/crates/next-custom-transforms/tests/fixture/server-actions/server/33/output.js +++ b/crates/next-custom-transforms/tests/fixture/server-actions/server/33/output.js @@ -2,7 +2,7 @@ import { encryptActionBoundArgs, decryptActionBoundArgs } from "private-next-rsc-action-encryption"; import { cache as $$cache__ } from "private-next-rsc-cache-wrapper"; const v = 'world'; -export var $$RSC_SERVER_CACHE_0 = $$cache__("default", "803128060c414d59f8552e4788b846c0d2b7f74743", false, async function fn() { +export var $$RSC_SERVER_CACHE_0 = $$cache__("default", "803128060c414d59f8552e4788b846c0d2b7f74743", 0, async function fn() { return 'hello, ' + v; }); Object.defineProperty($$RSC_SERVER_CACHE_0, "name", { diff --git a/crates/next-custom-transforms/tests/fixture/server-actions/server/34/output.js b/crates/next-custom-transforms/tests/fixture/server-actions/server/34/output.js index c7d502c1f04368..a869a0a6ede46c 100644 --- a/crates/next-custom-transforms/tests/fixture/server-actions/server/34/output.js +++ b/crates/next-custom-transforms/tests/fixture/server-actions/server/34/output.js @@ -1,7 +1,7 @@ /* __next_internal_action_entry_do_not_use__ {"8012a8d21b6362b4cc8f5b15560525095bc48dba80":"$$RSC_SERVER_CACHE_3","803128060c414d59f8552e4788b846c0d2b7f74743":"$$RSC_SERVER_CACHE_0","8069348c79fce073bae2f70f139565a2fda1c74c74":"$$RSC_SERVER_CACHE_2","80951c375b4a6a6e89d67b743ec5808127cfde405d":"$$RSC_SERVER_CACHE_1"} */ import { registerServerReference } from "private-next-rsc-server-reference"; import { encryptActionBoundArgs, decryptActionBoundArgs } from "private-next-rsc-action-encryption"; import { cache as $$cache__ } from "private-next-rsc-cache-wrapper"; -export var $$RSC_SERVER_CACHE_0 = $$cache__("default", "803128060c414d59f8552e4788b846c0d2b7f74743", false, async function() { +export var $$RSC_SERVER_CACHE_0 = $$cache__("default", "803128060c414d59f8552e4788b846c0d2b7f74743", 0, async function() { return 'foo'; }); Object.defineProperty($$RSC_SERVER_CACHE_0, "name", { @@ -10,7 +10,7 @@ Object.defineProperty($$RSC_SERVER_CACHE_0, "name", { }); const foo = registerServerReference($$RSC_SERVER_CACHE_0, "803128060c414d59f8552e4788b846c0d2b7f74743", null); export { bar }; -export var $$RSC_SERVER_CACHE_1 = $$cache__("default", "80951c375b4a6a6e89d67b743ec5808127cfde405d", false, async function bar() { +export var $$RSC_SERVER_CACHE_1 = $$cache__("default", "80951c375b4a6a6e89d67b743ec5808127cfde405d", 0, async function bar() { return 'bar'; }); Object.defineProperty($$RSC_SERVER_CACHE_1, "name", { @@ -22,7 +22,7 @@ var bar = registerServerReference($$RSC_SERVER_CACHE_1, "80951c375b4a6a6e89d67b7 const qux = async function qux() { return 'qux'; }; -export var $$RSC_SERVER_CACHE_2 = $$cache__("default", "8069348c79fce073bae2f70f139565a2fda1c74c74", false, async function baz() { +export var $$RSC_SERVER_CACHE_2 = $$cache__("default", "8069348c79fce073bae2f70f139565a2fda1c74c74", 0, async function baz() { return qux() + 'baz'; }); Object.defineProperty($$RSC_SERVER_CACHE_2, "name", { @@ -30,7 +30,7 @@ Object.defineProperty($$RSC_SERVER_CACHE_2, "name", { "writable": false }); const baz = registerServerReference($$RSC_SERVER_CACHE_2, "8069348c79fce073bae2f70f139565a2fda1c74c74", null); -export var $$RSC_SERVER_CACHE_3 = $$cache__("default", "8012a8d21b6362b4cc8f5b15560525095bc48dba80", false, async function() { +export var $$RSC_SERVER_CACHE_3 = $$cache__("default", "8012a8d21b6362b4cc8f5b15560525095bc48dba80", 0, async function() { return 'quux'; }); Object.defineProperty($$RSC_SERVER_CACHE_3, "name", { diff --git a/crates/next-custom-transforms/tests/fixture/server-actions/server/35/output.js b/crates/next-custom-transforms/tests/fixture/server-actions/server/35/output.js index 77ac341c719572..41d10d499f9748 100644 --- a/crates/next-custom-transforms/tests/fixture/server-actions/server/35/output.js +++ b/crates/next-custom-transforms/tests/fixture/server-actions/server/35/output.js @@ -1,7 +1,7 @@ /* __next_internal_action_entry_do_not_use__ {"803128060c414d59f8552e4788b846c0d2b7f74743":"$$RSC_SERVER_CACHE_0"} */ import { registerServerReference } from "private-next-rsc-server-reference"; import { encryptActionBoundArgs, decryptActionBoundArgs } from "private-next-rsc-action-encryption"; import { cache as $$cache__ } from "private-next-rsc-cache-wrapper"; -export var $$RSC_SERVER_CACHE_0 = $$cache__("default", "803128060c414d59f8552e4788b846c0d2b7f74743", false, async function() { +export var $$RSC_SERVER_CACHE_0 = $$cache__("default", "803128060c414d59f8552e4788b846c0d2b7f74743", 0, async function() { return 'data'; }); Object.defineProperty($$RSC_SERVER_CACHE_0, "name", { diff --git a/crates/next-custom-transforms/tests/fixture/server-actions/server/36/output.js b/crates/next-custom-transforms/tests/fixture/server-actions/server/36/output.js index c495225c05237d..3c03750190a0de 100644 --- a/crates/next-custom-transforms/tests/fixture/server-actions/server/36/output.js +++ b/crates/next-custom-transforms/tests/fixture/server-actions/server/36/output.js @@ -1,7 +1,7 @@ /* __next_internal_action_entry_do_not_use__ {"8012a8d21b6362b4cc8f5b15560525095bc48dba80":"$$RSC_SERVER_CACHE_3","803128060c414d59f8552e4788b846c0d2b7f74743":"$$RSC_SERVER_CACHE_0","80951c375b4a6a6e89d67b743ec5808127cfde405d":"$$RSC_SERVER_CACHE_1","c069348c79fce073bae2f70f139565a2fda1c74c74":"$$RSC_SERVER_CACHE_2"} */ import { registerServerReference } from "private-next-rsc-server-reference"; import { encryptActionBoundArgs, decryptActionBoundArgs } from "private-next-rsc-action-encryption"; import { cache as $$cache__ } from "private-next-rsc-cache-wrapper"; -export var $$RSC_SERVER_CACHE_0 = $$cache__("default", "803128060c414d59f8552e4788b846c0d2b7f74743", false, async function foo() { +export var $$RSC_SERVER_CACHE_0 = $$cache__("default", "803128060c414d59f8552e4788b846c0d2b7f74743", 0, async function foo() { return 'data A'; }); Object.defineProperty($$RSC_SERVER_CACHE_0, "name", { @@ -9,7 +9,7 @@ Object.defineProperty($$RSC_SERVER_CACHE_0, "name", { "writable": false }); export var foo = registerServerReference($$RSC_SERVER_CACHE_0, "803128060c414d59f8552e4788b846c0d2b7f74743", null); -export var $$RSC_SERVER_CACHE_1 = $$cache__("default", "80951c375b4a6a6e89d67b743ec5808127cfde405d", false, async function bar() { +export var $$RSC_SERVER_CACHE_1 = $$cache__("default", "80951c375b4a6a6e89d67b743ec5808127cfde405d", 0, async function bar() { return 'data B'; }); Object.defineProperty($$RSC_SERVER_CACHE_1, "name", { @@ -17,7 +17,7 @@ Object.defineProperty($$RSC_SERVER_CACHE_1, "name", { "writable": false }); export var bar = registerServerReference($$RSC_SERVER_CACHE_1, "80951c375b4a6a6e89d67b743ec5808127cfde405d", null); -export var $$RSC_SERVER_CACHE_2 = $$cache__("default", "c069348c79fce073bae2f70f139565a2fda1c74c74", false, async function Cached({ children }) { +export var $$RSC_SERVER_CACHE_2 = $$cache__("default", "c069348c79fce073bae2f70f139565a2fda1c74c74", 0, async function Cached({ children }) { return children; }); Object.defineProperty($$RSC_SERVER_CACHE_2, "name", { @@ -25,7 +25,7 @@ Object.defineProperty($$RSC_SERVER_CACHE_2, "name", { "writable": false }); export default registerServerReference($$RSC_SERVER_CACHE_2, "c069348c79fce073bae2f70f139565a2fda1c74c74", null); -export var $$RSC_SERVER_CACHE_3 = $$cache__("default", "8012a8d21b6362b4cc8f5b15560525095bc48dba80", false, async function baz() { +export var $$RSC_SERVER_CACHE_3 = $$cache__("default", "8012a8d21b6362b4cc8f5b15560525095bc48dba80", 0, async function baz() { return 'data C'; }); Object.defineProperty($$RSC_SERVER_CACHE_3, "name", { diff --git a/crates/next-custom-transforms/tests/fixture/server-actions/server/37/output.js b/crates/next-custom-transforms/tests/fixture/server-actions/server/37/output.js index 806464e3b066eb..0ba849ea942040 100644 --- a/crates/next-custom-transforms/tests/fixture/server-actions/server/37/output.js +++ b/crates/next-custom-transforms/tests/fixture/server-actions/server/37/output.js @@ -1,7 +1,7 @@ /* __next_internal_action_entry_do_not_use__ {"803128060c414d59f8552e4788b846c0d2b7f74743":"$$RSC_SERVER_CACHE_0"} */ import { registerServerReference } from "private-next-rsc-server-reference"; import { encryptActionBoundArgs, decryptActionBoundArgs } from "private-next-rsc-action-encryption"; import { cache as $$cache__ } from "private-next-rsc-cache-wrapper"; -export var $$RSC_SERVER_CACHE_0 = $$cache__("default", "803128060c414d59f8552e4788b846c0d2b7f74743", false, async function fn() { +export var $$RSC_SERVER_CACHE_0 = $$cache__("default", "803128060c414d59f8552e4788b846c0d2b7f74743", 0, async function fn() { return 'foo'; }); Object.defineProperty($$RSC_SERVER_CACHE_0, "name", { diff --git a/crates/next-custom-transforms/tests/fixture/server-actions/server/38/output.js b/crates/next-custom-transforms/tests/fixture/server-actions/server/38/output.js index f2e20aee3360d6..fd8981f7b00a23 100644 --- a/crates/next-custom-transforms/tests/fixture/server-actions/server/38/output.js +++ b/crates/next-custom-transforms/tests/fixture/server-actions/server/38/output.js @@ -1,7 +1,7 @@ /* __next_internal_action_entry_do_not_use__ {"803128060c414d59f8552e4788b846c0d2b7f74743":"$$RSC_SERVER_CACHE_0"} */ import { registerServerReference } from "private-next-rsc-server-reference"; import { encryptActionBoundArgs, decryptActionBoundArgs } from "private-next-rsc-action-encryption"; import { cache as $$cache__ } from "private-next-rsc-cache-wrapper"; -export var $$RSC_SERVER_CACHE_0 = $$cache__("x", "803128060c414d59f8552e4788b846c0d2b7f74743", false, async function foo() { +export var $$RSC_SERVER_CACHE_0 = $$cache__("x", "803128060c414d59f8552e4788b846c0d2b7f74743", 0, async function foo() { return 'data'; }); Object.defineProperty($$RSC_SERVER_CACHE_0, "name", { diff --git a/crates/next-custom-transforms/tests/fixture/server-actions/server/39/output.js b/crates/next-custom-transforms/tests/fixture/server-actions/server/39/output.js index aebb9079b49923..9bef24e1b7110a 100644 --- a/crates/next-custom-transforms/tests/fixture/server-actions/server/39/output.js +++ b/crates/next-custom-transforms/tests/fixture/server-actions/server/39/output.js @@ -1,8 +1,7 @@ /* __next_internal_action_entry_do_not_use__ {"803128060c414d59f8552e4788b846c0d2b7f74743":"$$RSC_SERVER_CACHE_0"} */ import { registerServerReference } from "private-next-rsc-server-reference"; import { encryptActionBoundArgs, decryptActionBoundArgs } from "private-next-rsc-action-encryption"; import { cache as $$cache__ } from "private-next-rsc-cache-wrapper"; -export var $$RSC_SERVER_CACHE_0 = $$cache__("default", "803128060c414d59f8552e4788b846c0d2b7f74743", true, async function fn($$ACTION_CLOSURE_BOUND) { - var [$$ACTION_ARG_0, $$ACTION_ARG_1] = $$ACTION_CLOSURE_BOUND; +export var $$RSC_SERVER_CACHE_0 = $$cache__("default", "803128060c414d59f8552e4788b846c0d2b7f74743", 2, async function fn($$ACTION_ARG_0, $$ACTION_ARG_1) { console.log($$ACTION_ARG_0); return { foo: $$ACTION_ARG_1 diff --git a/crates/next-custom-transforms/tests/fixture/server-actions/server/40/output.js b/crates/next-custom-transforms/tests/fixture/server-actions/server/40/output.js index 15de9534239938..ce12109d337b38 100644 --- a/crates/next-custom-transforms/tests/fixture/server-actions/server/40/output.js +++ b/crates/next-custom-transforms/tests/fixture/server-actions/server/40/output.js @@ -1,8 +1,7 @@ /* __next_internal_action_entry_do_not_use__ {"401c36b06e398c97abe5d5d7ae8c672bfddf4e1b91":"$$RSC_SERVER_ACTION_2","c03128060c414d59f8552e4788b846c0d2b7f74743":"$$RSC_SERVER_CACHE_0"} */ import { registerServerReference } from "private-next-rsc-server-reference"; import { encryptActionBoundArgs, decryptActionBoundArgs } from "private-next-rsc-action-encryption"; import { cache as $$cache__ } from "private-next-rsc-cache-wrapper"; -export var $$RSC_SERVER_CACHE_0 = $$cache__("default", "c03128060c414d59f8552e4788b846c0d2b7f74743", true, async function cache($$ACTION_CLOSURE_BOUND, e) { - var [$$ACTION_ARG_0, $$ACTION_ARG_1] = $$ACTION_CLOSURE_BOUND; +export var $$RSC_SERVER_CACHE_0 = $$cache__("default", "c03128060c414d59f8552e4788b846c0d2b7f74743", 2, async function cache($$ACTION_ARG_0, $$ACTION_ARG_1, e) { const f = $$ACTION_ARG_0 + e; return [ f, diff --git a/crates/next-custom-transforms/tests/fixture/server-actions/server/41/output.js b/crates/next-custom-transforms/tests/fixture/server-actions/server/41/output.js index f5a07f3a446d04..5f35cab3686759 100644 --- a/crates/next-custom-transforms/tests/fixture/server-actions/server/41/output.js +++ b/crates/next-custom-transforms/tests/fixture/server-actions/server/41/output.js @@ -8,7 +8,7 @@ export const $$RSC_SERVER_ACTION_0 = async function fn($$ACTION_CLOSURE_BOUND) { foo: $$ACTION_ARG_1 }; }; -export var $$RSC_SERVER_CACHE_1 = $$cache__("default", "c0951c375b4a6a6e89d67b743ec5808127cfde405d", false, async function Component({ foo }) { +export var $$RSC_SERVER_CACHE_1 = $$cache__("default", "c0951c375b4a6a6e89d67b743ec5808127cfde405d", 0, async function Component({ foo }) { const a = 123; var fn = registerServerReference($$RSC_SERVER_ACTION_0, "006a88810ecce4a4e8b59d53b8327d7e98bbf251d7", null).bind(null, encryptActionBoundArgs("006a88810ecce4a4e8b59d53b8327d7e98bbf251d7", [ a, diff --git a/crates/next-custom-transforms/tests/fixture/server-actions/server/42/output.js b/crates/next-custom-transforms/tests/fixture/server-actions/server/42/output.js index 60ea035315d764..4a0ce92a234f0b 100644 --- a/crates/next-custom-transforms/tests/fixture/server-actions/server/42/output.js +++ b/crates/next-custom-transforms/tests/fixture/server-actions/server/42/output.js @@ -1,8 +1,7 @@ /* __next_internal_action_entry_do_not_use__ {"803128060c414d59f8552e4788b846c0d2b7f74743":"$$RSC_SERVER_CACHE_0"} */ import { registerServerReference } from "private-next-rsc-server-reference"; import { encryptActionBoundArgs, decryptActionBoundArgs } from "private-next-rsc-action-encryption"; import { cache as $$cache__ } from "private-next-rsc-cache-wrapper"; -export var $$RSC_SERVER_CACHE_0 = $$cache__("default", "803128060c414d59f8552e4788b846c0d2b7f74743", true, async function($$ACTION_CLOSURE_BOUND) { - var [$$ACTION_ARG_0, $$ACTION_ARG_1] = $$ACTION_CLOSURE_BOUND; +export var $$RSC_SERVER_CACHE_0 = $$cache__("default", "803128060c414d59f8552e4788b846c0d2b7f74743", 2, async function($$ACTION_ARG_0, $$ACTION_ARG_1) { console.log($$ACTION_ARG_0); return { foo: $$ACTION_ARG_1 diff --git a/crates/next-custom-transforms/tests/fixture/server-actions/server/43/output.js b/crates/next-custom-transforms/tests/fixture/server-actions/server/43/output.js index 111f500613792b..b795fdaedb51fa 100644 --- a/crates/next-custom-transforms/tests/fixture/server-actions/server/43/output.js +++ b/crates/next-custom-transforms/tests/fixture/server-actions/server/43/output.js @@ -7,7 +7,7 @@ export const $$RSC_SERVER_ACTION_0 = async function action($$ACTION_CLOSURE_BOUN var [$$ACTION_ARG_0] = await decryptActionBoundArgs("006a88810ecce4a4e8b59d53b8327d7e98bbf251d7", $$ACTION_CLOSURE_BOUND); console.log(secret, $$ACTION_ARG_0); }; -export var $$RSC_SERVER_CACHE_1 = $$cache__("default", "e0951c375b4a6a6e89d67b743ec5808127cfde405d", false, async function getCachedRandom(x, children) { +export var $$RSC_SERVER_CACHE_1 = $$cache__("default", "e0951c375b4a6a6e89d67b743ec5808127cfde405d", 0, async function getCachedRandom(x, children) { return { x, y: Math.random(), diff --git a/crates/next-custom-transforms/tests/fixture/server-actions/server/45/output.js b/crates/next-custom-transforms/tests/fixture/server-actions/server/45/output.js index 449f1d68c9f755..2d81d32f8192c6 100644 --- a/crates/next-custom-transforms/tests/fixture/server-actions/server/45/output.js +++ b/crates/next-custom-transforms/tests/fixture/server-actions/server/45/output.js @@ -7,7 +7,7 @@ function Foo() { console.log(v); return v; } -export var $$RSC_SERVER_CACHE_0 = $$cache__("default", "803128060c414d59f8552e4788b846c0d2b7f74743", false, async function bar() { +export var $$RSC_SERVER_CACHE_0 = $$cache__("default", "803128060c414d59f8552e4788b846c0d2b7f74743", 0, async function bar() { return ; }); Object.defineProperty($$RSC_SERVER_CACHE_0, "name", { diff --git a/crates/next-custom-transforms/tests/fixture/server-actions/server/46/output.js b/crates/next-custom-transforms/tests/fixture/server-actions/server/46/output.js index 0ff2eb717075dd..785d6b735b670a 100644 --- a/crates/next-custom-transforms/tests/fixture/server-actions/server/46/output.js +++ b/crates/next-custom-transforms/tests/fixture/server-actions/server/46/output.js @@ -3,7 +3,7 @@ /* __next_internal_action_entry_do_not_use__ {"6090b5db271335765a4b0eab01f044b381b5ebd5cd":"$$RSC_SERVER_ACTION_1","7c9ed0cc47abc4e1c64320cf42b74ae60b58c40f00":"$$RSC_SERVER_ACTION_3","7ea9b2939c1f39073a6bed227fd20233064c8b7869":"$$RSC_SERVER_ACTION_4","e03128060c414d59f8552e4788b846c0d2b7f74743":"$$RSC_SERVER_CACHE_0","ff471a5eb0be1c31686dd4ba938a80328b80b1615d":"$$RSC_SERVER_CACHE_5","ff69348c79fce073bae2f70f139565a2fda1c74c74":"$$RSC_SERVER_CACHE_2"} */ import { registerServerReference } from "private-next-rsc-server-reference"; import { encryptActionBoundArgs, decryptActionBoundArgs } from "private-next-rsc-action-encryption"; import { cache as $$cache__ } from "private-next-rsc-cache-wrapper"; -export var $$RSC_SERVER_CACHE_0 = $$cache__("default", "e03128060c414d59f8552e4788b846c0d2b7f74743", false, async function f1(a, b) { +export var $$RSC_SERVER_CACHE_0 = $$cache__("default", "e03128060c414d59f8552e4788b846c0d2b7f74743", 0, async function f1(a, b) { return [ a, b @@ -22,7 +22,7 @@ $$RSC_SERVER_ACTION_1 = async function f2(a, b) { ]; }; var f2 = registerServerReference($$RSC_SERVER_ACTION_1, "6090b5db271335765a4b0eab01f044b381b5ebd5cd", null); -export var $$RSC_SERVER_CACHE_2 = $$cache__("default", "ff69348c79fce073bae2f70f139565a2fda1c74c74", false, // Should be 1 111111 1, which is "ff" in hex. +export var $$RSC_SERVER_CACHE_2 = $$cache__("default", "ff69348c79fce073bae2f70f139565a2fda1c74c74", 0, // Should be 1 111111 1, which is "ff" in hex. async function f3(a, b, ...rest) { return [ a, @@ -58,7 +58,7 @@ $$RSC_SERVER_ACTION_4 = async function f4(a, b, c, d, e, f) { ]; }; var f4 = registerServerReference($$RSC_SERVER_ACTION_4, "7ea9b2939c1f39073a6bed227fd20233064c8b7869", null); -export var $$RSC_SERVER_CACHE_5 = $$cache__("default", "ff471a5eb0be1c31686dd4ba938a80328b80b1615d", false, // Should be 1 111111 1, which is "ff" in hex. +export var $$RSC_SERVER_CACHE_5 = $$cache__("default", "ff471a5eb0be1c31686dd4ba938a80328b80b1615d", 0, // Should be 1 111111 1, which is "ff" in hex. async function f5(a, b, c, d, e, f, g) { return [ a, diff --git a/crates/next-custom-transforms/tests/fixture/server-actions/server/48/output.js b/crates/next-custom-transforms/tests/fixture/server-actions/server/48/output.js index 03e7baef7e5bf9..4005e28f0c9d80 100644 --- a/crates/next-custom-transforms/tests/fixture/server-actions/server/48/output.js +++ b/crates/next-custom-transforms/tests/fixture/server-actions/server/48/output.js @@ -24,7 +24,7 @@ export async function action3(a, b) { {b} ; } -export var $$RSC_SERVER_CACHE_0 = $$cache__("default", "e03128060c414d59f8552e4788b846c0d2b7f74743", false, async function cache(a, b) { +export var $$RSC_SERVER_CACHE_0 = $$cache__("default", "e03128060c414d59f8552e4788b846c0d2b7f74743", 0, async function cache(a, b) { return
{a} {b} diff --git a/crates/next-custom-transforms/tests/fixture/server-actions/server/49/output.js b/crates/next-custom-transforms/tests/fixture/server-actions/server/49/output.js index 8182a0563e01fa..743c407acadde5 100644 --- a/crates/next-custom-transforms/tests/fixture/server-actions/server/49/output.js +++ b/crates/next-custom-transforms/tests/fixture/server-actions/server/49/output.js @@ -1,7 +1,7 @@ /* __next_internal_action_entry_do_not_use__ {"f03128060c414d59f8552e4788b846c0d2b7f74743":"$$RSC_SERVER_CACHE_0"} */ import { registerServerReference } from "private-next-rsc-server-reference"; import { encryptActionBoundArgs, decryptActionBoundArgs } from "private-next-rsc-action-encryption"; import { cache as $$cache__ } from "private-next-rsc-cache-wrapper"; -export var $$RSC_SERVER_CACHE_0 = $$cache__("default", "f03128060c414d59f8552e4788b846c0d2b7f74743", false, async function(a, b, c) { +export var $$RSC_SERVER_CACHE_0 = $$cache__("default", "f03128060c414d59f8552e4788b846c0d2b7f74743", 0, async function(a, b, c) { return
{a} {b} diff --git a/crates/next-custom-transforms/tests/fixture/server-actions/server/50/output.js b/crates/next-custom-transforms/tests/fixture/server-actions/server/50/output.js index e1f71054ca1f48..55df457988e389 100644 --- a/crates/next-custom-transforms/tests/fixture/server-actions/server/50/output.js +++ b/crates/next-custom-transforms/tests/fixture/server-actions/server/50/output.js @@ -1,7 +1,7 @@ /* __next_internal_action_entry_do_not_use__ {"f03128060c414d59f8552e4788b846c0d2b7f74743":"$$RSC_SERVER_CACHE_0"} */ import { registerServerReference } from "private-next-rsc-server-reference"; import { encryptActionBoundArgs, decryptActionBoundArgs } from "private-next-rsc-action-encryption"; import { cache as $$cache__ } from "private-next-rsc-cache-wrapper"; -export var $$RSC_SERVER_CACHE_0 = $$cache__("default", "f03128060c414d59f8552e4788b846c0d2b7f74743", false, async function(a, b, c) { +export var $$RSC_SERVER_CACHE_0 = $$cache__("default", "f03128060c414d59f8552e4788b846c0d2b7f74743", 0, async function(a, b, c) { return
{a} {b} diff --git a/packages/next/src/server/use-cache/use-cache-wrapper.ts b/packages/next/src/server/use-cache/use-cache-wrapper.ts index 4235945df5717e..dbc58ca0980c5d 100644 --- a/packages/next/src/server/use-cache/use-cache-wrapper.ts +++ b/packages/next/src/server/use-cache/use-cache-wrapper.ts @@ -438,7 +438,7 @@ function createTrackedReadableStream( export function cache( kind: string, id: string, - hasBoundArgs: boolean, + boundArgsLength: number, fn: any ) { if (!process.env.__NEXT_DYNAMIC_IO) { @@ -502,22 +502,29 @@ export function cache( } } - if (hasBoundArgs) { - if (args.length < 1) { + if (boundArgsLength > 0) { + if (args.length === 0) { throw new InvariantError( - 'Expected server closure to receive at least one argument, got: ' + - args.length + `Expected the "use cache" function ${JSON.stringify(fn.name)} to receive its encrypted bound arguments as the first argument.` ) } - const [encryptedBound, ...rest] = args - const decryptedBound = await decryptActionBoundArgs(id, encryptedBound) - if (!Array.isArray(decryptedBound)) { + + const [encryptedBoundArgs, ...otherArgs] = args + const boundArgs = await decryptActionBoundArgs(id, encryptedBoundArgs) + + if (!Array.isArray(boundArgs)) { throw new InvariantError( - 'Expected bound closure args to deserialize into an array, got: ' + - typeof decryptedBound + `Expected the bound arguments of "use cache" function ${JSON.stringify(fn.name)} to deserialize into an array, got ${typeof boundArgs} instead.` ) } - args = [decryptedBound, ...rest] + + if (boundArgsLength !== boundArgs.length) { + throw new InvariantError( + `Expected the "use cache" function ${JSON.stringify(fn.name)} to receive ${boundArgsLength} bound arguments, got ${boundArgs.length} instead.` + ) + } + + args = [...boundArgs, ...otherArgs] } const temporaryReferences = createClientTemporaryReferenceSet()