@stateforward/hsm.ts 0.1.0
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/README.md +39 -0
- package/dist/chunk-R6UCUJT5.js +307 -0
- package/dist/chunk-R6UCUJT5.js.map +1 -0
- package/dist/chunk-UO7RF4FF.js +132 -0
- package/dist/chunk-UO7RF4FF.js.map +1 -0
- package/dist/index.cjs +3015 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +1013 -0
- package/dist/index.d.ts +1013 -0
- package/dist/index.js +2462 -0
- package/dist/index.js.map +1 -0
- package/dist/kind.cjs +162 -0
- package/dist/kind.cjs.map +1 -0
- package/dist/kind.d.cts +75 -0
- package/dist/kind.d.ts +75 -0
- package/dist/kind.js +21 -0
- package/dist/kind.js.map +1 -0
- package/dist/muid.cjs +345 -0
- package/dist/muid.cjs.map +1 -0
- package/dist/muid.d.cts +56 -0
- package/dist/muid.d.ts +56 -0
- package/dist/muid.js +37 -0
- package/dist/muid.js.map +1 -0
- package/package.json +68 -0
package/README.md
ADDED
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
# hsm.ts
|
|
2
|
+
|
|
3
|
+
Standalone TypeScript implementation of the HSM DSL and runtime.
|
|
4
|
+
|
|
5
|
+
This package ships a native TypeScript runtime with richer compile-time types. The current build focuses on:
|
|
6
|
+
|
|
7
|
+
- standard TypeScript source for both the DSL and runtime
|
|
8
|
+
- modern package outputs via `tsup`
|
|
9
|
+
- PascalCase DSL/runtime exports with camelCase compatibility aliases
|
|
10
|
+
- attribute-aware `sm.get("name")` and `sm.set("name", value)` typing on the returned machine
|
|
11
|
+
|
|
12
|
+
## Development
|
|
13
|
+
|
|
14
|
+
```sh
|
|
15
|
+
npm install
|
|
16
|
+
npm run typecheck
|
|
17
|
+
npm run test
|
|
18
|
+
npm run build
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
## Example
|
|
22
|
+
|
|
23
|
+
```ts
|
|
24
|
+
import * as hsm from "@stateforward/hsm.ts";
|
|
25
|
+
|
|
26
|
+
class Counter extends hsm.Instance {}
|
|
27
|
+
|
|
28
|
+
const model = hsm.define(
|
|
29
|
+
"Counter",
|
|
30
|
+
hsm.attribute("count", 0),
|
|
31
|
+
hsm.state("idle"),
|
|
32
|
+
hsm.initial(hsm.target("idle")),
|
|
33
|
+
);
|
|
34
|
+
|
|
35
|
+
const machine = hsm.start(new Counter(), model);
|
|
36
|
+
|
|
37
|
+
const count = machine.get("count"); // number
|
|
38
|
+
machine.set("count", count + 1);
|
|
39
|
+
```
|
|
@@ -0,0 +1,307 @@
|
|
|
1
|
+
// src/muid.ts
|
|
2
|
+
var defaultEpochValue = 17e11;
|
|
3
|
+
var make64 = (high, low) => ({
|
|
4
|
+
high: high >>> 0,
|
|
5
|
+
low: low >>> 0
|
|
6
|
+
});
|
|
7
|
+
var from32 = (value) => make64(0, value >>> 0);
|
|
8
|
+
var add64 = (a, b) => {
|
|
9
|
+
const low = a.low + b.low >>> 0;
|
|
10
|
+
const carry = a.low + b.low > 4294967295 ? 1 : 0;
|
|
11
|
+
const high = a.high + b.high + carry >>> 0;
|
|
12
|
+
return make64(high, low);
|
|
13
|
+
};
|
|
14
|
+
var sub64 = (a, b) => {
|
|
15
|
+
const low = a.low - b.low >>> 0;
|
|
16
|
+
const borrow = a.low < b.low ? 1 : 0;
|
|
17
|
+
const high = a.high - b.high - borrow >>> 0;
|
|
18
|
+
return make64(high, low);
|
|
19
|
+
};
|
|
20
|
+
var shl64 = (value, bits) => {
|
|
21
|
+
if (bits === 0) {
|
|
22
|
+
return value;
|
|
23
|
+
}
|
|
24
|
+
if (bits >= 64) {
|
|
25
|
+
return make64(0, 0);
|
|
26
|
+
}
|
|
27
|
+
if (bits >= 32) {
|
|
28
|
+
return make64(value.low << bits - 32, 0);
|
|
29
|
+
}
|
|
30
|
+
const high = value.high << bits | value.low >>> 32 - bits;
|
|
31
|
+
const low = value.low << bits;
|
|
32
|
+
return make64(high >>> 0, low >>> 0);
|
|
33
|
+
};
|
|
34
|
+
var shr64 = (value, bits) => {
|
|
35
|
+
if (bits === 0) {
|
|
36
|
+
return value;
|
|
37
|
+
}
|
|
38
|
+
if (bits >= 64) {
|
|
39
|
+
return make64(0, 0);
|
|
40
|
+
}
|
|
41
|
+
if (bits >= 32) {
|
|
42
|
+
return make64(0, value.high >>> bits - 32);
|
|
43
|
+
}
|
|
44
|
+
const low = value.low >>> bits | value.high << 32 - bits;
|
|
45
|
+
const high = value.high >>> bits;
|
|
46
|
+
return make64(high >>> 0, low >>> 0);
|
|
47
|
+
};
|
|
48
|
+
var or64 = (a, b) => make64((a.high | b.high) >>> 0, (a.low | b.low) >>> 0);
|
|
49
|
+
var and64 = (a, b) => make64((a.high & b.high) >>> 0, (a.low & b.low) >>> 0);
|
|
50
|
+
var cmp64 = (a, b) => {
|
|
51
|
+
if (a.high < b.high) {
|
|
52
|
+
return -1;
|
|
53
|
+
}
|
|
54
|
+
if (a.high > b.high) {
|
|
55
|
+
return 1;
|
|
56
|
+
}
|
|
57
|
+
if (a.low < b.low) {
|
|
58
|
+
return -1;
|
|
59
|
+
}
|
|
60
|
+
if (a.low > b.low) {
|
|
61
|
+
return 1;
|
|
62
|
+
}
|
|
63
|
+
return 0;
|
|
64
|
+
};
|
|
65
|
+
var gte64 = (a, b) => cmp64(a, b) >= 0;
|
|
66
|
+
var toHex64 = (value) => {
|
|
67
|
+
if (value.high === 0) {
|
|
68
|
+
return value.low.toString(16);
|
|
69
|
+
}
|
|
70
|
+
const highHex = value.high.toString(16);
|
|
71
|
+
let lowHex = value.low.toString(16);
|
|
72
|
+
while (lowHex.length < 8) {
|
|
73
|
+
lowHex = `0${lowHex}`;
|
|
74
|
+
}
|
|
75
|
+
return `${highHex}${lowHex}`;
|
|
76
|
+
};
|
|
77
|
+
var toString64 = (value) => {
|
|
78
|
+
if (value.high === 0) {
|
|
79
|
+
return value.low.toString();
|
|
80
|
+
}
|
|
81
|
+
if (value.high < 2097152) {
|
|
82
|
+
return (value.high * 4294967296 + value.low).toString();
|
|
83
|
+
}
|
|
84
|
+
return `0x${toHex64(value)}`;
|
|
85
|
+
};
|
|
86
|
+
var toBase32_64 = (value) => {
|
|
87
|
+
if (value.high === 0) {
|
|
88
|
+
return value.low.toString(32);
|
|
89
|
+
}
|
|
90
|
+
const hex = toHex64(value);
|
|
91
|
+
let num = 0;
|
|
92
|
+
let result = "";
|
|
93
|
+
for (let index = 0; index < hex.length; index += 1) {
|
|
94
|
+
num = num * 16 + Number.parseInt(hex[index], 16);
|
|
95
|
+
if (num >= 32) {
|
|
96
|
+
result += (num % 32).toString(32);
|
|
97
|
+
num = Math.floor(num / 32);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
if (num > 0) {
|
|
101
|
+
result = `${num.toString(32)}${result}`;
|
|
102
|
+
}
|
|
103
|
+
return result || "0";
|
|
104
|
+
};
|
|
105
|
+
var hashString = (value) => {
|
|
106
|
+
let hash = make64(2166136261, 0);
|
|
107
|
+
const prime = from32(16777619);
|
|
108
|
+
for (let index = 0; index < value.length; index += 1) {
|
|
109
|
+
const char = from32(value.charCodeAt(index));
|
|
110
|
+
hash = and64(or64(hash, char), make64(0, 4294967295));
|
|
111
|
+
if (hash.high === 0) {
|
|
112
|
+
hash = from32(hash.low * prime.low >>> 0);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
return hash;
|
|
116
|
+
};
|
|
117
|
+
var getMachineIdentifier = () => {
|
|
118
|
+
if (typeof process !== "undefined") {
|
|
119
|
+
const identifier = process.env.HOSTNAME ?? process.env.COMPUTERNAME ?? process.release?.name;
|
|
120
|
+
if (identifier) {
|
|
121
|
+
return identifier;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
if (typeof navigator !== "undefined") {
|
|
125
|
+
return `${navigator.userAgent}${navigator.platform}${navigator.hardwareConcurrency ?? ""}`;
|
|
126
|
+
}
|
|
127
|
+
return `js-${Math.random().toString(36).slice(2)}`;
|
|
128
|
+
};
|
|
129
|
+
var getRandomBytes = (length) => {
|
|
130
|
+
const cryptoApi = globalThis.crypto;
|
|
131
|
+
if (cryptoApi?.getRandomValues) {
|
|
132
|
+
const values = new Uint8Array(length);
|
|
133
|
+
cryptoApi.getRandomValues(values);
|
|
134
|
+
return Array.from(values);
|
|
135
|
+
}
|
|
136
|
+
return Array.from({ length }, () => Math.floor(Math.random() * 256));
|
|
137
|
+
};
|
|
138
|
+
var getDefaultConfig = () => {
|
|
139
|
+
const epoch = make64(
|
|
140
|
+
Math.floor(defaultEpochValue / 4294967296),
|
|
141
|
+
defaultEpochValue % 4294967296
|
|
142
|
+
);
|
|
143
|
+
const timestampBitLen = 41;
|
|
144
|
+
const machineIDBitLen = 14;
|
|
145
|
+
const maxMachineID = (1 << machineIDBitLen) - 1;
|
|
146
|
+
const identifier = getMachineIdentifier();
|
|
147
|
+
let machineID;
|
|
148
|
+
if (identifier) {
|
|
149
|
+
const hash = hashString(identifier);
|
|
150
|
+
machineID = from32(hash.low & maxMachineID);
|
|
151
|
+
} else {
|
|
152
|
+
const randomBytes = getRandomBytes(4);
|
|
153
|
+
let randomValue = 0;
|
|
154
|
+
for (let index = 0; index < 4; index += 1) {
|
|
155
|
+
randomValue = randomValue << 8 | randomBytes[index];
|
|
156
|
+
}
|
|
157
|
+
machineID = from32(randomValue & maxMachineID);
|
|
158
|
+
}
|
|
159
|
+
return {
|
|
160
|
+
epoch,
|
|
161
|
+
machineID,
|
|
162
|
+
machineIDBitLen,
|
|
163
|
+
timestampBitLen
|
|
164
|
+
};
|
|
165
|
+
};
|
|
166
|
+
var MUID = class {
|
|
167
|
+
value;
|
|
168
|
+
constructor(value) {
|
|
169
|
+
if (typeof value === "number") {
|
|
170
|
+
this.value = from32(value);
|
|
171
|
+
return;
|
|
172
|
+
}
|
|
173
|
+
if (value && typeof value.high === "number" && typeof value.low === "number") {
|
|
174
|
+
this.value = make64(value.high, value.low);
|
|
175
|
+
return;
|
|
176
|
+
}
|
|
177
|
+
this.value = make64(0, 0);
|
|
178
|
+
}
|
|
179
|
+
toString() {
|
|
180
|
+
return toBase32_64(this.value);
|
|
181
|
+
}
|
|
182
|
+
toHex() {
|
|
183
|
+
return toHex64(this.value);
|
|
184
|
+
}
|
|
185
|
+
toDecimal() {
|
|
186
|
+
return toString64(this.value);
|
|
187
|
+
}
|
|
188
|
+
valueOf() {
|
|
189
|
+
return this.value;
|
|
190
|
+
}
|
|
191
|
+
};
|
|
192
|
+
var Generator = class {
|
|
193
|
+
timestampBitLen;
|
|
194
|
+
machineIDBitLen;
|
|
195
|
+
epoch;
|
|
196
|
+
shardIndex;
|
|
197
|
+
shardBitLen;
|
|
198
|
+
counterBitLen;
|
|
199
|
+
timestampBitShift;
|
|
200
|
+
machineIDShift;
|
|
201
|
+
shardIndexShift;
|
|
202
|
+
counterBitMask;
|
|
203
|
+
machineID;
|
|
204
|
+
state;
|
|
205
|
+
constructor(config = {}, shardIndex = 0, shardBitLen = 0) {
|
|
206
|
+
this.timestampBitLen = config.timestampBitLen ?? 41;
|
|
207
|
+
this.machineIDBitLen = config.machineIDBitLen ?? 14;
|
|
208
|
+
this.epoch = config.epoch ?? make64(
|
|
209
|
+
Math.floor(defaultEpochValue / 4294967296),
|
|
210
|
+
defaultEpochValue % 4294967296
|
|
211
|
+
);
|
|
212
|
+
this.shardIndex = shardIndex;
|
|
213
|
+
this.shardBitLen = shardBitLen;
|
|
214
|
+
this.counterBitLen = 64 - this.timestampBitLen - this.machineIDBitLen - this.shardBitLen;
|
|
215
|
+
this.timestampBitShift = this.machineIDBitLen + this.shardBitLen + this.counterBitLen;
|
|
216
|
+
this.machineIDShift = this.shardBitLen + this.counterBitLen;
|
|
217
|
+
this.shardIndexShift = this.counterBitLen;
|
|
218
|
+
this.counterBitMask = this.counterBitLen >= 32 ? make64(4294967295, 4294967295) : sub64(shl64(from32(1), this.counterBitLen), from32(1));
|
|
219
|
+
const machineIDMask = this.machineIDBitLen >= 32 ? make64(4294967295, 4294967295) : sub64(shl64(from32(1), this.machineIDBitLen), from32(1));
|
|
220
|
+
this.machineID = and64(config.machineID ?? from32(0), machineIDMask);
|
|
221
|
+
this.shardIndex = (this.shardIndex & (1 << Math.min(this.shardBitLen, 31)) - 1) >>> 0;
|
|
222
|
+
this.state = from32(1);
|
|
223
|
+
}
|
|
224
|
+
id() {
|
|
225
|
+
let now = sub64(from32(Date.now() & 4294967295), this.epoch);
|
|
226
|
+
const dateNow = Date.now();
|
|
227
|
+
if (dateNow > 4294967295) {
|
|
228
|
+
now = sub64(
|
|
229
|
+
make64(Math.floor(dateNow / 4294967296), dateNow & 4294967295),
|
|
230
|
+
this.epoch
|
|
231
|
+
);
|
|
232
|
+
}
|
|
233
|
+
const lastTimestamp = shr64(this.state, this.counterBitLen);
|
|
234
|
+
let counter = and64(this.state, this.counterBitMask);
|
|
235
|
+
if (cmp64(now, lastTimestamp) < 0) {
|
|
236
|
+
now = lastTimestamp;
|
|
237
|
+
}
|
|
238
|
+
if (cmp64(now, lastTimestamp) === 0) {
|
|
239
|
+
if (gte64(counter, this.counterBitMask)) {
|
|
240
|
+
now = add64(now, from32(1));
|
|
241
|
+
counter = from32(1);
|
|
242
|
+
} else {
|
|
243
|
+
counter = add64(counter, from32(1));
|
|
244
|
+
}
|
|
245
|
+
} else {
|
|
246
|
+
counter = from32(1);
|
|
247
|
+
}
|
|
248
|
+
this.state = or64(shl64(now, this.counterBitLen), counter);
|
|
249
|
+
const timestampPart = shl64(now, this.timestampBitShift);
|
|
250
|
+
const machineIDPart = shl64(this.machineID, this.machineIDShift);
|
|
251
|
+
const shardIndexPart = shl64(from32(this.shardIndex), this.shardIndexShift);
|
|
252
|
+
return new MUID(
|
|
253
|
+
or64(or64(or64(timestampPart, machineIDPart), shardIndexPart), counter)
|
|
254
|
+
);
|
|
255
|
+
}
|
|
256
|
+
};
|
|
257
|
+
var ShardedGenerators = class {
|
|
258
|
+
pool;
|
|
259
|
+
size;
|
|
260
|
+
index = 0;
|
|
261
|
+
constructor() {
|
|
262
|
+
const numCPU = typeof navigator !== "undefined" && navigator.hardwareConcurrency ? navigator.hardwareConcurrency : 4;
|
|
263
|
+
const shardBits = numCPU > 1 ? Math.min(Math.ceil(Math.log2(numCPU)), 5) : 0;
|
|
264
|
+
const defaultConfig = getDefaultConfig();
|
|
265
|
+
this.size = 1 << shardBits;
|
|
266
|
+
this.pool = [];
|
|
267
|
+
for (let index = 0; index < this.size; index += 1) {
|
|
268
|
+
this.pool.push(new Generator(defaultConfig, index, shardBits));
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
next() {
|
|
272
|
+
const generator = this.pool[this.index];
|
|
273
|
+
this.index = (this.index + 1) % this.size;
|
|
274
|
+
return generator;
|
|
275
|
+
}
|
|
276
|
+
};
|
|
277
|
+
var defaultGenerator = new Generator(getDefaultConfig(), 0, 0);
|
|
278
|
+
var make = () => defaultGenerator.id();
|
|
279
|
+
var newGenerator = (config = {}, shardIndex = 0, shardBitLen = 0) => new Generator(
|
|
280
|
+
{
|
|
281
|
+
...getDefaultConfig(),
|
|
282
|
+
...config
|
|
283
|
+
},
|
|
284
|
+
shardIndex,
|
|
285
|
+
shardBitLen
|
|
286
|
+
);
|
|
287
|
+
var makeMuid = (prefix) => `${prefix}-${make().toString()}`;
|
|
288
|
+
|
|
289
|
+
export {
|
|
290
|
+
make64,
|
|
291
|
+
from32,
|
|
292
|
+
add64,
|
|
293
|
+
sub64,
|
|
294
|
+
shl64,
|
|
295
|
+
shr64,
|
|
296
|
+
or64,
|
|
297
|
+
and64,
|
|
298
|
+
cmp64,
|
|
299
|
+
getDefaultConfig,
|
|
300
|
+
MUID,
|
|
301
|
+
Generator,
|
|
302
|
+
ShardedGenerators,
|
|
303
|
+
make,
|
|
304
|
+
newGenerator,
|
|
305
|
+
makeMuid
|
|
306
|
+
};
|
|
307
|
+
//# sourceMappingURL=chunk-R6UCUJT5.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/muid.ts"],"sourcesContent":["export type UInt64 = {\n high: number;\n low: number;\n};\n\nexport type MuidConfig = {\n machineID?: UInt64;\n timestampBitLen?: number;\n machineIDBitLen?: number;\n epoch?: UInt64;\n};\n\nconst defaultEpochValue = 1700000000000;\n\nexport const make64 = (high: number, low: number): UInt64 => ({\n high: high >>> 0,\n low: low >>> 0,\n});\n\nexport const from32 = (value: number) => make64(0, value >>> 0);\n\nexport const add64 = (a: UInt64, b: UInt64) => {\n const low = (a.low + b.low) >>> 0;\n const carry = a.low + b.low > 0xffffffff ? 1 : 0;\n const high = (a.high + b.high + carry) >>> 0;\n return make64(high, low);\n};\n\nexport const sub64 = (a: UInt64, b: UInt64) => {\n const low = (a.low - b.low) >>> 0;\n const borrow = a.low < b.low ? 1 : 0;\n const high = (a.high - b.high - borrow) >>> 0;\n return make64(high, low);\n};\n\nexport const shl64 = (value: UInt64, bits: number) => {\n if (bits === 0) {\n return value;\n }\n if (bits >= 64) {\n return make64(0, 0);\n }\n if (bits >= 32) {\n return make64(value.low << (bits - 32), 0);\n }\n\n const high = (value.high << bits) | (value.low >>> (32 - bits));\n const low = value.low << bits;\n return make64(high >>> 0, low >>> 0);\n};\n\nexport const shr64 = (value: UInt64, bits: number) => {\n if (bits === 0) {\n return value;\n }\n if (bits >= 64) {\n return make64(0, 0);\n }\n if (bits >= 32) {\n return make64(0, value.high >>> (bits - 32));\n }\n\n const low = (value.low >>> bits) | (value.high << (32 - bits));\n const high = value.high >>> bits;\n return make64(high >>> 0, low >>> 0);\n};\n\nexport const or64 = (a: UInt64, b: UInt64) =>\n make64((a.high | b.high) >>> 0, (a.low | b.low) >>> 0);\n\nexport const and64 = (a: UInt64, b: UInt64) =>\n make64((a.high & b.high) >>> 0, (a.low & b.low) >>> 0);\n\nexport const cmp64 = (a: UInt64, b: UInt64) => {\n if (a.high < b.high) {\n return -1;\n }\n if (a.high > b.high) {\n return 1;\n }\n if (a.low < b.low) {\n return -1;\n }\n if (a.low > b.low) {\n return 1;\n }\n return 0;\n};\n\nconst gte64 = (a: UInt64, b: UInt64) => cmp64(a, b) >= 0;\n\nconst toHex64 = (value: UInt64) => {\n if (value.high === 0) {\n return value.low.toString(16);\n }\n\n const highHex = value.high.toString(16);\n let lowHex = value.low.toString(16);\n while (lowHex.length < 8) {\n lowHex = `0${lowHex}`;\n }\n return `${highHex}${lowHex}`;\n};\n\nconst toString64 = (value: UInt64) => {\n if (value.high === 0) {\n return value.low.toString();\n }\n\n if (value.high < 0x200000) {\n return (value.high * 0x100000000 + value.low).toString();\n }\n\n return `0x${toHex64(value)}`;\n};\n\nconst toBase32_64 = (value: UInt64) => {\n if (value.high === 0) {\n return value.low.toString(32);\n }\n\n const hex = toHex64(value);\n let num = 0;\n let result = \"\";\n\n for (let index = 0; index < hex.length; index += 1) {\n num = num * 16 + Number.parseInt(hex[index]!, 16);\n if (num >= 32) {\n result += (num % 32).toString(32);\n num = Math.floor(num / 32);\n }\n }\n\n if (num > 0) {\n result = `${num.toString(32)}${result}`;\n }\n\n return result || \"0\";\n};\n\nconst hashString = (value: string) => {\n let hash = make64(0x811c9dc5, 0);\n const prime = from32(0x01000193);\n\n for (let index = 0; index < value.length; index += 1) {\n const char = from32(value.charCodeAt(index));\n hash = and64(or64(hash, char), make64(0, 0xffffffff));\n if (hash.high === 0) {\n hash = from32((hash.low * prime.low) >>> 0);\n }\n }\n\n return hash;\n};\n\nconst getMachineIdentifier = () => {\n if (typeof process !== \"undefined\") {\n const identifier =\n process.env.HOSTNAME ??\n process.env.COMPUTERNAME ??\n process.release?.name;\n if (identifier) {\n return identifier;\n }\n }\n\n if (typeof navigator !== \"undefined\") {\n return `${navigator.userAgent}${navigator.platform}${navigator.hardwareConcurrency ?? \"\"}`;\n }\n\n return `js-${Math.random().toString(36).slice(2)}`;\n};\n\nconst getRandomBytes = (length: number) => {\n const cryptoApi = globalThis.crypto;\n if (cryptoApi?.getRandomValues) {\n const values = new Uint8Array(length);\n cryptoApi.getRandomValues(values);\n return Array.from(values);\n }\n\n return Array.from({ length }, () => Math.floor(Math.random() * 256));\n};\n\nexport const getDefaultConfig = (): Required<MuidConfig> => {\n const epoch = make64(\n Math.floor(defaultEpochValue / 0x100000000),\n defaultEpochValue % 0x100000000,\n );\n const timestampBitLen = 41;\n const machineIDBitLen = 14;\n const maxMachineID = (1 << machineIDBitLen) - 1;\n const identifier = getMachineIdentifier();\n let machineID: UInt64;\n\n if (identifier) {\n const hash = hashString(identifier);\n machineID = from32(hash.low & maxMachineID);\n } else {\n const randomBytes = getRandomBytes(4);\n let randomValue = 0;\n for (let index = 0; index < 4; index += 1) {\n randomValue = (randomValue << 8) | randomBytes[index]!;\n }\n machineID = from32(randomValue & maxMachineID);\n }\n\n return {\n epoch,\n machineID,\n machineIDBitLen,\n timestampBitLen,\n };\n};\n\nexport class MUID {\n readonly value: UInt64;\n\n constructor(value?: UInt64 | number | null) {\n if (typeof value === \"number\") {\n this.value = from32(value);\n return;\n }\n\n if (value && typeof value.high === \"number\" && typeof value.low === \"number\") {\n this.value = make64(value.high, value.low);\n return;\n }\n\n this.value = make64(0, 0);\n }\n\n toString() {\n return toBase32_64(this.value);\n }\n\n toHex() {\n return toHex64(this.value);\n }\n\n toDecimal() {\n return toString64(this.value);\n }\n\n valueOf() {\n return this.value;\n }\n}\n\nexport class Generator {\n readonly timestampBitLen: number;\n readonly machineIDBitLen: number;\n readonly epoch: UInt64;\n readonly shardIndex: number;\n readonly shardBitLen: number;\n readonly counterBitLen: number;\n readonly timestampBitShift: number;\n readonly machineIDShift: number;\n readonly shardIndexShift: number;\n readonly counterBitMask: UInt64;\n readonly machineID: UInt64;\n state: UInt64;\n\n constructor(config: MuidConfig = {}, shardIndex = 0, shardBitLen = 0) {\n this.timestampBitLen = config.timestampBitLen ?? 41;\n this.machineIDBitLen = config.machineIDBitLen ?? 14;\n this.epoch =\n config.epoch ??\n make64(\n Math.floor(defaultEpochValue / 0x100000000),\n defaultEpochValue % 0x100000000,\n );\n this.shardIndex = shardIndex;\n this.shardBitLen = shardBitLen;\n this.counterBitLen =\n 64 - this.timestampBitLen - this.machineIDBitLen - this.shardBitLen;\n this.timestampBitShift =\n this.machineIDBitLen + this.shardBitLen + this.counterBitLen;\n this.machineIDShift = this.shardBitLen + this.counterBitLen;\n this.shardIndexShift = this.counterBitLen;\n this.counterBitMask =\n this.counterBitLen >= 32\n ? make64(0xffffffff, 0xffffffff)\n : sub64(shl64(from32(1), this.counterBitLen), from32(1));\n\n const machineIDMask =\n this.machineIDBitLen >= 32\n ? make64(0xffffffff, 0xffffffff)\n : sub64(shl64(from32(1), this.machineIDBitLen), from32(1));\n\n this.machineID = and64(config.machineID ?? from32(0), machineIDMask);\n this.shardIndex =\n (this.shardIndex & ((1 << Math.min(this.shardBitLen, 31)) - 1)) >>> 0;\n this.state = from32(1);\n }\n\n id() {\n let now = sub64(from32(Date.now() & 0xffffffff), this.epoch);\n const dateNow = Date.now();\n if (dateNow > 0xffffffff) {\n now = sub64(\n make64(Math.floor(dateNow / 0x100000000), dateNow & 0xffffffff),\n this.epoch,\n );\n }\n const lastTimestamp = shr64(this.state, this.counterBitLen);\n let counter = and64(this.state, this.counterBitMask);\n\n if (cmp64(now, lastTimestamp) < 0) {\n now = lastTimestamp;\n }\n\n if (cmp64(now, lastTimestamp) === 0) {\n if (gte64(counter, this.counterBitMask)) {\n now = add64(now, from32(1));\n counter = from32(1);\n } else {\n counter = add64(counter, from32(1));\n }\n } else {\n counter = from32(1);\n }\n\n this.state = or64(shl64(now, this.counterBitLen), counter);\n\n const timestampPart = shl64(now, this.timestampBitShift);\n const machineIDPart = shl64(this.machineID, this.machineIDShift);\n const shardIndexPart = shl64(from32(this.shardIndex), this.shardIndexShift);\n return new MUID(\n or64(or64(or64(timestampPart, machineIDPart), shardIndexPart), counter),\n );\n }\n}\n\nexport class ShardedGenerators {\n readonly pool: Generator[];\n readonly size: number;\n index = 0;\n\n constructor() {\n const numCPU =\n typeof navigator !== \"undefined\" && navigator.hardwareConcurrency\n ? navigator.hardwareConcurrency\n : 4;\n const shardBits =\n numCPU > 1 ? Math.min(Math.ceil(Math.log2(numCPU)), 5) : 0;\n const defaultConfig = getDefaultConfig();\n this.size = 1 << shardBits;\n this.pool = [];\n\n for (let index = 0; index < this.size; index += 1) {\n this.pool.push(new Generator(defaultConfig, index, shardBits));\n }\n }\n\n next() {\n const generator = this.pool[this.index]!;\n this.index = (this.index + 1) % this.size;\n return generator;\n }\n}\n\nconst defaultGenerator = new Generator(getDefaultConfig(), 0, 0);\n\nexport const make = () => defaultGenerator.id();\n\nexport const newGenerator = (\n config: MuidConfig = {},\n shardIndex = 0,\n shardBitLen = 0,\n) =>\n new Generator(\n {\n ...getDefaultConfig(),\n ...config,\n },\n shardIndex,\n shardBitLen,\n );\n\nexport const makeMuid = (prefix: string) => `${prefix}-${make().toString()}`;\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
// src/kind.ts
|
|
2
|
+
var length = 48;
|
|
3
|
+
var idLength = 8;
|
|
4
|
+
var depthMax = length / idLength;
|
|
5
|
+
var idMask = (1 << idLength) - 1;
|
|
6
|
+
var counter = 0;
|
|
7
|
+
var nextId = () => {
|
|
8
|
+
const id = counter & idMask;
|
|
9
|
+
counter += 1;
|
|
10
|
+
return id;
|
|
11
|
+
};
|
|
12
|
+
var extractId = (kindValue, depth) => Math.floor(kindValue / Math.pow(2, idLength * depth)) & idMask;
|
|
13
|
+
var bases = (id) => {
|
|
14
|
+
const baseKinds = Array(depthMax).fill(0);
|
|
15
|
+
for (let index = 1; index < depthMax; index += 1) {
|
|
16
|
+
baseKinds[index - 1] = extractId(id, index);
|
|
17
|
+
}
|
|
18
|
+
return baseKinds;
|
|
19
|
+
};
|
|
20
|
+
function kind(...baseKinds) {
|
|
21
|
+
let result = nextId();
|
|
22
|
+
const used = {};
|
|
23
|
+
let usedCount = 0;
|
|
24
|
+
for (const base of baseKinds) {
|
|
25
|
+
for (let depth = 0; depth < depthMax; depth += 1) {
|
|
26
|
+
const baseId = extractId(base, depth);
|
|
27
|
+
if (baseId === 0) {
|
|
28
|
+
break;
|
|
29
|
+
}
|
|
30
|
+
if (used[baseId]) {
|
|
31
|
+
continue;
|
|
32
|
+
}
|
|
33
|
+
used[baseId] = true;
|
|
34
|
+
usedCount += 1;
|
|
35
|
+
result += baseId * Math.pow(2, usedCount * idLength);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
return result;
|
|
39
|
+
}
|
|
40
|
+
function isKind(kindValue, ...baseKinds) {
|
|
41
|
+
for (const base of baseKinds) {
|
|
42
|
+
const baseId = base & idMask;
|
|
43
|
+
if (kindValue === baseId) {
|
|
44
|
+
return true;
|
|
45
|
+
}
|
|
46
|
+
for (let depth = 0; depth < depthMax; depth += 1) {
|
|
47
|
+
const currentId = extractId(kindValue, depth);
|
|
48
|
+
if (currentId === baseId) {
|
|
49
|
+
return true;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
return false;
|
|
54
|
+
}
|
|
55
|
+
var makeKind = (...baseKinds) => kind(...baseKinds);
|
|
56
|
+
var kinds = {
|
|
57
|
+
Null: makeKind(),
|
|
58
|
+
Element: makeKind(),
|
|
59
|
+
Partial: 0,
|
|
60
|
+
Vertex: 0,
|
|
61
|
+
Constraint: 0,
|
|
62
|
+
Behavior: 0,
|
|
63
|
+
Namespace: 0,
|
|
64
|
+
Concurrent: 0,
|
|
65
|
+
Sequential: 0,
|
|
66
|
+
StateMachine: 0,
|
|
67
|
+
Attribute: 0,
|
|
68
|
+
State: 0,
|
|
69
|
+
Model: 0,
|
|
70
|
+
Transition: 0,
|
|
71
|
+
Internal: 0,
|
|
72
|
+
External: 0,
|
|
73
|
+
Local: 0,
|
|
74
|
+
Self: 0,
|
|
75
|
+
Event: 0,
|
|
76
|
+
CompletionEvent: 0,
|
|
77
|
+
ChangeEvent: 0,
|
|
78
|
+
ErrorEvent: 0,
|
|
79
|
+
TimeEvent: 0,
|
|
80
|
+
CallEvent: 0,
|
|
81
|
+
Pseudostate: 0,
|
|
82
|
+
Initial: 0,
|
|
83
|
+
FinalState: 0,
|
|
84
|
+
Choice: 0,
|
|
85
|
+
Junction: 0,
|
|
86
|
+
DeepHistory: 0,
|
|
87
|
+
ShallowHistory: 0
|
|
88
|
+
};
|
|
89
|
+
kinds.Partial = makeKind(kinds.Element);
|
|
90
|
+
kinds.Vertex = makeKind(kinds.Element);
|
|
91
|
+
kinds.Constraint = makeKind(kinds.Element);
|
|
92
|
+
kinds.Behavior = makeKind(kinds.Element);
|
|
93
|
+
kinds.Namespace = makeKind(kinds.Element);
|
|
94
|
+
kinds.Concurrent = makeKind(kinds.Behavior);
|
|
95
|
+
kinds.Sequential = makeKind(kinds.Behavior);
|
|
96
|
+
kinds.StateMachine = makeKind(kinds.Concurrent, kinds.Namespace);
|
|
97
|
+
kinds.Attribute = makeKind(kinds.Element);
|
|
98
|
+
kinds.State = makeKind(kinds.Vertex, kinds.Namespace);
|
|
99
|
+
kinds.Model = makeKind(kinds.State);
|
|
100
|
+
kinds.Transition = makeKind(kinds.Element);
|
|
101
|
+
kinds.Internal = makeKind(kinds.Transition);
|
|
102
|
+
kinds.External = makeKind(kinds.Transition);
|
|
103
|
+
kinds.Local = makeKind(kinds.Transition);
|
|
104
|
+
kinds.Self = makeKind(kinds.Transition);
|
|
105
|
+
kinds.Event = makeKind(kinds.Element);
|
|
106
|
+
kinds.CompletionEvent = makeKind(kinds.Event);
|
|
107
|
+
kinds.ChangeEvent = makeKind(kinds.Event);
|
|
108
|
+
kinds.ErrorEvent = makeKind(kinds.CompletionEvent);
|
|
109
|
+
kinds.TimeEvent = makeKind(kinds.Event);
|
|
110
|
+
kinds.CallEvent = makeKind(kinds.Event);
|
|
111
|
+
kinds.Pseudostate = makeKind(kinds.Vertex);
|
|
112
|
+
kinds.Initial = makeKind(kinds.Pseudostate);
|
|
113
|
+
kinds.FinalState = makeKind(kinds.State);
|
|
114
|
+
kinds.Choice = makeKind(kinds.Pseudostate);
|
|
115
|
+
kinds.Junction = makeKind(kinds.Pseudostate);
|
|
116
|
+
kinds.DeepHistory = makeKind(kinds.Pseudostate);
|
|
117
|
+
kinds.ShallowHistory = makeKind(kinds.Pseudostate);
|
|
118
|
+
var Kinds = kinds;
|
|
119
|
+
var MakeKind = makeKind;
|
|
120
|
+
var IsKind = isKind;
|
|
121
|
+
|
|
122
|
+
export {
|
|
123
|
+
bases,
|
|
124
|
+
kind,
|
|
125
|
+
isKind,
|
|
126
|
+
makeKind,
|
|
127
|
+
kinds,
|
|
128
|
+
Kinds,
|
|
129
|
+
MakeKind,
|
|
130
|
+
IsKind
|
|
131
|
+
};
|
|
132
|
+
//# sourceMappingURL=chunk-UO7RF4FF.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/kind.ts"],"sourcesContent":["export type Kind = number;\n\nconst length = 48;\nconst idLength = 8;\nconst depthMax = length / idLength;\nconst idMask = (1 << idLength) - 1;\n\nlet counter = 0;\n\nconst nextId = () => {\n const id = counter & idMask;\n counter += 1;\n return id;\n};\n\nconst extractId = (kindValue: number, depth: number) =>\n Math.floor(kindValue / Math.pow(2, idLength * depth)) & idMask;\n\nexport const bases = (id: number) => {\n const baseKinds = Array<number>(depthMax).fill(0);\n\n for (let index = 1; index < depthMax; index += 1) {\n baseKinds[index - 1] = extractId(id, index);\n }\n\n return baseKinds;\n};\n\nexport function kind(...baseKinds: number[]) {\n let result = nextId();\n const used: Record<number, true> = {};\n let usedCount = 0;\n\n for (const base of baseKinds) {\n for (let depth = 0; depth < depthMax; depth += 1) {\n const baseId = extractId(base, depth);\n if (baseId === 0) {\n break;\n }\n if (used[baseId]) {\n continue;\n }\n\n used[baseId] = true;\n usedCount += 1;\n result += baseId * Math.pow(2, usedCount * idLength);\n }\n }\n\n return result;\n}\n\nexport function isKind(kindValue: number, ...baseKinds: number[]) {\n for (const base of baseKinds) {\n const baseId = base & idMask;\n if (kindValue === baseId) {\n return true;\n }\n\n for (let depth = 0; depth < depthMax; depth += 1) {\n const currentId = extractId(kindValue, depth);\n if (currentId === baseId) {\n return true;\n }\n }\n }\n\n return false;\n}\n\nexport const makeKind = (...baseKinds: number[]) => kind(...baseKinds);\n\nexport const kinds = {\n Null: makeKind(),\n Element: makeKind(),\n Partial: 0,\n Vertex: 0,\n Constraint: 0,\n Behavior: 0,\n Namespace: 0,\n Concurrent: 0,\n Sequential: 0,\n StateMachine: 0,\n Attribute: 0,\n State: 0,\n Model: 0,\n Transition: 0,\n Internal: 0,\n External: 0,\n Local: 0,\n Self: 0,\n Event: 0,\n CompletionEvent: 0,\n ChangeEvent: 0,\n ErrorEvent: 0,\n TimeEvent: 0,\n CallEvent: 0,\n Pseudostate: 0,\n Initial: 0,\n FinalState: 0,\n Choice: 0,\n Junction: 0,\n DeepHistory: 0,\n ShallowHistory: 0,\n} satisfies Record<string, Kind>;\n\nkinds.Partial = makeKind(kinds.Element);\nkinds.Vertex = makeKind(kinds.Element);\nkinds.Constraint = makeKind(kinds.Element);\nkinds.Behavior = makeKind(kinds.Element);\nkinds.Namespace = makeKind(kinds.Element);\nkinds.Concurrent = makeKind(kinds.Behavior);\nkinds.Sequential = makeKind(kinds.Behavior);\nkinds.StateMachine = makeKind(kinds.Concurrent, kinds.Namespace);\nkinds.Attribute = makeKind(kinds.Element);\nkinds.State = makeKind(kinds.Vertex, kinds.Namespace);\nkinds.Model = makeKind(kinds.State);\nkinds.Transition = makeKind(kinds.Element);\nkinds.Internal = makeKind(kinds.Transition);\nkinds.External = makeKind(kinds.Transition);\nkinds.Local = makeKind(kinds.Transition);\nkinds.Self = makeKind(kinds.Transition);\nkinds.Event = makeKind(kinds.Element);\nkinds.CompletionEvent = makeKind(kinds.Event);\nkinds.ChangeEvent = makeKind(kinds.Event);\nkinds.ErrorEvent = makeKind(kinds.CompletionEvent);\nkinds.TimeEvent = makeKind(kinds.Event);\nkinds.CallEvent = makeKind(kinds.Event);\nkinds.Pseudostate = makeKind(kinds.Vertex);\nkinds.Initial = makeKind(kinds.Pseudostate);\nkinds.FinalState = makeKind(kinds.State);\nkinds.Choice = makeKind(kinds.Pseudostate);\nkinds.Junction = makeKind(kinds.Pseudostate);\nkinds.DeepHistory = makeKind(kinds.Pseudostate);\nkinds.ShallowHistory = makeKind(kinds.Pseudostate);\n\nexport const Kinds = kinds;\nexport const MakeKind = makeKind;\nexport const IsKind = isKind;\n"],"mappings":";AAEA,IAAM,SAAS;AACf,IAAM,WAAW;AACjB,IAAM,WAAW,SAAS;AAC1B,IAAM,UAAU,KAAK,YAAY;AAEjC,IAAI,UAAU;AAEd,IAAM,SAAS,MAAM;AACnB,QAAM,KAAK,UAAU;AACrB,aAAW;AACX,SAAO;AACT;AAEA,IAAM,YAAY,CAAC,WAAmB,UACpC,KAAK,MAAM,YAAY,KAAK,IAAI,GAAG,WAAW,KAAK,CAAC,IAAI;AAEnD,IAAM,QAAQ,CAAC,OAAe;AACnC,QAAM,YAAY,MAAc,QAAQ,EAAE,KAAK,CAAC;AAEhD,WAAS,QAAQ,GAAG,QAAQ,UAAU,SAAS,GAAG;AAChD,cAAU,QAAQ,CAAC,IAAI,UAAU,IAAI,KAAK;AAAA,EAC5C;AAEA,SAAO;AACT;AAEO,SAAS,QAAQ,WAAqB;AAC3C,MAAI,SAAS,OAAO;AACpB,QAAM,OAA6B,CAAC;AACpC,MAAI,YAAY;AAEhB,aAAW,QAAQ,WAAW;AAC5B,aAAS,QAAQ,GAAG,QAAQ,UAAU,SAAS,GAAG;AAChD,YAAM,SAAS,UAAU,MAAM,KAAK;AACpC,UAAI,WAAW,GAAG;AAChB;AAAA,MACF;AACA,UAAI,KAAK,MAAM,GAAG;AAChB;AAAA,MACF;AAEA,WAAK,MAAM,IAAI;AACf,mBAAa;AACb,gBAAU,SAAS,KAAK,IAAI,GAAG,YAAY,QAAQ;AAAA,IACrD;AAAA,EACF;AAEA,SAAO;AACT;AAEO,SAAS,OAAO,cAAsB,WAAqB;AAChE,aAAW,QAAQ,WAAW;AAC5B,UAAM,SAAS,OAAO;AACtB,QAAI,cAAc,QAAQ;AACxB,aAAO;AAAA,IACT;AAEA,aAAS,QAAQ,GAAG,QAAQ,UAAU,SAAS,GAAG;AAChD,YAAM,YAAY,UAAU,WAAW,KAAK;AAC5C,UAAI,cAAc,QAAQ;AACxB,eAAO;AAAA,MACT;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAEO,IAAM,WAAW,IAAI,cAAwB,KAAK,GAAG,SAAS;AAE9D,IAAM,QAAQ;AAAA,EACnB,MAAM,SAAS;AAAA,EACf,SAAS,SAAS;AAAA,EAClB,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,YAAY;AAAA,EACZ,UAAU;AAAA,EACV,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,cAAc;AAAA,EACd,WAAW;AAAA,EACX,OAAO;AAAA,EACP,OAAO;AAAA,EACP,YAAY;AAAA,EACZ,UAAU;AAAA,EACV,UAAU;AAAA,EACV,OAAO;AAAA,EACP,MAAM;AAAA,EACN,OAAO;AAAA,EACP,iBAAiB;AAAA,EACjB,aAAa;AAAA,EACb,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,WAAW;AAAA,EACX,aAAa;AAAA,EACb,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,aAAa;AAAA,EACb,gBAAgB;AAClB;AAEA,MAAM,UAAU,SAAS,MAAM,OAAO;AACtC,MAAM,SAAS,SAAS,MAAM,OAAO;AACrC,MAAM,aAAa,SAAS,MAAM,OAAO;AACzC,MAAM,WAAW,SAAS,MAAM,OAAO;AACvC,MAAM,YAAY,SAAS,MAAM,OAAO;AACxC,MAAM,aAAa,SAAS,MAAM,QAAQ;AAC1C,MAAM,aAAa,SAAS,MAAM,QAAQ;AAC1C,MAAM,eAAe,SAAS,MAAM,YAAY,MAAM,SAAS;AAC/D,MAAM,YAAY,SAAS,MAAM,OAAO;AACxC,MAAM,QAAQ,SAAS,MAAM,QAAQ,MAAM,SAAS;AACpD,MAAM,QAAQ,SAAS,MAAM,KAAK;AAClC,MAAM,aAAa,SAAS,MAAM,OAAO;AACzC,MAAM,WAAW,SAAS,MAAM,UAAU;AAC1C,MAAM,WAAW,SAAS,MAAM,UAAU;AAC1C,MAAM,QAAQ,SAAS,MAAM,UAAU;AACvC,MAAM,OAAO,SAAS,MAAM,UAAU;AACtC,MAAM,QAAQ,SAAS,MAAM,OAAO;AACpC,MAAM,kBAAkB,SAAS,MAAM,KAAK;AAC5C,MAAM,cAAc,SAAS,MAAM,KAAK;AACxC,MAAM,aAAa,SAAS,MAAM,eAAe;AACjD,MAAM,YAAY,SAAS,MAAM,KAAK;AACtC,MAAM,YAAY,SAAS,MAAM,KAAK;AACtC,MAAM,cAAc,SAAS,MAAM,MAAM;AACzC,MAAM,UAAU,SAAS,MAAM,WAAW;AAC1C,MAAM,aAAa,SAAS,MAAM,KAAK;AACvC,MAAM,SAAS,SAAS,MAAM,WAAW;AACzC,MAAM,WAAW,SAAS,MAAM,WAAW;AAC3C,MAAM,cAAc,SAAS,MAAM,WAAW;AAC9C,MAAM,iBAAiB,SAAS,MAAM,WAAW;AAE1C,IAAM,QAAQ;AACd,IAAM,WAAW;AACjB,IAAM,SAAS;","names":[]}
|