Skip to content

Commit 2ed8209

Browse files
committed
fix: Throw unkown function error code when function not found in module.
Support returning falsy values from a juno function
1 parent 79f85d5 commit 2ed8209

File tree

4 files changed

+66
-23
lines changed

4 files changed

+66
-23
lines changed

src/juno-node.ts

Lines changed: 35 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import { promises as fsPromises } from 'fs';
33
import { BaseProtocol } from './protocol/base-protocol';
44
import BaseConnection from './connection/base-connection';
55
import { JsonProtocol } from './protocol/json-protocol';
6-
import { ResponseTypes, RequestTypes } from './utils/constants';
6+
import { ResponseTypes, RequestTypes, ErrorTypes } from './utils/constants';
77
import {
88
FunctionCallRequest,
99
FunctionCallResponse,
@@ -12,6 +12,7 @@ import {
1212
} from './models/messages';
1313
import UnixSocketConnection from './connection/unix-socket-connection';
1414
import InetSocketConnection from './connection/inet-socket-connection';
15+
import {JunoError} from './models/errors';
1516

1617
export default class JunoModule {
1718

@@ -139,54 +140,72 @@ export default class JunoModule {
139140
}
140141

141142
return new Promise((resolve, reject) => {
142-
this.requests[request.requestId] = (response: any) => {
143-
if (response) {
144-
resolve(response);
143+
this.requests[request.requestId] = (err: boolean | Error, response: any) => {
144+
if (err) {
145+
reject(err);
145146
} else {
146-
reject(response);
147+
resolve(response);
147148
}
148149
};
149150
});
150151
}
151152

152153
private async onDataHandler(data: Buffer) {
153154
const response = this.protocol.decode(data);
154-
let value;
155+
let value: any = true;
156+
let err: boolean | Error = false;
155157
switch (response.type) {
156158
case ResponseTypes.ModuleRegistered: {
157-
value = true;
159+
err = false;
158160
break;
159161
}
160162
case ResponseTypes.FunctionResponse: {
163+
err = false;
161164
value = (response as FunctionCallResponse).data;
162165
break;
163166
}
164167
case ResponseTypes.FunctionDeclared: {
165-
value = true;
168+
err = false;
166169
break;
167170
}
168171
case ResponseTypes.HookRegistered: {
169-
value = true;
172+
err = false;
170173
break;
171174
}
172175
case ResponseTypes.HookTriggered: {
173-
value = await this.executeHookTriggered(response as TriggerHookRequest);
176+
try {
177+
await this.executeHookTriggered(response as TriggerHookRequest);
178+
err = false;
179+
} catch (e) {
180+
err = e;
181+
}
174182
break;
175183
}
176184

177185
case RequestTypes.FunctionCall: {
178-
this.executeFunctionCall(response as FunctionCallRequest);
186+
try {
187+
await this.executeFunctionCall(response as FunctionCallRequest);
188+
} catch (e) {
189+
err = e;
190+
}
179191
break;
180192
}
181193

182194
default: {
183-
value = false;
184-
break;
195+
err = TypeError("Error message/Invalid message received from juno");
185196
}
186197
}
187198

199+
if (err instanceof JunoError) {
200+
this.sendRequest({
201+
requestId: response.requestId,
202+
type: ResponseTypes.Error,
203+
error: err.errCode,
204+
});
205+
}
206+
188207
if (this.requests[response.requestId]) {
189-
this.requests[response.requestId](value);
208+
this.requests[response.requestId](err, value);
190209
delete this.requests[response.requestId];
191210
}
192211
}
@@ -202,10 +221,9 @@ export default class JunoModule {
202221
type: ResponseTypes.FunctionResponse,
203222
data: res || {}
204223
});
205-
return true;
206224
} else {
207225
// Function wasn't found in the module.
208-
return false;
226+
throw new JunoError(ErrorTypes.UnkownFunction);
209227
}
210228
}
211229

@@ -222,10 +240,6 @@ export default class JunoModule {
222240
listener(request.data || {});
223241
}
224242
}
225-
return true;
226-
} else {
227-
// This moddule triggered the hook.
228-
return true;
229-
}
243+
}
230244
}
231245
}

src/models/errors.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
export class JunoError extends Error {
2+
errCode: number;
3+
constructor(errCode: number) {
4+
super(`Juno Error: ${errCode}`);
5+
this.errCode = errCode;
6+
7+
// Set the prototype explicitly.
8+
Object.setPrototypeOf(this, JunoError.prototype);
9+
}
10+
}
11+

src/models/messages.ts

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,12 +52,17 @@ export interface DeclareFunctionResponse extends BaseMessage {
5252
function: string;
5353
}
5454

55+
export interface ErrorResponse extends BaseMessage {
56+
error: number;
57+
}
58+
5559
export type JunoResponse =
5660
RegisterModuleResponse |
5761
ListenHookResponse |
5862
TriggerHookResponse |
5963
DeclareFunctionResponse |
60-
FunctionCallResponse;
64+
FunctionCallResponse |
65+
ErrorResponse;
6166
export type JunoRequest =
6267
RegisterModuleRequest |
6368
DeclareFunctionRequest |
@@ -74,4 +79,5 @@ export type JunoMessage =
7479
DeclareFunctionRequest |
7580
FunctionCallRequest |
7681
RegisterHookRequest |
77-
TriggerHookRequest;
82+
TriggerHookRequest |
83+
ErrorResponse;

src/utils/constants.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,21 @@ export const RequestTypes = {
1919
};
2020

2121
export const ResponseTypes = {
22+
Error: 0,
2223
ModuleRegistered: 2,
2324
FunctionResponse: 4,
2425
HookRegistered: 6,
2526
HookTriggered: 8,
2627
FunctionDeclared: 10
2728
};
29+
30+
export const ErrorTypes = {
31+
MalformedRequest: 0,
32+
InvalidRequestId: 1,
33+
UnkownRequest: 2,
34+
UnregisteredModule: 3,
35+
UnkownModule: 4,
36+
UnkownFunction: 5,
37+
InvalidModuleId: 6,
38+
DuplicateModule: 7,
39+
};

0 commit comments

Comments
 (0)