@matter/nodejs 0.11.0-alpha.0-20241005-e3e4e4a7a
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/LICENSE +201 -0
- package/README.md +1 -0
- package/dist/cjs/behavior/index.d.ts +7 -0
- package/dist/cjs/behavior/index.d.ts.map +1 -0
- package/dist/cjs/behavior/index.js +8 -0
- package/dist/cjs/behavior/index.js.map +6 -0
- package/dist/cjs/behavior/instrumentation.d.ts +11 -0
- package/dist/cjs/behavior/instrumentation.d.ts.map +1 -0
- package/dist/cjs/behavior/instrumentation.js +47 -0
- package/dist/cjs/behavior/instrumentation.js.map +6 -0
- package/dist/cjs/behavior/register.d.ts +7 -0
- package/dist/cjs/behavior/register.d.ts.map +1 -0
- package/dist/cjs/behavior/register.js +9 -0
- package/dist/cjs/behavior/register.js.map +6 -0
- package/dist/cjs/crypto/NodeJsCrypto.d.ts +29 -0
- package/dist/cjs/crypto/NodeJsCrypto.d.ts.map +1 -0
- package/dist/cjs/crypto/NodeJsCrypto.js +154 -0
- package/dist/cjs/crypto/NodeJsCrypto.js.map +6 -0
- package/dist/cjs/crypto/index.d.ts +8 -0
- package/dist/cjs/crypto/index.d.ts.map +1 -0
- package/dist/cjs/crypto/index.js +25 -0
- package/dist/cjs/crypto/index.js.map +6 -0
- package/dist/cjs/crypto/register.d.ts +7 -0
- package/dist/cjs/crypto/register.d.ts.map +1 -0
- package/dist/cjs/crypto/register.js +21 -0
- package/dist/cjs/crypto/register.js.map +6 -0
- package/dist/cjs/environment/NodeJsActionTracer.d.ts +15 -0
- package/dist/cjs/environment/NodeJsActionTracer.d.ts.map +1 -0
- package/dist/cjs/environment/NodeJsActionTracer.js +80 -0
- package/dist/cjs/environment/NodeJsActionTracer.js.map +6 -0
- package/dist/cjs/environment/NodeJsEnvironment.d.ts +55 -0
- package/dist/cjs/environment/NodeJsEnvironment.d.ts.map +1 -0
- package/dist/cjs/environment/NodeJsEnvironment.js +121 -0
- package/dist/cjs/environment/NodeJsEnvironment.js.map +6 -0
- package/dist/cjs/environment/ProcessManager.d.ts +45 -0
- package/dist/cjs/environment/ProcessManager.d.ts.map +1 -0
- package/dist/cjs/environment/ProcessManager.js +112 -0
- package/dist/cjs/environment/ProcessManager.js.map +6 -0
- package/dist/cjs/environment/index.d.ts +10 -0
- package/dist/cjs/environment/index.d.ts.map +1 -0
- package/dist/cjs/environment/index.js +27 -0
- package/dist/cjs/environment/index.js.map +6 -0
- package/dist/cjs/environment/register.d.ts +7 -0
- package/dist/cjs/environment/register.d.ts.map +1 -0
- package/dist/cjs/environment/register.js +10 -0
- package/dist/cjs/environment/register.js.map +6 -0
- package/dist/cjs/index.d.ts +12 -0
- package/dist/cjs/index.d.ts.map +1 -0
- package/dist/cjs/index.js +29 -0
- package/dist/cjs/index.js.map +6 -0
- package/dist/cjs/log/FileLogger.d.ts +13 -0
- package/dist/cjs/log/FileLogger.d.ts.map +1 -0
- package/dist/cjs/log/FileLogger.js +46 -0
- package/dist/cjs/log/FileLogger.js.map +6 -0
- package/dist/cjs/log/index.d.ts +7 -0
- package/dist/cjs/log/index.d.ts.map +1 -0
- package/dist/cjs/log/index.js +24 -0
- package/dist/cjs/log/index.js.map +6 -0
- package/dist/cjs/net/NodeJsNetwork.d.ts +27 -0
- package/dist/cjs/net/NodeJsNetwork.d.ts.map +1 -0
- package/dist/cjs/net/NodeJsNetwork.js +145 -0
- package/dist/cjs/net/NodeJsNetwork.js.map +6 -0
- package/dist/cjs/net/NodeJsUdpChannel.d.ts +23 -0
- package/dist/cjs/net/NodeJsUdpChannel.d.ts.map +1 -0
- package/dist/cjs/net/NodeJsUdpChannel.js +181 -0
- package/dist/cjs/net/NodeJsUdpChannel.js.map +6 -0
- package/dist/cjs/net/index.d.ts +9 -0
- package/dist/cjs/net/index.d.ts.map +1 -0
- package/dist/cjs/net/index.js +26 -0
- package/dist/cjs/net/index.js.map +6 -0
- package/dist/cjs/net/register.d.ts +7 -0
- package/dist/cjs/net/register.d.ts.map +1 -0
- package/dist/cjs/net/register.js +16 -0
- package/dist/cjs/net/register.js.map +6 -0
- package/dist/cjs/package.json +11 -0
- package/dist/cjs/storage/StorageBackendDisk.d.ts +27 -0
- package/dist/cjs/storage/StorageBackendDisk.d.ts.map +1 -0
- package/dist/cjs/storage/StorageBackendDisk.js +128 -0
- package/dist/cjs/storage/StorageBackendDisk.js.map +6 -0
- package/dist/cjs/storage/StorageBackendJsonFile.d.ts +27 -0
- package/dist/cjs/storage/StorageBackendJsonFile.d.ts.map +1 -0
- package/dist/cjs/storage/StorageBackendJsonFile.js +110 -0
- package/dist/cjs/storage/StorageBackendJsonFile.js.map +6 -0
- package/dist/cjs/storage/index.d.ts +8 -0
- package/dist/cjs/storage/index.d.ts.map +1 -0
- package/dist/cjs/storage/index.js +25 -0
- package/dist/cjs/storage/index.js.map +6 -0
- package/dist/cjs/tsconfig.tsbuildinfo +1 -0
- package/dist/esm/behavior/index.d.ts +7 -0
- package/dist/esm/behavior/index.d.ts.map +1 -0
- package/dist/esm/behavior/index.js +7 -0
- package/dist/esm/behavior/index.js.map +6 -0
- package/dist/esm/behavior/instrumentation.d.ts +11 -0
- package/dist/esm/behavior/instrumentation.d.ts.map +1 -0
- package/dist/esm/behavior/instrumentation.js +27 -0
- package/dist/esm/behavior/instrumentation.js.map +6 -0
- package/dist/esm/behavior/register.d.ts +7 -0
- package/dist/esm/behavior/register.d.ts.map +1 -0
- package/dist/esm/behavior/register.js +8 -0
- package/dist/esm/behavior/register.js.map +6 -0
- package/dist/esm/crypto/NodeJsCrypto.d.ts +29 -0
- package/dist/esm/crypto/NodeJsCrypto.d.ts.map +1 -0
- package/dist/esm/crypto/NodeJsCrypto.js +135 -0
- package/dist/esm/crypto/NodeJsCrypto.js.map +6 -0
- package/dist/esm/crypto/index.d.ts +8 -0
- package/dist/esm/crypto/index.d.ts.map +1 -0
- package/dist/esm/crypto/index.js +8 -0
- package/dist/esm/crypto/index.js.map +6 -0
- package/dist/esm/crypto/register.d.ts +7 -0
- package/dist/esm/crypto/register.d.ts.map +1 -0
- package/dist/esm/crypto/register.js +20 -0
- package/dist/esm/crypto/register.js.map +6 -0
- package/dist/esm/environment/NodeJsActionTracer.d.ts +15 -0
- package/dist/esm/environment/NodeJsActionTracer.d.ts.map +1 -0
- package/dist/esm/environment/NodeJsActionTracer.js +60 -0
- package/dist/esm/environment/NodeJsActionTracer.js.map +6 -0
- package/dist/esm/environment/NodeJsEnvironment.d.ts +55 -0
- package/dist/esm/environment/NodeJsEnvironment.d.ts.map +1 -0
- package/dist/esm/environment/NodeJsEnvironment.js +108 -0
- package/dist/esm/environment/NodeJsEnvironment.js.map +6 -0
- package/dist/esm/environment/ProcessManager.d.ts +45 -0
- package/dist/esm/environment/ProcessManager.d.ts.map +1 -0
- package/dist/esm/environment/ProcessManager.js +92 -0
- package/dist/esm/environment/ProcessManager.js.map +6 -0
- package/dist/esm/environment/index.d.ts +10 -0
- package/dist/esm/environment/index.d.ts.map +1 -0
- package/dist/esm/environment/index.js +10 -0
- package/dist/esm/environment/index.js.map +6 -0
- package/dist/esm/environment/register.d.ts +7 -0
- package/dist/esm/environment/register.d.ts.map +1 -0
- package/dist/esm/environment/register.js +9 -0
- package/dist/esm/environment/register.js.map +6 -0
- package/dist/esm/index.d.ts +12 -0
- package/dist/esm/index.d.ts.map +1 -0
- package/dist/esm/index.js +12 -0
- package/dist/esm/index.js.map +6 -0
- package/dist/esm/log/FileLogger.d.ts +13 -0
- package/dist/esm/log/FileLogger.d.ts.map +1 -0
- package/dist/esm/log/FileLogger.js +26 -0
- package/dist/esm/log/FileLogger.js.map +6 -0
- package/dist/esm/log/index.d.ts +7 -0
- package/dist/esm/log/index.d.ts.map +1 -0
- package/dist/esm/log/index.js +7 -0
- package/dist/esm/log/index.js.map +6 -0
- package/dist/esm/net/NodeJsNetwork.d.ts +27 -0
- package/dist/esm/net/NodeJsNetwork.d.ts.map +1 -0
- package/dist/esm/net/NodeJsNetwork.js +133 -0
- package/dist/esm/net/NodeJsNetwork.js.map +6 -0
- package/dist/esm/net/NodeJsUdpChannel.d.ts +23 -0
- package/dist/esm/net/NodeJsUdpChannel.d.ts.map +1 -0
- package/dist/esm/net/NodeJsUdpChannel.js +159 -0
- package/dist/esm/net/NodeJsUdpChannel.js.map +6 -0
- package/dist/esm/net/index.d.ts +9 -0
- package/dist/esm/net/index.d.ts.map +1 -0
- package/dist/esm/net/index.js +9 -0
- package/dist/esm/net/index.js.map +6 -0
- package/dist/esm/net/register.d.ts +7 -0
- package/dist/esm/net/register.d.ts.map +1 -0
- package/dist/esm/net/register.js +15 -0
- package/dist/esm/net/register.js.map +6 -0
- package/dist/esm/package.json +11 -0
- package/dist/esm/storage/StorageBackendDisk.d.ts +27 -0
- package/dist/esm/storage/StorageBackendDisk.d.ts.map +1 -0
- package/dist/esm/storage/StorageBackendDisk.js +108 -0
- package/dist/esm/storage/StorageBackendDisk.js.map +6 -0
- package/dist/esm/storage/StorageBackendJsonFile.d.ts +27 -0
- package/dist/esm/storage/StorageBackendJsonFile.d.ts.map +1 -0
- package/dist/esm/storage/StorageBackendJsonFile.js +90 -0
- package/dist/esm/storage/StorageBackendJsonFile.js.map +6 -0
- package/dist/esm/storage/index.d.ts +8 -0
- package/dist/esm/storage/index.d.ts.map +1 -0
- package/dist/esm/storage/index.js +8 -0
- package/dist/esm/storage/index.js.map +6 -0
- package/dist/esm/tsconfig.tsbuildinfo +1 -0
- package/package.json +114 -0
- package/src/behavior/index.ts +7 -0
- package/src/behavior/instrumentation.ts +32 -0
- package/src/behavior/register.ts +9 -0
- package/src/crypto/NodeJsCrypto.ts +164 -0
- package/src/crypto/index.ts +8 -0
- package/src/crypto/register.ts +25 -0
- package/src/environment/NodeJsActionTracer.ts +70 -0
- package/src/environment/NodeJsEnvironment.ts +172 -0
- package/src/environment/ProcessManager.ts +128 -0
- package/src/environment/index.ts +10 -0
- package/src/environment/register.ts +10 -0
- package/src/index.ts +12 -0
- package/src/log/FileLogger.ts +30 -0
- package/src/log/index.ts +7 -0
- package/src/net/NodeJsNetwork.ts +157 -0
- package/src/net/NodeJsUdpChannel.ts +179 -0
- package/src/net/index.ts +9 -0
- package/src/net/register.ts +20 -0
- package/src/storage/StorageBackendDisk.ts +132 -0
- package/src/storage/StorageBackendJsonFile.ts +102 -0
- package/src/storage/index.ts +8 -0
- package/src/tsconfig.json +28 -0
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2022-2024 Matter.js Authors
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
import {
|
|
7
|
+
ChannelType,
|
|
8
|
+
Diagnostic,
|
|
9
|
+
isIPv4,
|
|
10
|
+
isIPv6,
|
|
11
|
+
Logger,
|
|
12
|
+
MAX_UDP_MESSAGE_SIZE,
|
|
13
|
+
NetworkError
|
|
14
|
+
} from "#general";
|
|
15
|
+
import { RetransmissionLimitReachedError } from "#protocol";
|
|
16
|
+
import * as dgram from "dgram";
|
|
17
|
+
import { NodeJsNetwork } from "./NodeJsNetwork.js";
|
|
18
|
+
const logger = Logger.get("UdpChannelNode");
|
|
19
|
+
function createDgramSocket(host, port, options) {
|
|
20
|
+
const socket = dgram.createSocket(options);
|
|
21
|
+
return new Promise((resolve, reject) => {
|
|
22
|
+
const handleBindError = (error) => {
|
|
23
|
+
try {
|
|
24
|
+
socket.close();
|
|
25
|
+
} catch (error2) {
|
|
26
|
+
logger.debug("Error on closing socket", error2);
|
|
27
|
+
}
|
|
28
|
+
reject(error);
|
|
29
|
+
};
|
|
30
|
+
socket.on("error", handleBindError);
|
|
31
|
+
socket.bind(port, host, () => {
|
|
32
|
+
const { address: localHost, port: localPort } = socket.address();
|
|
33
|
+
logger.debug(
|
|
34
|
+
"Socket created and bound ",
|
|
35
|
+
Diagnostic.dict({
|
|
36
|
+
remoteAddress: `${host}:${port}`,
|
|
37
|
+
localAddress: `${localHost}:${localPort}`
|
|
38
|
+
})
|
|
39
|
+
);
|
|
40
|
+
socket.removeListener("error", handleBindError);
|
|
41
|
+
socket.on("error", (error) => logger.error(error));
|
|
42
|
+
resolve(socket);
|
|
43
|
+
});
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
class NodeJsUdpChannel {
|
|
47
|
+
constructor(type, socket, netInterface) {
|
|
48
|
+
this.type = type;
|
|
49
|
+
this.socket = socket;
|
|
50
|
+
this.netInterface = netInterface;
|
|
51
|
+
}
|
|
52
|
+
static async create({
|
|
53
|
+
listeningPort,
|
|
54
|
+
type,
|
|
55
|
+
listeningAddress,
|
|
56
|
+
netInterface,
|
|
57
|
+
membershipAddresses
|
|
58
|
+
}) {
|
|
59
|
+
const socketOptions = { type, reuseAddr: true };
|
|
60
|
+
if (type === "udp6") {
|
|
61
|
+
socketOptions.ipv6Only = true;
|
|
62
|
+
}
|
|
63
|
+
const socket = await createDgramSocket(listeningAddress, listeningPort, socketOptions);
|
|
64
|
+
socket.setBroadcast(true);
|
|
65
|
+
let netInterfaceZone;
|
|
66
|
+
if (netInterface !== void 0) {
|
|
67
|
+
netInterfaceZone = NodeJsNetwork.getNetInterfaceZoneIpv6(netInterface);
|
|
68
|
+
let multicastInterface;
|
|
69
|
+
if (type === "udp4") {
|
|
70
|
+
multicastInterface = NodeJsNetwork.getMulticastInterfaceIpv4(netInterface);
|
|
71
|
+
if (multicastInterface === void 0) {
|
|
72
|
+
throw new NetworkError(`No IPv4 addresses on interface: ${netInterface}`);
|
|
73
|
+
}
|
|
74
|
+
} else {
|
|
75
|
+
if (netInterfaceZone === void 0) {
|
|
76
|
+
throw new NetworkError(`No IPv6 addresses on interface: ${netInterface}`);
|
|
77
|
+
}
|
|
78
|
+
multicastInterface = `::%${netInterfaceZone}`;
|
|
79
|
+
}
|
|
80
|
+
logger.debug(
|
|
81
|
+
"Initialize multicast",
|
|
82
|
+
Diagnostic.dict({
|
|
83
|
+
address: `${multicastInterface}:${listeningPort}`,
|
|
84
|
+
interface: netInterface,
|
|
85
|
+
type
|
|
86
|
+
})
|
|
87
|
+
);
|
|
88
|
+
socket.setMulticastInterface(multicastInterface);
|
|
89
|
+
}
|
|
90
|
+
if (membershipAddresses !== void 0) {
|
|
91
|
+
const multicastInterfaces = NodeJsNetwork.getMembershipMulticastInterfaces(netInterface, type === "udp4");
|
|
92
|
+
for (const address of membershipAddresses) {
|
|
93
|
+
for (const multicastInterface of multicastInterfaces) {
|
|
94
|
+
try {
|
|
95
|
+
socket.addMembership(address, multicastInterface);
|
|
96
|
+
} catch (error) {
|
|
97
|
+
logger.warn(
|
|
98
|
+
`Error adding membership for address ${address}${multicastInterface ? ` with interface ${multicastInterface}` : ""}: ${error}`
|
|
99
|
+
);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
return new NodeJsUdpChannel(type, socket, netInterfaceZone);
|
|
105
|
+
}
|
|
106
|
+
maxPayloadSize = MAX_UDP_MESSAGE_SIZE;
|
|
107
|
+
onData(listener) {
|
|
108
|
+
const messageListener = (data, { address, port }) => {
|
|
109
|
+
const netInterface = this.netInterface ?? NodeJsNetwork.getNetInterfaceForIp(address);
|
|
110
|
+
if (netInterface === void 0) return;
|
|
111
|
+
listener(netInterface, address, port, data);
|
|
112
|
+
};
|
|
113
|
+
this.socket.on("message", messageListener);
|
|
114
|
+
return {
|
|
115
|
+
close: async () => {
|
|
116
|
+
this.socket.removeListener("message", messageListener);
|
|
117
|
+
}
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
async send(host, port, data) {
|
|
121
|
+
return new Promise((resolve, reject) => {
|
|
122
|
+
this.socket.send(data, port, host, (error) => {
|
|
123
|
+
if (error !== null) {
|
|
124
|
+
const netError = error instanceof Error && "code" in error && error.code === "EHOSTUNREACH" ? new RetransmissionLimitReachedError(error.message) : new NetworkError(error.message);
|
|
125
|
+
netError.stack = error.stack;
|
|
126
|
+
reject(netError);
|
|
127
|
+
return;
|
|
128
|
+
}
|
|
129
|
+
resolve();
|
|
130
|
+
});
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
async close() {
|
|
134
|
+
try {
|
|
135
|
+
this.socket.close();
|
|
136
|
+
} catch (error) {
|
|
137
|
+
logger.debug("Error on closing socket", error);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
get port() {
|
|
141
|
+
return this.socket.address().port;
|
|
142
|
+
}
|
|
143
|
+
supports(type, address) {
|
|
144
|
+
if (type !== ChannelType.UDP) {
|
|
145
|
+
return false;
|
|
146
|
+
}
|
|
147
|
+
if (address === void 0) {
|
|
148
|
+
return true;
|
|
149
|
+
}
|
|
150
|
+
if (this.type === "udp4") {
|
|
151
|
+
return isIPv4(address);
|
|
152
|
+
}
|
|
153
|
+
return isIPv6(address);
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
export {
|
|
157
|
+
NodeJsUdpChannel
|
|
158
|
+
};
|
|
159
|
+
//# sourceMappingURL=NodeJsUdpChannel.js.map
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/net/NodeJsUdpChannel.ts"],
|
|
4
|
+
"mappings": "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",
|
|
5
|
+
"names": ["error"]
|
|
6
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/net/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,eAAe,CAAC;AACvB,cAAc,oBAAoB,CAAC;AACnC,cAAc,uBAAuB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"register.d.ts","sourceRoot":"","sources":["../../../src/net/register.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2022-2024 Matter.js Authors
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
import { Network, NoProviderError, singleton } from "#general";
|
|
7
|
+
import { NodeJsNetwork } from "./NodeJsNetwork.js";
|
|
8
|
+
try {
|
|
9
|
+
Network.get();
|
|
10
|
+
} catch (error) {
|
|
11
|
+
NoProviderError.accept(error);
|
|
12
|
+
Network.get = singleton(() => new NodeJsNetwork());
|
|
13
|
+
process.on("beforeExit", () => void Network.get().close());
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=register.js.map
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/net/register.ts"],
|
|
4
|
+
"mappings": "AAAA;AAAA;AAAA;AAAA;AAAA;AAMA,SAAS,SAAS,iBAAiB,iBAAiB;AACpD,SAAS,qBAAqB;AAG9B,IAAI;AACA,UAAQ,IAAI;AAChB,SAAS,OAAO;AACZ,kBAAgB,OAAO,KAAK;AAE5B,UAAQ,MAAM,UAAU,MAAM,IAAI,cAAc,CAAC;AAGjD,UAAQ,GAAG,cAAc,MAAM,KAAK,QAAQ,IAAI,EAAE,MAAM,CAAC;AAC7D;",
|
|
5
|
+
"names": []
|
|
6
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2022-2024 Matter.js Authors
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
import { SupportedStorageTypes, SyncStorage } from "#general";
|
|
7
|
+
export declare class StorageBackendDisk extends SyncStorage {
|
|
8
|
+
private readonly localStorage;
|
|
9
|
+
protected isInitialized: boolean;
|
|
10
|
+
constructor(path: string, clear?: boolean);
|
|
11
|
+
get initialized(): boolean;
|
|
12
|
+
initialize(): void;
|
|
13
|
+
close(): void;
|
|
14
|
+
clear(): void;
|
|
15
|
+
getContextBaseKey(contexts: string[], allowEmptyContext?: boolean): string;
|
|
16
|
+
buildStorageKey(contexts: string[], key: string): string;
|
|
17
|
+
get<T extends SupportedStorageTypes>(contexts: string[], key: string): T | undefined;
|
|
18
|
+
set(contexts: string[], key: string, value: SupportedStorageTypes): void;
|
|
19
|
+
set(contexts: string[], values: Record<string, SupportedStorageTypes>): void;
|
|
20
|
+
delete(contexts: string[], key: string): void;
|
|
21
|
+
/** Returns all keys of a storage context without keys of sub-contexts */
|
|
22
|
+
keys(contexts: string[]): string[];
|
|
23
|
+
values(contexts: string[]): Record<string, SupportedStorageTypes>;
|
|
24
|
+
contexts(contexts: string[]): string[];
|
|
25
|
+
clearAll(contexts: string[]): void;
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=StorageBackendDisk.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"StorageBackendDisk.d.ts","sourceRoot":"","sources":["../../../src/storage/StorageBackendDisk.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAA0B,qBAAqB,EAAE,WAAW,EAAU,MAAM,UAAU,CAAC;AAG9F,qBAAa,kBAAmB,SAAQ,WAAW;IAC/C,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC;IAC9B,SAAS,CAAC,aAAa,UAAS;gBAEpB,IAAI,EAAE,MAAM,EAAE,KAAK,UAAQ;IAMvC,IAAI,WAAW,YAEd;IAED,UAAU;IAIV,KAAK;IAIL,KAAK;IAIL,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,iBAAiB,UAAQ;IAY/D,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,MAAM;IAQ/C,GAAG,CAAC,CAAC,SAAS,qBAAqB,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,MAAM,GAAG,CAAC,GAAG,SAAS;IAMpF,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,qBAAqB,GAAG,IAAI;IACxE,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,qBAAqB,CAAC,GAAG,IAAI;IAe5E,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,MAAM;IAItC,yEAAyE;IACzE,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE;IAavB,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE;IASzB,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE;IAkB3B,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE;CAS9B"}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2022-2024 Matter.js Authors
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
import { fromJson, StorageError, SyncStorage, toJson } from "#general";
|
|
7
|
+
import { LocalStorage } from "node-localstorage";
|
|
8
|
+
class StorageBackendDisk extends SyncStorage {
|
|
9
|
+
localStorage;
|
|
10
|
+
isInitialized = false;
|
|
11
|
+
constructor(path, clear = false) {
|
|
12
|
+
super();
|
|
13
|
+
this.localStorage = new LocalStorage(path);
|
|
14
|
+
if (clear) this.clear();
|
|
15
|
+
}
|
|
16
|
+
get initialized() {
|
|
17
|
+
return this.isInitialized;
|
|
18
|
+
}
|
|
19
|
+
initialize() {
|
|
20
|
+
this.isInitialized = true;
|
|
21
|
+
}
|
|
22
|
+
close() {
|
|
23
|
+
this.isInitialized = false;
|
|
24
|
+
}
|
|
25
|
+
clear() {
|
|
26
|
+
this.localStorage.clear();
|
|
27
|
+
}
|
|
28
|
+
getContextBaseKey(contexts, allowEmptyContext = false) {
|
|
29
|
+
const contextKey = contexts.join(".");
|
|
30
|
+
if (!contextKey.length && !allowEmptyContext || contextKey.includes("..") || contextKey.startsWith(".") || contextKey.endsWith("."))
|
|
31
|
+
throw new StorageError("Context must not be an empty and not contain dots.");
|
|
32
|
+
return contextKey;
|
|
33
|
+
}
|
|
34
|
+
buildStorageKey(contexts, key) {
|
|
35
|
+
if (!key.length) {
|
|
36
|
+
throw new StorageError("Key must not be an empty string.");
|
|
37
|
+
}
|
|
38
|
+
const contextKey = this.getContextBaseKey(contexts);
|
|
39
|
+
return `${contextKey}.${key}`;
|
|
40
|
+
}
|
|
41
|
+
get(contexts, key) {
|
|
42
|
+
const value = this.localStorage.getItem(this.buildStorageKey(contexts, key));
|
|
43
|
+
if (value === null) return void 0;
|
|
44
|
+
return fromJson(value);
|
|
45
|
+
}
|
|
46
|
+
set(contexts, keyOrValues, value) {
|
|
47
|
+
if (typeof keyOrValues === "string") {
|
|
48
|
+
this.localStorage.setItem(this.buildStorageKey(contexts, keyOrValues), toJson(value));
|
|
49
|
+
} else {
|
|
50
|
+
for (const [key, value2] of Object.entries(keyOrValues)) {
|
|
51
|
+
this.localStorage.setItem(this.buildStorageKey(contexts, key), toJson(value2));
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
delete(contexts, key) {
|
|
56
|
+
this.localStorage.removeItem(this.buildStorageKey(contexts, key));
|
|
57
|
+
}
|
|
58
|
+
/** Returns all keys of a storage context without keys of sub-contexts */
|
|
59
|
+
keys(contexts) {
|
|
60
|
+
const contextKey = this.getContextBaseKey(contexts);
|
|
61
|
+
const keys = [];
|
|
62
|
+
const contextKeyStart = `${contextKey}.`;
|
|
63
|
+
const len = contextKeyStart.length;
|
|
64
|
+
for (const key of Object.keys(this.localStorage)) {
|
|
65
|
+
if (key.startsWith(contextKeyStart) && !key.includes(".", len)) {
|
|
66
|
+
keys.push(key.substring(len));
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
return keys;
|
|
70
|
+
}
|
|
71
|
+
values(contexts) {
|
|
72
|
+
const values = {};
|
|
73
|
+
for (const key of this.keys(contexts)) {
|
|
74
|
+
values[key] = this.get(contexts, key);
|
|
75
|
+
}
|
|
76
|
+
return values;
|
|
77
|
+
}
|
|
78
|
+
contexts(contexts) {
|
|
79
|
+
const contextKey = this.getContextBaseKey(contexts, true);
|
|
80
|
+
const startContextKey = contextKey.length ? `${contextKey}.` : "";
|
|
81
|
+
const len = startContextKey.length;
|
|
82
|
+
const foundContexts = new Array();
|
|
83
|
+
for (const key of Object.keys(this.localStorage)) {
|
|
84
|
+
if (key.startsWith(startContextKey)) {
|
|
85
|
+
const subKeys = key.substring(len).split(".");
|
|
86
|
+
if (subKeys.length === 1) continue;
|
|
87
|
+
const context = subKeys[0];
|
|
88
|
+
if (!foundContexts.includes(context)) {
|
|
89
|
+
foundContexts.push(context);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
return foundContexts;
|
|
94
|
+
}
|
|
95
|
+
clearAll(contexts) {
|
|
96
|
+
const contextKey = this.getContextBaseKey(contexts, true);
|
|
97
|
+
const startContextKey = contextKey.length ? `${contextKey}.` : "";
|
|
98
|
+
for (const key of Object.keys(this.localStorage)) {
|
|
99
|
+
if (key.startsWith(startContextKey)) {
|
|
100
|
+
this.localStorage.removeItem(key);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
export {
|
|
106
|
+
StorageBackendDisk
|
|
107
|
+
};
|
|
108
|
+
//# sourceMappingURL=StorageBackendDisk.js.map
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/storage/StorageBackendDisk.ts"],
|
|
4
|
+
"mappings": "AAAA;AAAA;AAAA;AAAA;AAAA;AAMA,SAAS,UAAU,cAAqC,aAAa,cAAc;AACnF,SAAS,oBAAoB;AAEtB,MAAM,2BAA2B,YAAY;AAAA,EAC/B;AAAA,EACP,gBAAgB;AAAA,EAE1B,YAAY,MAAc,QAAQ,OAAO;AACrC,UAAM;AACN,SAAK,eAAe,IAAI,aAAa,IAAI;AACzC,QAAI,MAAO,MAAK,MAAM;AAAA,EAC1B;AAAA,EAEA,IAAI,cAAc;AACd,WAAO,KAAK;AAAA,EAChB;AAAA,EAEA,aAAa;AACT,SAAK,gBAAgB;AAAA,EACzB;AAAA,EAEA,QAAQ;AACJ,SAAK,gBAAgB;AAAA,EACzB;AAAA,EAEA,QAAQ;AACJ,SAAK,aAAa,MAAM;AAAA,EAC5B;AAAA,EAEA,kBAAkB,UAAoB,oBAAoB,OAAO;AAC7D,UAAM,aAAa,SAAS,KAAK,GAAG;AACpC,QACK,CAAC,WAAW,UAAU,CAAC,qBACxB,WAAW,SAAS,IAAI,KACxB,WAAW,WAAW,GAAG,KACzB,WAAW,SAAS,GAAG;AAEvB,YAAM,IAAI,aAAa,oDAAoD;AAC/E,WAAO;AAAA,EACX;AAAA,EAEA,gBAAgB,UAAoB,KAAa;AAC7C,QAAI,CAAC,IAAI,QAAQ;AACb,YAAM,IAAI,aAAa,kCAAkC;AAAA,IAC7D;AACA,UAAM,aAAa,KAAK,kBAAkB,QAAQ;AAClD,WAAO,GAAG,UAAU,IAAI,GAAG;AAAA,EAC/B;AAAA,EAEA,IAAqC,UAAoB,KAA4B;AACjF,UAAM,QAAQ,KAAK,aAAa,QAAQ,KAAK,gBAAgB,UAAU,GAAG,CAAC;AAC3E,QAAI,UAAU,KAAM,QAAO;AAC3B,WAAO,SAAS,KAAK;AAAA,EACzB;AAAA,EAIA,IACI,UACA,aACA,OACF;AACE,QAAI,OAAO,gBAAgB,UAAU;AACjC,WAAK,aAAa,QAAQ,KAAK,gBAAgB,UAAU,WAAW,GAAG,OAAO,KAAK,CAAC;AAAA,IACxF,OAAO;AACH,iBAAW,CAAC,KAAKA,MAAK,KAAK,OAAO,QAAQ,WAAW,GAAG;AACpD,aAAK,aAAa,QAAQ,KAAK,gBAAgB,UAAU,GAAG,GAAG,OAAOA,MAAK,CAAC;AAAA,MAChF;AAAA,IACJ;AAAA,EACJ;AAAA,EAEA,OAAO,UAAoB,KAAa;AACpC,SAAK,aAAa,WAAW,KAAK,gBAAgB,UAAU,GAAG,CAAC;AAAA,EACpE;AAAA;AAAA,EAGA,KAAK,UAAoB;AACrB,UAAM,aAAa,KAAK,kBAAkB,QAAQ;AAClD,UAAM,OAAO,CAAC;AACd,UAAM,kBAAkB,GAAG,UAAU;AACrC,UAAM,MAAM,gBAAgB;AAC5B,eAAW,OAAO,OAAO,KAAK,KAAK,YAAY,GAAG;AAC9C,UAAI,IAAI,WAAW,eAAe,KAAK,CAAC,IAAI,SAAS,KAAK,GAAG,GAAG;AAC5D,aAAK,KAAK,IAAI,UAAU,GAAG,CAAC;AAAA,MAChC;AAAA,IACJ;AACA,WAAO;AAAA,EACX;AAAA,EAEA,OAAO,UAAoB;AAEvB,UAAM,SAAS,CAAC;AAChB,eAAW,OAAO,KAAK,KAAK,QAAQ,GAAG;AACnC,aAAO,GAAG,IAAI,KAAK,IAAI,UAAU,GAAG;AAAA,IACxC;AACA,WAAO;AAAA,EACX;AAAA,EAEA,SAAS,UAAoB;AACzB,UAAM,aAAa,KAAK,kBAAkB,UAAU,IAAI;AACxD,UAAM,kBAAkB,WAAW,SAAS,GAAG,UAAU,MAAM;AAC/D,UAAM,MAAM,gBAAgB;AAC5B,UAAM,gBAAgB,IAAI,MAAc;AACxC,eAAW,OAAO,OAAO,KAAK,KAAK,YAAY,GAAG;AAC9C,UAAI,IAAI,WAAW,eAAe,GAAG;AACjC,cAAM,UAAU,IAAI,UAAU,GAAG,EAAE,MAAM,GAAG;AAC5C,YAAI,QAAQ,WAAW,EAAG;AAC1B,cAAM,UAAU,QAAQ,CAAC;AACzB,YAAI,CAAC,cAAc,SAAS,OAAO,GAAG;AAClC,wBAAc,KAAK,OAAO;AAAA,QAC9B;AAAA,MACJ;AAAA,IACJ;AACA,WAAO;AAAA,EACX;AAAA,EAEA,SAAS,UAAoB;AACzB,UAAM,aAAa,KAAK,kBAAkB,UAAU,IAAI;AACxD,UAAM,kBAAkB,WAAW,SAAS,GAAG,UAAU,MAAM;AAC/D,eAAW,OAAO,OAAO,KAAK,KAAK,YAAY,GAAG;AAC9C,UAAI,IAAI,WAAW,eAAe,GAAG;AACjC,aAAK,aAAa,WAAW,GAAG;AAAA,MACpC;AAAA,IACJ;AAAA,EACJ;AACJ;",
|
|
5
|
+
"names": ["value"]
|
|
6
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2022-2024 Matter.js Authors
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
import { StorageBackendMemory, SupportedStorageTypes } from "#general";
|
|
7
|
+
export declare class StorageBackendJsonFile extends StorageBackendMemory {
|
|
8
|
+
private readonly path;
|
|
9
|
+
/** We store changes after a value was set to the storage, but not more often than this setting (in ms). */
|
|
10
|
+
static commitDelay: number;
|
|
11
|
+
committed: Promise<void>;
|
|
12
|
+
private readonly commitTimer;
|
|
13
|
+
private closed;
|
|
14
|
+
private resolveCommitted?;
|
|
15
|
+
constructor(path: string);
|
|
16
|
+
static create(path: string): Promise<StorageBackendJsonFile>;
|
|
17
|
+
initialize(): Promise<void>;
|
|
18
|
+
private triggerCommit;
|
|
19
|
+
set(contexts: string[], keyOrValues: string | Record<string, SupportedStorageTypes>, value?: SupportedStorageTypes): void;
|
|
20
|
+
delete(contexts: string[], key: string): void;
|
|
21
|
+
clear(): void;
|
|
22
|
+
private commit;
|
|
23
|
+
close(): Promise<void>;
|
|
24
|
+
private toJson;
|
|
25
|
+
private fromJson;
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=StorageBackendJsonFile.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"StorageBackendJsonFile.d.ts","sourceRoot":"","sources":["../../../src/storage/StorageBackendJsonFile.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAY,oBAAoB,EAAgB,qBAAqB,EAAgB,MAAM,UAAU,CAAC;AAG7G,qBAAa,sBAAuB,SAAQ,oBAAoB;IAWhD,OAAO,CAAC,QAAQ,CAAC,IAAI;IAVjC,2GAA2G;IAC3G,MAAM,CAAC,WAAW,SAAQ;IAC1B,SAAS,gBAAqB;IAE9B,OAAO,CAAC,QAAQ,CAAC,WAAW,CAE1B;IACF,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,gBAAgB,CAAC,CAAa;gBAET,IAAI,EAAE,MAAM;WAInB,MAAM,CAAC,IAAI,EAAE,MAAM;IAM1B,UAAU;IAczB,OAAO,CAAC,aAAa;IASZ,GAAG,CACR,QAAQ,EAAE,MAAM,EAAE,EAClB,WAAW,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,qBAAqB,CAAC,EAC3D,KAAK,CAAC,EAAE,qBAAqB,GAC9B,IAAI;IAKE,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI;IAK7C,KAAK,IAAI,IAAI;YAKR,MAAM;IAcL,KAAK;IAQpB,OAAO,CAAC,MAAM;IAId,OAAO,CAAC,QAAQ;CAGnB"}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2022-2024 Matter.js Authors
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
import { fromJson, StorageBackendMemory, StorageError, Time, toJson } from "#general";
|
|
7
|
+
import { readFile, writeFile } from "fs/promises";
|
|
8
|
+
class StorageBackendJsonFile extends StorageBackendMemory {
|
|
9
|
+
constructor(path) {
|
|
10
|
+
super();
|
|
11
|
+
this.path = path;
|
|
12
|
+
}
|
|
13
|
+
/** We store changes after a value was set to the storage, but not more often than this setting (in ms). */
|
|
14
|
+
static commitDelay = 1e3;
|
|
15
|
+
committed = Promise.resolve();
|
|
16
|
+
commitTimer = Time.getTimer(
|
|
17
|
+
"Storage commit",
|
|
18
|
+
StorageBackendJsonFile.commitDelay,
|
|
19
|
+
() => this.commit()
|
|
20
|
+
);
|
|
21
|
+
closed = false;
|
|
22
|
+
resolveCommitted;
|
|
23
|
+
static async create(path) {
|
|
24
|
+
const storage = new this(path);
|
|
25
|
+
await storage.initialize();
|
|
26
|
+
return storage;
|
|
27
|
+
}
|
|
28
|
+
async initialize() {
|
|
29
|
+
if (this.initialized) throw new StorageError("Storage already initialized!");
|
|
30
|
+
super.initialize();
|
|
31
|
+
try {
|
|
32
|
+
this.store = this.fromJson(await readFile(this.path, "utf-8"));
|
|
33
|
+
} catch (error) {
|
|
34
|
+
if (error.code !== "ENOENT") {
|
|
35
|
+
throw error;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
this.isInitialized = true;
|
|
39
|
+
}
|
|
40
|
+
triggerCommit() {
|
|
41
|
+
if (!this.commitTimer.isRunning) {
|
|
42
|
+
this.committed = new Promise((resolve) => {
|
|
43
|
+
this.resolveCommitted = resolve;
|
|
44
|
+
});
|
|
45
|
+
this.commitTimer.start();
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
set(contexts, keyOrValues, value) {
|
|
49
|
+
super.set(contexts, keyOrValues, value);
|
|
50
|
+
this.triggerCommit();
|
|
51
|
+
}
|
|
52
|
+
delete(contexts, key) {
|
|
53
|
+
super.delete(contexts, key);
|
|
54
|
+
this.triggerCommit();
|
|
55
|
+
}
|
|
56
|
+
clear() {
|
|
57
|
+
super.clear();
|
|
58
|
+
this.triggerCommit();
|
|
59
|
+
}
|
|
60
|
+
async commit() {
|
|
61
|
+
if (!this.initialized || this.closed) return;
|
|
62
|
+
if (this.commitTimer.isRunning) {
|
|
63
|
+
this.commitTimer.stop();
|
|
64
|
+
}
|
|
65
|
+
try {
|
|
66
|
+
await writeFile(this.path, this.toJson(this.store), "utf-8");
|
|
67
|
+
} finally {
|
|
68
|
+
if (this.resolveCommitted !== void 0) {
|
|
69
|
+
this.resolveCommitted?.();
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
async close() {
|
|
74
|
+
this.commitTimer.stop();
|
|
75
|
+
await this.commit();
|
|
76
|
+
super.close();
|
|
77
|
+
this.closed = true;
|
|
78
|
+
this.isInitialized = false;
|
|
79
|
+
}
|
|
80
|
+
toJson(object) {
|
|
81
|
+
return toJson(object, 1);
|
|
82
|
+
}
|
|
83
|
+
fromJson(json) {
|
|
84
|
+
return fromJson(json);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
export {
|
|
88
|
+
StorageBackendJsonFile
|
|
89
|
+
};
|
|
90
|
+
//# sourceMappingURL=StorageBackendJsonFile.js.map
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/storage/StorageBackendJsonFile.ts"],
|
|
4
|
+
"mappings": "AAAA;AAAA;AAAA;AAAA;AAAA;AAMA,SAAS,UAAU,sBAAsB,cAAqC,MAAM,cAAc;AAClG,SAAS,UAAU,iBAAiB;AAE7B,MAAM,+BAA+B,qBAAqB;AAAA,EAW7D,YAA6B,MAAc;AACvC,UAAM;AADmB;AAAA,EAE7B;AAAA;AAAA,EAXA,OAAO,cAAc;AAAA,EACrB,YAAY,QAAQ,QAAQ;AAAA,EAEX,cAAc,KAAK;AAAA,IAAS;AAAA,IAAkB,uBAAuB;AAAA,IAAa,MAC/F,KAAK,OAAO;AAAA,EAChB;AAAA,EACQ,SAAS;AAAA,EACT;AAAA,EAMR,aAAsB,OAAO,MAAc;AACvC,UAAM,UAAU,IAAI,KAAK,IAAI;AAC7B,UAAM,QAAQ,WAAW;AACzB,WAAO;AAAA,EACX;AAAA,EAEA,MAAe,aAAa;AACxB,QAAI,KAAK,YAAa,OAAM,IAAI,aAAa,8BAA8B;AAC3E,UAAM,WAAW;AACjB,QAAI;AACA,WAAK,QAAQ,KAAK,SAAS,MAAM,SAAS,KAAK,MAAM,OAAO,CAAC;AAAA,IACjE,SAAS,OAAY;AAEjB,UAAI,MAAM,SAAS,UAAU;AACzB,cAAM;AAAA,MACV;AAAA,IACJ;AACA,SAAK,gBAAgB;AAAA,EACzB;AAAA,EAEQ,gBAAgB;AACpB,QAAI,CAAC,KAAK,YAAY,WAAW;AAC7B,WAAK,YAAY,IAAI,QAAQ,aAAW;AACpC,aAAK,mBAAmB;AAAA,MAC5B,CAAC;AACD,WAAK,YAAY,MAAM;AAAA,IAC3B;AAAA,EACJ;AAAA,EAES,IACL,UACA,aACA,OACI;AACJ,UAAM,IAAI,UAAU,aAAa,KAAK;AACtC,SAAK,cAAc;AAAA,EACvB;AAAA,EAES,OAAO,UAAoB,KAAmB;AACnD,UAAM,OAAO,UAAU,GAAG;AAC1B,SAAK,cAAc;AAAA,EACvB;AAAA,EAES,QAAc;AACnB,UAAM,MAAM;AACZ,SAAK,cAAc;AAAA,EACvB;AAAA,EAEA,MAAc,SAAS;AACnB,QAAI,CAAC,KAAK,eAAe,KAAK,OAAQ;AACtC,QAAI,KAAK,YAAY,WAAW;AAC5B,WAAK,YAAY,KAAK;AAAA,IAC1B;AACA,QAAI;AACA,YAAM,UAAU,KAAK,MAAM,KAAK,OAAO,KAAK,KAAK,GAAG,OAAO;AAAA,IAC/D,UAAE;AACE,UAAI,KAAK,qBAAqB,QAAW;AACrC,aAAK,mBAAmB;AAAA,MAC5B;AAAA,IACJ;AAAA,EACJ;AAAA,EAEA,MAAe,QAAQ;AACnB,SAAK,YAAY,KAAK;AACtB,UAAM,KAAK,OAAO;AAClB,UAAM,MAAM;AACZ,SAAK,SAAS;AACd,SAAK,gBAAgB;AAAA,EACzB;AAAA,EAEQ,OAAO,QAAqB;AAChC,WAAO,OAAO,QAAQ,CAAC;AAAA,EAC3B;AAAA,EAEQ,SAAS,MAAmB;AAChC,WAAO,SAAS,IAAI;AAAA,EACxB;AACJ;",
|
|
5
|
+
"names": []
|
|
6
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/storage/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,cAAc,yBAAyB,CAAC;AACxC,cAAc,6BAA6B,CAAC"}
|