@rezless/vm 0.3.0 → 0.5.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/NOTICE +26 -14
- package/dist/builtins/base64.d.ts.map +1 -1
- package/dist/builtins/base64.js +29 -2
- package/dist/builtins/base64.js.map +1 -1
- package/dist/builtins/chat.d.ts +7 -1
- package/dist/builtins/chat.d.ts.map +1 -1
- package/dist/builtins/chat.js +26 -29
- package/dist/builtins/chat.js.map +1 -1
- package/dist/builtins/dataserver.d.ts +2 -1
- package/dist/builtins/dataserver.d.ts.map +1 -1
- package/dist/builtins/dataserver.js +5 -4
- package/dist/builtins/dataserver.js.map +1 -1
- package/dist/builtins/debug.d.ts +4 -0
- package/dist/builtins/debug.d.ts.map +1 -0
- package/dist/builtins/debug.js +7 -0
- package/dist/builtins/debug.js.map +1 -0
- package/dist/builtins/hash.js +1 -1
- package/dist/builtins/hash.js.map +1 -1
- package/dist/builtins/http.d.ts +8 -1
- package/dist/builtins/http.d.ts.map +1 -1
- package/dist/builtins/http.js +87 -9
- package/dist/builtins/http.js.map +1 -1
- package/dist/builtins/identity.d.ts +2 -0
- package/dist/builtins/identity.d.ts.map +1 -1
- package/dist/builtins/identity.js +9 -1
- package/dist/builtins/identity.js.map +1 -1
- package/dist/builtins/index.d.ts.map +1 -1
- package/dist/builtins/index.js +29 -7
- package/dist/builtins/index.js.map +1 -1
- package/dist/builtins/inventory.d.ts +13 -2
- package/dist/builtins/inventory.d.ts.map +1 -1
- package/dist/builtins/inventory.js +82 -43
- package/dist/builtins/inventory.js.map +1 -1
- package/dist/builtins/json.d.ts.map +1 -1
- package/dist/builtins/json.js +11 -36
- package/dist/builtins/json.js.map +1 -1
- package/dist/builtins/link-info.d.ts +1 -1
- package/dist/builtins/link-info.d.ts.map +1 -1
- package/dist/builtins/link-info.js +2 -2
- package/dist/builtins/link-info.js.map +1 -1
- package/dist/builtins/linksetdata.d.ts.map +1 -1
- package/dist/builtins/linksetdata.js +298 -31
- package/dist/builtins/linksetdata.js.map +1 -1
- package/dist/builtins/listen.d.ts +3 -1
- package/dist/builtins/listen.d.ts.map +1 -1
- package/dist/builtins/listen.js +9 -1
- package/dist/builtins/listen.js.map +1 -1
- package/dist/builtins/lists.d.ts +21 -0
- package/dist/builtins/lists.d.ts.map +1 -1
- package/dist/builtins/lists.js +82 -38
- package/dist/builtins/lists.js.map +1 -1
- package/dist/builtins/math.d.ts +27 -4
- package/dist/builtins/math.d.ts.map +1 -1
- package/dist/builtins/math.js +118 -41
- package/dist/builtins/math.js.map +1 -1
- package/dist/builtins/permissions.d.ts +18 -0
- package/dist/builtins/permissions.d.ts.map +1 -0
- package/dist/builtins/permissions.js +17 -0
- package/dist/builtins/permissions.js.map +1 -0
- package/dist/builtins/prim-accessors.d.ts +1 -0
- package/dist/builtins/prim-accessors.d.ts.map +1 -1
- package/dist/builtins/prim-accessors.js +44 -42
- package/dist/builtins/prim-accessors.js.map +1 -1
- package/dist/builtins/prim-params.d.ts +1 -1
- package/dist/builtins/prim-params.d.ts.map +1 -1
- package/dist/builtins/prim-params.js +19 -11
- package/dist/builtins/prim-params.js.map +1 -1
- package/dist/builtins/strings.d.ts.map +1 -1
- package/dist/builtins/strings.js +37 -33
- package/dist/builtins/strings.js.map +1 -1
- package/dist/builtins/time.d.ts +2 -0
- package/dist/builtins/time.d.ts.map +1 -1
- package/dist/builtins/time.js +2 -0
- package/dist/builtins/time.js.map +1 -1
- package/dist/clock.d.ts +23 -9
- package/dist/clock.d.ts.map +1 -1
- package/dist/clock.js +40 -13
- package/dist/clock.js.map +1 -1
- package/dist/dispatch.d.ts +1 -1
- package/dist/dispatch.d.ts.map +1 -1
- package/dist/dispatch.js +12 -5
- package/dist/dispatch.js.map +1 -1
- package/dist/generated/constants.d.ts +130 -18
- package/dist/generated/constants.d.ts.map +1 -1
- package/dist/generated/constants.js +254 -142
- package/dist/generated/constants.js.map +1 -1
- package/dist/generated/constants_table.d.ts +1 -1
- package/dist/generated/constants_table.d.ts.map +1 -1
- package/dist/generated/constants_table.js +247 -135
- package/dist/generated/constants_table.js.map +1 -1
- package/dist/generated/events.d.ts +22 -22
- package/dist/generated/events.d.ts.map +1 -1
- package/dist/generated/events.js +10 -10
- package/dist/generated/events.js.map +1 -1
- package/dist/generated/functions.d.ts +292 -187
- package/dist/generated/functions.d.ts.map +1 -1
- package/dist/generated/functions.js +149 -140
- package/dist/generated/functions.js.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/interpreter.d.ts +1 -1
- package/dist/interpreter.d.ts.map +1 -1
- package/dist/interpreter.js +2 -2
- package/dist/interpreter.js.map +1 -1
- package/dist/inventory.d.ts +4 -2
- package/dist/inventory.d.ts.map +1 -1
- package/dist/inventory.js +6 -2
- package/dist/inventory.js.map +1 -1
- package/dist/keys.d.ts +6 -0
- package/dist/keys.d.ts.map +1 -0
- package/dist/keys.js +20 -0
- package/dist/keys.js.map +1 -0
- package/dist/linkset.d.ts +28 -3
- package/dist/linkset.d.ts.map +1 -1
- package/dist/linkset.js +66 -7
- package/dist/linkset.js.map +1 -1
- package/dist/prim-params.d.ts +9 -2
- package/dist/prim-params.d.ts.map +1 -1
- package/dist/prim-params.js +198 -113
- package/dist/prim-params.js.map +1 -1
- package/dist/prim.d.ts +6 -1
- package/dist/prim.d.ts.map +1 -1
- package/dist/prim.js +23 -3
- package/dist/prim.js.map +1 -1
- package/dist/runtime.d.ts +11 -1
- package/dist/runtime.d.ts.map +1 -1
- package/dist/script.d.ts +30 -5
- package/dist/script.d.ts.map +1 -1
- package/dist/script.js +94 -32
- package/dist/script.js.map +1 -1
- package/dist/typecheck.d.ts +1 -1
- package/dist/typecheck.js +1 -1
- package/dist/values/coerce.d.ts +11 -0
- package/dist/values/coerce.d.ts.map +1 -1
- package/dist/values/coerce.js +65 -38
- package/dist/values/coerce.js.map +1 -1
- package/dist/values/format.d.ts +24 -16
- package/dist/values/format.d.ts.map +1 -1
- package/dist/values/format.js +42 -25
- package/dist/values/format.js.map +1 -1
- package/dist/values/ops.d.ts +2 -1
- package/dist/values/ops.d.ts.map +1 -1
- package/dist/values/ops.js +13 -5
- package/dist/values/ops.js.map +1 -1
- package/dist/values/utf8.d.ts +3 -0
- package/dist/values/utf8.d.ts.map +1 -0
- package/dist/values/utf8.js +14 -0
- package/dist/values/utf8.js.map +1 -0
- package/dist/world.d.ts +29 -0
- package/dist/world.d.ts.map +1 -0
- package/dist/world.js +29 -0
- package/dist/world.js.map +1 -0
- package/package.json +2 -2
package/NOTICE
CHANGED
|
@@ -8,26 +8,38 @@ This product is licensed under the Apache License, Version 2.0 (see LICENSE).
|
|
|
8
8
|
Third-party content
|
|
9
9
|
-------------------
|
|
10
10
|
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
11
|
+
LSL function, event, and constant definitions come from the
|
|
12
|
+
secondlife/lsl-definitions project
|
|
13
|
+
(https://github.com/secondlife/lsl-definitions), licensed under the MIT License.
|
|
14
|
+
The vendored data file and the files generated from it:
|
|
14
15
|
|
|
15
|
-
|
|
16
|
-
Copyright (C) 2013-2025 Sei Lisa.
|
|
17
|
-
Copyright (C) 2017-2023 Mako Nozaki.
|
|
18
|
-
Copyright (C) 2023-2023 Alex Carpenter.
|
|
19
|
-
|
|
20
|
-
The vendored data file and any output mechanically derived from it remain
|
|
21
|
-
under their original LGPL-3.0-or-later license:
|
|
22
|
-
|
|
23
|
-
vendor/kwdb.xml (the data file)
|
|
16
|
+
vendor/lsl_definitions.yaml (the data file)
|
|
24
17
|
packages/vm/src/generated/constants.ts (derived)
|
|
25
18
|
packages/vm/src/generated/constants_table.ts (derived)
|
|
26
19
|
packages/vm/src/generated/functions.ts (derived)
|
|
27
20
|
packages/vm/src/generated/events.ts (derived)
|
|
28
21
|
packages/parser/src/generated/event-names.ts (derived)
|
|
29
22
|
|
|
30
|
-
|
|
31
|
-
|
|
23
|
+
MIT License
|
|
24
|
+
|
|
25
|
+
Copyright (c) 2025 Linden Research, Inc.
|
|
26
|
+
|
|
27
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
28
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
29
|
+
in the Software without restriction, including without limitation the rights
|
|
30
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
31
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
32
|
+
furnished to do so, subject to the following conditions:
|
|
33
|
+
|
|
34
|
+
The above copyright notice and this permission notice shall be included in all
|
|
35
|
+
copies or substantial portions of the Software.
|
|
36
|
+
|
|
37
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
38
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
39
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
40
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
41
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
42
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
43
|
+
SOFTWARE.
|
|
32
44
|
|
|
33
45
|
Second Life is a registered trademark of Linden Research, Inc.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"base64.d.ts","sourceRoot":"","sources":["../../src/builtins/base64.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAGhD;;;;GAIG;AAEH,eAAO,MAAM,gBAAgB,EAAE,WAG9B,CAAA;AAED,eAAO,MAAM,gBAAgB,EAAE,
|
|
1
|
+
{"version":3,"file":"base64.d.ts","sourceRoot":"","sources":["../../src/builtins/base64.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAGhD;;;;GAIG;AAEH,eAAO,MAAM,gBAAgB,EAAE,WAG9B,CAAA;AAED,eAAO,MAAM,gBAAgB,EAAE,WAG9B,CAAA;AA6BD;;;;;;;;;GASG;AACH,eAAO,MAAM,iBAAiB,EAAE,WAK/B,CAAA;AA6BD;;;GAGG;AACH,eAAO,MAAM,WAAW,EAAE,WAMzB,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,iBAAiB,EAAE,WAK/B,CAAA"}
|
package/dist/builtins/base64.js
CHANGED
|
@@ -10,9 +10,36 @@ export const llStringToBase64 = (_ctx, args) => {
|
|
|
10
10
|
};
|
|
11
11
|
export const llBase64ToString = (_ctx, args) => {
|
|
12
12
|
const s = args[0] ?? '';
|
|
13
|
-
|
|
14
|
-
return Buffer.from(s, 'base64').toString('utf8');
|
|
13
|
+
return decodeUtf8Lenient(Buffer.from(s, 'base64'));
|
|
15
14
|
};
|
|
15
|
+
/** UTF-8 decode where NUL and each byte of an invalid sequence become `?`. */
|
|
16
|
+
function decodeUtf8Lenient(bytes) {
|
|
17
|
+
const strict = new TextDecoder('utf-8', { fatal: true, ignoreBOM: true });
|
|
18
|
+
let out = '';
|
|
19
|
+
let i = 0;
|
|
20
|
+
while (i < bytes.length) {
|
|
21
|
+
const b = bytes[i];
|
|
22
|
+
const len = b < 0x80 ? 1 : b >= 0xc2 && b < 0xe0 ? 2 : b >= 0xe0 && b < 0xf0 ? 3 : b >= 0xf0 && b < 0xf5 ? 4 : 0;
|
|
23
|
+
let ch = null;
|
|
24
|
+
if (len > 0 && i + len <= bytes.length) {
|
|
25
|
+
try {
|
|
26
|
+
ch = strict.decode(bytes.subarray(i, i + len));
|
|
27
|
+
}
|
|
28
|
+
catch {
|
|
29
|
+
ch = null;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
if (ch === null) {
|
|
33
|
+
out += '?';
|
|
34
|
+
i += 1;
|
|
35
|
+
}
|
|
36
|
+
else {
|
|
37
|
+
out += ch === '\0' ? '?' : ch;
|
|
38
|
+
i += len;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
return out;
|
|
42
|
+
}
|
|
16
43
|
/**
|
|
17
44
|
* llIntegerToBase64(integer x) — encodes the 32-bit big-endian
|
|
18
45
|
* representation of x as 6 base64 chars (24 bits → 4 chars × 6 bits, padded
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"base64.js","sourceRoot":"","sources":["../../src/builtins/base64.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAA;AAE5C;;;;GAIG;AAEH,MAAM,CAAC,MAAM,gBAAgB,GAAgB,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE;IAC1D,MAAM,CAAC,GAAI,IAAI,CAAC,CAAC,CAAwB,IAAI,EAAE,CAAA;IAC/C,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAA;AAClD,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,gBAAgB,GAAgB,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE;IAC1D,MAAM,CAAC,GAAI,IAAI,CAAC,CAAC,CAAwB,IAAI,EAAE,CAAA;IAC/C,
|
|
1
|
+
{"version":3,"file":"base64.js","sourceRoot":"","sources":["../../src/builtins/base64.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAA;AAE5C;;;;GAIG;AAEH,MAAM,CAAC,MAAM,gBAAgB,GAAgB,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE;IAC1D,MAAM,CAAC,GAAI,IAAI,CAAC,CAAC,CAAwB,IAAI,EAAE,CAAA;IAC/C,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAA;AAClD,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,gBAAgB,GAAgB,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE;IAC1D,MAAM,CAAC,GAAI,IAAI,CAAC,CAAC,CAAwB,IAAI,EAAE,CAAA;IAC/C,OAAO,iBAAiB,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAA;AACpD,CAAC,CAAA;AAED,8EAA8E;AAC9E,SAAS,iBAAiB,CAAC,KAAiB;IAC1C,MAAM,MAAM,GAAG,IAAI,WAAW,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;IACzE,IAAI,GAAG,GAAG,EAAE,CAAA;IACZ,IAAI,CAAC,GAAG,CAAC,CAAA;IACT,OAAO,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;QACxB,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,CAAE,CAAA;QACnB,MAAM,GAAG,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;QAChH,IAAI,EAAE,GAAkB,IAAI,CAAA;QAC5B,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC,GAAG,GAAG,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;YACvC,IAAI,CAAC;gBACH,EAAE,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,CAAA;YAChD,CAAC;YAAC,MAAM,CAAC;gBACP,EAAE,GAAG,IAAI,CAAA;YACX,CAAC;QACH,CAAC;QACD,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC;YAChB,GAAG,IAAI,GAAG,CAAA;YACV,CAAC,IAAI,CAAC,CAAA;QACR,CAAC;aAAM,CAAC;YACN,GAAG,IAAI,EAAE,KAAK,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAA;YAC7B,CAAC,IAAI,GAAG,CAAA;QACV,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAA;AACZ,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAgB,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE;IAC3D,MAAM,CAAC,GAAG,OAAO,CAAE,IAAI,CAAC,CAAC,CAAwB,IAAI,CAAC,CAAC,CAAA;IACvD,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;IAC3B,GAAG,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;IACtB,OAAO,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAA;AAC/B,CAAC,CAAA;AAED,MAAM,eAAe,GACnB,kEAAkE,CAAA;AAEpE;;;;;;GAMG;AACH,SAAS,kBAAkB,CAAC,CAAS;IACnC,MAAM,KAAK,GAAa,EAAE,CAAA;IAC1B,IAAI,IAAI,GAAG,CAAC,CAAA;IACZ,IAAI,KAAK,GAAG,CAAC,CAAA;IACb,KAAK,MAAM,EAAE,IAAI,CAAC,EAAE,CAAC;QACnB,MAAM,CAAC,GAAG,eAAe,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;QACrC,IAAI,CAAC,GAAG,CAAC;YAAE,MAAK;QAChB,IAAI,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM,CAAA;QACjC,KAAK,IAAI,CAAC,CAAA;QACV,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;YACf,KAAK,IAAI,CAAC,CAAA;YACV,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,IAAI,KAAK,CAAC,GAAG,IAAI,CAAC,CAAA;QACpC,CAAC;IACH,CAAC;IACD,OAAO,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;AAC/B,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,MAAM,WAAW,GAAgB,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE;IACrD,MAAM,IAAI,GAAG,kBAAkB,CAAE,IAAI,CAAC,CAAC,CAAwB,IAAI,EAAE,CAAC,CAAA;IACtE,MAAM,GAAG,GAAG,kBAAkB,CAAE,IAAI,CAAC,CAAC,CAAwB,IAAI,EAAE,CAAC,CAAA;IACrE,MAAM,GAAG,GACP,GAAG,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,GAAG,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,MAAM,CAAE,CAAC,CAAA;IAC9E,OAAO,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAA;AAC5C,CAAC,CAAA;AAED;;;GAGG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAgB,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE;IAC3D,MAAM,CAAC,GAAI,IAAI,CAAC,CAAC,CAAwB,IAAI,EAAE,CAAA;IAC/C,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAA;IACpC,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,CAAC,CAAA;IAC5B,OAAO,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,CAAA;AAC3B,CAAC,CAAA"}
|
package/dist/builtins/chat.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { BuiltinImpl } from '../runtime.js';
|
|
2
|
-
/** llSay(integer channel, string msg) — captures into ScriptState.chat. */
|
|
2
|
+
/** llSay(integer channel, string msg) — captures into ScriptState.chat and reaches other prims' listens. */
|
|
3
3
|
export declare const llSay: BuiltinImpl;
|
|
4
4
|
/** llShout(integer channel, string msg) */
|
|
5
5
|
export declare const llShout: BuiltinImpl;
|
|
@@ -7,4 +7,10 @@ export declare const llShout: BuiltinImpl;
|
|
|
7
7
|
export declare const llWhisper: BuiltinImpl;
|
|
8
8
|
/** llOwnerSay(string msg) — channel 0 by convention; LSL routes it privately to the owner. */
|
|
9
9
|
export declare const llOwnerSay: BuiltinImpl;
|
|
10
|
+
/** llRegionSay(integer channel, string msg) — channel 0 is refused with a DEBUG_CHANNEL error. */
|
|
11
|
+
export declare const llRegionSay: BuiltinImpl;
|
|
12
|
+
/** llRegionSayTo(key target, integer channel, string msg) — any channel, including 0. */
|
|
13
|
+
export declare const llRegionSayTo: BuiltinImpl;
|
|
14
|
+
/** llInstantMessage(key agent, string msg) — the 2 s forced delay comes from the function spec. */
|
|
15
|
+
export declare const llInstantMessage: BuiltinImpl;
|
|
10
16
|
//# sourceMappingURL=chat.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chat.d.ts","sourceRoot":"","sources":["../../src/builtins/chat.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,
|
|
1
|
+
{"version":3,"file":"chat.d.ts","sourceRoot":"","sources":["../../src/builtins/chat.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAyB,MAAM,eAAe,CAAA;AAcvE,4GAA4G;AAC5G,eAAO,MAAM,KAAK,EAAE,WAC2E,CAAA;AAE/F,2CAA2C;AAC3C,eAAO,MAAM,OAAO,EAAE,WAC2E,CAAA;AAEjG,6CAA6C;AAC7C,eAAO,MAAM,SAAS,EAAE,WAC2E,CAAA;AAEnG,8FAA8F;AAC9F,eAAO,MAAM,UAAU,EAAE,WACqD,CAAA;AAE9E,kGAAkG;AAClG,eAAO,MAAM,WAAW,EAAE,WAOzB,CAAA;AAED,yFAAyF;AACzF,eAAO,MAAM,aAAa,EAAE,WAOzB,CAAA;AAEH,mGAAmG;AACnG,eAAO,MAAM,gBAAgB,EAAE,WACgF,CAAA"}
|
package/dist/builtins/chat.js
CHANGED
|
@@ -1,36 +1,33 @@
|
|
|
1
1
|
import { PUBLIC_CHANNEL } from '../generated/constants.js';
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
2
|
+
import { truncateUtf8 } from '../values/utf8.js';
|
|
3
|
+
import { sayError } from './debug.js';
|
|
4
|
+
const MAX_CHAT_BYTES = 1024;
|
|
5
|
+
function emit(ctx, channel, text, type, to) {
|
|
6
|
+
const entry = { channel, text: truncateUtf8(text, MAX_CHAT_BYTES), type };
|
|
7
|
+
ctx.state.chat.push(to === undefined ? entry : { ...entry, to });
|
|
8
|
+
if (type !== 'ownerSay' && type !== 'im')
|
|
9
|
+
ctx.linkset.routeChat(ctx.prim, type, channel, entry.text, to);
|
|
7
10
|
return undefined;
|
|
8
|
-
}
|
|
11
|
+
}
|
|
12
|
+
/** llSay(integer channel, string msg) — captures into ScriptState.chat and reaches other prims' listens. */
|
|
13
|
+
export const llSay = (ctx, args) => emit(ctx, args[0] ?? 0, args[1] ?? '', 'say');
|
|
9
14
|
/** llShout(integer channel, string msg) */
|
|
10
|
-
export const llShout = (ctx, args) =>
|
|
11
|
-
ctx.state.chat.push({
|
|
12
|
-
channel: args[0] ?? 0,
|
|
13
|
-
text: args[1] ?? '',
|
|
14
|
-
type: 'shout',
|
|
15
|
-
});
|
|
16
|
-
return undefined;
|
|
17
|
-
};
|
|
15
|
+
export const llShout = (ctx, args) => emit(ctx, args[0] ?? 0, args[1] ?? '', 'shout');
|
|
18
16
|
/** llWhisper(integer channel, string msg) */
|
|
19
|
-
export const llWhisper = (ctx, args) =>
|
|
20
|
-
ctx.state.chat.push({
|
|
21
|
-
channel: args[0] ?? 0,
|
|
22
|
-
text: args[1] ?? '',
|
|
23
|
-
type: 'whisper',
|
|
24
|
-
});
|
|
25
|
-
return undefined;
|
|
26
|
-
};
|
|
17
|
+
export const llWhisper = (ctx, args) => emit(ctx, args[0] ?? 0, args[1] ?? '', 'whisper');
|
|
27
18
|
/** llOwnerSay(string msg) — channel 0 by convention; LSL routes it privately to the owner. */
|
|
28
|
-
export const llOwnerSay = (ctx, args) =>
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
19
|
+
export const llOwnerSay = (ctx, args) => emit(ctx, PUBLIC_CHANNEL, args[0] ?? '', 'ownerSay');
|
|
20
|
+
/** llRegionSay(integer channel, string msg) — channel 0 is refused with a DEBUG_CHANNEL error. */
|
|
21
|
+
export const llRegionSay = (ctx, args) => {
|
|
22
|
+
const channel = args[0] ?? 0;
|
|
23
|
+
if (channel === PUBLIC_CHANNEL) {
|
|
24
|
+
sayError(ctx, 'Cannot use llRegionSay() on channel 0.');
|
|
25
|
+
return undefined;
|
|
26
|
+
}
|
|
27
|
+
return emit(ctx, channel, args[1] ?? '', 'regionSay');
|
|
35
28
|
};
|
|
29
|
+
/** llRegionSayTo(key target, integer channel, string msg) — any channel, including 0. */
|
|
30
|
+
export const llRegionSayTo = (ctx, args) => emit(ctx, args[1] ?? 0, args[2] ?? '', 'regionSayTo', args[0] ?? '');
|
|
31
|
+
/** llInstantMessage(key agent, string msg) — the 2 s forced delay comes from the function spec. */
|
|
32
|
+
export const llInstantMessage = (ctx, args) => emit(ctx, PUBLIC_CHANNEL, args[1] ?? '', 'im', args[0] ?? '');
|
|
36
33
|
//# sourceMappingURL=chat.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chat.js","sourceRoot":"","sources":["../../src/builtins/chat.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAA;
|
|
1
|
+
{"version":3,"file":"chat.js","sourceRoot":"","sources":["../../src/builtins/chat.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { BuiltinImpl } from '../runtime.js';
|
|
1
|
+
import type { BuiltinImpl, CallContext } from '../runtime.js';
|
|
2
2
|
/**
|
|
3
3
|
* A pending dataserver request. LSL has a small zoo of llRequest*
|
|
4
4
|
* functions that each return a key and later fire the `dataserver` event
|
|
@@ -13,6 +13,7 @@ export interface DataserverRequestEntry {
|
|
|
13
13
|
readonly args: ReadonlyArray<unknown>;
|
|
14
14
|
fulfilled: boolean;
|
|
15
15
|
}
|
|
16
|
+
export declare function nextDataserverKey(ctx: CallContext): string;
|
|
16
17
|
/** llRequestAgentData(key id, integer data) → request key */
|
|
17
18
|
export declare const llRequestAgentData: BuiltinImpl;
|
|
18
19
|
/** llRequestInventoryData(string name) → request key */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dataserver.d.ts","sourceRoot":"","sources":["../../src/builtins/dataserver.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;
|
|
1
|
+
{"version":3,"file":"dataserver.d.ts","sourceRoot":"","sources":["../../src/builtins/dataserver.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAG7D;;;;;GAKG;AACH,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;IACpB,iFAAiF;IACjF,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,wDAAwD;IACxD,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC,OAAO,CAAC,CAAA;IACrC,SAAS,EAAE,OAAO,CAAA;CACnB;AAED,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,WAAW,GAAG,MAAM,CAG1D;AAYD,6DAA6D;AAC7D,eAAO,MAAM,kBAAkB,EAAE,WACc,CAAA;AAE/C,wDAAwD;AACxD,eAAO,MAAM,sBAAsB,EAAE,WACK,CAAA;AAE1C,wEAAwE;AACxE,eAAO,MAAM,sBAAsB,EAAE,WACc,CAAA;AAEnD,8CAA8C;AAC9C,eAAO,MAAM,iBAAiB,EAAE,WACI,CAAA;AAEpC,iDAAiD;AACjD,eAAO,MAAM,oBAAoB,EAAE,WACK,CAAA"}
|
|
@@ -1,9 +1,10 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
import { requestKey } from '../keys.js';
|
|
2
|
+
export function nextDataserverKey(ctx) {
|
|
3
|
+
ctx.state.dataserverKeyCounter += 1;
|
|
4
|
+
return requestKey(ctx, 'dataserver', ctx.state.dataserverKeyCounter);
|
|
4
5
|
}
|
|
5
6
|
function record(ctx, source, args) {
|
|
6
|
-
const key =
|
|
7
|
+
const key = nextDataserverKey(ctx);
|
|
7
8
|
ctx.state.dataserverRequests.push({ key, source, args, fulfilled: false });
|
|
8
9
|
return key;
|
|
9
10
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dataserver.js","sourceRoot":"","sources":["../../src/builtins/dataserver.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"dataserver.js","sourceRoot":"","sources":["../../src/builtins/dataserver.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAiBvC,MAAM,UAAU,iBAAiB,CAAC,GAAgB;IAChD,GAAG,CAAC,KAAK,CAAC,oBAAoB,IAAI,CAAC,CAAA;IACnC,OAAO,UAAU,CAAC,GAAG,EAAE,YAAY,EAAE,GAAG,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAA;AACtE,CAAC;AAED,SAAS,MAAM,CACb,GAAgB,EAChB,MAAc,EACd,IAA4B;IAE5B,MAAM,GAAG,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAA;IAClC,GAAG,CAAC,KAAK,CAAC,kBAAkB,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAA;IAC1E,OAAO,GAAG,CAAA;AACZ,CAAC;AAED,6DAA6D;AAC7D,MAAM,CAAC,MAAM,kBAAkB,GAAgB,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,CAC3D,MAAM,CAAC,GAAG,EAAE,YAAY,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;AAE/C,wDAAwD;AACxD,MAAM,CAAC,MAAM,sBAAsB,GAAgB,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,CAC/D,MAAM,CAAC,GAAG,EAAE,gBAAgB,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;AAE1C,wEAAwE;AACxE,MAAM,CAAC,MAAM,sBAAsB,GAAgB,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,CAC/D,MAAM,CAAC,GAAG,EAAE,gBAAgB,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;AAEnD,8CAA8C;AAC9C,MAAM,CAAC,MAAM,iBAAiB,GAAgB,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,CAC1D,MAAM,CAAC,GAAG,EAAE,UAAU,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;AAEpC,iDAAiD;AACjD,MAAM,CAAC,MAAM,oBAAoB,GAAgB,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,CAC7D,MAAM,CAAC,GAAG,EAAE,cAAc,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"debug.d.ts","sourceRoot":"","sources":["../../src/builtins/debug.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAGhD,0FAA0F;AAC1F,wBAAgB,QAAQ,CAAC,GAAG,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAG7D"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { DEBUG_CHANNEL } from '../generated/constants.js';
|
|
2
|
+
/** Report a non-fatal script error the way the simulator does: a say on DEBUG_CHANNEL. */
|
|
3
|
+
export function sayError(ctx, text) {
|
|
4
|
+
ctx.state.chat.push({ channel: DEBUG_CHANNEL, text, type: 'say' });
|
|
5
|
+
ctx.linkset.routeChat(ctx.prim, 'say', DEBUG_CHANNEL, text);
|
|
6
|
+
}
|
|
7
|
+
//# sourceMappingURL=debug.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"debug.js","sourceRoot":"","sources":["../../src/builtins/debug.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAA;AAEzD,0FAA0F;AAC1F,MAAM,UAAU,QAAQ,CAAC,GAAgB,EAAE,IAAY;IACrD,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,aAAa,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAA;IAClE,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE,aAAa,EAAE,IAAI,CAAC,CAAA;AAC7D,CAAC"}
|
package/dist/builtins/hash.js
CHANGED
|
@@ -27,7 +27,7 @@ export const llHMAC = (_ctx, args) => {
|
|
|
27
27
|
const supported = new Set(['md5', 'sha1', 'sha224', 'sha256', 'sha384', 'sha512']);
|
|
28
28
|
if (!supported.has(algo))
|
|
29
29
|
return '';
|
|
30
|
-
// Per
|
|
30
|
+
// Per the LSL definitions: llHMAC returns the *Base64*-encoded HMAC, unlike the other
|
|
31
31
|
// hash builtins which return lowercase hex.
|
|
32
32
|
return createHmac(algo, key).update(message, 'utf8').digest('base64');
|
|
33
33
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hash.js","sourceRoot":"","sources":["../../src/builtins/hash.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAGpD;;;GAGG;AAEH,MAAM,QAAQ,GAAG,CAAC,CAA0D,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;AAEhG,MAAM,CAAC,MAAM,WAAW,GAAgB,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE;IACrD,MAAM,OAAO,GAAI,IAAI,CAAC,CAAC,CAAwB,IAAI,EAAE,CAAA;IACrD,MAAM,KAAK,GAAI,IAAI,CAAC,CAAC,CAAwB,IAAI,CAAC,CAAA;IAClD,6CAA6C;IAC7C,MAAM,CAAC,GAAG,UAAU,CAAC,KAAK,CAAC,CAAA;IAC3B,CAAC,CAAC,MAAM,CAAC,GAAG,OAAO,IAAI,KAAK,EAAE,EAAE,MAAM,CAAC,CAAA;IACvC,OAAO,QAAQ,CAAC,CAAC,CAAC,CAAA;AACpB,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,YAAY,GAAgB,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE;IACtD,MAAM,OAAO,GAAI,IAAI,CAAC,CAAC,CAAwB,IAAI,EAAE,CAAA;IACrD,OAAO,QAAQ,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAA;AAC7D,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,cAAc,GAAgB,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE;IACxD,MAAM,OAAO,GAAI,IAAI,CAAC,CAAC,CAAwB,IAAI,EAAE,CAAA;IACrD,OAAO,QAAQ,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAA;AAC/D,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,MAAM,GAAgB,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE;IAChD,MAAM,GAAG,GAAI,IAAI,CAAC,CAAC,CAAwB,IAAI,EAAE,CAAA;IACjD,MAAM,OAAO,GAAI,IAAI,CAAC,CAAC,CAAwB,IAAI,EAAE,CAAA;IACrD,MAAM,IAAI,GAAG,CAAE,IAAI,CAAC,CAAC,CAAwB,IAAI,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAA;IACxE,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAA;IAClF,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC;QAAE,OAAO,EAAE,CAAA;IACnC,
|
|
1
|
+
{"version":3,"file":"hash.js","sourceRoot":"","sources":["../../src/builtins/hash.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAGpD;;;GAGG;AAEH,MAAM,QAAQ,GAAG,CAAC,CAA0D,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;AAEhG,MAAM,CAAC,MAAM,WAAW,GAAgB,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE;IACrD,MAAM,OAAO,GAAI,IAAI,CAAC,CAAC,CAAwB,IAAI,EAAE,CAAA;IACrD,MAAM,KAAK,GAAI,IAAI,CAAC,CAAC,CAAwB,IAAI,CAAC,CAAA;IAClD,6CAA6C;IAC7C,MAAM,CAAC,GAAG,UAAU,CAAC,KAAK,CAAC,CAAA;IAC3B,CAAC,CAAC,MAAM,CAAC,GAAG,OAAO,IAAI,KAAK,EAAE,EAAE,MAAM,CAAC,CAAA;IACvC,OAAO,QAAQ,CAAC,CAAC,CAAC,CAAA;AACpB,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,YAAY,GAAgB,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE;IACtD,MAAM,OAAO,GAAI,IAAI,CAAC,CAAC,CAAwB,IAAI,EAAE,CAAA;IACrD,OAAO,QAAQ,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAA;AAC7D,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,cAAc,GAAgB,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE;IACxD,MAAM,OAAO,GAAI,IAAI,CAAC,CAAC,CAAwB,IAAI,EAAE,CAAA;IACrD,OAAO,QAAQ,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAA;AAC/D,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,MAAM,GAAgB,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE;IAChD,MAAM,GAAG,GAAI,IAAI,CAAC,CAAC,CAAwB,IAAI,EAAE,CAAA;IACjD,MAAM,OAAO,GAAI,IAAI,CAAC,CAAC,CAAwB,IAAI,EAAE,CAAA;IACrD,MAAM,IAAI,GAAG,CAAE,IAAI,CAAC,CAAC,CAAwB,IAAI,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAA;IACxE,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAA;IAClF,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC;QAAE,OAAO,EAAE,CAAA;IACnC,sFAAsF;IACtF,4CAA4C;IAC5C,OAAO,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAA;AACvE,CAAC,CAAA"}
|
package/dist/builtins/http.d.ts
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import type { BuiltinImpl } from '../runtime.js';
|
|
2
2
|
import type { LslValue } from '../values/types.js';
|
|
3
3
|
import { NULL_KEY } from '../values/types.js';
|
|
4
|
+
/** Response bodies longer than this are cut unless HTTP_BODY_MAXLENGTH says otherwise. */
|
|
5
|
+
export declare const DEFAULT_HTTP_BODY_MAXLENGTH = 2048;
|
|
4
6
|
/**
|
|
5
7
|
* Captured outgoing HTTP request, exposed via Script.httpRequests so tests
|
|
6
8
|
* can assert on what the script fired off, and reply to it via
|
|
@@ -17,6 +19,8 @@ export interface HttpRequestEntry {
|
|
|
17
19
|
readonly mimetype: string;
|
|
18
20
|
/** Custom headers from HTTP_CUSTOM_HEADER pairs in the options list. */
|
|
19
21
|
readonly headers: ReadonlyArray<readonly [name: string, value: string]>;
|
|
22
|
+
/** Response bodies are cut to this many bytes. Default 2048; set by HTTP_BODY_MAXLENGTH. */
|
|
23
|
+
readonly bodyMaxLength: number;
|
|
20
24
|
/** Raw, unparsed options list as passed to llHTTPRequest, for completeness. */
|
|
21
25
|
readonly rawOptions: ReadonlyArray<LslValue>;
|
|
22
26
|
/** Whether a response has been fed back to this request yet. */
|
|
@@ -27,7 +31,10 @@ export interface HttpRequestEntry {
|
|
|
27
31
|
*
|
|
28
32
|
* Captures the request into ScriptState.httpRequests and returns a
|
|
29
33
|
* deterministic key. Tests respond via Script.respondToHttp(key, ...),
|
|
30
|
-
* which schedules an http_response event.
|
|
34
|
+
* which schedules an http_response event. An invalid URL, method or
|
|
35
|
+
* HTTP_BODY_MAXLENGTH, or more than 25 requests per object in 20 seconds,
|
|
36
|
+
* says an error and returns NULL_KEY; with HTTP_EXTENDED_ERROR set it
|
|
37
|
+
* returns a key and answers with an http_response error instead.
|
|
31
38
|
*/
|
|
32
39
|
export declare const llHTTPRequest: BuiltinImpl;
|
|
33
40
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../src/builtins/http.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,
|
|
1
|
+
{"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../src/builtins/http.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAe,MAAM,eAAe,CAAA;AAC7D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAA;AAClD,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAA;AAW7C,0FAA0F;AAC1F,eAAO,MAAM,2BAA2B,OAAO,CAAA;AAO/C;;;;GAIG;AACH,MAAM,WAAW,gBAAgB;IAC/B,yEAAyE;IACzE,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;IACpB,oEAAoE;IACpE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,uEAAuE;IACvE,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,wEAAwE;IACxE,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAA;IACvE,4FAA4F;IAC5F,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAA;IAC9B,+EAA+E;IAC/E,QAAQ,CAAC,UAAU,EAAE,aAAa,CAAC,QAAQ,CAAC,CAAA;IAC5C,gEAAgE;IAChE,SAAS,EAAE,OAAO,CAAA;CACnB;AA8ED;;;;;;;;;GASG;AACH,eAAO,MAAM,aAAa,EAAE,WA0D3B,CAAA;AA4BD;;;;GAIG;AACH,eAAO,MAAM,cAAc,EAAE,WAE5B,CAAA;AAED,OAAO,EAAE,QAAQ,IAAI,aAAa,EAAE,CAAA"}
|
package/dist/builtins/http.js
CHANGED
|
@@ -1,15 +1,23 @@
|
|
|
1
1
|
import { NULL_KEY } from '../values/types.js';
|
|
2
|
-
import { HTTP_METHOD, HTTP_MIMETYPE, HTTP_CUSTOM_HEADER, } from '../generated/constants.js';
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
2
|
+
import { HTTP_METHOD, HTTP_MIMETYPE, HTTP_CUSTOM_HEADER, HTTP_BODY_MAXLENGTH, HTTP_EXTENDED_ERROR, } from '../generated/constants.js';
|
|
3
|
+
import { requestKey } from '../keys.js';
|
|
4
|
+
import { sayError } from './debug.js';
|
|
5
|
+
/** Response bodies longer than this are cut unless HTTP_BODY_MAXLENGTH says otherwise. */
|
|
6
|
+
export const DEFAULT_HTTP_BODY_MAXLENGTH = 2048;
|
|
7
|
+
const MAX_HTTP_BODY_MAXLENGTH = 16384;
|
|
8
|
+
/** Requests allowed per object within HTTP_THROTTLE_WINDOW_MS. */
|
|
9
|
+
const HTTP_THROTTLE_REQUESTS = 25;
|
|
10
|
+
const HTTP_THROTTLE_WINDOW_MS = 20_000;
|
|
11
|
+
const HTTP_METHODS = new Set(['GET', 'POST', 'PUT', 'DELETE', 'PATCH', 'HEAD']);
|
|
8
12
|
function parseOptions(raw) {
|
|
9
13
|
const out = {
|
|
10
14
|
method: 'GET',
|
|
11
15
|
mimetype: 'text/plain;charset=utf-8',
|
|
12
16
|
headers: [],
|
|
17
|
+
bodyMaxLength: DEFAULT_HTTP_BODY_MAXLENGTH,
|
|
18
|
+
extendedError: false,
|
|
19
|
+
methodAt: -1,
|
|
20
|
+
bodyMaxLengthAt: -1,
|
|
13
21
|
};
|
|
14
22
|
let i = 0;
|
|
15
23
|
while (i < raw.length) {
|
|
@@ -21,8 +29,10 @@ function parseOptions(raw) {
|
|
|
21
29
|
switch (code) {
|
|
22
30
|
case HTTP_METHOD: {
|
|
23
31
|
const v = raw[i + 1];
|
|
24
|
-
if (typeof v === 'string')
|
|
32
|
+
if (typeof v === 'string') {
|
|
25
33
|
out.method = v;
|
|
34
|
+
out.methodAt = i;
|
|
35
|
+
}
|
|
26
36
|
i += 2;
|
|
27
37
|
break;
|
|
28
38
|
}
|
|
@@ -33,6 +43,20 @@ function parseOptions(raw) {
|
|
|
33
43
|
i += 2;
|
|
34
44
|
break;
|
|
35
45
|
}
|
|
46
|
+
case HTTP_BODY_MAXLENGTH: {
|
|
47
|
+
const v = raw[i + 1];
|
|
48
|
+
if (typeof v === 'number') {
|
|
49
|
+
out.bodyMaxLength = v;
|
|
50
|
+
out.bodyMaxLengthAt = i;
|
|
51
|
+
}
|
|
52
|
+
i += 2;
|
|
53
|
+
break;
|
|
54
|
+
}
|
|
55
|
+
case HTTP_EXTENDED_ERROR: {
|
|
56
|
+
out.extendedError = raw[i + 1] !== 0;
|
|
57
|
+
i += 2;
|
|
58
|
+
break;
|
|
59
|
+
}
|
|
36
60
|
case HTTP_CUSTOM_HEADER: {
|
|
37
61
|
const name = raw[i + 1];
|
|
38
62
|
const value = raw[i + 2];
|
|
@@ -55,14 +79,45 @@ function parseOptions(raw) {
|
|
|
55
79
|
*
|
|
56
80
|
* Captures the request into ScriptState.httpRequests and returns a
|
|
57
81
|
* deterministic key. Tests respond via Script.respondToHttp(key, ...),
|
|
58
|
-
* which schedules an http_response event.
|
|
82
|
+
* which schedules an http_response event. An invalid URL, method or
|
|
83
|
+
* HTTP_BODY_MAXLENGTH, or more than 25 requests per object in 20 seconds,
|
|
84
|
+
* says an error and returns NULL_KEY; with HTTP_EXTENDED_ERROR set it
|
|
85
|
+
* returns a key and answers with an http_response error instead.
|
|
59
86
|
*/
|
|
60
87
|
export const llHTTPRequest = (ctx, args) => {
|
|
61
88
|
const url = args[0] ?? '';
|
|
62
89
|
const rawOptions = args[1] ?? [];
|
|
63
90
|
const body = args[2] ?? '';
|
|
64
91
|
const parsed = parseOptions(rawOptions);
|
|
65
|
-
const
|
|
92
|
+
const reject = (error, status, title, detail) => {
|
|
93
|
+
sayError(ctx, error);
|
|
94
|
+
if (!parsed.extendedError)
|
|
95
|
+
return NULL_KEY;
|
|
96
|
+
const key = nextKey(ctx);
|
|
97
|
+
const payload = { request_id: key, status, metadata: [], body: extendedErrorBody(status, title, detail) };
|
|
98
|
+
for (const s of ctx.prim.scripts)
|
|
99
|
+
ctx.state.clock.scheduleOn(s, ctx.state.clock.now, 'http_response', payload);
|
|
100
|
+
return key;
|
|
101
|
+
};
|
|
102
|
+
if (!isValidUrl(url)) {
|
|
103
|
+
const message = 'URL passed to llHTTPRequest is not valid';
|
|
104
|
+
return reject(message, 471, 'llHTTPRequest URL is invalid.', message);
|
|
105
|
+
}
|
|
106
|
+
if (parsed.bodyMaxLength <= 0 || parsed.bodyMaxLength > MAX_HTTP_BODY_MAXLENGTH) {
|
|
107
|
+
return reject('HTTP_BODY_MAXLENGTH value is invalid', 472, 'llHTTPRequest parameter error.', `Maximum body length must be in the rage (0, ${MAX_HTTP_BODY_MAXLENGTH}] in position ${parsed.bodyMaxLengthAt}`);
|
|
108
|
+
}
|
|
109
|
+
if (!HTTP_METHODS.has(parsed.method)) {
|
|
110
|
+
return reject(`HTTP method ${parsed.method} is unsupported`, 405, 'Unrecognized HTTP Method.', `HTTP method ${parsed.method} is unsupported at position ${parsed.methodAt}.`);
|
|
111
|
+
}
|
|
112
|
+
const now = ctx.state.clock.now;
|
|
113
|
+
const recent = ctx.linkset.httpRequestTimes;
|
|
114
|
+
while (recent.length > 0 && recent[0] <= now - HTTP_THROTTLE_WINDOW_MS)
|
|
115
|
+
recent.shift();
|
|
116
|
+
if (recent.length >= HTTP_THROTTLE_REQUESTS) {
|
|
117
|
+
return reject('Too many HTTP requests too fast.', 420, 'llHTTPRequest is throttled.', 'Too many HTTP requests, made too quickly.');
|
|
118
|
+
}
|
|
119
|
+
recent.push(now);
|
|
120
|
+
const key = nextKey(ctx);
|
|
66
121
|
ctx.state.httpRequests.push({
|
|
67
122
|
key,
|
|
68
123
|
url,
|
|
@@ -70,11 +125,34 @@ export const llHTTPRequest = (ctx, args) => {
|
|
|
70
125
|
body,
|
|
71
126
|
mimetype: parsed.mimetype,
|
|
72
127
|
headers: parsed.headers,
|
|
128
|
+
bodyMaxLength: parsed.bodyMaxLength,
|
|
73
129
|
rawOptions,
|
|
74
130
|
fulfilled: false,
|
|
75
131
|
});
|
|
76
132
|
return key;
|
|
77
133
|
};
|
|
134
|
+
function nextKey(ctx) {
|
|
135
|
+
ctx.state.httpKeyCounter += 1;
|
|
136
|
+
return requestKey(ctx, 'http', ctx.state.httpKeyCounter);
|
|
137
|
+
}
|
|
138
|
+
/** The JSON body Second Life sends in an HTTP_EXTENDED_ERROR http_response. */
|
|
139
|
+
function extendedErrorBody(status, title, detail) {
|
|
140
|
+
return ('{\n' +
|
|
141
|
+
` "detail" : ${JSON.stringify(detail)},\n` +
|
|
142
|
+
` "status" : ${status},\n` +
|
|
143
|
+
` "title" : ${JSON.stringify(title)},\n` +
|
|
144
|
+
' "type" : "http://wiki.secondlife.com/wiki/llHTTPRequest"\n' +
|
|
145
|
+
'}\n');
|
|
146
|
+
}
|
|
147
|
+
function isValidUrl(url) {
|
|
148
|
+
try {
|
|
149
|
+
const u = new URL(url);
|
|
150
|
+
return (u.protocol === 'http:' || u.protocol === 'https:') && u.hostname !== '';
|
|
151
|
+
}
|
|
152
|
+
catch {
|
|
153
|
+
return false;
|
|
154
|
+
}
|
|
155
|
+
}
|
|
78
156
|
/**
|
|
79
157
|
* llHTTPResponse(key request_id, integer status, string body) — used by
|
|
80
158
|
* scripts that hold an inbound HTTP request from llRequestURL. Captured
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"http.js","sourceRoot":"","sources":["../../src/builtins/http.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAA;AAC7C,OAAO,EACL,WAAW,EACX,aAAa,EACb,kBAAkB,
|
|
1
|
+
{"version":3,"file":"http.js","sourceRoot":"","sources":["../../src/builtins/http.ts"],"names":[],"mappings":"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"}
|
|
@@ -13,4 +13,6 @@ export declare const llGetOwnerKey: BuiltinImpl;
|
|
|
13
13
|
export declare const llSetObjectName: BuiltinImpl;
|
|
14
14
|
/** llGetScriptName() — the script's filename (e.g. "greeter.lsl"). */
|
|
15
15
|
export declare const llGetScriptName: BuiltinImpl;
|
|
16
|
+
/** llGenerateKey() — a fresh random UUID from the script's seeded random source. */
|
|
17
|
+
export declare const llGenerateKey: BuiltinImpl;
|
|
16
18
|
//# sourceMappingURL=identity.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"identity.d.ts","sourceRoot":"","sources":["../../src/builtins/identity.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;
|
|
1
|
+
{"version":3,"file":"identity.d.ts","sourceRoot":"","sources":["../../src/builtins/identity.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAMhD,oDAAoD;AACpD,eAAO,MAAM,UAAU,EAAE,WAA+C,CAAA;AACxE,+DAA+D;AAC/D,eAAO,MAAM,YAAY,EAAE,WAA+C,CAAA;AAC1E,sEAAsE;AACtE,eAAO,MAAM,QAAQ,EAAE,WAAmD,CAAA;AAC1E,2CAA2C;AAC3C,eAAO,MAAM,eAAe,EAAE,WAAoD,CAAA;AAElF,yFAAyF;AACzF,eAAO,MAAM,aAAa,EAAE,WAO3B,CAAA;AAED,8DAA8D;AAC9D,eAAO,MAAM,eAAe,EAAE,WAI7B,CAAA;AAED,sEAAsE;AACtE,eAAO,MAAM,eAAe,EAAE,WAAoD,CAAA;AAElF,oFAAoF;AACpF,eAAO,MAAM,aAAa,EAAE,WAI3B,CAAA"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { NULL_KEY } from '../values/types.js';
|
|
2
|
+
import { PRIM_NAME } from '../generated/constants.js';
|
|
2
3
|
const KEY_PATTERN = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
|
|
3
4
|
/** llGetOwner() — script's configured owner key. */
|
|
4
5
|
export const llGetOwner = (ctx) => ctx.state.identity.owner;
|
|
@@ -23,9 +24,16 @@ export const llGetOwnerKey = (ctx, args) => {
|
|
|
23
24
|
/** llSetObjectName(string name) — mutates the prim's name. */
|
|
24
25
|
export const llSetObjectName = (ctx, args) => {
|
|
25
26
|
const name = args[0] ?? '';
|
|
26
|
-
ctx.
|
|
27
|
+
ctx.prim.setPrimParam(PRIM_NAME, [name], 0);
|
|
27
28
|
return undefined;
|
|
28
29
|
};
|
|
29
30
|
/** llGetScriptName() — the script's filename (e.g. "greeter.lsl"). */
|
|
30
31
|
export const llGetScriptName = (ctx) => ctx.state.identity.scriptName;
|
|
32
|
+
/** llGenerateKey() — a fresh random UUID from the script's seeded random source. */
|
|
33
|
+
export const llGenerateKey = (ctx) => {
|
|
34
|
+
let hex = '';
|
|
35
|
+
for (let i = 0; i < 4; i++)
|
|
36
|
+
hex += ctx.state.random.nextInt(0x100000000).toString(16).padStart(8, '0');
|
|
37
|
+
return `${hex.slice(0, 8)}-${hex.slice(8, 12)}-${hex.slice(12, 16)}-${hex.slice(16, 20)}-${hex.slice(20)}`;
|
|
38
|
+
};
|
|
31
39
|
//# sourceMappingURL=identity.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"identity.js","sourceRoot":"","sources":["../../src/builtins/identity.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAA;
|
|
1
|
+
{"version":3,"file":"identity.js","sourceRoot":"","sources":["../../src/builtins/identity.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAA;AAC7C,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAA;AAErD,MAAM,WAAW,GAAG,iEAAiE,CAAA;AAErF,oDAAoD;AACpD,MAAM,CAAC,MAAM,UAAU,GAAgB,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAA;AACxE,+DAA+D;AAC/D,MAAM,CAAC,MAAM,YAAY,GAAgB,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAA;AAC1E,sEAAsE;AACtE,MAAM,CAAC,MAAM,QAAQ,GAAgB,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAA;AAC1E,2CAA2C;AAC3C,MAAM,CAAC,MAAM,eAAe,GAAgB,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAA;AAElF,yFAAyF;AACzF,MAAM,CAAC,MAAM,aAAa,GAAgB,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE;IACtD,MAAM,EAAE,GAAI,IAAI,CAAC,CAAC,CAAwB,IAAI,EAAE,CAAA;IAChD,IAAI,EAAE,KAAK,QAAQ;QAAE,OAAO,QAAQ,CAAA;IACpC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC;QAAE,OAAO,QAAQ,CAAA;IAC1C,MAAM,OAAO,GAAG,EAAE,CAAC,WAAW,EAAE,CAAA;IAChC,IAAI,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,WAAW,EAAE,KAAK,OAAO,CAAC;QAAE,OAAO,GAAG,CAAC,OAAO,CAAC,KAAK,CAAA;IAC5F,OAAO,EAAE,CAAA;AACX,CAAC,CAAA;AAED,8DAA8D;AAC9D,MAAM,CAAC,MAAM,eAAe,GAAgB,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE;IACxD,MAAM,IAAI,GAAI,IAAI,CAAC,CAAC,CAAwB,IAAI,EAAE,CAAA;IAClD,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,SAAS,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAA;IAC3C,OAAO,SAAS,CAAA;AAClB,CAAC,CAAA;AAED,sEAAsE;AACtE,MAAM,CAAC,MAAM,eAAe,GAAgB,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAA;AAElF,oFAAoF;AACpF,MAAM,CAAC,MAAM,aAAa,GAAgB,CAAC,GAAG,EAAE,EAAE;IAChD,IAAI,GAAG,GAAG,EAAE,CAAA;IACZ,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE;QAAE,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA;IACtG,OAAO,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,CAAA;AAC5G,CAAC,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/builtins/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/builtins/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAmPhD;;;;GAIG;AACH,eAAO,MAAM,aAAa,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CA0O/D,CAAA"}
|