@nativewrappers/common 0.0.136 → 0.0.138
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/BaseScript.d.ts +2 -0
- package/BaseScript.js +10 -0
- package/Command.js +6 -4
- package/GlobalData.d.ts +10 -0
- package/GlobalData.js +18 -0
- package/collections/CircularBuffer.d.ts +18 -0
- package/collections/CircularBuffer.js +92 -0
- package/collections/Stack.d.ts +9 -0
- package/collections/Stack.js +0 -0
- package/decors/Events.js +12 -4
- package/decors/Exports.js +3 -1
- package/decors/Resources.d.ts +10 -2
- package/decors/Resources.js +35 -10
- package/decors/Ticks.js +11 -2
- package/index.d.ts +4 -1
- package/index.js +4 -1
- package/net/NetworkedMap.d.ts +2 -2
- package/net/NetworkedMap.js +13 -1
- package/package.json +1 -1
package/BaseScript.d.ts
ADDED
package/BaseScript.js
ADDED
package/Command.js
CHANGED
|
@@ -14,6 +14,9 @@ function registerCommand(name, commandHandler, restricted = true) {
|
|
|
14
14
|
}
|
|
15
15
|
RegisterCommand(name, commandHandler, GlobalData.IS_CLIENT ? false : !!restricted);
|
|
16
16
|
$SERVER: {
|
|
17
|
+
$CLIENT: {
|
|
18
|
+
if (GlobalData.IS_CLIENT) return;
|
|
19
|
+
}
|
|
17
20
|
const ace = `command.${name}`;
|
|
18
21
|
if (typeof restricted === "string") {
|
|
19
22
|
if (IsPrincipalAceAllowed(restricted, ace)) return;
|
|
@@ -59,13 +62,12 @@ class Command {
|
|
|
59
62
|
const names = Array.isArray(name) ? name : [name];
|
|
60
63
|
for (const name2 of names) {
|
|
61
64
|
const commandObj = { ...this, name: `/${name2}` };
|
|
62
|
-
|
|
65
|
+
if (GlobalData.IS_CLIENT) {
|
|
66
|
+
emit("chat:addSuggestion", commandObj);
|
|
67
|
+
} else {
|
|
63
68
|
commands.push(commandObj);
|
|
64
69
|
emitNet("chat:addSuggestions", -1, commandObj);
|
|
65
70
|
}
|
|
66
|
-
$CLIENT: {
|
|
67
|
-
emit("chat:addSuggestion", commandObj);
|
|
68
|
-
}
|
|
69
71
|
}
|
|
70
72
|
}, 100);
|
|
71
73
|
}
|
package/GlobalData.d.ts
CHANGED
|
@@ -1,3 +1,12 @@
|
|
|
1
|
+
export declare enum ErrorType {
|
|
2
|
+
Event = 0,
|
|
3
|
+
NetEvent = 1,
|
|
4
|
+
Export = 2,
|
|
5
|
+
Nui = 3,
|
|
6
|
+
Tick = 4,
|
|
7
|
+
Immediate = 5
|
|
8
|
+
}
|
|
9
|
+
export type NativeWrapperErrorType = (type: ErrorType, err: Error) => void;
|
|
1
10
|
export declare class GlobalData {
|
|
2
11
|
static CurrentResource: string;
|
|
3
12
|
static GameName: string;
|
|
@@ -9,4 +18,5 @@ export declare class GlobalData {
|
|
|
9
18
|
static NetworkTick: number | null;
|
|
10
19
|
static NetworkedTicks: any[];
|
|
11
20
|
static EnablePrettyPrint: boolean;
|
|
21
|
+
static OnError: (type: ErrorType, err: Error) => void;
|
|
12
22
|
}
|
package/GlobalData.js
CHANGED
|
@@ -1,5 +1,16 @@
|
|
|
1
1
|
var __defProp = Object.defineProperty;
|
|
2
2
|
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
|
|
3
|
+
var ErrorType = /* @__PURE__ */ ((ErrorType2) => {
|
|
4
|
+
ErrorType2[ErrorType2["Event"] = 0] = "Event";
|
|
5
|
+
ErrorType2[ErrorType2["NetEvent"] = 1] = "NetEvent";
|
|
6
|
+
ErrorType2[ErrorType2["Export"] = 2] = "Export";
|
|
7
|
+
ErrorType2[ErrorType2["Nui"] = 3] = "Nui";
|
|
8
|
+
ErrorType2[ErrorType2["Tick"] = 4] = "Tick";
|
|
9
|
+
ErrorType2[ErrorType2["Immediate"] = 5] = "Immediate";
|
|
10
|
+
return ErrorType2;
|
|
11
|
+
})(ErrorType || {});
|
|
12
|
+
globalThis.OnError = (type, err) => {
|
|
13
|
+
};
|
|
3
14
|
class GlobalData {
|
|
4
15
|
static {
|
|
5
16
|
__name(this, "GlobalData");
|
|
@@ -14,7 +25,14 @@ class GlobalData {
|
|
|
14
25
|
static NetworkTick = null;
|
|
15
26
|
static NetworkedTicks = [];
|
|
16
27
|
static EnablePrettyPrint = true;
|
|
28
|
+
/*
|
|
29
|
+
* Called when one of the decors errors
|
|
30
|
+
*/
|
|
31
|
+
static OnError = /* @__PURE__ */ __name((type, err) => {
|
|
32
|
+
globalThis.OnError(type, err);
|
|
33
|
+
}, "OnError");
|
|
17
34
|
}
|
|
18
35
|
export {
|
|
36
|
+
ErrorType,
|
|
19
37
|
GlobalData
|
|
20
38
|
};
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export declare class CircularBuffer<T> {
|
|
2
|
+
private buffer;
|
|
3
|
+
private tail;
|
|
4
|
+
private count;
|
|
5
|
+
private max_size;
|
|
6
|
+
constructor(max_size: number);
|
|
7
|
+
push(item: T): void;
|
|
8
|
+
pop(): T | undefined;
|
|
9
|
+
peek(): T | undefined;
|
|
10
|
+
[Symbol.iterator](): Iterator<T>;
|
|
11
|
+
for_each(callback: (item: T, index: number) => void): void;
|
|
12
|
+
average(this: CircularBuffer<number>): number;
|
|
13
|
+
is_empty(): boolean;
|
|
14
|
+
is_full(): boolean;
|
|
15
|
+
size(): number;
|
|
16
|
+
capacity(): number;
|
|
17
|
+
clear(): void;
|
|
18
|
+
}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
var __defProp = Object.defineProperty;
|
|
2
|
+
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
|
|
3
|
+
class CircularBuffer {
|
|
4
|
+
static {
|
|
5
|
+
__name(this, "CircularBuffer");
|
|
6
|
+
}
|
|
7
|
+
buffer;
|
|
8
|
+
tail = 0;
|
|
9
|
+
count = 0;
|
|
10
|
+
max_size;
|
|
11
|
+
constructor(max_size) {
|
|
12
|
+
if (max_size <= 0) {
|
|
13
|
+
throw new Error("Buffer size must be greater than 0");
|
|
14
|
+
}
|
|
15
|
+
this.max_size = max_size;
|
|
16
|
+
this.buffer = new Array(max_size);
|
|
17
|
+
}
|
|
18
|
+
push(item) {
|
|
19
|
+
this.buffer[this.tail] = item;
|
|
20
|
+
this.tail++;
|
|
21
|
+
if (this.tail >= this.max_size) {
|
|
22
|
+
this.tail = 0;
|
|
23
|
+
}
|
|
24
|
+
if (this.count < this.max_size) {
|
|
25
|
+
this.count++;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
pop() {
|
|
29
|
+
if (this.is_empty()) {
|
|
30
|
+
return void 0;
|
|
31
|
+
}
|
|
32
|
+
this.tail--;
|
|
33
|
+
if (this.tail < 0) {
|
|
34
|
+
this.tail = this.max_size - 1;
|
|
35
|
+
}
|
|
36
|
+
const item = this.buffer[this.tail];
|
|
37
|
+
this.buffer[this.tail] = void 0;
|
|
38
|
+
this.count--;
|
|
39
|
+
return item;
|
|
40
|
+
}
|
|
41
|
+
peek() {
|
|
42
|
+
if (this.is_empty()) {
|
|
43
|
+
return void 0;
|
|
44
|
+
}
|
|
45
|
+
let peek_index = this.tail - 1;
|
|
46
|
+
if (peek_index < 0) {
|
|
47
|
+
peek_index = this.max_size - 1;
|
|
48
|
+
}
|
|
49
|
+
return this.buffer[peek_index];
|
|
50
|
+
}
|
|
51
|
+
*[Symbol.iterator]() {
|
|
52
|
+
for (let i = 0; i < this.count; i++) {
|
|
53
|
+
yield this.buffer[i];
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
for_each(callback) {
|
|
57
|
+
let i = 0;
|
|
58
|
+
for (const item of this) {
|
|
59
|
+
callback(item, i++);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
average() {
|
|
63
|
+
if (this.is_empty()) {
|
|
64
|
+
return 0;
|
|
65
|
+
}
|
|
66
|
+
let sum = 0;
|
|
67
|
+
for (const item of this) {
|
|
68
|
+
sum += item;
|
|
69
|
+
}
|
|
70
|
+
return sum / this.count;
|
|
71
|
+
}
|
|
72
|
+
is_empty() {
|
|
73
|
+
return this.count === 0;
|
|
74
|
+
}
|
|
75
|
+
is_full() {
|
|
76
|
+
return this.count === this.max_size;
|
|
77
|
+
}
|
|
78
|
+
size() {
|
|
79
|
+
return this.count;
|
|
80
|
+
}
|
|
81
|
+
capacity() {
|
|
82
|
+
return this.max_size;
|
|
83
|
+
}
|
|
84
|
+
clear() {
|
|
85
|
+
this.buffer = new Array(this.max_size);
|
|
86
|
+
this.tail = 0;
|
|
87
|
+
this.count = 0;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
export {
|
|
91
|
+
CircularBuffer
|
|
92
|
+
};
|
|
File without changes
|
package/decors/Events.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
var __defProp = Object.defineProperty;
|
|
2
2
|
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
|
|
3
|
-
import { GlobalData } from "../GlobalData";
|
|
3
|
+
import { ErrorType, GlobalData } from "../GlobalData";
|
|
4
4
|
const DisablePrettyPrint = /* @__PURE__ */ __name(() => GlobalData.EnablePrettyPrint = false, "DisablePrettyPrint");
|
|
5
5
|
const AsyncFunction = (async () => {
|
|
6
6
|
}).constructor;
|
|
@@ -14,12 +14,13 @@ function OnEvent(eventName) {
|
|
|
14
14
|
try {
|
|
15
15
|
return await originalMethod.call(this, ...args);
|
|
16
16
|
} catch (e) {
|
|
17
|
+
GlobalData.OnError(ErrorType.Event, e);
|
|
17
18
|
REMOVE_EVENT_LOG: {
|
|
18
19
|
if (!GlobalData.EnablePrettyPrint) return;
|
|
19
20
|
console.error("------- EVENT ERROR --------");
|
|
20
21
|
console.error(`Call to ${eventName} errored`);
|
|
21
22
|
console.error(`Data: ${JSON.stringify(args)}`);
|
|
22
|
-
|
|
23
|
+
globalThis.printError("event", e);
|
|
23
24
|
console.error("------- END EVENT ERROR --------");
|
|
24
25
|
}
|
|
25
26
|
}
|
|
@@ -62,13 +63,14 @@ function OnNetEvent(eventName, remoteOnly = true) {
|
|
|
62
63
|
}
|
|
63
64
|
return await originalMethod.call(this, ...args);
|
|
64
65
|
} catch (e) {
|
|
66
|
+
GlobalData.OnError(ErrorType.NetEvent, e);
|
|
65
67
|
REMOVE_NET_EVENT_LOG: {
|
|
66
68
|
if (!GlobalData.EnablePrettyPrint) return;
|
|
67
69
|
console.error("------- NET EVENT ERROR --------");
|
|
68
70
|
console.error(`Call to ${eventName} errored`);
|
|
69
71
|
console.error(`Caller: ${src}`);
|
|
70
72
|
console.error(`Data: ${JSON.stringify(args)}`);
|
|
71
|
-
|
|
73
|
+
globalThis.printError("net event", e);
|
|
72
74
|
console.error("------- END NET EVENT ERROR --------");
|
|
73
75
|
}
|
|
74
76
|
}
|
|
@@ -90,7 +92,13 @@ function OnNuiEvent(eventName, dontErrorWhenCbIsntInvoked = false) {
|
|
|
90
92
|
wasInvoked = true;
|
|
91
93
|
cb(args);
|
|
92
94
|
}, "cbWrapper");
|
|
93
|
-
|
|
95
|
+
let retData;
|
|
96
|
+
try {
|
|
97
|
+
retData = await originalMethod.call(this, data, cbWrapper);
|
|
98
|
+
} catch (e) {
|
|
99
|
+
GlobalData.OnError(ErrorType.Nui, e);
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
94
102
|
if (!wasInvoked && !retData) {
|
|
95
103
|
if (dontErrorWhenCbIsntInvoked) return;
|
|
96
104
|
throw new Error(
|
package/decors/Exports.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
var __defProp = Object.defineProperty;
|
|
2
2
|
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
|
|
3
|
-
import { GlobalData } from "../GlobalData";
|
|
3
|
+
import { ErrorType, GlobalData } from "../GlobalData";
|
|
4
4
|
const AsyncFunction = (async () => {
|
|
5
5
|
}).constructor;
|
|
6
6
|
function Exports(exportName) {
|
|
@@ -15,6 +15,7 @@ function Exports(exportName) {
|
|
|
15
15
|
try {
|
|
16
16
|
return await originalMethod.call(this, ...args);
|
|
17
17
|
} catch (err) {
|
|
18
|
+
GlobalData.OnError(ErrorType.Export, err);
|
|
18
19
|
REMOVE_EVENT_LOG: {
|
|
19
20
|
if (!GlobalData.EnablePrettyPrint) return;
|
|
20
21
|
console.error("------- EXPORT ERROR --------");
|
|
@@ -31,6 +32,7 @@ function Exports(exportName) {
|
|
|
31
32
|
try {
|
|
32
33
|
return originalMethod.call(this, ...args);
|
|
33
34
|
} catch (err) {
|
|
35
|
+
GlobalData.OnError(ErrorType.Export, err);
|
|
34
36
|
REMOVE_EVENT_LOG: {
|
|
35
37
|
if (!GlobalData.EnablePrettyPrint) return;
|
|
36
38
|
console.error("------- EXPORT ERROR --------");
|
package/decors/Resources.d.ts
CHANGED
|
@@ -1,8 +1,16 @@
|
|
|
1
|
+
type ResourceName = string;
|
|
2
|
+
type ResourceOrGlobal = ResourceName | "global";
|
|
3
|
+
export declare const EnsureResourceWrapperInit: () => void;
|
|
1
4
|
/**
|
|
2
5
|
* Called whenever the specified resource is started, this will be called once on once on resource start if the resource is started.
|
|
6
|
+
* NOTE: If you want to listen to *all* resource start/stop events you should send
|
|
7
|
+
* {@link resource} as "global"
|
|
3
8
|
*/
|
|
4
|
-
export declare function OnResourceStart(resource?:
|
|
9
|
+
export declare function OnResourceStart(resource?: ResourceOrGlobal): (originalMethod: any, context: ClassMethodDecoratorContext) => void;
|
|
5
10
|
/**
|
|
6
11
|
* Called whenever the specified resource is stopped.
|
|
12
|
+
* NOTE: If you want to listen to *all* resource start/stop events you should send
|
|
13
|
+
* {@link resource} as "global"
|
|
7
14
|
*/
|
|
8
|
-
export declare function OnResourceStop(resource?:
|
|
15
|
+
export declare function OnResourceStop(resource?: ResourceOrGlobal): (originalMethod: any, context: ClassMethodDecoratorContext) => void;
|
|
16
|
+
export {};
|
package/decors/Resources.js
CHANGED
|
@@ -7,6 +7,10 @@ class ResourceWrapper {
|
|
|
7
7
|
}
|
|
8
8
|
#on_resource_start = /* @__PURE__ */ new Map();
|
|
9
9
|
#on_resource_stop = /* @__PURE__ */ new Map();
|
|
10
|
+
// used for global resource/start/stops, callers have to define their listener
|
|
11
|
+
// as "global"
|
|
12
|
+
#global_on_resource_start = [];
|
|
13
|
+
#global_on_resource_stop = [];
|
|
10
14
|
#add_or_init(resource_fn_map, resource_name, fn) {
|
|
11
15
|
const fn_array = resource_fn_map.get(resource_name);
|
|
12
16
|
if (fn_array) {
|
|
@@ -21,7 +25,11 @@ class ResourceWrapper {
|
|
|
21
25
|
* @param fn The function to call
|
|
22
26
|
*/
|
|
23
27
|
add_to_resource_start(resource_name, fn) {
|
|
24
|
-
|
|
28
|
+
if (resource_name === "global") {
|
|
29
|
+
this.#global_on_resource_start.push(fn);
|
|
30
|
+
} else {
|
|
31
|
+
this.#add_or_init(this.#on_resource_start, resource_name, fn);
|
|
32
|
+
}
|
|
25
33
|
}
|
|
26
34
|
/**
|
|
27
35
|
* Adds a function to get called whenever a resource is stopped
|
|
@@ -29,31 +37,47 @@ class ResourceWrapper {
|
|
|
29
37
|
* @param fn The function to call
|
|
30
38
|
*/
|
|
31
39
|
add_to_resource_stop(resource_name, fn) {
|
|
32
|
-
|
|
40
|
+
if (resource_name === "global") {
|
|
41
|
+
this.#global_on_resource_stop.push(fn);
|
|
42
|
+
} else {
|
|
43
|
+
this.#add_or_init(this.#on_resource_stop, resource_name, fn);
|
|
44
|
+
}
|
|
33
45
|
}
|
|
34
|
-
#call_for_resource(resource_fn_map, resource_name) {
|
|
46
|
+
#call_for_resource(resource_fn_map, global_array, resource_name) {
|
|
35
47
|
const functions = resource_fn_map.get(resource_name);
|
|
36
48
|
if (functions) {
|
|
37
49
|
for (const fn of functions) {
|
|
38
|
-
|
|
50
|
+
try {
|
|
51
|
+
fn(resource_name);
|
|
52
|
+
} catch (e) {
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
for (const fn of global_array) {
|
|
57
|
+
try {
|
|
58
|
+
fn(resource_name);
|
|
59
|
+
} catch (e) {
|
|
39
60
|
}
|
|
40
61
|
}
|
|
41
62
|
}
|
|
42
63
|
@Event("onResourceStart")
|
|
43
64
|
on_resource_start(resource_name) {
|
|
44
|
-
this.#call_for_resource(this.#on_resource_start, resource_name);
|
|
65
|
+
this.#call_for_resource(this.#on_resource_start, this.#global_on_resource_start, resource_name);
|
|
45
66
|
}
|
|
46
67
|
@Event("onResourceStop")
|
|
47
68
|
on_resource_stop(resource_name) {
|
|
48
|
-
this.#call_for_resource(this.#on_resource_stop, resource_name);
|
|
69
|
+
this.#call_for_resource(this.#on_resource_stop, this.#global_on_resource_stop, resource_name);
|
|
49
70
|
}
|
|
50
71
|
}
|
|
51
|
-
|
|
52
|
-
globalThis.RESOURCE_WRAPPER
|
|
53
|
-
|
|
72
|
+
const EnsureResourceWrapperInit = /* @__PURE__ */ __name(() => {
|
|
73
|
+
if (!globalThis.RESOURCE_WRAPPER) {
|
|
74
|
+
globalThis.RESOURCE_WRAPPER = new ResourceWrapper();
|
|
75
|
+
}
|
|
76
|
+
}, "EnsureResourceWrapperInit");
|
|
77
|
+
EnsureResourceWrapperInit();
|
|
54
78
|
const RESOURCE_WRAPPER = globalThis.RESOURCE_WRAPPER;
|
|
55
79
|
const onResourceStart = /* @__PURE__ */ __name((resource, originalMethod) => {
|
|
56
|
-
if (GetResourceState(resource) === "started") {
|
|
80
|
+
if (resource !== "global" && GetResourceState(resource) === "started") {
|
|
57
81
|
setImmediate(() => originalMethod.call());
|
|
58
82
|
}
|
|
59
83
|
RESOURCE_WRAPPER.add_to_resource_start(resource, originalMethod);
|
|
@@ -89,6 +113,7 @@ function OnResourceStop(resource = GetCurrentResourceName()) {
|
|
|
89
113
|
}
|
|
90
114
|
__name(OnResourceStop, "OnResourceStop");
|
|
91
115
|
export {
|
|
116
|
+
EnsureResourceWrapperInit,
|
|
92
117
|
OnResourceStart,
|
|
93
118
|
OnResourceStop
|
|
94
119
|
};
|
package/decors/Ticks.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
var __defProp = Object.defineProperty;
|
|
2
2
|
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
|
|
3
|
+
import { ErrorType, GlobalData } from "../GlobalData";
|
|
3
4
|
function SetTick() {
|
|
4
5
|
return /* @__PURE__ */ __name(function actualDecorator(originalMethod, context) {
|
|
5
6
|
if (context.private) {
|
|
@@ -7,7 +8,11 @@ function SetTick() {
|
|
|
7
8
|
}
|
|
8
9
|
context.addInitializer(function() {
|
|
9
10
|
setTick(async () => {
|
|
10
|
-
|
|
11
|
+
try {
|
|
12
|
+
await originalMethod.call(this);
|
|
13
|
+
} catch (e) {
|
|
14
|
+
GlobalData.OnError(ErrorType.Tick, e);
|
|
15
|
+
}
|
|
11
16
|
});
|
|
12
17
|
});
|
|
13
18
|
}, "actualDecorator");
|
|
@@ -20,7 +25,11 @@ function SetImmediate() {
|
|
|
20
25
|
}
|
|
21
26
|
context.addInitializer(function() {
|
|
22
27
|
setImmediate(async () => {
|
|
23
|
-
|
|
28
|
+
try {
|
|
29
|
+
await originalMethod.call(this);
|
|
30
|
+
} catch (e) {
|
|
31
|
+
GlobalData.OnError(ErrorType.Immediate, e);
|
|
32
|
+
}
|
|
24
33
|
});
|
|
25
34
|
});
|
|
26
35
|
}, "actualDecorator");
|
package/index.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
export * from "./BaseScript";
|
|
1
2
|
export * from "./Command";
|
|
2
3
|
export * from "./Convar";
|
|
3
4
|
export * from "./GlobalData";
|
|
@@ -23,4 +24,6 @@ export * from "./decors/Events";
|
|
|
23
24
|
export * from "./decors/Exports";
|
|
24
25
|
export * from "./decors/Permissions";
|
|
25
26
|
export * from "./decors/Resources";
|
|
26
|
-
export * from "./decors/Ticks";
|
|
27
|
+
export * from "./decors/Ticks";
|
|
28
|
+
export * from "./collections/CircularBuffer";
|
|
29
|
+
export * from "./collections/Stack";
|
package/index.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
export * from "./BaseScript";
|
|
1
2
|
export * from "./Command";
|
|
2
3
|
export * from "./Convar";
|
|
3
4
|
export * from "./GlobalData";
|
|
@@ -23,4 +24,6 @@ export * from "./decors/Events";
|
|
|
23
24
|
export * from "./decors/Exports";
|
|
24
25
|
export * from "./decors/Permissions";
|
|
25
26
|
export * from "./decors/Resources";
|
|
26
|
-
export * from "./decors/Ticks";
|
|
27
|
+
export * from "./decors/Ticks";
|
|
28
|
+
export * from "./collections/CircularBuffer";
|
|
29
|
+
export * from "./collections/Stack";
|
package/net/NetworkedMap.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
type ChangeListener<V> = (value: V) => void;
|
|
1
|
+
type ChangeListener<V> = (value: V | undefined) => void;
|
|
2
2
|
/**
|
|
3
3
|
* not ready to be used just thoughts right now
|
|
4
4
|
*/
|
|
@@ -13,7 +13,7 @@ export declare class NetworkedMap<K, V> extends Map<K, V> {
|
|
|
13
13
|
hasSubscriber(sub: number): boolean;
|
|
14
14
|
subscriberCount(): number;
|
|
15
15
|
private handleSync;
|
|
16
|
-
listenForChange(key: K, fn: ChangeListener<V>): void;
|
|
16
|
+
listenForChange(key: K, fn: ChangeListener<V | undefined>): void;
|
|
17
17
|
set(key: K, value: V): this;
|
|
18
18
|
clear(): void;
|
|
19
19
|
delete(key: K): boolean;
|
package/net/NetworkedMap.js
CHANGED
|
@@ -76,7 +76,10 @@ class NetworkedMap extends Map {
|
|
|
76
76
|
console.error(`[NetworkedMap:resync] Tried to call resync on a source that wasn't already subscribed`);
|
|
77
77
|
return;
|
|
78
78
|
}
|
|
79
|
-
const packed_data = msgpack_pack([
|
|
79
|
+
const packed_data = msgpack_pack([
|
|
80
|
+
this.#syncName,
|
|
81
|
+
[[5 /* Resync */, this.size === 0 ? [] : Array.from(this)]]
|
|
82
|
+
]);
|
|
80
83
|
TriggerClientEventInternal(
|
|
81
84
|
`${GlobalData.CurrentResource}:syncChanges`,
|
|
82
85
|
source2,
|
|
@@ -115,6 +118,13 @@ class NetworkedMap extends Map {
|
|
|
115
118
|
super.clear();
|
|
116
119
|
continue;
|
|
117
120
|
}
|
|
121
|
+
case 5 /* Resync */: {
|
|
122
|
+
for (const [, v] of this.#changeListeners) {
|
|
123
|
+
for (const fn of v) {
|
|
124
|
+
fn(void 0);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
}
|
|
118
128
|
case 4 /* Init */: {
|
|
119
129
|
super.clear();
|
|
120
130
|
const key_value = key;
|
|
@@ -134,6 +144,8 @@ class NetworkedMap extends Map {
|
|
|
134
144
|
/*
|
|
135
145
|
* Listens for the change on the specified key, it will get the resulting
|
|
136
146
|
* value on the change
|
|
147
|
+
* NOTE: When the server calls `resync` this will get ran with `undefined` for
|
|
148
|
+
* every change listener.
|
|
137
149
|
*/
|
|
138
150
|
listenForChange(key, fn) {
|
|
139
151
|
const listener = this.#changeListeners.get(key);
|