Skip to content

Commit 5451ca5

Browse files
authored
Require triple equals via eslint (#447)
1 parent 0cac0a2 commit 5451ca5

File tree

13 files changed

+46
-42
lines changed

13 files changed

+46
-42
lines changed

.eslintrc.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
"plugins": ["@typescript-eslint", "require-extensions"],
3535
"rules": {
3636
"no-console": "error",
37+
"eqeqeq": "error",
3738
"@typescript-eslint/consistent-type-imports": "error",
3839
"@typescript-eslint/consistent-type-exports": "error",
3940
"@typescript-eslint/restrict-template-expressions": [

packages/restate-e2e-services/src/non_determinism.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ const invocationCounts = new Map<string, number>();
2121
function doLeftAction(ctx: restate.ObjectContext): boolean {
2222
const newValue = (invocationCounts.get(ctx.key) ?? 0) + 1;
2323
invocationCounts.set(ctx.key, newValue);
24-
return newValue % 2 == 1;
24+
return newValue % 2 === 1;
2525
}
2626

2727
function incrementCounter(ctx: restate.ObjectContext) {

packages/restate-e2e-services/src/workflow.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ const wf = restate.workflow({
1818

1919
const output = await ctx.promise("p");
2020

21-
if (ctx.promise("p").peek() == undefined) {
21+
if (ctx.promise("p").peek() === undefined) {
2222
throw new restate.TerminalError("Durable promise should be completed");
2323
}
2424

packages/restate-sdk-clients/src/ingress.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -318,7 +318,7 @@ class HttpIngress implements Ingress {
318318
result,
319319
};
320320
} catch (e) {
321-
if (!(e instanceof HttpCallError) || e.status != 470) {
321+
if (!(e instanceof HttpCallError) || e.status !== 470) {
322322
throw e;
323323
}
324324
return {
@@ -335,11 +335,11 @@ class HttpIngress implements Ingress {
335335
{
336336
get: (_target, prop) => {
337337
const handler = prop as string;
338-
if (handler == "workflowSubmit") {
338+
if (handler === "workflowSubmit") {
339339
return workflowSubmit;
340-
} else if (handler == "workflowAttach") {
340+
} else if (handler === "workflowAttach") {
341341
return workflowAttach;
342-
} else if (handler == "workflowOutput") {
342+
} else if (handler === "workflowOutput") {
343343
return workflowOutput;
344344
}
345345
// shared handlers pass trough via the ingress's normal invocation form

packages/restate-sdk-core/src/serde_api.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ class JsonSerde<T> implements Serde<T | undefined> {
3232
}
3333

3434
deserialize(data: Uint8Array): T | undefined {
35-
if (data.length == 0) {
35+
if (data.length === 0) {
3636
return undefined;
3737
}
3838
return JSON.parse(new TextDecoder().decode(data)) as T;
@@ -62,7 +62,7 @@ class VoidSerde implements Serde<void> {
6262
}
6363

6464
deserialize(data: Uint8Array): void {
65-
if (data.length != 0) {
65+
if (data.length !== 0) {
6666
throw new Error("Expected empty data");
6767
}
6868
}

packages/restate-sdk/src/context.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -606,7 +606,7 @@ export const CombineablePromise = {
606606
all<T extends readonly CombineablePromise<unknown>[] | []>(
607607
values: T
608608
): Promise<{ -readonly [P in keyof T]: Awaited<T[P]> }> {
609-
if (values.length == 0) {
609+
if (values.length === 0) {
610610
return Promise.all(values);
611611
}
612612
return ContextImpl.createCombinator("All", values) as Promise<{
@@ -626,7 +626,7 @@ export const CombineablePromise = {
626626
race<T extends readonly CombineablePromise<unknown>[] | []>(
627627
values: T
628628
): Promise<Awaited<T[number]>> {
629-
if (values.length == 0) {
629+
if (values.length === 0) {
630630
return Promise.race(values);
631631
}
632632
return ContextImpl.createCombinator("Race", values) as Promise<
@@ -647,7 +647,7 @@ export const CombineablePromise = {
647647
any<T extends readonly CombineablePromise<unknown>[] | []>(
648648
values: T
649649
): Promise<Awaited<T[number]>> {
650-
if (values.length == 0) {
650+
if (values.length === 0) {
651651
return Promise.any(values);
652652
}
653653
return ContextImpl.createCombinator("Any", values) as Promise<
@@ -669,7 +669,7 @@ export const CombineablePromise = {
669669
): Promise<{
670670
-readonly [P in keyof T]: PromiseSettledResult<Awaited<T[P]>>;
671671
}> {
672-
if (values.length == 0) {
672+
if (values.length === 0) {
673673
return Promise.allSettled(values);
674674
}
675675
return ContextImpl.createCombinator("AllSettled", values) as Promise<{

packages/restate-sdk/src/context_impl.ts

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@ export class ContextImpl implements ObjectContext, WorkflowContext {
9999
}, new Map()),
100100
attemptHeaders: Object.entries(attemptHeaders).reduce(
101101
(headers, [key, value]) => {
102-
if (value != undefined) {
102+
if (value !== undefined) {
103103
headers.set(key, value instanceof Array ? value[0] : value);
104104
}
105105
return headers;
@@ -139,7 +139,7 @@ export class ContextImpl implements ObjectContext, WorkflowContext {
139139
return this.processCompletableEntry(
140140
(vm) => vm.sys_get_state(name),
141141
(asyncResultValue) => {
142-
if (asyncResultValue == "Empty") {
142+
if (asyncResultValue === "Empty") {
143143
// Empty
144144
return null;
145145
} else if ("Success" in asyncResultValue) {
@@ -244,7 +244,7 @@ export class ContextImpl implements ObjectContext, WorkflowContext {
244244
const parameter = requestSerde.serialize(send.parameter);
245245

246246
let delay;
247-
if (send.delay != undefined) {
247+
if (send.delay !== undefined) {
248248
delay = BigInt(send.delay);
249249
}
250250

@@ -358,7 +358,7 @@ export class ContextImpl implements ObjectContext, WorkflowContext {
358358
// Record the result/failure, get back the handle for the ack.
359359
let handle;
360360
try {
361-
if (err != undefined) {
361+
if (err !== undefined) {
362362
if (err instanceof TerminalError) {
363363
// Record failure, go ahead
364364
handle = this.coreVm.sys_run_exit_failure({
@@ -409,7 +409,7 @@ export class ContextImpl implements ObjectContext, WorkflowContext {
409409
return this.processCompletableEntry(
410410
(vm) => vm.sys_sleep(BigInt(millis)),
411411
(asyncResultValue) => {
412-
if (asyncResultValue == "Empty") {
412+
if (asyncResultValue === "Empty") {
413413
// Empty
414414
return undefined as void;
415415
} else if ("Failure" in asyncResultValue) {
@@ -453,7 +453,7 @@ export class ContextImpl implements ObjectContext, WorkflowContext {
453453
if (!serde) {
454454
return defaultSerde<T>().deserialize(asyncResultValue.Success);
455455
}
456-
if (asyncResultValue.Success.length == 0) {
456+
if (asyncResultValue.Success.length === 0) {
457457
return undefined as T;
458458
}
459459
return serde.deserialize(asyncResultValue.Success);
@@ -482,10 +482,10 @@ export class ContextImpl implements ObjectContext, WorkflowContext {
482482

483483
if (serde) {
484484
value =
485-
payload == undefined ? new Uint8Array() : serde.serialize(payload);
485+
payload === undefined ? new Uint8Array() : serde.serialize(payload);
486486
} else {
487487
value =
488-
payload != undefined
488+
payload !== undefined
489489
? defaultSerde().serialize(payload)
490490
: defaultSerde().serialize(null);
491491
}
@@ -634,7 +634,7 @@ export class ContextImpl implements ObjectContext, WorkflowContext {
634634
return promisesMap.get(handlesResult[0]);
635635
case "OrTimeout":
636636
// The sleep promise is always the second one in the list.
637-
if (handlesResult[0] == castedPromises[1].asyncResultHandle) {
637+
if (handlesResult[0] === castedPromises[1].asyncResultHandle) {
638638
return Promise.reject(new TimeoutError());
639639
} else {
640640
return promisesMap.get(handlesResult[0]);
@@ -751,7 +751,7 @@ export class ContextImpl implements ObjectContext, WorkflowContext {
751751

752752
// Now loop waiting for the async result
753753
let asyncResult = this.coreVm.take_async_result(handle);
754-
while (asyncResult == "NotReady") {
754+
while (asyncResult === "NotReady") {
755755
await this.awaitNextRead();
756756
// Using notify_await_point immediately before take_async_result
757757
// makes sure the state machine will try to suspend only now,
@@ -776,7 +776,7 @@ export class ContextImpl implements ObjectContext, WorkflowContext {
776776
// and will notify the caller that a read was executed
777777
// and the result was piped in the state machine.
778778
private awaitNextRead(): Promise<void> {
779-
if (this.currentRead == undefined) {
779+
if (this.currentRead === undefined) {
780780
// Register a new read
781781
this.currentRead = this.readNext().finally(() => {
782782
this.currentRead = undefined;
@@ -808,7 +808,7 @@ export class ContextImpl implements ObjectContext, WorkflowContext {
808808
const error = ensureError(e);
809809
if (
810810
!(error instanceof RestateError) ||
811-
error.code != SUSPENDED_ERROR_CODE
811+
error.code !== SUSPENDED_ERROR_CODE
812812
) {
813813
this.console.warn("Function completed with an error.\n", error);
814814
}
@@ -823,7 +823,7 @@ function unpack<T>(
823823
a: string | RunAction<T>,
824824
b?: RunAction<T>
825825
): { name?: string; action: RunAction<T> } {
826-
if (typeof a == "string") {
826+
if (typeof a === "string") {
827827
if (typeof b !== "function") {
828828
throw new TypeError("");
829829
}

packages/restate-sdk/src/endpoint/handlers/generic.ts

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,10 @@ export class GenericHandler implements RestateHandler {
9797
private readonly protocolMode: ProtocolMode
9898
) {
9999
// Setup identity verifier
100-
if (this.endpoint.keySet == undefined || this.endpoint.keySet.length == 0) {
100+
if (
101+
this.endpoint.keySet === undefined ||
102+
this.endpoint.keySet.length === 0
103+
) {
101104
this.endpoint.rlog.warn(
102105
`Accepting requests without validating request signatures; handler access must be restricted`
103106
);
@@ -257,7 +260,7 @@ export class GenericHandler implements RestateHandler {
257260
// Now buffer input entries
258261
while (!coreVm.is_ready_to_execute()) {
259262
const nextValue = await inputReader.read();
260-
if (nextValue.value != undefined) {
263+
if (nextValue.value !== undefined) {
261264
coreVm.notify_input(nextValue.value);
262265
}
263266
if (nextValue.done) {
@@ -318,7 +321,7 @@ export class GenericHandler implements RestateHandler {
318321
const error = ensureError(e);
319322
if (
320323
!(error instanceof RestateError) ||
321-
error.code != SUSPENDED_ERROR_CODE
324+
error.code !== SUSPENDED_ERROR_CODE
322325
) {
323326
console.warn("Function completed with an error.\n", error);
324327
}

packages/restate-sdk/src/logger.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,7 @@ export const defaultLogger: Logger = (
108108
function readRestateLogLevel(): RestateLogLevel {
109109
const env = globalThis.process?.env?.RESTATE_LOGGING;
110110
const level = logLevelFromName(env);
111-
if (level != null) {
111+
if (level !== null) {
112112
return level;
113113
}
114114
return RestateLogLevel.INFO;

packages/restate-sdk/src/types/components.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -145,7 +145,7 @@ export class VirtualObjectComponent implements Component {
145145
contentType: opts.contentType ?? "application/json",
146146
},
147147
ty:
148-
opts.kind == HandlerKind.EXCLUSIVE
148+
opts.kind === HandlerKind.EXCLUSIVE
149149
? d.ServiceHandlerType.EXCLUSIVE
150150
: d.ServiceHandlerType.SHARED,
151151
};
@@ -220,7 +220,7 @@ export class WorkflowComponent implements Component {
220220
contentType: handler.contentType ?? "application/json",
221221
},
222222
ty:
223-
handler.kind == HandlerKind.WORKFLOW
223+
handler.kind === HandlerKind.WORKFLOW
224224
? d.ServiceHandlerType.WORKFLOW
225225
: d.ServiceHandlerType.SHARED,
226226
};

packages/restate-sdk/src/types/errors.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ export function ensureError(e: unknown): Error {
2222
if (e instanceof Error) {
2323
return e;
2424
}
25-
if (typeof e == "object" && e != null && "code" in e && "message" in e) {
25+
if (typeof e === "object" && e !== null && "code" in e && "message" in e) {
2626
// This is an error from the VM
2727
return new RestateError(e.message as string, {
2828
errorCode: e.code as number,

packages/restate-sdk/src/types/rpc.ts

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -409,7 +409,7 @@ export class HandlerWrapper {
409409
} else if (opts?.accept) {
410410
// accept but no serializer, use pass trough
411411
inputSerde = new DeserializerWrapper(opts.accept, (input) => input);
412-
} else if (opts?.contentType == JSON_CONTENT_TYPE) {
412+
} else if (opts?.contentType === JSON_CONTENT_TYPE) {
413413
// contentType is JSON, use the default serde
414414
inputSerde = defaultSerde();
415415
} else if (opts?.input) {
@@ -426,7 +426,7 @@ export class HandlerWrapper {
426426
opts.contentType ?? JSON_CONTENT_TYPE,
427427
opts.outputSerializer
428428
);
429-
} else if (opts?.contentType == JSON_CONTENT_TYPE) {
429+
} else if (opts?.contentType === JSON_CONTENT_TYPE) {
430430
// contentType is JSON, use the default serde
431431
outputSerde = defaultSerde();
432432
} else if (opts?.contentType) {
@@ -541,7 +541,7 @@ export namespace handlers {
541541
optsOrFn: WorkflowHandlerOpts | WorkflowHandler<F, WorkflowContext<any>>,
542542
fn?: WorkflowHandler<F, WorkflowContext<any>>
543543
): F {
544-
if (typeof optsOrFn == "function") {
544+
if (typeof optsOrFn === "function") {
545545
return HandlerWrapper.from(HandlerKind.WORKFLOW, optsOrFn).transpose();
546546
}
547547
const opts = optsOrFn satisfies WorkflowHandlerOpts;
@@ -593,7 +593,7 @@ export namespace handlers {
593593
| WorkflowSharedHandler<F, WorkflowSharedContext<any>>,
594594
fn?: WorkflowSharedHandler<F, WorkflowSharedContext<any>>
595595
): F {
596-
if (typeof optsOrFn == "function") {
596+
if (typeof optsOrFn === "function") {
597597
return HandlerWrapper.from(HandlerKind.SHARED, optsOrFn).transpose();
598598
}
599599
const opts = optsOrFn satisfies ObjectHandlerOpts;
@@ -649,7 +649,7 @@ export namespace handlers {
649649
optsOrFn: ObjectHandlerOpts | ObjectHandler<F, ObjectContext<any>>,
650650
fn?: ObjectHandler<F, ObjectContext<any>>
651651
): F {
652-
if (typeof optsOrFn == "function") {
652+
if (typeof optsOrFn === "function") {
653653
return HandlerWrapper.from(HandlerKind.EXCLUSIVE, optsOrFn).transpose();
654654
}
655655
const opts = optsOrFn satisfies ObjectHandlerOpts;
@@ -707,7 +707,7 @@ export namespace handlers {
707707
| ObjectSharedHandler<F, ObjectSharedContext<any>>,
708708
fn?: ObjectSharedHandler<F, ObjectSharedContext<any>>
709709
): F {
710-
if (typeof optsOrFn == "function") {
710+
if (typeof optsOrFn === "function") {
711711
return HandlerWrapper.from(HandlerKind.SHARED, optsOrFn).transpose();
712712
}
713713
const opts = optsOrFn satisfies ObjectHandlerOpts;
@@ -973,7 +973,7 @@ export const workflow = <P extends string, M>(workflow: {
973973
} else {
974974
throw new TypeError(`Missing main workflow handler, named 'run'`);
975975
}
976-
if (runWrapper.kind != HandlerKind.WORKFLOW) {
976+
if (runWrapper.kind !== HandlerKind.WORKFLOW) {
977977
throw new TypeError(
978978
`Workflow's main handler handler run, must be of type workflow'`
979979
);
@@ -986,7 +986,7 @@ export const workflow = <P extends string, M>(workflow: {
986986
//
987987

988988
for (const [name, handler] of Object.entries(workflow.handlers)) {
989-
if (name == "run") {
989+
if (name === "run") {
990990
continue;
991991
}
992992
let wrapper: HandlerWrapper;
@@ -1000,7 +1000,7 @@ export const workflow = <P extends string, M>(workflow: {
10001000
} else {
10011001
throw new TypeError(`Unexpected handler type ${name}`);
10021002
}
1003-
if (wrapper.kind == HandlerKind.WORKFLOW) {
1003+
if (wrapper.kind === HandlerKind.WORKFLOW) {
10041004
throw new TypeError(
10051005
`A workflow must contain exactly one handler annotated as workflow, named 'run'. Please use a shared handler for any additional handlers`
10061006
);

packages/restate-sdk/src/utils/rand.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ export class RandImpl implements Rand {
2424
id: string | [bigint, bigint, bigint, bigint],
2525
private readonly checkState: (state: string) => void = () => undefined
2626
) {
27-
if (typeof id == "string") {
27+
if (typeof id === "string") {
2828
// hash the invocation ID, which is known to contain 74 bits of entropy
2929
const hash = createHash("sha256").update(id).digest();
3030

0 commit comments

Comments
 (0)