Skip to content
This repository was archived by the owner on Jul 10, 2025. It is now read-only.

Commit 86a7302

Browse files
author
Akim
authored
feat(js-client): Add fire-and-forget flag [DXJ-562] (#400)
* Add fire-and-forget flag * Fix test * Store particle behavior in queue item * Fix tests
1 parent 9b629ee commit 86a7302

File tree

7 files changed

+20
-2
lines changed

7 files changed

+20
-2
lines changed

packages/core/js-client/src/api.spec.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,7 @@ describe("User API methods", () => {
8080
args: {},
8181
peer,
8282
script,
83+
fireAndForget: false,
8384
});
8485

8586
expect(res).toBe(7);

packages/core/js-client/src/api.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,7 @@ export const v5_callFunction = async (
134134
peer: peerOrArg,
135135
args: callArgs,
136136
config,
137+
fireAndForget: returnTypeVoid,
137138
});
138139

139140
if (returnTypeVoid) {

packages/core/js-client/src/clientPeer/__test__/client.spec.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ describe("FluenceClient usage test suite", () => {
5555
},
5656
});
5757

58-
peer.internals.initiateParticle(particle, resolve, reject);
58+
peer.internals.initiateParticle(particle, resolve, reject, false);
5959
});
6060

6161
await expect(promise).rejects.toThrow(ExpirationError);

packages/core/js-client/src/compilerSupport/callFunction.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ export type CallAquaFunctionArgs = {
4949
config?: CallAquaFunctionConfig | undefined;
5050
peer: FluencePeer;
5151
args: { [key: string]: JSONValue | ArgCallbackFunction };
52+
fireAndForget: boolean;
5253
};
5354

5455
export type CallAquaFunctionConfig = {
@@ -60,6 +61,7 @@ export const callAquaFunction = async ({
6061
config = {},
6162
peer,
6263
args,
64+
fireAndForget,
6365
}: CallAquaFunctionArgs) => {
6466
log.trace("calling aqua function %j", { script, config, args });
6567

@@ -85,6 +87,6 @@ export const callAquaFunction = async ({
8587

8688
registerParticleScopeService(peer, particle, errorHandlingService(reject));
8789

88-
peer.internals.initiateParticle(particle, resolve, reject);
90+
peer.internals.initiateParticle(particle, resolve, reject, fireAndForget);
8991
});
9092
};

packages/core/js-client/src/jsPeer/FluencePeer.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -255,11 +255,13 @@ export abstract class FluencePeer {
255255
* @param particle - particle to start execution of
256256
* @param onSuccess - callback which is called when particle execution succeed
257257
* @param onError - callback which is called when particle execution fails
258+
* @param fireAndForget - determines whether particle has fire-and-forget behavior
258259
*/
259260
initiateParticle: (
260261
particle: IParticle,
261262
onSuccess: (result: JSONValue) => void,
262263
onError: (error: Error) => void,
264+
fireAndForget: boolean = true,
263265
): void => {
264266
if (!this.isInitialized) {
265267
throw new Error(
@@ -278,6 +280,7 @@ export abstract class FluencePeer {
278280
callResults: [],
279281
onSuccess,
280282
onError,
283+
fireAndForget,
281284
});
282285
},
283286

@@ -607,6 +610,9 @@ export abstract class FluencePeer {
607610
if (item.result.callRequests.length > 0) {
608611
// TS doesn't allow to pass just 'item'
609612
void this.execCallRequests({ ...item, result: item.result });
613+
} else if (item.fireAndForget === true) {
614+
// Local work done.
615+
item.onSuccess(null);
610616
}
611617

612618
return connectionPromise;

packages/core/js-client/src/particle/Particle.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -187,6 +187,7 @@ export interface ParticleQueueItem {
187187
callResults: CallResultsArray;
188188
onSuccess: (result: JSONValue) => void;
189189
onError: (error: Error) => void;
190+
fireAndForget?: boolean;
190191
}
191192

192193
/**

packages/core/js-client/src/util/testUtils.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,11 +103,18 @@ export const compileAqua = async (aquaFile: string): Promise<CompiledFile> => {
103103
const functions = Object.entries(compilationResult.functions)
104104
.map(([name, fnInfo]: [string, FunctionInfo]) => {
105105
const callFn = (peer: FluencePeer, args: PassedArgs) => {
106+
const def = fnInfo.funcDef;
107+
108+
const isReturnTypeVoid =
109+
def.arrow.codomain.tag === "nil" ||
110+
def.arrow.codomain.items.length === 0;
111+
106112
return callAquaFunction({
107113
script: fnInfo.script,
108114
config: {},
109115
peer: peer,
110116
args,
117+
fireAndForget: isReturnTypeVoid,
111118
});
112119
};
113120

0 commit comments

Comments
 (0)