Commit 81a48a0e authored by 水濑真白's avatar 水濑真白

fix: transport only raw in noParse mode; parse on main thread

parent 6ba3347f
Pipeline #43164 passed with stages
in 36 seconds
...@@ -36,30 +36,26 @@ import { YGOProMessages, CardQuery } from 'ygopro-msg-encode'; ...@@ -36,30 +36,26 @@ import { YGOProMessages, CardQuery } from 'ygopro-msg-encode';
const { OcgcoreScriptConstants } = _OcgcoreConstants; const { OcgcoreScriptConstants } = _OcgcoreConstants;
// Serializable types for transport // Serializable types for transport (noParse mode: only send binary data)
interface SerializableProcessResult { interface SerializableProcessResult {
length: number; length: number;
raw: Uint8Array; raw: Uint8Array;
status: number; status: number;
messagePayload?: Uint8Array;
} }
interface SerializableCardQueryResult { interface SerializableCardQueryResult {
length: number; length: number;
raw: Uint8Array; raw: Uint8Array;
cardPayload: Uint8Array | null;
} }
interface SerializableFieldCardQueryResult { interface SerializableFieldCardQueryResult {
length: number; length: number;
raw: Uint8Array; raw: Uint8Array;
cardsPayload: Uint8Array[];
} }
interface SerializableFieldInfoResult { interface SerializableFieldInfoResult {
length: number; length: number;
raw: Uint8Array; raw: Uint8Array;
fieldPayload: Uint8Array;
} }
@DefineWorker() @DefineWorker()
...@@ -204,32 +200,27 @@ export class OcgcoreWorker { ...@@ -204,32 +200,27 @@ export class OcgcoreWorker {
@WorkerMethod() @WorkerMethod()
@TransportEncoder<OcgcoreProcessResult, SerializableProcessResult>( @TransportEncoder<OcgcoreProcessResult, SerializableProcessResult>(
(result) => { // serialize in worker: only send raw
// Re-parse from raw at encode time, so worker-side core calls can use noParse. (result) => ({
let messagePayload: Uint8Array | undefined; length: result.length,
if (result.raw.length > 0) { raw: result.raw,
try { status: result.status,
messagePayload = YGOProMessages.getInstanceFromPayload( }),
result.raw, // deserialize in main thread: re-parse from raw
).toPayload();
} catch {
messagePayload = undefined;
}
}
return {
length: result.length,
raw: result.raw,
status: result.status,
messagePayload,
};
},
(serialized) => ({ (serialized) => ({
length: serialized.length, length: serialized.length,
raw: serialized.raw, raw: serialized.raw,
status: serialized.status, status: serialized.status,
message: serialized.messagePayload message:
? YGOProMessages.getInstanceFromPayload(serialized.messagePayload) serialized.raw.length > 0
: undefined, ? (() => {
try {
return YGOProMessages.getInstanceFromPayload(serialized.raw);
} catch {
return undefined;
}
})()
: undefined,
}), }),
) )
async process(): Promise<OcgcoreProcessResult> { async process(): Promise<OcgcoreProcessResult> {
...@@ -248,20 +239,16 @@ export class OcgcoreWorker { ...@@ -248,20 +239,16 @@ export class OcgcoreWorker {
@WorkerMethod() @WorkerMethod()
@TransportEncoder<OcgcoreCardQueryResult, SerializableCardQueryResult>( @TransportEncoder<OcgcoreCardQueryResult, SerializableCardQueryResult>(
(result) => { // serialize in worker: only send raw
const card = parseCardQuery(result.raw, result.length); (result) => ({
return { length: result.length,
length: result.length, raw: result.raw,
raw: result.raw, }),
cardPayload: card ? card.toPayload() : null, // deserialize in main thread: re-parse from raw
};
},
(serialized) => ({ (serialized) => ({
length: serialized.length, length: serialized.length,
raw: serialized.raw, raw: serialized.raw,
card: serialized.cardPayload card: parseCardQuery(serialized.raw, serialized.length),
? new CardQuery().fromPayload(serialized.cardPayload)
: null,
}), }),
) )
async queryCard( async queryCard(
...@@ -282,20 +269,16 @@ export class OcgcoreWorker { ...@@ -282,20 +269,16 @@ export class OcgcoreWorker {
OcgcoreFieldCardQueryResult, OcgcoreFieldCardQueryResult,
SerializableFieldCardQueryResult SerializableFieldCardQueryResult
>( >(
(result) => { // serialize in worker: only send raw
const cards = parseFieldCardQuery(result.raw, result.length); (result) => ({
return { length: result.length,
length: result.length, raw: result.raw,
raw: result.raw, }),
cardsPayload: cards.map((card) => card.toPayload()), // deserialize in main thread: re-parse from raw
};
},
(serialized) => ({ (serialized) => ({
length: serialized.length, length: serialized.length,
raw: serialized.raw, raw: serialized.raw,
cards: serialized.cardsPayload.map((payload) => cards: parseFieldCardQuery(serialized.raw, serialized.length),
new CardQuery().fromPayload(payload),
),
}), }),
) )
async queryFieldCard( async queryFieldCard(
...@@ -306,17 +289,16 @@ export class OcgcoreWorker { ...@@ -306,17 +289,16 @@ export class OcgcoreWorker {
@WorkerMethod() @WorkerMethod()
@TransportEncoder<OcgcoreFieldInfoResult, SerializableFieldInfoResult>( @TransportEncoder<OcgcoreFieldInfoResult, SerializableFieldInfoResult>(
// serialize in worker: only send raw
(result) => ({ (result) => ({
length: result.length, length: result.length,
raw: result.raw, raw: result.raw,
fieldPayload: parseFieldInfo(result.raw).toPayload(),
}), }),
// deserialize in main thread: re-parse from raw
(serialized) => ({ (serialized) => ({
length: serialized.length, length: serialized.length,
raw: serialized.raw, raw: serialized.raw,
field: YGOProMessages.getInstanceFromPayload( field: parseFieldInfo(serialized.raw),
serialized.fieldPayload,
) as any,
}), }),
) )
async queryFieldInfo(): Promise<OcgcoreFieldInfoResult> { async queryFieldInfo(): Promise<OcgcoreFieldInfoResult> {
...@@ -325,33 +307,29 @@ export class OcgcoreWorker { ...@@ -325,33 +307,29 @@ export class OcgcoreWorker {
@WorkerMethod() @WorkerMethod()
@TransportEncoder<OcgcoreProcessResult[], SerializableProcessResult[]>( @TransportEncoder<OcgcoreProcessResult[], SerializableProcessResult[]>(
// serialize in worker: only send raw
(results) => (results) =>
results.map((result) => { results.map((result) => ({
let messagePayload: Uint8Array | undefined; length: result.length,
if (result.raw.length > 0) { raw: result.raw,
try { status: result.status,
messagePayload = YGOProMessages.getInstanceFromPayload( })),
result.raw, // deserialize in main thread: re-parse from raw
).toPayload();
} catch {
messagePayload = undefined;
}
}
return {
length: result.length,
raw: result.raw,
status: result.status,
messagePayload,
};
}),
(serializedArray) => (serializedArray) =>
serializedArray.map((serialized) => ({ serializedArray.map((serialized) => ({
length: serialized.length, length: serialized.length,
raw: serialized.raw, raw: serialized.raw,
status: serialized.status, status: serialized.status,
message: serialized.messagePayload message:
? YGOProMessages.getInstanceFromPayload(serialized.messagePayload) serialized.raw.length > 0
: undefined, ? (() => {
try {
return YGOProMessages.getInstanceFromPayload(serialized.raw);
} catch {
return undefined;
}
})()
: undefined,
})), })),
) )
async advance(): Promise<OcgcoreProcessResult[]> { async advance(): Promise<OcgcoreProcessResult[]> {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment