cojson 0.10.2 → 0.10.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.turbo/turbo-build.log +1 -1
- package/CHANGELOG.md +6 -0
- package/dist/PeerState.js.map +1 -1
- package/dist/PriorityBasedMessageQueue.js +7 -54
- package/dist/PriorityBasedMessageQueue.js.map +1 -1
- package/package.json +1 -1
- package/src/PeerState.ts +2 -2
- package/src/PriorityBasedMessageQueue.ts +11 -67
- package/src/tests/PriorityBasedMessageQueue.test.ts +1 -1
package/.turbo/turbo-build.log
CHANGED
package/CHANGELOG.md
CHANGED
package/dist/PeerState.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PeerState.js","sourceRoot":"","sources":["../src/PeerState.ts"],"names":[],"mappings":"AAAA,OAAO,EAAyB,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAC9E,OAAO,EACL,yBAAyB,GAE1B,MAAM,gCAAgC,CAAC;AAGxC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAGlD,MAAM,OAAO,SAAS;IACpB,YACU,IAAU,EAClB,WAAwC;QADhC,SAAI,GAAJ,IAAI,CAAM;QA6BX,mBAAc,GAAiB,IAAI,GAAG,EAAE,CAAC;QAUzC,oBAAe,GAA0C,IAAI,GAAG,EAAE,CAAC;QA0B5E;;;;;WAKG;QACK,UAAK,GAAG,IAAI,yBAAyB,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;QAC9D,eAAU,GAAG,KAAK,CAAC;QACpB,WAAM,GAAG,KAAK,CAAC;QAtEpB,IAAI,CAAC,qBAAqB,GAAG,WAAW,EAAE,KAAK,EAAE,IAAI,IAAI,eAAe,EAAE,CAAC;QAE3E,oEAAoE;QACpE,qFAAqF;QACrF,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YAC5B,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,qBAAqB,CAAC;QAChD,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,WAAW,GAAG,WAAW,EAAE,KAAK,EAAE,IAAI,IAAI,eAAe,EAAE,CAAC;QACnE,CAAC;IACH,CAAC;IAmBD,qBAAqB,CAAC,MAA6B;QACjD,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QAElC,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YAC5B,IAAI,CAAC,qBAAqB,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QAC9C,CAAC;IACH,CAAC;IAID,IAAI,EAAE;QACJ,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;IACtB,CAAC;IAED,IAAI,IAAI;QACN,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;IACxB,CAAC;IAED,IAAI,QAAQ;QACV,OAAO,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC;IAC5B,CAAC;IAED,IAAI,YAAY;QACd,OAAO,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC;IAChC,CAAC;IAED,8BAA8B;QAC5B,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,QAAQ,CAAC;IACrC,CAAC;IAED,qBAAqB;QACnB,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,SAAS,CAAC;IACrE,CAAC;IAYD,KAAK,CAAC,YAAY;QAChB,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACpB,OAAO;QACT,CAAC;QAED,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;QAEvB,IAAI,
|
|
1
|
+
{"version":3,"file":"PeerState.js","sourceRoot":"","sources":["../src/PeerState.ts"],"names":[],"mappings":"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"}
|
|
@@ -12,62 +12,13 @@ function promiseWithResolvers() {
|
|
|
12
12
|
reject,
|
|
13
13
|
};
|
|
14
14
|
}
|
|
15
|
-
class Queue {
|
|
16
|
-
constructor() {
|
|
17
|
-
this.head = undefined;
|
|
18
|
-
this.tail = undefined;
|
|
19
|
-
}
|
|
20
|
-
push(msg) {
|
|
21
|
-
const { promise, resolve, reject } = promiseWithResolvers();
|
|
22
|
-
const entry = {
|
|
23
|
-
msg,
|
|
24
|
-
promise,
|
|
25
|
-
resolve,
|
|
26
|
-
reject,
|
|
27
|
-
next: undefined,
|
|
28
|
-
};
|
|
29
|
-
if (this.head === undefined) {
|
|
30
|
-
this.head = entry;
|
|
31
|
-
}
|
|
32
|
-
else {
|
|
33
|
-
if (this.tail === undefined) {
|
|
34
|
-
throw new Error("Tail is null but head is not");
|
|
35
|
-
}
|
|
36
|
-
this.tail.next = entry;
|
|
37
|
-
}
|
|
38
|
-
this.tail = entry;
|
|
39
|
-
return entry;
|
|
40
|
-
}
|
|
41
|
-
pull() {
|
|
42
|
-
const entry = this.head;
|
|
43
|
-
if (entry) {
|
|
44
|
-
this.head = entry.next;
|
|
45
|
-
}
|
|
46
|
-
if (this.head === undefined) {
|
|
47
|
-
this.tail = undefined;
|
|
48
|
-
}
|
|
49
|
-
return entry;
|
|
50
|
-
}
|
|
51
|
-
isNonEmpty() {
|
|
52
|
-
return this.head !== undefined;
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
15
|
export class PriorityBasedMessageQueue {
|
|
56
16
|
getQueue(priority) {
|
|
57
17
|
return this.queues[priority];
|
|
58
18
|
}
|
|
59
19
|
constructor(defaultPriority) {
|
|
60
20
|
this.defaultPriority = defaultPriority;
|
|
61
|
-
this.queues = [
|
|
62
|
-
new Queue(),
|
|
63
|
-
new Queue(),
|
|
64
|
-
new Queue(),
|
|
65
|
-
new Queue(),
|
|
66
|
-
new Queue(),
|
|
67
|
-
new Queue(),
|
|
68
|
-
new Queue(),
|
|
69
|
-
new Queue(),
|
|
70
|
-
];
|
|
21
|
+
this.queues = [[], [], [], [], [], [], [], []];
|
|
71
22
|
this.queueSizeCounter = metrics
|
|
72
23
|
.getMeter("cojson")
|
|
73
24
|
.createUpDownCounter("jazz.messagequeue.size", {
|
|
@@ -77,22 +28,24 @@ export class PriorityBasedMessageQueue {
|
|
|
77
28
|
});
|
|
78
29
|
}
|
|
79
30
|
push(msg) {
|
|
31
|
+
const { promise, resolve, reject } = promiseWithResolvers();
|
|
32
|
+
const entry = { msg, promise, resolve, reject };
|
|
80
33
|
const priority = "priority" in msg ? msg.priority : this.defaultPriority;
|
|
81
|
-
|
|
34
|
+
this.getQueue(priority).push(entry);
|
|
82
35
|
this.queueSizeCounter.add(1, {
|
|
83
36
|
priority,
|
|
84
37
|
});
|
|
85
|
-
return
|
|
38
|
+
return promise;
|
|
86
39
|
}
|
|
87
40
|
pull() {
|
|
88
|
-
const priority = this.queues.findIndex((queue) => queue.
|
|
41
|
+
const priority = this.queues.findIndex((queue) => queue.length > 0);
|
|
89
42
|
if (priority === -1) {
|
|
90
43
|
return;
|
|
91
44
|
}
|
|
92
45
|
this.queueSizeCounter.add(-1, {
|
|
93
46
|
priority,
|
|
94
47
|
});
|
|
95
|
-
return this.queues[priority]?.
|
|
48
|
+
return this.queues[priority]?.shift();
|
|
96
49
|
}
|
|
97
50
|
}
|
|
98
51
|
//# sourceMappingURL=PriorityBasedMessageQueue.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PriorityBasedMessageQueue.js","sourceRoot":"","sources":["../src/PriorityBasedMessageQueue.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAIxD,SAAS,oBAAoB;IAC3B,IAAI,OAAO,GAAG,CAAC,CAAI,EAAE,EAAE,GAAE,CAAC,CAAC;IAC3B,IAAI,MAAM,GAAG,CAAC,CAAU,EAAE,EAAE,GAAE,CAAC,CAAC;IAEhC,MAAM,OAAO,GAAG,IAAI,OAAO,CAAI,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE;QACnD,OAAO,GAAG,QAAQ,CAAC;QACnB,MAAM,GAAG,OAAO,CAAC;IACnB,CAAC,CAAC,CAAC;IAEH,OAAO;QACL,OAAO;QACP,OAAO;QACP,MAAM;KACP,CAAC;AACJ,CAAC;
|
|
1
|
+
{"version":3,"file":"PriorityBasedMessageQueue.js","sourceRoot":"","sources":["../src/PriorityBasedMessageQueue.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAIxD,SAAS,oBAAoB;IAC3B,IAAI,OAAO,GAAG,CAAC,CAAI,EAAE,EAAE,GAAE,CAAC,CAAC;IAC3B,IAAI,MAAM,GAAG,CAAC,CAAU,EAAE,EAAE,GAAE,CAAC,CAAC;IAEhC,MAAM,OAAO,GAAG,IAAI,OAAO,CAAI,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE;QACnD,OAAO,GAAG,QAAQ,CAAC;QACnB,MAAM,GAAG,OAAO,CAAC;IACnB,CAAC,CAAC,CAAC;IAEH,OAAO;QACL,OAAO;QACP,OAAO;QACP,MAAM;KACP,CAAC;AACJ,CAAC;AAmBD,MAAM,OAAO,yBAAyB;IAU5B,QAAQ,CAAC,QAAyB;QACxC,OAAO,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAC/B,CAAC;IAED,YAAoB,eAAgC;QAAhC,oBAAe,GAAf,eAAe,CAAiB;QAb5C,WAAM,GAAe,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;QAC9D,qBAAgB,GAAG,OAAO;aACvB,QAAQ,CAAC,QAAQ,CAAC;aAClB,mBAAmB,CAAC,wBAAwB,EAAE;YAC7C,WAAW,EAAE,2BAA2B;YACxC,SAAS,EAAE,SAAS,CAAC,GAAG;YACxB,IAAI,EAAE,OAAO;SACd,CAAC,CAAC;IAMkD,CAAC;IAEjD,IAAI,CAAC,GAAgB;QAC1B,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,oBAAoB,EAAQ,CAAC;QAClE,MAAM,KAAK,GAAe,EAAE,GAAG,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;QAE5D,MAAM,QAAQ,GAAG,UAAU,IAAI,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC;QAEzE,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAEpC,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,EAAE;YAC3B,QAAQ;SACT,CAAC,CAAC;QAEH,OAAO,OAAO,CAAC;IACjB,CAAC;IAEM,IAAI;QACT,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAEpE,IAAI,QAAQ,KAAK,CAAC,CAAC,EAAE,CAAC;YACpB,OAAO;QACT,CAAC;QAED,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE;YAC5B,QAAQ;SACT,CAAC,CAAC;QAEH,OAAO,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,KAAK,EAAE,CAAC;IACxC,CAAC;CACF"}
|
package/package.json
CHANGED
package/src/PeerState.ts
CHANGED
|
@@ -93,7 +93,7 @@ export class PeerState {
|
|
|
93
93
|
|
|
94
94
|
this.processing = true;
|
|
95
95
|
|
|
96
|
-
let entry: QueueEntry
|
|
96
|
+
let entry: QueueEntry | undefined;
|
|
97
97
|
while ((entry = this.queue.pull())) {
|
|
98
98
|
// Awaiting the push to send one message at a time
|
|
99
99
|
// This way when the peer is "under pressure" we can enqueue all
|
|
@@ -130,7 +130,7 @@ export class PeerState {
|
|
|
130
130
|
}
|
|
131
131
|
|
|
132
132
|
private closeQueue() {
|
|
133
|
-
let entry: QueueEntry
|
|
133
|
+
let entry: QueueEntry | undefined;
|
|
134
134
|
while ((entry = this.queue.pull())) {
|
|
135
135
|
// Using resolve here to avoid unnecessary noise in the logs
|
|
136
136
|
entry.resolve();
|
|
@@ -18,12 +18,11 @@ function promiseWithResolvers<R>() {
|
|
|
18
18
|
};
|
|
19
19
|
}
|
|
20
20
|
|
|
21
|
-
export type QueueEntry
|
|
22
|
-
msg:
|
|
21
|
+
export type QueueEntry = {
|
|
22
|
+
msg: SyncMessage;
|
|
23
23
|
promise: Promise<void>;
|
|
24
24
|
resolve: () => void;
|
|
25
25
|
reject: (_: unknown) => void;
|
|
26
|
-
next: QueueEntry<V> | undefined;
|
|
27
26
|
};
|
|
28
27
|
|
|
29
28
|
/**
|
|
@@ -34,68 +33,10 @@ type Tuple<T, N extends number, A extends unknown[] = []> = A extends {
|
|
|
34
33
|
}
|
|
35
34
|
? A
|
|
36
35
|
: Tuple<T, N, [...A, T]>;
|
|
37
|
-
type QueueTuple = Tuple<
|
|
38
|
-
|
|
39
|
-
class Queue<V> {
|
|
40
|
-
head: QueueEntry<V> | undefined = undefined;
|
|
41
|
-
tail: QueueEntry<V> | undefined = undefined;
|
|
42
|
-
|
|
43
|
-
push(msg: V) {
|
|
44
|
-
const { promise, resolve, reject } = promiseWithResolvers<void>();
|
|
45
|
-
const entry: QueueEntry<V> = {
|
|
46
|
-
msg,
|
|
47
|
-
promise,
|
|
48
|
-
resolve,
|
|
49
|
-
reject,
|
|
50
|
-
next: undefined,
|
|
51
|
-
};
|
|
52
|
-
|
|
53
|
-
if (this.head === undefined) {
|
|
54
|
-
this.head = entry;
|
|
55
|
-
} else {
|
|
56
|
-
if (this.tail === undefined) {
|
|
57
|
-
throw new Error("Tail is null but head is not");
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
this.tail.next = entry;
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
this.tail = entry;
|
|
64
|
-
|
|
65
|
-
return entry;
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
pull() {
|
|
69
|
-
const entry = this.head;
|
|
70
|
-
|
|
71
|
-
if (entry) {
|
|
72
|
-
this.head = entry.next;
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
if (this.head === undefined) {
|
|
76
|
-
this.tail = undefined;
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
return entry;
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
isNonEmpty() {
|
|
83
|
-
return this.head !== undefined;
|
|
84
|
-
}
|
|
85
|
-
}
|
|
36
|
+
type QueueTuple = Tuple<QueueEntry[], 8>;
|
|
86
37
|
|
|
87
38
|
export class PriorityBasedMessageQueue {
|
|
88
|
-
private queues: QueueTuple = [
|
|
89
|
-
new Queue(),
|
|
90
|
-
new Queue(),
|
|
91
|
-
new Queue(),
|
|
92
|
-
new Queue(),
|
|
93
|
-
new Queue(),
|
|
94
|
-
new Queue(),
|
|
95
|
-
new Queue(),
|
|
96
|
-
new Queue(),
|
|
97
|
-
];
|
|
98
|
-
|
|
39
|
+
private queues: QueueTuple = [[], [], [], [], [], [], [], []];
|
|
99
40
|
queueSizeCounter = metrics
|
|
100
41
|
.getMeter("cojson")
|
|
101
42
|
.createUpDownCounter("jazz.messagequeue.size", {
|
|
@@ -111,19 +52,22 @@ export class PriorityBasedMessageQueue {
|
|
|
111
52
|
constructor(private defaultPriority: CoValuePriority) {}
|
|
112
53
|
|
|
113
54
|
public push(msg: SyncMessage) {
|
|
55
|
+
const { promise, resolve, reject } = promiseWithResolvers<void>();
|
|
56
|
+
const entry: QueueEntry = { msg, promise, resolve, reject };
|
|
57
|
+
|
|
114
58
|
const priority = "priority" in msg ? msg.priority : this.defaultPriority;
|
|
115
59
|
|
|
116
|
-
|
|
60
|
+
this.getQueue(priority).push(entry);
|
|
117
61
|
|
|
118
62
|
this.queueSizeCounter.add(1, {
|
|
119
63
|
priority,
|
|
120
64
|
});
|
|
121
65
|
|
|
122
|
-
return
|
|
66
|
+
return promise;
|
|
123
67
|
}
|
|
124
68
|
|
|
125
69
|
public pull() {
|
|
126
|
-
const priority = this.queues.findIndex((queue) => queue.
|
|
70
|
+
const priority = this.queues.findIndex((queue) => queue.length > 0);
|
|
127
71
|
|
|
128
72
|
if (priority === -1) {
|
|
129
73
|
return;
|
|
@@ -133,6 +77,6 @@ export class PriorityBasedMessageQueue {
|
|
|
133
77
|
priority,
|
|
134
78
|
});
|
|
135
79
|
|
|
136
|
-
return this.queues[priority]?.
|
|
80
|
+
return this.queues[priority]?.shift();
|
|
137
81
|
}
|
|
138
82
|
}
|
|
@@ -22,7 +22,7 @@ describe("PriorityBasedMessageQueue", () => {
|
|
|
22
22
|
const { queue } = setup();
|
|
23
23
|
expect(queue["defaultPriority"]).toBe(CO_VALUE_PRIORITY.MEDIUM);
|
|
24
24
|
expect(queue["queues"].length).toBe(8);
|
|
25
|
-
expect(queue["queues"].every((q) => !q.
|
|
25
|
+
expect(queue["queues"].every((q) => !q.length)).toBe(true);
|
|
26
26
|
});
|
|
27
27
|
|
|
28
28
|
test("should push message with default priority", async () => {
|