Skip to content

Commit 89c18a9

Browse files
authored
feat(vscode): define "deamon" domain messages (#918)
1 parent 448fcf7 commit 89c18a9

File tree

7 files changed

+164
-2
lines changed

7 files changed

+164
-2
lines changed

extensions/vscode/src/daemon/dart-frog-daemon.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
* The Dart Frog daemon is a long-running process that is responsible for
33
* managing a single or multiple Dart Frog projects simultaneously.
44
*
5-
* @see {@link https://dartfrog.vgv.dev/docs/advanced/daemon Dart Frog deamon documentation }
5+
* @see {@link https://dartfrog.vgv.dev/docs/advanced/daemon Dart Frog daemon documentation }
66
*/
77
export class DartFrogDaemon {
88
private static _instance: DartFrogDaemon;
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
/**
2+
* Defines the protocol used by the Dart Frog daemon "daemon" domain and custom
3+
* type guards to check if an object is a valid message.
4+
*
5+
* @see {@link https://dartfrog.vgv.dev/docs/advanced/daemon#daemon-domain Dart Frog daemon domain}
6+
*/
7+
8+
import {
9+
DaemonRequest,
10+
DaemonEvent,
11+
isDaemonEvent,
12+
isDaemonRequest,
13+
} from "../protocol";
14+
15+
const domainName = "daemon";
16+
17+
const requestVersionMethodName = `${domainName}.requestVersion`;
18+
19+
export class RequestVersionDaemonRequest extends DaemonRequest {
20+
constructor(id: string) {
21+
super();
22+
this.id = id;
23+
}
24+
25+
public readonly id: string;
26+
public readonly method: string = requestVersionMethodName;
27+
public readonly params: undefined;
28+
}
29+
30+
export function isRequestVersionDaemonRequest(
31+
object: any
32+
): object is RequestVersionDaemonRequest {
33+
return isDaemonRequest(object) && object.method === requestVersionMethodName;
34+
}
35+
36+
const killMethodName = `${domainName}.kill`;
37+
38+
export class KillDaemonRequest extends DaemonRequest {
39+
constructor(id: string) {
40+
super();
41+
this.id = id;
42+
}
43+
44+
public readonly id: string;
45+
public readonly method: string = killMethodName;
46+
public readonly params: undefined;
47+
}
48+
49+
export function isKillDaemonRequest(object: any): object is KillDaemonRequest {
50+
return isDaemonRequest(object) && object.method === killMethodName;
51+
}
52+
53+
const readyEventName = `${domainName}.ready`;
54+
55+
export interface ReadyDaemonEvent extends DaemonEvent {
56+
event: string;
57+
params: {
58+
version: string;
59+
processId: number;
60+
};
61+
}
62+
63+
export function isReadyDaemonEvent(object: any): object is ReadyDaemonEvent {
64+
return (
65+
isDaemonEvent(object) &&
66+
object.event === readyEventName &&
67+
typeof object.params.version === "string" &&
68+
typeof object.params.processId === "number"
69+
);
70+
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export * from "./daemon";
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
export * from "./protocol";
2+
export * from "./domains";
Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
import * as assert from "assert";
2+
import {
3+
DaemonMessage,
4+
KillDaemonRequest,
5+
RequestVersionDaemonRequest,
6+
isKillDaemonRequest,
7+
isReadyDaemonEvent,
8+
isRequestVersionDaemonRequest,
9+
} from "../../../../../daemon";
10+
11+
suite("RequestVersionDaemonRequest", () => {
12+
test("is a valid requestVersion request", () => {
13+
const request = new RequestVersionDaemonRequest("1");
14+
15+
assert.equal(request.id, "1");
16+
assert.equal(request.method, "daemon.requestVersion");
17+
assert.equal(request.params, undefined);
18+
});
19+
});
20+
21+
suite("isRequestVersionDaemonRequest", () => {
22+
test("returns true when it is a RequestVersionDaemonRequest", () => {
23+
const request = Buffer.from(
24+
`[{"method": "daemon.requestVersion", "id": "1"}]\n`,
25+
"utf8"
26+
);
27+
const requestObject = DaemonMessage.decode(request)[0];
28+
assert.equal(isRequestVersionDaemonRequest(requestObject), true);
29+
});
30+
31+
test("returns false when it is not a RequestVersionDaemonRequest", () => {
32+
const request = Buffer.from(
33+
`[{"method": "daemon.notARequestVersion", "id": "1"}]\n`,
34+
"utf8"
35+
);
36+
const requestObject = DaemonMessage.decode(request)[0];
37+
assert.equal(isRequestVersionDaemonRequest(requestObject), false);
38+
});
39+
});
40+
41+
suite("KillDaemonRequest", () => {
42+
test("is a valid kill request", () => {
43+
const request = new KillDaemonRequest("1");
44+
45+
assert.equal(request.id, "1");
46+
assert.equal(request.method, "daemon.kill");
47+
assert.equal(request.params, undefined);
48+
});
49+
});
50+
51+
suite("isKillDaemonRequest", () => {
52+
test("returns true when it is a KillDaemonRequest", () => {
53+
const request = Buffer.from(
54+
`[{"method": "daemon.kill", "id": "1"}]\n`,
55+
"utf8"
56+
);
57+
const requestObject = DaemonMessage.decode(request)[0];
58+
assert.equal(isKillDaemonRequest(requestObject), true);
59+
});
60+
61+
test("returns false when it is not a KillDaemonRequest", () => {
62+
const request = Buffer.from(
63+
`[{"method": "daemon.notAKill", "id": "1"}]\n`,
64+
"utf8"
65+
);
66+
const requestObject = DaemonMessage.decode(request)[0];
67+
assert.equal(isKillDaemonRequest(requestObject), false);
68+
});
69+
});
70+
71+
suite("isReadyDaemonEvent", () => {
72+
test("returns true when it is a KillDaemonRequest", () => {
73+
const event = Buffer.from(
74+
`[{"event":"daemon.ready","params":{"version":"0.0.1","processId":8623}}]\n`,
75+
"utf8"
76+
);
77+
const eventObject = DaemonMessage.decode(event)[0];
78+
assert.equal(isReadyDaemonEvent(eventObject), true);
79+
});
80+
81+
test("returns false when it is not a KillDaemonRequest", () => {
82+
const event = Buffer.from(
83+
`[{"event":"daemon.notAReady","params":{"version":"0.0.1","processId":8623}}]\n`,
84+
"utf8"
85+
);
86+
const eventObject = DaemonMessage.decode(event)[0];
87+
assert.equal(isReadyDaemonEvent(eventObject), false);
88+
});
89+
});

extensions/vscode/src/test/suite/daemon/protocol.test.ts renamed to extensions/vscode/src/test/suite/daemon/protocol/protocol.test.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import {
44
isDaemonEvent,
55
isDaemonRequest,
66
isDaemonResponse,
7-
} from "../../../daemon";
7+
} from "../../../../daemon";
88

99
suite("DaemonMessage", () => {
1010
suite("decode", () => {

0 commit comments

Comments
 (0)