@rezless/vm 0.6.2 → 0.8.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.
Files changed (273) hide show
  1. package/dist/builtins/agents.d.ts +14 -0
  2. package/dist/builtins/agents.d.ts.map +1 -0
  3. package/dist/builtins/agents.js +117 -0
  4. package/dist/builtins/agents.js.map +1 -0
  5. package/dist/builtins/animation.d.ts +46 -0
  6. package/dist/builtins/animation.d.ts.map +1 -0
  7. package/dist/builtins/animation.js +316 -0
  8. package/dist/builtins/animation.js.map +1 -0
  9. package/dist/builtins/attachments.d.ts +9 -0
  10. package/dist/builtins/attachments.d.ts.map +1 -0
  11. package/dist/builtins/attachments.js +127 -0
  12. package/dist/builtins/attachments.js.map +1 -0
  13. package/dist/builtins/base64.d.ts +13 -2
  14. package/dist/builtins/base64.d.ts.map +1 -1
  15. package/dist/builtins/base64.js +8 -6
  16. package/dist/builtins/base64.js.map +1 -1
  17. package/dist/builtins/camera.d.ts +35 -0
  18. package/dist/builtins/camera.d.ts.map +1 -0
  19. package/dist/builtins/camera.js +104 -0
  20. package/dist/builtins/camera.js.map +1 -0
  21. package/dist/builtins/collision.d.ts +21 -0
  22. package/dist/builtins/collision.d.ts.map +1 -0
  23. package/dist/builtins/collision.js +44 -0
  24. package/dist/builtins/collision.js.map +1 -0
  25. package/dist/builtins/controls.d.ts +19 -0
  26. package/dist/builtins/controls.d.ts.map +1 -0
  27. package/dist/builtins/controls.js +27 -0
  28. package/dist/builtins/controls.js.map +1 -0
  29. package/dist/builtins/damage.d.ts +24 -0
  30. package/dist/builtins/damage.d.ts.map +1 -0
  31. package/dist/builtins/damage.js +166 -0
  32. package/dist/builtins/damage.js.map +1 -0
  33. package/dist/builtins/detected.d.ts +22 -1
  34. package/dist/builtins/detected.d.ts.map +1 -1
  35. package/dist/builtins/detected.js +28 -2
  36. package/dist/builtins/detected.js.map +1 -1
  37. package/dist/builtins/dialog.d.ts +23 -0
  38. package/dist/builtins/dialog.d.ts.map +1 -0
  39. package/dist/builtins/dialog.js +69 -0
  40. package/dist/builtins/dialog.js.map +1 -0
  41. package/dist/builtins/email.d.ts +61 -0
  42. package/dist/builtins/email.d.ts.map +1 -0
  43. package/dist/builtins/email.js +121 -0
  44. package/dist/builtins/email.js.map +1 -0
  45. package/dist/builtins/environment.d.ts +27 -0
  46. package/dist/builtins/environment.d.ts.map +1 -0
  47. package/dist/builtins/environment.js +126 -0
  48. package/dist/builtins/environment.js.map +1 -0
  49. package/dist/builtins/experience.d.ts +51 -0
  50. package/dist/builtins/experience.d.ts.map +1 -0
  51. package/dist/builtins/experience.js +202 -0
  52. package/dist/builtins/experience.js.map +1 -0
  53. package/dist/builtins/game-control.d.ts +17 -0
  54. package/dist/builtins/game-control.d.ts.map +1 -0
  55. package/dist/builtins/game-control.js +21 -0
  56. package/dist/builtins/game-control.js.map +1 -0
  57. package/dist/builtins/give.d.ts +16 -0
  58. package/dist/builtins/give.d.ts.map +1 -0
  59. package/dist/builtins/give.js +137 -0
  60. package/dist/builtins/give.js.map +1 -0
  61. package/dist/builtins/ground.d.ts +18 -0
  62. package/dist/builtins/ground.d.ts.map +1 -0
  63. package/dist/builtins/ground.js +83 -0
  64. package/dist/builtins/ground.js.map +1 -0
  65. package/dist/builtins/hash.d.ts +1 -0
  66. package/dist/builtins/hash.d.ts.map +1 -1
  67. package/dist/builtins/hash.js +12 -2
  68. package/dist/builtins/hash.js.map +1 -1
  69. package/dist/builtins/http.d.ts +99 -4
  70. package/dist/builtins/http.d.ts.map +1 -1
  71. package/dist/builtins/http.js +216 -6
  72. package/dist/builtins/http.js.map +1 -1
  73. package/dist/builtins/index.d.ts.map +1 -1
  74. package/dist/builtins/index.js +250 -14
  75. package/dist/builtins/index.js.map +1 -1
  76. package/dist/builtins/inventory.d.ts +8 -5
  77. package/dist/builtins/inventory.d.ts.map +1 -1
  78. package/dist/builtins/inventory.js +37 -15
  79. package/dist/builtins/inventory.js.map +1 -1
  80. package/dist/builtins/json.d.ts.map +1 -1
  81. package/dist/builtins/json.js +45 -34
  82. package/dist/builtins/json.js.map +1 -1
  83. package/dist/builtins/land.d.ts +29 -0
  84. package/dist/builtins/land.d.ts.map +1 -0
  85. package/dist/builtins/land.js +339 -0
  86. package/dist/builtins/land.js.map +1 -0
  87. package/dist/builtins/link-info.js +2 -2
  88. package/dist/builtins/link-info.js.map +1 -1
  89. package/dist/builtins/links.d.ts +20 -0
  90. package/dist/builtins/links.d.ts.map +1 -0
  91. package/dist/builtins/links.js +53 -0
  92. package/dist/builtins/links.js.map +1 -0
  93. package/dist/builtins/linksetdata.d.ts +5 -0
  94. package/dist/builtins/linksetdata.d.ts.map +1 -1
  95. package/dist/builtins/linksetdata.js +22 -9
  96. package/dist/builtins/linksetdata.js.map +1 -1
  97. package/dist/builtins/lists.d.ts +21 -0
  98. package/dist/builtins/lists.d.ts.map +1 -1
  99. package/dist/builtins/lists.js +137 -17
  100. package/dist/builtins/lists.js.map +1 -1
  101. package/dist/builtins/math.d.ts +18 -0
  102. package/dist/builtins/math.d.ts.map +1 -1
  103. package/dist/builtins/math.js +104 -5
  104. package/dist/builtins/math.js.map +1 -1
  105. package/dist/builtins/media.d.ts +8 -0
  106. package/dist/builtins/media.d.ts.map +1 -0
  107. package/dist/builtins/media.js +167 -0
  108. package/dist/builtins/media.js.map +1 -0
  109. package/dist/builtins/motion.d.ts +79 -0
  110. package/dist/builtins/motion.d.ts.map +1 -0
  111. package/dist/builtins/motion.js +396 -0
  112. package/dist/builtins/motion.js.map +1 -0
  113. package/dist/builtins/notecard-search.d.ts +15 -0
  114. package/dist/builtins/notecard-search.d.ts.map +1 -0
  115. package/dist/builtins/notecard-search.js +374 -0
  116. package/dist/builtins/notecard-search.js.map +1 -0
  117. package/dist/builtins/object-animation.d.ts +21 -0
  118. package/dist/builtins/object-animation.d.ts.map +1 -0
  119. package/dist/builtins/object-animation.js +193 -0
  120. package/dist/builtins/object-animation.js.map +1 -0
  121. package/dist/builtins/object-reads.d.ts +39 -0
  122. package/dist/builtins/object-reads.d.ts.map +1 -0
  123. package/dist/builtins/object-reads.js +332 -0
  124. package/dist/builtins/object-reads.js.map +1 -0
  125. package/dist/builtins/object.d.ts +11 -2
  126. package/dist/builtins/object.d.ts.map +1 -1
  127. package/dist/builtins/object.js +32 -8
  128. package/dist/builtins/object.js.map +1 -1
  129. package/dist/builtins/particles.d.ts +4 -0
  130. package/dist/builtins/particles.d.ts.map +1 -0
  131. package/dist/builtins/particles.js +65 -0
  132. package/dist/builtins/particles.js.map +1 -0
  133. package/dist/builtins/pathfinding.d.ts +39 -0
  134. package/dist/builtins/pathfinding.d.ts.map +1 -0
  135. package/dist/builtins/pathfinding.js +83 -0
  136. package/dist/builtins/pathfinding.js.map +1 -0
  137. package/dist/builtins/permissions.d.ts.map +1 -1
  138. package/dist/builtins/permissions.js +6 -0
  139. package/dist/builtins/permissions.js.map +1 -1
  140. package/dist/builtins/physics.d.ts +49 -0
  141. package/dist/builtins/physics.d.ts.map +1 -0
  142. package/dist/builtins/physics.js +47 -0
  143. package/dist/builtins/physics.js.map +1 -0
  144. package/dist/builtins/prim-accessors.d.ts +4 -0
  145. package/dist/builtins/prim-accessors.d.ts.map +1 -1
  146. package/dist/builtins/prim-accessors.js +75 -28
  147. package/dist/builtins/prim-accessors.js.map +1 -1
  148. package/dist/builtins/prim-params.d.ts.map +1 -1
  149. package/dist/builtins/prim-params.js +6 -2
  150. package/dist/builtins/prim-params.js.map +1 -1
  151. package/dist/builtins/raycast.d.ts +3 -0
  152. package/dist/builtins/raycast.d.ts.map +1 -0
  153. package/dist/builtins/raycast.js +65 -0
  154. package/dist/builtins/raycast.js.map +1 -0
  155. package/dist/builtins/region.d.ts +31 -0
  156. package/dist/builtins/region.d.ts.map +1 -0
  157. package/dist/builtins/region.js +125 -0
  158. package/dist/builtins/region.js.map +1 -0
  159. package/dist/builtins/remote-load.d.ts +3 -0
  160. package/dist/builtins/remote-load.d.ts.map +1 -0
  161. package/dist/builtins/remote-load.js +53 -0
  162. package/dist/builtins/remote-load.js.map +1 -0
  163. package/dist/builtins/rez.d.ts +10 -0
  164. package/dist/builtins/rez.d.ts.map +1 -0
  165. package/dist/builtins/rez.js +255 -0
  166. package/dist/builtins/rez.js.map +1 -0
  167. package/dist/builtins/rsa.d.ts +4 -0
  168. package/dist/builtins/rsa.d.ts.map +1 -0
  169. package/dist/builtins/rsa.js +44 -0
  170. package/dist/builtins/rsa.js.map +1 -0
  171. package/dist/builtins/script-control.d.ts +8 -3
  172. package/dist/builtins/script-control.d.ts.map +1 -1
  173. package/dist/builtins/script-control.js +27 -8
  174. package/dist/builtins/script-control.js.map +1 -1
  175. package/dist/builtins/sensor.d.ts +11 -0
  176. package/dist/builtins/sensor.d.ts.map +1 -0
  177. package/dist/builtins/sensor.js +145 -0
  178. package/dist/builtins/sensor.js.map +1 -0
  179. package/dist/builtins/sit.d.ts +23 -0
  180. package/dist/builtins/sit.d.ts.map +1 -0
  181. package/dist/builtins/sit.js +150 -0
  182. package/dist/builtins/sit.js.map +1 -0
  183. package/dist/builtins/sound.d.ts +19 -0
  184. package/dist/builtins/sound.d.ts.map +1 -0
  185. package/dist/builtins/sound.js +113 -0
  186. package/dist/builtins/sound.js.map +1 -0
  187. package/dist/builtins/strings.d.ts +6 -0
  188. package/dist/builtins/strings.d.ts.map +1 -1
  189. package/dist/builtins/strings.js +47 -6
  190. package/dist/builtins/strings.js.map +1 -1
  191. package/dist/builtins/targets.d.ts +12 -0
  192. package/dist/builtins/targets.d.ts.map +1 -0
  193. package/dist/builtins/targets.js +121 -0
  194. package/dist/builtins/targets.js.map +1 -0
  195. package/dist/builtins/time.d.ts +15 -5
  196. package/dist/builtins/time.d.ts.map +1 -1
  197. package/dist/builtins/time.js +36 -11
  198. package/dist/builtins/time.js.map +1 -1
  199. package/dist/builtins/vehicles.d.ts +22 -0
  200. package/dist/builtins/vehicles.d.ts.map +1 -0
  201. package/dist/builtins/vehicles.js +78 -0
  202. package/dist/builtins/vehicles.js.map +1 -0
  203. package/dist/builtins/viewer.d.ts +39 -0
  204. package/dist/builtins/viewer.d.ts.map +1 -0
  205. package/dist/builtins/viewer.js +74 -0
  206. package/dist/builtins/viewer.js.map +1 -0
  207. package/dist/clock.d.ts +45 -7
  208. package/dist/clock.d.ts.map +1 -1
  209. package/dist/clock.js +125 -14
  210. package/dist/clock.js.map +1 -1
  211. package/dist/dispatch.d.ts +3 -2
  212. package/dist/dispatch.d.ts.map +1 -1
  213. package/dist/dispatch.js +15 -10
  214. package/dist/dispatch.js.map +1 -1
  215. package/dist/experience.d.ts +39 -0
  216. package/dist/experience.d.ts.map +1 -0
  217. package/dist/experience.js +38 -0
  218. package/dist/experience.js.map +1 -0
  219. package/dist/index.d.ts +20 -3
  220. package/dist/index.d.ts.map +1 -1
  221. package/dist/index.js +1 -0
  222. package/dist/index.js.map +1 -1
  223. package/dist/interpreter.d.ts +5 -10
  224. package/dist/interpreter.d.ts.map +1 -1
  225. package/dist/interpreter.js +143 -70
  226. package/dist/interpreter.js.map +1 -1
  227. package/dist/inventory.d.ts +2 -0
  228. package/dist/inventory.d.ts.map +1 -1
  229. package/dist/inventory.js +2 -0
  230. package/dist/inventory.js.map +1 -1
  231. package/dist/linkset.d.ts +147 -11
  232. package/dist/linkset.d.ts.map +1 -1
  233. package/dist/linkset.js +401 -28
  234. package/dist/linkset.js.map +1 -1
  235. package/dist/memory.d.ts +5 -2
  236. package/dist/memory.d.ts.map +1 -1
  237. package/dist/memory.js +5 -2
  238. package/dist/memory.js.map +1 -1
  239. package/dist/prim-params.d.ts +27 -10
  240. package/dist/prim-params.d.ts.map +1 -1
  241. package/dist/prim-params.js +209 -125
  242. package/dist/prim-params.js.map +1 -1
  243. package/dist/prim.d.ts +95 -5
  244. package/dist/prim.d.ts.map +1 -1
  245. package/dist/prim.js +96 -7
  246. package/dist/prim.js.map +1 -1
  247. package/dist/runtime.d.ts +52 -3
  248. package/dist/runtime.d.ts.map +1 -1
  249. package/dist/script.d.ts +171 -12
  250. package/dist/script.d.ts.map +1 -1
  251. package/dist/script.js +480 -73
  252. package/dist/script.js.map +1 -1
  253. package/dist/typecheck.d.ts +3 -1
  254. package/dist/typecheck.d.ts.map +1 -1
  255. package/dist/typecheck.js +25 -5
  256. package/dist/typecheck.js.map +1 -1
  257. package/dist/values/coerce.d.ts +1 -1
  258. package/dist/values/coerce.d.ts.map +1 -1
  259. package/dist/values/coerce.js +10 -6
  260. package/dist/values/coerce.js.map +1 -1
  261. package/dist/values/format.d.ts +3 -1
  262. package/dist/values/format.d.ts.map +1 -1
  263. package/dist/values/format.js +10 -6
  264. package/dist/values/format.js.map +1 -1
  265. package/dist/values/ops.d.ts +3 -0
  266. package/dist/values/ops.d.ts.map +1 -1
  267. package/dist/values/ops.js +2 -2
  268. package/dist/values/ops.js.map +1 -1
  269. package/dist/world.d.ts +247 -1
  270. package/dist/world.d.ts.map +1 -1
  271. package/dist/world.js +318 -6
  272. package/dist/world.js.map +1 -1
  273. package/package.json +2 -2
@@ -0,0 +1,339 @@
1
+ import { NULL_KEY, ZERO_VECTOR } from '../values/types.js';
2
+ import { listElementType, typedList } from '../values/list-types.js';
3
+ import { findObjectPrim } from './object-reads.js';
4
+ import { llScriptDanger } from './region.js';
5
+ import { sayError } from './debug.js';
6
+ import { nextDataserverKey } from './dataserver.js';
7
+ import { PERMISSION_DEBIT, PERMISSION_RETURN_OBJECTS, PERMISSION_PRIVILEGED_LAND_ACCESS } from '../generated/constants.js';
8
+ import { PARCEL_DETAILS_NAME, PARCEL_DETAILS_DESC, PARCEL_DETAILS_OWNER, PARCEL_DETAILS_GROUP, PARCEL_DETAILS_AREA, PARCEL_DETAILS_ID, PARCEL_DETAILS_SEE_AVATARS, PARCEL_DETAILS_PRIM_CAPACITY, PARCEL_DETAILS_PRIM_USED, PARCEL_DETAILS_LANDING_POINT, PARCEL_DETAILS_LANDING_LOOKAT, PARCEL_DETAILS_TP_ROUTING, PARCEL_DETAILS_FLAGS, PARCEL_DETAILS_SCRIPT_DANGER, PARCEL_COUNT_TOTAL, PARCEL_COUNT_TEMP, } from '../generated/constants.js';
9
+ // Empty virtual land for a test that has not supplied a parcel fixture.
10
+ const EMPTY_PARCEL = {
11
+ region: '', id: NULL_KEY, owner: NULL_KEY, effects: [],
12
+ media: { texture: NULL_KEY, url: '', type: '', width: 0, height: 0, description: '', loop: 0 },
13
+ bounds: { min: { x: 0, y: 0 }, max: { x: 256, y: 256 } },
14
+ };
15
+ const sameKey = (a, b) => a.toLowerCase() === b.toLowerCase();
16
+ const positionArg = (args) => args[0];
17
+ function parcelAt(ctx, position) {
18
+ const { world, region } = ctx.linkset;
19
+ return (world && region !== undefined ? world.parcelAt(region, position) : undefined) ?? EMPTY_PARCEL;
20
+ }
21
+ function parcelsOf(ctx, parcel, simWide) {
22
+ return simWide && ctx.linkset.world
23
+ ? ctx.linkset.world.parcels.filter((p) => p.region === parcel.region && sameKey(p.owner, parcel.owner))
24
+ : [parcel];
25
+ }
26
+ const capacity = (parcels) => Math.trunc(parcels.reduce((sum, p) => sum + (p.maxPrims ?? 0), 0));
27
+ const count = (p, category) => p.primCounts?.[category] ?? 0;
28
+ const owns = (ctx, parcel) => parcel.owner !== NULL_KEY && sameKey(parcel.owner, ctx.linkset.owner);
29
+ export const llGetLandOwnerAt = (ctx, args) => parcelAt(ctx, positionArg(args)).owner;
30
+ export const llGetParcelFlags = (ctx, args) => parcelAt(ctx, positionArg(args)).flags ?? 0;
31
+ export const llGetParcelMaxPrims = (ctx, args) => capacity(parcelsOf(ctx, parcelAt(ctx, positionArg(args)), args[1] !== 0));
32
+ export const llGetParcelPrimCount = (ctx, args) => {
33
+ const category = args[1];
34
+ if (category < PARCEL_COUNT_TOTAL || category > PARCEL_COUNT_TEMP)
35
+ return 0;
36
+ return parcelsOf(ctx, parcelAt(ctx, positionArg(args)), args[2] !== 0).reduce((sum, p) => sum + count(p, category), 0);
37
+ };
38
+ export const llGetParcelMusicURL = (ctx) => {
39
+ const parcel = parcelAt(ctx, ctx.prim.regionPosition());
40
+ return owns(ctx, parcel) ? parcel.musicURL ?? '' : '';
41
+ };
42
+ /** Group return powers are not modeled; only the parcel owner has access. */
43
+ export const llGetParcelPrimOwners = (ctx, args) => {
44
+ const parcel = parcelAt(ctx, positionArg(args));
45
+ if (!owns(ctx, parcel))
46
+ return [];
47
+ const values = [];
48
+ const types = [];
49
+ for (const [owner, impact] of Object.entries(parcel.primOwners ?? {}).sort(([a], [b]) => a.toLowerCase().localeCompare(b.toLowerCase())).slice(0, 100)) {
50
+ values.push(owner, impact);
51
+ types.push('key', 'integer');
52
+ }
53
+ return typedList(values, types);
54
+ };
55
+ /** Unknown integer rules stop the query; rules of other types are skipped. */
56
+ export const llGetParcelDetails = (ctx, args) => {
57
+ const position = positionArg(args);
58
+ const parcel = parcelAt(ctx, position);
59
+ const params = args[1];
60
+ const values = [];
61
+ const types = [];
62
+ for (let i = 0; i < params.length; i++) {
63
+ const rule = params[i];
64
+ const type = listElementType(params, i);
65
+ if (typeof rule !== 'number' || (type !== undefined && type !== 'integer'))
66
+ continue;
67
+ let value;
68
+ let resultType = 'integer';
69
+ switch (rule) {
70
+ case PARCEL_DETAILS_NAME:
71
+ value = parcel.name ?? '';
72
+ resultType = 'string';
73
+ break;
74
+ case PARCEL_DETAILS_DESC:
75
+ value = parcel.description ?? '';
76
+ resultType = 'string';
77
+ break;
78
+ case PARCEL_DETAILS_OWNER:
79
+ value = parcel.owner;
80
+ resultType = 'key';
81
+ break;
82
+ case PARCEL_DETAILS_GROUP:
83
+ value = parcel.group ?? NULL_KEY;
84
+ resultType = 'key';
85
+ break;
86
+ case PARCEL_DETAILS_AREA:
87
+ value = parcel.area ?? (parcel.bounds.max.x - parcel.bounds.min.x) * (parcel.bounds.max.y - parcel.bounds.min.y);
88
+ break;
89
+ case PARCEL_DETAILS_ID:
90
+ value = parcel.id;
91
+ resultType = 'key';
92
+ break;
93
+ case PARCEL_DETAILS_SEE_AVATARS:
94
+ value = parcel.seeAvatars === false ? 0 : 1;
95
+ break;
96
+ case PARCEL_DETAILS_PRIM_CAPACITY:
97
+ value = capacity(parcelsOf(ctx, parcel, true));
98
+ break;
99
+ case PARCEL_DETAILS_PRIM_USED:
100
+ value = parcelsOf(ctx, parcel, true).reduce((sum, p) => sum + count(p, PARCEL_COUNT_TOTAL), 0);
101
+ break;
102
+ case PARCEL_DETAILS_LANDING_POINT:
103
+ value = { ...(parcel.landingPoint ?? ZERO_VECTOR) };
104
+ resultType = 'vector';
105
+ break;
106
+ case PARCEL_DETAILS_LANDING_LOOKAT:
107
+ value = { ...(parcel.landingLookAt ?? ZERO_VECTOR) };
108
+ resultType = 'vector';
109
+ break;
110
+ case PARCEL_DETAILS_TP_ROUTING:
111
+ value = parcel.tpRouting ?? 1;
112
+ break;
113
+ case PARCEL_DETAILS_FLAGS:
114
+ value = parcel.flags ?? 0;
115
+ break;
116
+ case PARCEL_DETAILS_SCRIPT_DANGER:
117
+ value = llScriptDanger(ctx, [position]);
118
+ break;
119
+ default: return typedList(values, types);
120
+ }
121
+ values.push(value);
122
+ types.push(resultType);
123
+ }
124
+ return typedList(values, types);
125
+ };
126
+ export const llOverMyLand = (ctx, args) => {
127
+ const id = args[0];
128
+ if (id === NULL_KEY || !/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(id))
129
+ return 0;
130
+ const prim = findObjectPrim(ctx, id);
131
+ let position = prim?.regionPosition();
132
+ if (!position) {
133
+ const world = ctx.linkset.world;
134
+ position = [...(world?.objects ?? []), ...(world?.avatars ?? [])]
135
+ .find((p) => p.region === ctx.linkset.region && sameKey(p.key, id))?.position;
136
+ }
137
+ return position && owns(ctx, parcelAt(ctx, position)) ? 1 : 0;
138
+ };
139
+ // Effects are fixture requests. They never contact a viewer, exchange money,
140
+ // remove VM objects or transfer their ownership.
141
+ function effect(ctx, name, args, accepted, result) {
142
+ const parcel = parcelAt(ctx, ctx.prim.regionPosition());
143
+ if (parcel === EMPTY_PARCEL)
144
+ return;
145
+ parcel.effects.push({ function: name, args: structuredClone(args), source: ctx.prim.key,
146
+ owner: ctx.linkset.owner, time: ctx.state.clock.now, accepted,
147
+ ...(result === undefined ? {} : { result }) });
148
+ }
149
+ const validKey = (key) => typeof key === 'string' && key !== NULL_KEY &&
150
+ /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(key);
151
+ const permission = (ctx, bit) => !!(ctx.state.permissions.granted & bit) &&
152
+ sameKey(ctx.state.permissions.agent, ctx.linkset.owner);
153
+ const current = (ctx) => parcelAt(ctx, ctx.prim.regionPosition());
154
+ const estateManager = (ctx) => ctx.linkset.world !== undefined && ctx.linkset.region !== undefined &&
155
+ (ctx.linkset.world.region(ctx.linkset.region).estateManagers ?? []).some(id => sameKey(id, ctx.linkset.owner));
156
+ export const llSetParcelMusicURL = (ctx, args) => {
157
+ const parcel = current(ctx);
158
+ const accepted = owns(ctx, parcel);
159
+ effect(ctx, 'llSetParcelMusicURL', args, accepted);
160
+ if (accepted)
161
+ parcel.musicURL = args[0];
162
+ };
163
+ function landRequest(name, target) {
164
+ return (ctx, args) => {
165
+ const accepted = owns(ctx, current(ctx)) && (!target || validKey(args[0]));
166
+ effect(ctx, name, args, accepted);
167
+ return undefined;
168
+ };
169
+ }
170
+ export const llAddToLandBanList = landRequest('llAddToLandBanList', true);
171
+ export const llAddToLandPassList = landRequest('llAddToLandPassList', true);
172
+ export const llRemoveFromLandBanList = landRequest('llRemoveFromLandBanList', true);
173
+ export const llRemoveFromLandPassList = landRequest('llRemoveFromLandPassList', true);
174
+ export const llResetLandBanList = landRequest('llResetLandBanList', false);
175
+ export const llResetLandPassList = landRequest('llResetLandPassList', false);
176
+ export const llEjectFromLand = landRequest('llEjectFromLand', true);
177
+ export const llReturnObjectsByID = (ctx, args) => {
178
+ const result = !permission(ctx, PERMISSION_RETURN_OBJECTS) ? -4
179
+ : !(owns(ctx, current(ctx)) || estateManager(ctx)) ? -2 : 0;
180
+ effect(ctx, 'llReturnObjectsByID', args, result === 0, result);
181
+ return result;
182
+ };
183
+ export const llReturnObjectsByOwner = (ctx, args) => {
184
+ const result = !validKey(args[0]) || ![1, 2, 4].includes(args[1]) ? -3
185
+ : !permission(ctx, PERMISSION_RETURN_OBJECTS) ? -4
186
+ : !(estateManager(ctx) || (args[1] !== 4 && owns(ctx, current(ctx)))) ? -2 : 0;
187
+ effect(ctx, 'llReturnObjectsByOwner', args, result === 0, result);
188
+ return result;
189
+ };
190
+ export const llManageEstateAccess = (ctx, args) => {
191
+ const accepted = estateManager(ctx) && validKey(args[1]) && [4, 8, 16, 32, 64, 128].includes(args[0]);
192
+ const result = accepted ? 1 : 0;
193
+ effect(ctx, 'llManageEstateAccess', args, accepted, result);
194
+ return result;
195
+ };
196
+ export const llSetParcelForSale = (ctx, args) => {
197
+ const parcel = current(ctx);
198
+ let result = parcel === EMPTY_PARCEL ? 1
199
+ : !owns(ctx, parcel) || !permission(ctx, PERMISSION_PRIVILEGED_LAND_ACCESS) ? 2
200
+ : parcel.inEscrow ? 3 : 0;
201
+ let price = 0, agent = NULL_KEY, objects = false;
202
+ if (result === 0 && args[0] !== 0) {
203
+ const options = args[1];
204
+ for (let i = 0; i < options.length; i += 2) {
205
+ const rule = options[i], value = options[i + 1];
206
+ if (rule === 1 && typeof value === 'number' && Number.isInteger(value))
207
+ price = value;
208
+ else if (rule === 2 && typeof value === 'string' && (value === NULL_KEY || validKey(value)))
209
+ agent = value;
210
+ else if (rule === 3 && typeof value === 'number' && Number.isInteger(value))
211
+ objects = value !== 0;
212
+ else {
213
+ result = 5;
214
+ break;
215
+ }
216
+ }
217
+ if (result === 0 && (price < 0 || (price === 0 && agent === NULL_KEY)))
218
+ result = 4;
219
+ }
220
+ effect(ctx, 'llSetParcelForSale', args, result === 0, result);
221
+ if (result === 0) {
222
+ if (args[0] === 0)
223
+ delete parcel.sale;
224
+ else
225
+ parcel.sale = { price, agent, objects };
226
+ }
227
+ return result;
228
+ };
229
+ export const llParcelMediaCommandList = (ctx, args) => {
230
+ const parcel = current(ctx);
231
+ const commands = args[0];
232
+ const accepted = owns(ctx, parcel);
233
+ effect(ctx, 'llParcelMediaCommandList', args, accepted);
234
+ if (!accepted)
235
+ return undefined;
236
+ // Agent-targeted commands are viewer requests, not changes to parcel settings.
237
+ let agentOnly = false;
238
+ for (let i = 0; i < commands.length; i++) {
239
+ const rule = commands[i];
240
+ if (rule === 7)
241
+ agentOnly = true;
242
+ if (rule === 11)
243
+ i += 2;
244
+ else if ([4, 5, 6, 7, 9, 10, 12, 13].includes(rule))
245
+ i++;
246
+ }
247
+ if (agentOnly)
248
+ return undefined;
249
+ const media = parcel.media;
250
+ for (let i = 0; i < commands.length; i++) {
251
+ const rule = commands[i];
252
+ if ([0, 1, 2, 3, 8].includes(rule))
253
+ continue;
254
+ const value = commands[++i];
255
+ if (rule === 4 && typeof value === 'string')
256
+ media.texture = value;
257
+ else if (rule === 5 && typeof value === 'string' && value.length <= 254)
258
+ media.url = value;
259
+ else if (rule === 10 && typeof value === 'string')
260
+ media.type = value;
261
+ else if (rule === 11 && typeof value === 'number' && typeof commands[i + 1] === 'number') {
262
+ media.width = value;
263
+ media.height = commands[++i];
264
+ }
265
+ else if (rule === 12 && typeof value === 'string')
266
+ media.description = value;
267
+ else if (rule === 13 && typeof value === 'number')
268
+ media.loop = value;
269
+ else if (rule !== 6 && rule !== 9)
270
+ break;
271
+ }
272
+ return undefined;
273
+ };
274
+ export const llParcelMediaQuery = (ctx, args) => {
275
+ const parcel = current(ctx);
276
+ const accepted = owns(ctx, parcel);
277
+ effect(ctx, 'llParcelMediaQuery', args, accepted);
278
+ if (!accepted)
279
+ return [];
280
+ const values = [], types = [];
281
+ const media = parcel.media;
282
+ for (const rule of args[0]) {
283
+ if (rule === 4) {
284
+ values.push(media.texture);
285
+ types.push('key');
286
+ }
287
+ else if (rule === 5) {
288
+ values.push(media.url);
289
+ types.push('string');
290
+ }
291
+ else if (rule === 10) {
292
+ values.push(media.type);
293
+ types.push('string');
294
+ }
295
+ else if (rule === 11) {
296
+ values.push(media.width, media.height);
297
+ types.push('integer', 'integer');
298
+ }
299
+ else if (rule === 12) {
300
+ values.push(media.description);
301
+ types.push('string');
302
+ }
303
+ else if (rule === 13) {
304
+ values.push(media.loop);
305
+ types.push('float');
306
+ }
307
+ }
308
+ return typedList(values, types);
309
+ };
310
+ export const llGiveMoney = (ctx, args) => {
311
+ const debit = permission(ctx, PERMISSION_DEBIT);
312
+ effect(ctx, 'llGiveMoney', args, debit && validKey(args[0]) && args[1] > 0, 0);
313
+ if (!debit)
314
+ sayError(ctx, 'Script trying to debit L$ from owner but PERMISSION_DEBIT permission not set!');
315
+ return 0;
316
+ };
317
+ export const llTransferLindenDollars = (ctx, args) => {
318
+ const key = nextDataserverKey(ctx);
319
+ const debit = permission(ctx, PERMISSION_DEBIT);
320
+ const accepted = debit && validKey(args[0]) && args[1] > 0;
321
+ effect(ctx, 'llTransferLindenDollars', args, accepted, key);
322
+ const error = !debit ? 'MISSING_PERMISSION_DEBIT'
323
+ : !validKey(args[0]) ? 'INVALID_DESTINATION'
324
+ : args[1] <= 0 ? 'INVALID_AMOUNT' : undefined;
325
+ if (error)
326
+ ctx.state.clock.schedule(ctx.state.clock.now, 'transaction_result', {
327
+ id: key, success: 0, data: error,
328
+ });
329
+ // Authorized requests stay pending. Tests can deliver transaction_result;
330
+ // the VM cannot know an account balance or the outcome of a real payment.
331
+ return key;
332
+ };
333
+ export const llTransferOwnership = (ctx, args) => {
334
+ const target = ctx.linkset.world?.avatars.some(a => a.region === ctx.linkset.region && sameKey(a.key, args[0]));
335
+ const result = !target ? -2 : args[2].length > 0 ? -1 : 0;
336
+ effect(ctx, 'llTransferOwnership', args, result === 0, result);
337
+ return result;
338
+ };
339
+ //# sourceMappingURL=land.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"land.js","sourceRoot":"","sources":["../../src/builtins/land.ts"],"names":[],"mappings":"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"}
@@ -17,8 +17,8 @@ export const llGetLinkName = (ctx, args) => {
17
17
  return prim ? prim.name : NULL_KEY;
18
18
  };
19
19
  function findPrim(ctx, link) {
20
- if (link === 0 && ctx.linkset.prims.length === 1)
21
- return ctx.linkset.prims[0];
20
+ if (link === 0)
21
+ return ctx.prim.linkNumber === 1 ? undefined : ctx.linkset.prims[0];
22
22
  if (link === LINK_THIS)
23
23
  return ctx.prim;
24
24
  return ctx.linkset.prims.find((p) => p.linkNumber === link);
@@ -1 +1 @@
1
- {"version":3,"file":"link-info.js","sourceRoot":"","sources":["../../src/builtins/link-info.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAA;AACrD,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAA;AAE7C,kFAAkF;AAClF,MAAM,CAAC,MAAM,eAAe,GAAgB,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAA;AAExE,8DAA8D;AAC9D,MAAM,CAAC,MAAM,kBAAkB,GAAgB,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAA;AAEhF,4EAA4E;AAC5E,MAAM,CAAC,MAAM,YAAY,GAAgB,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE;IACrD,MAAM,IAAI,GAAI,IAAI,CAAC,CAAC,CAAwB,IAAI,CAAC,CAAA;IACjD,MAAM,IAAI,GAAG,QAAQ,CAAC,GAAG,EAAE,IAAI,CAAC,CAAA;IAChC,OAAO,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAA;AACnC,CAAC,CAAA;AAED,6EAA6E;AAC7E,MAAM,CAAC,MAAM,aAAa,GAAgB,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE;IACtD,MAAM,IAAI,GAAI,IAAI,CAAC,CAAC,CAAwB,IAAI,CAAC,CAAA;IACjD,MAAM,IAAI,GAAG,QAAQ,CAAC,GAAG,EAAE,IAAI,CAAC,CAAA;IAChC,OAAO,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAA;AACpC,CAAC,CAAA;AAED,SAAS,QAAQ,CAAC,GAA+B,EAAE,IAAY;IAC7D,IAAI,IAAI,KAAK,CAAC,IAAI,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;IAC7E,IAAI,IAAI,KAAK,SAAS;QAAE,OAAO,GAAG,CAAC,IAAI,CAAA;IACvC,OAAO,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,KAAK,IAAI,CAAC,CAAA;AAC7D,CAAC"}
1
+ {"version":3,"file":"link-info.js","sourceRoot":"","sources":["../../src/builtins/link-info.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAA;AACrD,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAA;AAE7C,kFAAkF;AAClF,MAAM,CAAC,MAAM,eAAe,GAAgB,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAA;AAExE,8DAA8D;AAC9D,MAAM,CAAC,MAAM,kBAAkB,GAAgB,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAA;AAEhF,4EAA4E;AAC5E,MAAM,CAAC,MAAM,YAAY,GAAgB,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE;IACrD,MAAM,IAAI,GAAI,IAAI,CAAC,CAAC,CAAwB,IAAI,CAAC,CAAA;IACjD,MAAM,IAAI,GAAG,QAAQ,CAAC,GAAG,EAAE,IAAI,CAAC,CAAA;IAChC,OAAO,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAA;AACnC,CAAC,CAAA;AAED,6EAA6E;AAC7E,MAAM,CAAC,MAAM,aAAa,GAAgB,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE;IACtD,MAAM,IAAI,GAAI,IAAI,CAAC,CAAC,CAAwB,IAAI,CAAC,CAAA;IACjD,MAAM,IAAI,GAAG,QAAQ,CAAC,GAAG,EAAE,IAAI,CAAC,CAAA;IAChC,OAAO,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAA;AACpC,CAAC,CAAA;AAED,SAAS,QAAQ,CAAC,GAA+B,EAAE,IAAY;IAC7D,IAAI,IAAI,KAAK,CAAC;QAAE,OAAO,GAAG,CAAC,IAAI,CAAC,UAAU,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;IACnF,IAAI,IAAI,KAAK,SAAS;QAAE,OAAO,GAAG,CAAC,IAAI,CAAA;IACvC,OAAO,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,KAAK,IAAI,CAAC,CAAA;AAC7D,CAAC"}
@@ -0,0 +1,20 @@
1
+ import type { BuiltinImpl } from '../runtime.js';
2
+ /**
3
+ * llCreateLink(key target, integer parent) — link the object holding prim
4
+ * `target` with this one. With `parent` TRUE this object stays root and the
5
+ * target's prims go in from link 2; with FALSE the target's root becomes root
6
+ * and this object's prims go in from link 2. A target in this object only
7
+ * raises changed. A key with no prim, or no PERMISSION_CHANGE_LINKS, does
8
+ * nothing, with no error.
9
+ */
10
+ export declare const llCreateLink: BuiltinImpl;
11
+ /**
12
+ * llBreakLink(integer link) — break the prim at `link` out of the linkset.
13
+ * LINK_THIS reads as the root and any other negative number as link 2; 0
14
+ * and numbers past the last prim do nothing. Without
15
+ * PERMISSION_CHANGE_LINKS nothing happens, with no error.
16
+ */
17
+ export declare const llBreakLink: BuiltinImpl;
18
+ /** llBreakAllLinks() — break every prim apart. Without PERMISSION_CHANGE_LINKS nothing happens. */
19
+ export declare const llBreakAllLinks: BuiltinImpl;
20
+ //# sourceMappingURL=links.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"links.d.ts","sourceRoot":"","sources":["../../src/builtins/links.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAe,MAAM,eAAe,CAAA;AAO7D;;;;;;;GAOG;AACH,eAAO,MAAM,YAAY,EAAE,WAQ1B,CAAA;AAED;;;;;GAKG;AACH,eAAO,MAAM,WAAW,EAAE,WAUzB,CAAA;AAED,mGAAmG;AACnG,eAAO,MAAM,eAAe,EAAE,WAG7B,CAAA"}
@@ -0,0 +1,53 @@
1
+ import { LINK_THIS, PERMISSION_CHANGE_LINKS } from '../generated/constants.js';
2
+ import { findObjectPrim } from './object-reads.js';
3
+ const mayChangeLinks = (ctx) => (ctx.state.permissions.granted & PERMISSION_CHANGE_LINKS) !== 0;
4
+ /**
5
+ * llCreateLink(key target, integer parent) — link the object holding prim
6
+ * `target` with this one. With `parent` TRUE this object stays root and the
7
+ * target's prims go in from link 2; with FALSE the target's root becomes root
8
+ * and this object's prims go in from link 2. A target in this object only
9
+ * raises changed. A key with no prim, or no PERMISSION_CHANGE_LINKS, does
10
+ * nothing, with no error.
11
+ */
12
+ export const llCreateLink = (ctx, args) => {
13
+ if (!mayChangeLinks(ctx))
14
+ return undefined;
15
+ const target = findObjectPrim(ctx, args[0] ?? '')?.linkset;
16
+ if (!target)
17
+ return undefined;
18
+ const parent = args[1] ?? 0;
19
+ if (parent !== 0)
20
+ ctx.linkset.absorb(target);
21
+ else
22
+ target.absorb(ctx.linkset);
23
+ return undefined;
24
+ };
25
+ /**
26
+ * llBreakLink(integer link) — break the prim at `link` out of the linkset.
27
+ * LINK_THIS reads as the root and any other negative number as link 2; 0
28
+ * and numbers past the last prim do nothing. Without
29
+ * PERMISSION_CHANGE_LINKS nothing happens, with no error.
30
+ */
31
+ export const llBreakLink = (ctx, args) => {
32
+ if (!mayChangeLinks(ctx))
33
+ return undefined;
34
+ const link = args[0] ?? 0;
35
+ const prims = ctx.linkset.prims;
36
+ let prim;
37
+ if (link === LINK_THIS)
38
+ prim = prims[0];
39
+ else if (link < 0)
40
+ prim = prims[1];
41
+ else if (link > 0)
42
+ prim = prims[link - 1];
43
+ if (prim)
44
+ ctx.linkset.breakOff(prim);
45
+ return undefined;
46
+ };
47
+ /** llBreakAllLinks() — break every prim apart. Without PERMISSION_CHANGE_LINKS nothing happens. */
48
+ export const llBreakAllLinks = (ctx) => {
49
+ if (mayChangeLinks(ctx))
50
+ ctx.linkset.breakAll();
51
+ return undefined;
52
+ };
53
+ //# sourceMappingURL=links.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"links.js","sourceRoot":"","sources":["../../src/builtins/links.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAA;AAC9E,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA;AAElD,MAAM,cAAc,GAAG,CAAC,GAAgB,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC,OAAO,GAAG,uBAAuB,CAAC,KAAK,CAAC,CAAA;AAE5G;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,YAAY,GAAgB,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE;IACrD,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC;QAAE,OAAO,SAAS,CAAA;IAC1C,MAAM,MAAM,GAAG,cAAc,CAAC,GAAG,EAAG,IAAI,CAAC,CAAC,CAAwB,IAAI,EAAE,CAAC,EAAE,OAAO,CAAA;IAClF,IAAI,CAAC,MAAM;QAAE,OAAO,SAAS,CAAA;IAC7B,MAAM,MAAM,GAAI,IAAI,CAAC,CAAC,CAAwB,IAAI,CAAC,CAAA;IACnD,IAAI,MAAM,KAAK,CAAC;QAAE,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;;QACvC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;IAC/B,OAAO,SAAS,CAAA;AAClB,CAAC,CAAA;AAED;;;;;GAKG;AACH,MAAM,CAAC,MAAM,WAAW,GAAgB,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE;IACpD,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC;QAAE,OAAO,SAAS,CAAA;IAC1C,MAAM,IAAI,GAAI,IAAI,CAAC,CAAC,CAAwB,IAAI,CAAC,CAAA;IACjD,MAAM,KAAK,GAAG,GAAG,CAAC,OAAO,CAAC,KAAK,CAAA;IAC/B,IAAI,IAAsB,CAAA;IAC1B,IAAI,IAAI,KAAK,SAAS;QAAE,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAA;SAClC,IAAI,IAAI,GAAG,CAAC;QAAE,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAA;SAC7B,IAAI,IAAI,GAAG,CAAC;QAAE,IAAI,GAAG,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC,CAAA;IACzC,IAAI,IAAI;QAAE,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAA;IACpC,OAAO,SAAS,CAAA;AAClB,CAAC,CAAA;AAED,mGAAmG;AACnG,MAAM,CAAC,MAAM,eAAe,GAAgB,CAAC,GAAG,EAAE,EAAE;IAClD,IAAI,cAAc,CAAC,GAAG,CAAC;QAAE,GAAG,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAA;IAC/C,OAAO,SAAS,CAAA;AAClB,CAAC,CAAA"}
@@ -4,6 +4,11 @@ export interface LinksetDataEntry {
4
4
  /** Empty string = unprotected. */
5
5
  password: string;
6
6
  }
7
+ /**
8
+ * Move into `store` each pair of `from` whose key it lacks, while the pair
9
+ * still fits in the 131072 bytes; the rest are dropped.
10
+ */
11
+ export declare function mergeLinksetData(store: Map<string, LinksetDataEntry>, from: ReadonlyMap<string, LinksetDataEntry>): void;
7
12
  export declare const llLinksetDataWrite: BuiltinImpl;
8
13
  export declare const llLinksetDataWriteProtected: BuiltinImpl;
9
14
  export declare const llLinksetDataRead: BuiltinImpl;
@@ -1 +1 @@
1
- {"version":3,"file":"linksetdata.d.ts","sourceRoot":"","sources":["../../src/builtins/linksetdata.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAe,MAAM,eAAe,CAAA;AAe7D,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAA;IACb,kCAAkC;IAClC,QAAQ,EAAE,MAAM,CAAA;CACjB;AAmSD,eAAO,MAAM,kBAAkB,EAAE,WAmBhC,CAAA;AAED,eAAO,MAAM,2BAA2B,EAAE,WA4BzC,CAAA;AAED,eAAO,MAAM,iBAAiB,EAAE,WAM/B,CAAA;AAED,eAAO,MAAM,0BAA0B,EAAE,WAOxC,CAAA;AAED,eAAO,MAAM,mBAAmB,EAAE,WAUjC,CAAA;AAED,eAAO,MAAM,4BAA4B,EAAE,WAW1C,CAAA;AAED,eAAO,MAAM,wBAAwB,EAAE,WAuBtC,CAAA;AAED,eAAO,MAAM,kBAAkB,EAAE,WAIhC,CAAA;AAED,eAAO,MAAM,sBAAsB,EAAE,WACgC,CAAA;AAErE,eAAO,MAAM,sBAAsB,EAAE,WAEpC,CAAA;AAED,eAAO,MAAM,qBAAqB,EAAE,WAInC,CAAA;AAED,eAAO,MAAM,qBAAqB,EAAE,WAOnC,CAAA;AAED,eAAO,MAAM,uBAAuB,EAAE,WAOrC,CAAA"}
1
+ {"version":3,"file":"linksetdata.d.ts","sourceRoot":"","sources":["../../src/builtins/linksetdata.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAe,MAAM,eAAe,CAAA;AAe7D,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAA;IACb,kCAAkC;IAClC,QAAQ,EAAE,MAAM,CAAA;CACjB;AAwBD;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,gBAAgB,CAAC,EACpC,IAAI,EAAE,WAAW,CAAC,MAAM,EAAE,gBAAgB,CAAC,GAC1C,IAAI,CASN;AA2QD,eAAO,MAAM,kBAAkB,EAAE,WAmBhC,CAAA;AAED,eAAO,MAAM,2BAA2B,EAAE,WA4BzC,CAAA;AAED,eAAO,MAAM,iBAAiB,EAAE,WAM/B,CAAA;AAED,eAAO,MAAM,0BAA0B,EAAE,WAOxC,CAAA;AAED,eAAO,MAAM,mBAAmB,EAAE,WAUjC,CAAA;AAED,eAAO,MAAM,4BAA4B,EAAE,WAW1C,CAAA;AAED,eAAO,MAAM,wBAAwB,EAAE,WAuBtC,CAAA;AAED,eAAO,MAAM,kBAAkB,EAAE,WAIhC,CAAA;AAED,eAAO,MAAM,sBAAsB,EAAE,WACgC,CAAA;AAErE,eAAO,MAAM,sBAAsB,EAAE,WAEpC,CAAA;AAED,eAAO,MAAM,qBAAqB,EAAE,WAInC,CAAA;AAED,eAAO,MAAM,qBAAqB,EAAE,WAOnC,CAAA;AAED,eAAO,MAAM,uBAAuB,EAAE,WAOrC,CAAA"}
@@ -16,6 +16,22 @@ function bytesUsed(store) {
16
16
  used += entryCost(name, entry);
17
17
  return used;
18
18
  }
19
+ /**
20
+ * Move into `store` each pair of `from` whose key it lacks, while the pair
21
+ * still fits in the 131072 bytes; the rest are dropped.
22
+ */
23
+ export function mergeLinksetData(store, from) {
24
+ let used = bytesUsed(store);
25
+ for (const [name, entry] of from) {
26
+ if (store.has(name))
27
+ continue;
28
+ const cost = entryCost(name, entry);
29
+ if (used + cost > LSD_AVAILABLE_BYTES)
30
+ continue;
31
+ store.set(name, entry);
32
+ used += cost;
33
+ }
34
+ }
19
35
  function fits(ctx, name, entry) {
20
36
  const store = ctx.state.linksetData;
21
37
  const existing = store.get(name);
@@ -288,19 +304,16 @@ function compilePattern(pattern) {
288
304
  }
289
305
  /**
290
306
  * Slice helper matching LSL list-style start/count semantics for ListKeys /
291
- * FindKeys: negative `start` counts from the end; `count < 1` means "to the
307
+ * FindKeys: callers clamp a negative `start` to 0; `count < 1` means "to the
292
308
  * end".
293
309
  */
294
310
  function slice(arr, start, count) {
295
311
  if (arr.length === 0)
296
312
  return [];
297
- let s = start < 0 ? arr.length + start : start;
298
- if (s < 0)
299
- s = 0;
300
- if (s >= arr.length)
313
+ if (start >= arr.length)
301
314
  return [];
302
- const end = count < 1 ? arr.length : Math.min(arr.length, s + count);
303
- return arr.slice(s, end);
315
+ const end = count < 1 ? arr.length : Math.min(arr.length, start + count);
316
+ return arr.slice(start, end);
304
317
  }
305
318
  export const llLinksetDataWrite = (ctx, args) => {
306
319
  const name = args[0] ?? '';
@@ -445,7 +458,7 @@ export const llLinksetDataCountKeys = (ctx) => {
445
458
  export const llLinksetDataListKeys = (ctx, args) => {
446
459
  const start = args[0] ?? 0;
447
460
  const count = args[1] ?? -1;
448
- return uniformList(slice(sortedKeys(ctx), start, count), 'string');
461
+ return uniformList(slice(sortedKeys(ctx), Math.max(start, 0), count), 'string');
449
462
  };
450
463
  export const llLinksetDataFindKeys = (ctx, args) => {
451
464
  const pattern = args[0] ?? '';
@@ -454,7 +467,7 @@ export const llLinksetDataFindKeys = (ctx, args) => {
454
467
  const matches = compilePattern(pattern);
455
468
  if (!matches)
456
469
  return [];
457
- return uniformList(slice(sortedKeys(ctx).filter(matches), start, count), 'string');
470
+ return uniformList(slice(sortedKeys(ctx).filter(matches), Math.max(start, 0), count), 'string');
458
471
  };
459
472
  export const llLinksetDataCountFound = (ctx, args) => {
460
473
  const pattern = args[0] ?? '';