Skip to content

Commit 85f0f81

Browse files
authored
feat(vscode): implemented requestIdentifierGenerator for Dart Frog daemon (#929)
1 parent 2ba1179 commit 85f0f81

File tree

4 files changed

+83
-0
lines changed

4 files changed

+83
-0
lines changed

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

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,10 @@ import {
1010
isReadyDaemonEvent,
1111
} from "./protocol";
1212
import { EventEmitter } from "events";
13+
import {
14+
AscendingNumericalIdentifierGenerator,
15+
IdentifierGenerator,
16+
} from "../utils";
1317

1418
/**
1519
* The types of events that are emitted by the {@link DartFrogDaemon}.
@@ -46,6 +50,15 @@ export class DartFrogDaemon {
4650
return this._instance || (this._instance = new this());
4751
}
4852

53+
/**
54+
* Generates unique and valid identifiers for requests.
55+
*
56+
* Should not be used as a request counter, since it is not guaranteed to
57+
* be called the same number of times as the number of requests sent.
58+
*/
59+
public readonly requestIdentifierGenerator: IdentifierGenerator =
60+
new AscendingNumericalIdentifierGenerator();
61+
4962
private daemonMessagesEventEmitter = new EventEmitter();
5063

5164
/**
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
import { AscendingNumericalIdentifierGenerator } from "../../../utils";
2+
import * as assert from "assert";
3+
4+
suite("AscendingNumericalIdentifierGenerator", () => {
5+
suite("generate", () => {
6+
test("generates identifiers in ascending order", () => {
7+
const generator = new AscendingNumericalIdentifierGenerator();
8+
9+
const identifiers = [];
10+
for (let i = 0; i < 100; i++) {
11+
identifiers.push(generator.generate());
12+
}
13+
14+
assert.deepStrictEqual(identifiers, identifiers.sort());
15+
});
16+
17+
test("generates unique identifiers", () => {
18+
const generator = new AscendingNumericalIdentifierGenerator();
19+
20+
const identifiers = [];
21+
for (let i = 0; i < 100; i++) {
22+
identifiers.push(generator.generate());
23+
}
24+
25+
assert.deepStrictEqual(identifiers.length, new Set(identifiers).size);
26+
});
27+
28+
test("generates numerical identifiers", () => {
29+
const generator = new AscendingNumericalIdentifierGenerator();
30+
31+
const identifiers = [];
32+
for (let i = 0; i < 100; i++) {
33+
identifiers.push(generator.generate());
34+
}
35+
36+
assert.equal(
37+
identifiers.every((id) => /^\d+$/.test(id)),
38+
true
39+
);
40+
});
41+
});
42+
});
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
export abstract class IdentifierGenerator {
2+
/**
3+
* Generates a new unique identifier.
4+
*
5+
* @returns A new unique identifier, consecutive calls to this method should
6+
* always return different identifiers.
7+
*/
8+
abstract generate(): string;
9+
}
10+
11+
/**
12+
* Generates incremental identifiers.
13+
*
14+
* @example
15+
* const generator = new AscendingNumericalIdentifierGenerator();
16+
* generator.generate(); // "0"
17+
* generator.generate(); // "1"
18+
*/
19+
export class AscendingNumericalIdentifierGenerator
20+
implements IdentifierGenerator
21+
{
22+
private counter: bigint = 0n;
23+
24+
public generate(): string {
25+
return `${this.counter++}`;
26+
}
27+
}

extensions/vscode/src/utils/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
11
export * from "./cli-version";
22
export * from "./dart-frog-structure";
33
export * from "./suggest-installing-dart-frog-cli";
4+
export * from "./identifier-generator";

0 commit comments

Comments
 (0)