Skip to content

Commit 289a8b4

Browse files
committed
fix: custom serialization
1 parent 1a40e8e commit 289a8b4

File tree

2 files changed

+33
-22
lines changed

2 files changed

+33
-22
lines changed

packages/qwik/src/core/shared/shared-serialization.ts

Lines changed: 25 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -877,7 +877,9 @@ class ResourceResult extends PromiseResult {
877877
class SerializerResult extends PromiseResult {
878878
constructor(
879879
public $resolved$: boolean,
880-
public $value$: unknown
880+
public $value$: unknown,
881+
public $effects$: null | Set<EffectSubscription>,
882+
public $qrl$: QRLInternal | null
881883
) {
882884
super($resolved$, $value$);
883885
}
@@ -1126,7 +1128,7 @@ async function serialize(serializationContext: SerializationContext): Promise<vo
11261128
const result = value[SerializerSymbol](value);
11271129
if (isPromise(result)) {
11281130
const forwardRef = $resolvePromise$(result, $addRoot$, (resolved, resolvedValue) => {
1129-
return new SerializerResult(resolved, resolvedValue);
1131+
return new SerializerResult(resolved, resolvedValue, null, null);
11301132
});
11311133
output(TypeIds.ForwardRef, forwardRef);
11321134
} else {
@@ -1154,13 +1156,27 @@ async function serialize(serializationContext: SerializationContext): Promise<vo
11541156
value.$ssrNode$.vnodeData[0] |= VNodeDataFlag.SERIALIZE;
11551157
output(TypeIds.RefVNode, value.$ssrNode$.id);
11561158
} else if (value instanceof SignalImpl) {
1159+
if (value instanceof SerializerSignalImpl) {
1160+
const forwardRefId = $resolvePromise$(
1161+
$getCustomSerializerPromise$(value, value.$untrackedValue$),
1162+
$addRoot$,
1163+
(resolved, resolvedValue) => {
1164+
return new SerializerResult(
1165+
resolved,
1166+
resolvedValue,
1167+
value.$effects$,
1168+
value.$computeQrl$
1169+
);
1170+
}
1171+
);
1172+
output(TypeIds.ForwardRef, forwardRefId);
1173+
return;
1174+
}
11571175
/**
11581176
* Special case: when a Signal value is an SSRNode, it always needs to be a DOM ref instead.
11591177
* It can never be meant to become a vNode, because vNodes are internal only.
11601178
*/
1161-
const isSerialized = value instanceof SerializerSignalImpl;
11621179
const v: unknown =
1163-
!isSerialized &&
11641180
value instanceof ComputedSignalImpl &&
11651181
(value.$flags$ & SignalFlags.INVALID || fastSkipSerialize(value.$untrackedValue$))
11661182
? NEEDS_COMPUTATION
@@ -1182,13 +1198,9 @@ async function serialize(serializationContext: SerializationContext): Promise<vo
11821198
value.$effects$,
11831199
];
11841200
if (v !== NEEDS_COMPUTATION) {
1185-
if (isSerialized) {
1186-
out.push($getCustomSerializerPromise$(value, v));
1187-
} else {
1188-
out.push(v);
1189-
}
1201+
out.push(v);
11901202
}
1191-
output(isSerialized ? TypeIds.SerializerSignal : TypeIds.ComputedSignal, out);
1203+
output(TypeIds.ComputedSignal, out);
11921204
} else {
11931205
output(TypeIds.Signal, [v, ...(value.$effects$ || [])]);
11941206
}
@@ -1276,7 +1288,9 @@ async function serialize(serializationContext: SerializationContext): Promise<vo
12761288
if (value instanceof ResourceResult) {
12771289
output(TypeIds.Resource, [value.$resolved$, value.$value$, value.$effects$]);
12781290
} else if (value instanceof SerializerResult) {
1279-
if (value.$resolved$) {
1291+
if (value.$qrl$) {
1292+
output(TypeIds.SerializerSignal, [value.$qrl$, value.$effects$, value.$value$]);
1293+
} else if (value.$resolved$) {
12801294
writeValue(value.$value$);
12811295
} else {
12821296
console.error(value.$value$);

packages/qwik/src/core/shared/shared-serialization.unit.ts

Lines changed: 8 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -495,20 +495,17 @@ describe('shared-serialization', () => {
495495
const objs = await serialize(custom);
496496
expect(dumpState(objs)).toMatchInlineSnapshot(`
497497
"
498-
0 SerializerSignal [
499-
RootRef 1
498+
0 ForwardRef 0
499+
1 SerializerSignal [
500+
QRL 2
500501
Constant null
501-
ForwardRef 0
502-
]
503-
1 QRL "mock-chunk#custom_createSerializer_qrl"
504-
2 Promise [
505-
Constant true
506502
Number 4
507503
]
504+
2 String "mock-chunk#custom_createSerializer_qrl"
508505
3 ForwardRefs [
509-
2
506+
1
510507
]
511-
(81 chars)"
508+
(72 chars)"
512509
`);
513510
});
514511
it(title(TypeIds.Store), async () => {
@@ -899,9 +896,9 @@ describe('shared-serialization', () => {
899896
Number 1
900897
]
901898
]
902-
1 QRL "mock-chunk#foo[0 0]"
899+
1 QRL "mock-chunk#foo[2]"
903900
2 RootRef "0 0"
904-
(58 chars)"
901+
(56 chars)"
905902
`);
906903
// make sure shared1 is only serialized once
907904
expect([objs[4], objs[5]]).toEqual([TypeIds.RootRef, '0 0']);

0 commit comments

Comments
 (0)