@hashgraphonline/standards-sdk 0.1.143-feat-solana-register.canary.1c6f446.78 → 0.1.144-feat-solana-register.canary.d5edcec.80
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/dist/cjs/hcs-10/sdk.d.ts.map +1 -1
- package/dist/cjs/hcs-14/issuers/hiero.d.ts.map +1 -1
- package/dist/cjs/index.d.ts.map +1 -1
- package/dist/cjs/services/registry-broker/schemas.d.ts +153 -153
- package/dist/cjs/standards-sdk.cjs +2 -2
- package/dist/cjs/standards-sdk.cjs.map +1 -1
- package/dist/cjs/utils/dynamic-import.d.ts +5 -1
- package/dist/cjs/utils/dynamic-import.d.ts.map +1 -1
- package/dist/es/hcs-10/sdk.d.ts.map +1 -1
- package/dist/es/hcs-14/issuers/hiero.d.ts.map +1 -1
- package/dist/es/index.d.ts.map +1 -1
- package/dist/es/services/registry-broker/schemas.d.ts +153 -153
- package/dist/es/standards-sdk.es.js +134 -135
- package/dist/es/standards-sdk.es.js.map +1 -1
- package/dist/es/standards-sdk.es10.js +70 -90
- package/dist/es/standards-sdk.es10.js.map +1 -1
- package/dist/es/standards-sdk.es100.js +229 -27
- package/dist/es/standards-sdk.es100.js.map +1 -1
- package/dist/es/standards-sdk.es101.js +109 -228
- package/dist/es/standards-sdk.es101.js.map +1 -1
- package/dist/es/standards-sdk.es102.js +15 -94
- package/dist/es/standards-sdk.es102.js.map +1 -1
- package/dist/es/standards-sdk.es103.js +80 -30
- package/dist/es/standards-sdk.es103.js.map +1 -1
- package/dist/es/standards-sdk.es104.js +27 -80
- package/dist/es/standards-sdk.es104.js.map +1 -1
- package/dist/es/standards-sdk.es105.js +136 -25
- package/dist/es/standards-sdk.es105.js.map +1 -1
- package/dist/es/standards-sdk.es106.js +27 -140
- package/dist/es/standards-sdk.es106.js.map +1 -1
- package/dist/es/standards-sdk.es107.js +20 -27
- package/dist/es/standards-sdk.es107.js.map +1 -1
- package/dist/es/standards-sdk.es108.js +156 -18
- package/dist/es/standards-sdk.es108.js.map +1 -1
- package/dist/es/standards-sdk.es109.js +198 -148
- package/dist/es/standards-sdk.es109.js.map +1 -1
- package/dist/es/standards-sdk.es11.js +121 -45
- package/dist/es/standards-sdk.es11.js.map +1 -1
- package/dist/es/standards-sdk.es110.js +747 -167
- package/dist/es/standards-sdk.es110.js.map +1 -1
- package/dist/es/standards-sdk.es111.js +9 -786
- package/dist/es/standards-sdk.es111.js.map +1 -1
- package/dist/es/standards-sdk.es112.js +567 -13
- package/dist/es/standards-sdk.es112.js.map +1 -1
- package/dist/es/standards-sdk.es113.js +576 -541
- package/dist/es/standards-sdk.es113.js.map +1 -1
- package/dist/es/standards-sdk.es114.js +12 -601
- package/dist/es/standards-sdk.es114.js.map +1 -1
- package/dist/es/standards-sdk.es115.js +2 -13
- package/dist/es/standards-sdk.es115.js.map +1 -1
- package/dist/es/standards-sdk.es116.js +87 -2
- package/dist/es/standards-sdk.es116.js.map +1 -1
- package/dist/es/standards-sdk.es117.js +37 -84
- package/dist/es/standards-sdk.es117.js.map +1 -1
- package/dist/es/standards-sdk.es118.js +2 -40
- package/dist/es/standards-sdk.es118.js.map +1 -1
- package/dist/es/standards-sdk.es119.js +231 -2
- package/dist/es/standards-sdk.es119.js.map +1 -1
- package/dist/es/standards-sdk.es12.js +60 -159
- package/dist/es/standards-sdk.es12.js.map +1 -1
- package/dist/es/standards-sdk.es120.js +1110 -201
- package/dist/es/standards-sdk.es120.js.map +1 -1
- package/dist/es/standards-sdk.es121.js +225 -1059
- package/dist/es/standards-sdk.es121.js.map +1 -1
- package/dist/es/standards-sdk.es122.js +419 -303
- package/dist/es/standards-sdk.es122.js.map +1 -1
- package/dist/es/standards-sdk.es123.js +351 -418
- package/dist/es/standards-sdk.es123.js.map +1 -1
- package/dist/es/standards-sdk.es124.js +872 -347
- package/dist/es/standards-sdk.es124.js.map +1 -1
- package/dist/es/standards-sdk.es125.js +182 -854
- package/dist/es/standards-sdk.es125.js.map +1 -1
- package/dist/es/standards-sdk.es126.js +1512 -153
- package/dist/es/standards-sdk.es126.js.map +1 -1
- package/dist/es/standards-sdk.es127.js +157 -1547
- package/dist/es/standards-sdk.es127.js.map +1 -1
- package/dist/es/standards-sdk.es128.js +192 -162
- package/dist/es/standards-sdk.es128.js.map +1 -1
- package/dist/es/standards-sdk.es129.js +61 -164
- package/dist/es/standards-sdk.es129.js.map +1 -1
- package/dist/es/standards-sdk.es13.js +200 -60
- package/dist/es/standards-sdk.es13.js.map +1 -1
- package/dist/es/standards-sdk.es130.js +102 -85
- package/dist/es/standards-sdk.es130.js.map +1 -1
- package/dist/es/standards-sdk.es131.js +222 -96
- package/dist/es/standards-sdk.es131.js.map +1 -1
- package/dist/es/standards-sdk.es132.js +153 -220
- package/dist/es/standards-sdk.es132.js.map +1 -1
- package/dist/es/standards-sdk.es133.js +104 -162
- package/dist/es/standards-sdk.es133.js.map +1 -1
- package/dist/es/standards-sdk.es134.js +296 -92
- package/dist/es/standards-sdk.es134.js.map +1 -1
- package/dist/es/standards-sdk.es135.js +432 -294
- package/dist/es/standards-sdk.es135.js.map +1 -1
- package/dist/es/standards-sdk.es136.js +14 -461
- package/dist/es/standards-sdk.es136.js.map +1 -1
- package/dist/es/standards-sdk.es137.js +79 -15
- package/dist/es/standards-sdk.es137.js.map +1 -1
- package/dist/es/standards-sdk.es138.js +77 -71
- package/dist/es/standards-sdk.es138.js.map +1 -1
- package/dist/es/standards-sdk.es139.js +152 -80
- package/dist/es/standards-sdk.es139.js.map +1 -1
- package/dist/es/standards-sdk.es14.js +149 -178
- package/dist/es/standards-sdk.es14.js.map +1 -1
- package/dist/es/standards-sdk.es140.js +7 -159
- package/dist/es/standards-sdk.es140.js.map +1 -1
- package/dist/es/standards-sdk.es141.js +86 -7
- package/dist/es/standards-sdk.es141.js.map +1 -1
- package/dist/es/standards-sdk.es142.js +44 -65
- package/dist/es/standards-sdk.es142.js.map +1 -1
- package/dist/es/standards-sdk.es143.js +30 -65
- package/dist/es/standards-sdk.es143.js.map +1 -1
- package/dist/es/standards-sdk.es144.js +34 -30
- package/dist/es/standards-sdk.es144.js.map +1 -1
- package/dist/es/standards-sdk.es145.js +28 -34
- package/dist/es/standards-sdk.es145.js.map +1 -1
- package/dist/es/standards-sdk.es146.js +138 -28
- package/dist/es/standards-sdk.es146.js.map +1 -1
- package/dist/es/standards-sdk.es147.js +37 -133
- package/dist/es/standards-sdk.es147.js.map +1 -1
- package/dist/es/standards-sdk.es148.js +12280 -33
- package/dist/es/standards-sdk.es148.js.map +1 -1
- package/dist/es/standards-sdk.es149.js +1 -1
- package/dist/es/standards-sdk.es15.js +152 -151
- package/dist/es/standards-sdk.es15.js.map +1 -1
- package/dist/es/standards-sdk.es150.js +12 -12284
- package/dist/es/standards-sdk.es150.js.map +1 -1
- package/dist/es/standards-sdk.es151.js +54 -15
- package/dist/es/standards-sdk.es151.js.map +1 -1
- package/dist/es/standards-sdk.es152.js +72 -160
- package/dist/es/standards-sdk.es152.js.map +1 -1
- package/dist/es/standards-sdk.es153.js +139 -289
- package/dist/es/standards-sdk.es153.js.map +1 -1
- package/dist/es/standards-sdk.es154.js +274 -298
- package/dist/es/standards-sdk.es154.js.map +1 -1
- package/dist/es/standards-sdk.es155.js +262 -369
- package/dist/es/standards-sdk.es155.js.map +1 -1
- package/dist/es/standards-sdk.es156.js +316 -194
- package/dist/es/standards-sdk.es156.js.map +1 -1
- package/dist/es/standards-sdk.es157.js +319 -64
- package/dist/es/standards-sdk.es157.js.map +1 -1
- package/dist/es/standards-sdk.es158.js +69 -49
- package/dist/es/standards-sdk.es158.js.map +1 -1
- package/dist/es/standards-sdk.es159.js +222 -65
- package/dist/es/standards-sdk.es159.js.map +1 -1
- package/dist/es/standards-sdk.es16.js +917 -136
- package/dist/es/standards-sdk.es16.js.map +1 -1
- package/dist/es/standards-sdk.es160.js +223 -218
- package/dist/es/standards-sdk.es160.js.map +1 -1
- package/dist/es/standards-sdk.es17.js +23 -948
- package/dist/es/standards-sdk.es17.js.map +1 -1
- package/dist/es/standards-sdk.es18.js +2422 -24
- package/dist/es/standards-sdk.es18.js.map +1 -1
- package/dist/es/standards-sdk.es19.js +818 -2092
- package/dist/es/standards-sdk.es19.js.map +1 -1
- package/dist/es/standards-sdk.es2.js +654 -189
- package/dist/es/standards-sdk.es2.js.map +1 -1
- package/dist/es/standards-sdk.es20.js +205 -1092
- package/dist/es/standards-sdk.es20.js.map +1 -1
- package/dist/es/standards-sdk.es21.js +858 -221
- package/dist/es/standards-sdk.es21.js.map +1 -1
- package/dist/es/standards-sdk.es22.js +179 -903
- package/dist/es/standards-sdk.es22.js.map +1 -1
- package/dist/es/standards-sdk.es23.js +164 -179
- package/dist/es/standards-sdk.es23.js.map +1 -1
- package/dist/es/standards-sdk.es24.js +62 -118
- package/dist/es/standards-sdk.es24.js.map +1 -1
- package/dist/es/standards-sdk.es25.js +377 -57
- package/dist/es/standards-sdk.es25.js.map +1 -1
- package/dist/es/standards-sdk.es26.js +36 -394
- package/dist/es/standards-sdk.es26.js.map +1 -1
- package/dist/es/standards-sdk.es27.js +901 -50
- package/dist/es/standards-sdk.es27.js.map +1 -1
- package/dist/es/standards-sdk.es28.js +134 -922
- package/dist/es/standards-sdk.es28.js.map +1 -1
- package/dist/es/standards-sdk.es29.js +7 -134
- package/dist/es/standards-sdk.es29.js.map +1 -1
- package/dist/es/standards-sdk.es3.js +63 -680
- package/dist/es/standards-sdk.es3.js.map +1 -1
- package/dist/es/standards-sdk.es30.js +344 -7
- package/dist/es/standards-sdk.es30.js.map +1 -1
- package/dist/es/standards-sdk.es31.js +302 -287
- package/dist/es/standards-sdk.es31.js.map +1 -1
- package/dist/es/standards-sdk.es32.js +94 -322
- package/dist/es/standards-sdk.es32.js.map +1 -1
- package/dist/es/standards-sdk.es33.js +458 -101
- package/dist/es/standards-sdk.es33.js.map +1 -1
- package/dist/es/standards-sdk.es34.js +132 -451
- package/dist/es/standards-sdk.es34.js.map +1 -1
- package/dist/es/standards-sdk.es35.js +216 -130
- package/dist/es/standards-sdk.es35.js.map +1 -1
- package/dist/es/standards-sdk.es36.js +273 -196
- package/dist/es/standards-sdk.es36.js.map +1 -1
- package/dist/es/standards-sdk.es37.js +148 -87
- package/dist/es/standards-sdk.es37.js.map +1 -1
- package/dist/es/standards-sdk.es38.js +183 -320
- package/dist/es/standards-sdk.es38.js.map +1 -1
- package/dist/es/standards-sdk.es39.js +238 -161
- package/dist/es/standards-sdk.es39.js.map +1 -1
- package/dist/es/standards-sdk.es4.js +425 -63
- package/dist/es/standards-sdk.es4.js.map +1 -1
- package/dist/es/standards-sdk.es40.js +136 -254
- package/dist/es/standards-sdk.es40.js.map +1 -1
- package/dist/es/standards-sdk.es41.js +225 -176
- package/dist/es/standards-sdk.es41.js.map +1 -1
- package/dist/es/standards-sdk.es42.js +199 -261
- package/dist/es/standards-sdk.es42.js.map +1 -1
- package/dist/es/standards-sdk.es43.js +237 -199
- package/dist/es/standards-sdk.es43.js.map +1 -1
- package/dist/es/standards-sdk.es44.js +209 -201
- package/dist/es/standards-sdk.es44.js.map +1 -1
- package/dist/es/standards-sdk.es45.js +305 -201
- package/dist/es/standards-sdk.es45.js.map +1 -1
- package/dist/es/standards-sdk.es46.js +371 -261
- package/dist/es/standards-sdk.es46.js.map +1 -1
- package/dist/es/standards-sdk.es47.js +316 -372
- package/dist/es/standards-sdk.es47.js.map +1 -1
- package/dist/es/standards-sdk.es48.js +404 -336
- package/dist/es/standards-sdk.es48.js.map +1 -1
- package/dist/es/standards-sdk.es49.js +83 -449
- package/dist/es/standards-sdk.es49.js.map +1 -1
- package/dist/es/standards-sdk.es5.js +232 -354
- package/dist/es/standards-sdk.es5.js.map +1 -1
- package/dist/es/standards-sdk.es50.js +179 -89
- package/dist/es/standards-sdk.es50.js.map +1 -1
- package/dist/es/standards-sdk.es51.js +231 -165
- package/dist/es/standards-sdk.es51.js.map +1 -1
- package/dist/es/standards-sdk.es52.js +25 -262
- package/dist/es/standards-sdk.es52.js.map +1 -1
- package/dist/es/standards-sdk.es53.js +56 -26
- package/dist/es/standards-sdk.es53.js.map +1 -1
- package/dist/es/standards-sdk.es54.js +12 -57
- package/dist/es/standards-sdk.es54.js.map +1 -1
- package/dist/es/standards-sdk.es55.js +49 -12
- package/dist/es/standards-sdk.es55.js.map +1 -1
- package/dist/es/standards-sdk.es56.js +115 -43
- package/dist/es/standards-sdk.es56.js.map +1 -1
- package/dist/es/standards-sdk.es57.js +42 -115
- package/dist/es/standards-sdk.es57.js.map +1 -1
- package/dist/es/standards-sdk.es58.js +52 -43
- package/dist/es/standards-sdk.es58.js.map +1 -1
- package/dist/es/standards-sdk.es59.js +36 -50
- package/dist/es/standards-sdk.es59.js.map +1 -1
- package/dist/es/standards-sdk.es6.js +125 -246
- package/dist/es/standards-sdk.es6.js.map +1 -1
- package/dist/es/standards-sdk.es60.js +207 -39
- package/dist/es/standards-sdk.es60.js.map +1 -1
- package/dist/es/standards-sdk.es61.js +24 -201
- package/dist/es/standards-sdk.es61.js.map +1 -1
- package/dist/es/standards-sdk.es62.js +87 -25
- package/dist/es/standards-sdk.es62.js.map +1 -1
- package/dist/es/standards-sdk.es63.js +3 -51
- package/dist/es/standards-sdk.es63.js.map +1 -1
- package/dist/es/standards-sdk.es64.js +100 -3
- package/dist/es/standards-sdk.es64.js.map +1 -1
- package/dist/es/standards-sdk.es65.js +61 -62
- package/dist/es/standards-sdk.es65.js.map +1 -1
- package/dist/es/standards-sdk.es66.js +17 -98
- package/dist/es/standards-sdk.es66.js.map +1 -1
- package/dist/es/standards-sdk.es67.js +77 -19
- package/dist/es/standards-sdk.es67.js.map +1 -1
- package/dist/es/standards-sdk.es68.js +458 -77
- package/dist/es/standards-sdk.es68.js.map +1 -1
- package/dist/es/standards-sdk.es69.js +106 -240
- package/dist/es/standards-sdk.es69.js.map +1 -1
- package/dist/es/standards-sdk.es7.js +28 -183
- package/dist/es/standards-sdk.es7.js.map +1 -1
- package/dist/es/standards-sdk.es70.js +170 -286
- package/dist/es/standards-sdk.es70.js.map +1 -1
- package/dist/es/standards-sdk.es71.js +71 -207
- package/dist/es/standards-sdk.es71.js.map +1 -1
- package/dist/es/standards-sdk.es72.js +71 -72
- package/dist/es/standards-sdk.es72.js.map +1 -1
- package/dist/es/standards-sdk.es73.js +143 -71
- package/dist/es/standards-sdk.es73.js.map +1 -1
- package/dist/es/standards-sdk.es74.js +62 -136
- package/dist/es/standards-sdk.es74.js.map +1 -1
- package/dist/es/standards-sdk.es75.js +380 -45
- package/dist/es/standards-sdk.es75.js.map +1 -1
- package/dist/es/standards-sdk.es76.js +222 -130
- package/dist/es/standards-sdk.es76.js.map +1 -1
- package/dist/es/standards-sdk.es77.js +320 -444
- package/dist/es/standards-sdk.es77.js.map +1 -1
- package/dist/es/standards-sdk.es78.js +88 -371
- package/dist/es/standards-sdk.es78.js.map +1 -1
- package/dist/es/standards-sdk.es79.js +125 -89
- package/dist/es/standards-sdk.es79.js.map +1 -1
- package/dist/es/standards-sdk.es8.js +80 -29
- package/dist/es/standards-sdk.es8.js.map +1 -1
- package/dist/es/standards-sdk.es80.js +8 -125
- package/dist/es/standards-sdk.es80.js.map +1 -1
- package/dist/es/standards-sdk.es81.js +45 -6
- package/dist/es/standards-sdk.es81.js.map +1 -1
- package/dist/es/standards-sdk.es82.js +98 -44
- package/dist/es/standards-sdk.es82.js.map +1 -1
- package/dist/es/standards-sdk.es83.js +331 -84
- package/dist/es/standards-sdk.es83.js.map +1 -1
- package/dist/es/standards-sdk.es84.js +93 -160
- package/dist/es/standards-sdk.es84.js.map +1 -1
- package/dist/es/standards-sdk.es85.js +55 -275
- package/dist/es/standards-sdk.es85.js.map +1 -1
- package/dist/es/standards-sdk.es86.js +43 -55
- package/dist/es/standards-sdk.es86.js.map +1 -1
- package/dist/es/standards-sdk.es87.js +145 -44
- package/dist/es/standards-sdk.es87.js.map +1 -1
- package/dist/es/standards-sdk.es88.js +30 -113
- package/dist/es/standards-sdk.es88.js.map +1 -1
- package/dist/es/standards-sdk.es89.js +22 -59
- package/dist/es/standards-sdk.es89.js.map +1 -1
- package/dist/es/standards-sdk.es9.js +104 -80
- package/dist/es/standards-sdk.es9.js.map +1 -1
- package/dist/es/standards-sdk.es90.js +23 -28
- package/dist/es/standards-sdk.es90.js.map +1 -1
- package/dist/es/standards-sdk.es91.js +238 -23
- package/dist/es/standards-sdk.es91.js.map +1 -1
- package/dist/es/standards-sdk.es92.js +267 -225
- package/dist/es/standards-sdk.es92.js.map +1 -1
- package/dist/es/standards-sdk.es93.js +95 -220
- package/dist/es/standards-sdk.es93.js.map +1 -1
- package/dist/es/standards-sdk.es94.js +124 -136
- package/dist/es/standards-sdk.es94.js.map +1 -1
- package/dist/es/standards-sdk.es95.js +42 -138
- package/dist/es/standards-sdk.es95.js.map +1 -1
- package/dist/es/standards-sdk.es96.js +259 -43
- package/dist/es/standards-sdk.es96.js.map +1 -1
- package/dist/es/standards-sdk.es97.js +82 -245
- package/dist/es/standards-sdk.es97.js.map +1 -1
- package/dist/es/standards-sdk.es98.js +49 -50
- package/dist/es/standards-sdk.es98.js.map +1 -1
- package/dist/es/standards-sdk.es99.js +29 -100
- package/dist/es/standards-sdk.es99.js.map +1 -1
- package/dist/es/utils/dynamic-import.d.ts +5 -1
- package/dist/es/utils/dynamic-import.d.ts.map +1 -1
- package/package.json +4 -4
- package/dist/cjs/patches/topic-autorenew-patch.d.ts +0 -2
- package/dist/cjs/patches/topic-autorenew-patch.d.ts.map +0 -1
- package/dist/es/patches/topic-autorenew-patch.d.ts +0 -2
- package/dist/es/patches/topic-autorenew-patch.d.ts.map +0 -1
- package/dist/es/standards-sdk.es161.js +0 -247
- package/dist/es/standards-sdk.es161.js.map +0 -1
|
@@ -1,465 +1,409 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
this.
|
|
6
|
-
this.
|
|
7
|
-
this.
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
"image/jpg",
|
|
11
|
-
"image/gif",
|
|
12
|
-
"image/svg+xml",
|
|
13
|
-
"image/webp"
|
|
14
|
-
]);
|
|
15
|
-
this.dangerousJSPatterns = [
|
|
16
|
-
/eval\s*\(/g,
|
|
17
|
-
/Function\s*\(/g,
|
|
18
|
-
/setTimeout\s*\(\s*["'].*["']/g,
|
|
19
|
-
/setInterval\s*\(\s*["'].*["']/g,
|
|
20
|
-
/document\.write/g,
|
|
21
|
-
/innerHTML\s*=/g,
|
|
22
|
-
/outerHTML\s*=/g
|
|
23
|
-
];
|
|
24
|
-
this.dangerousCSSPatterns = [
|
|
25
|
-
/javascript\s*:/gi,
|
|
26
|
-
/@import.*url\s*\(\s*["']?javascript:/gi,
|
|
27
|
-
/expression\s*\(/gi,
|
|
28
|
-
/behavior\s*:/gi
|
|
29
|
-
];
|
|
1
|
+
class BlockStateManager {
|
|
2
|
+
constructor(logger) {
|
|
3
|
+
this.blockStates = /* @__PURE__ */ new Map();
|
|
4
|
+
this.stateListeners = /* @__PURE__ */ new Map();
|
|
5
|
+
this.messageHandlers = /* @__PURE__ */ new Map();
|
|
6
|
+
this.schemas = /* @__PURE__ */ new Map();
|
|
7
|
+
this.persistentBlocks = /* @__PURE__ */ new Set();
|
|
8
|
+
this.unusedBlocks = /* @__PURE__ */ new Set();
|
|
9
|
+
this.maxBlockStates = 1e3;
|
|
30
10
|
this.logger = logger;
|
|
31
|
-
this.hcs = hcs || new HCS();
|
|
32
|
-
this.options = {
|
|
33
|
-
cacheTTL: options.cacheTTL || 3e5,
|
|
34
|
-
maxCacheSize: options.maxCacheSize || 50 * 1024 * 1024,
|
|
35
|
-
maxResourceSize: options.maxResourceSize || 5 * 1024 * 1024
|
|
36
|
-
};
|
|
37
11
|
}
|
|
38
12
|
/**
|
|
39
|
-
*
|
|
13
|
+
* Create isolated state for a block instance
|
|
40
14
|
*/
|
|
41
|
-
|
|
42
|
-
this.logger.debug("
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
15
|
+
createBlockState(blockId, initialState) {
|
|
16
|
+
this.logger.debug("Creating block state", { blockId });
|
|
17
|
+
if (this.schemas.has(blockId)) {
|
|
18
|
+
this.validateState(blockId, initialState);
|
|
19
|
+
}
|
|
20
|
+
while (this.blockStates.size >= this.maxBlockStates) {
|
|
21
|
+
if (this.unusedBlocks.size > 0) {
|
|
22
|
+
this.cleanupUnusedStates();
|
|
23
|
+
} else {
|
|
24
|
+
this.evictOldestBlock();
|
|
47
25
|
}
|
|
48
|
-
const content = resource.content;
|
|
49
|
-
const sanitized = this.sanitizeCSS(content);
|
|
50
|
-
this.logger.debug("CSS resource loaded successfully", {
|
|
51
|
-
topicId,
|
|
52
|
-
size: content.length,
|
|
53
|
-
sanitized: sanitized.length !== content.length
|
|
54
|
-
});
|
|
55
|
-
return sanitized;
|
|
56
|
-
} catch (error) {
|
|
57
|
-
this.logger.error("Failed to load CSS resource", { topicId, error });
|
|
58
|
-
throw new Error(
|
|
59
|
-
`Failed to load CSS resource: ${error instanceof Error ? error.message : "Unknown error"}`
|
|
60
|
-
);
|
|
61
26
|
}
|
|
27
|
+
this.blockStates.set(blockId, { ...initialState });
|
|
28
|
+
this.logger.debug("Block state created", {
|
|
29
|
+
blockId,
|
|
30
|
+
stateKeys: Object.keys(initialState)
|
|
31
|
+
});
|
|
62
32
|
}
|
|
63
33
|
/**
|
|
64
|
-
*
|
|
34
|
+
* Get current state for a block
|
|
65
35
|
*/
|
|
66
|
-
|
|
67
|
-
this.
|
|
68
|
-
|
|
69
|
-
const resource = await this.loadResource(topicId);
|
|
70
|
-
if (!resource.contentType.includes("javascript") && !resource.contentType.includes("ecmascript")) {
|
|
71
|
-
throw new Error(
|
|
72
|
-
`Expected JavaScript resource, got ${resource.contentType}`
|
|
73
|
-
);
|
|
74
|
-
}
|
|
75
|
-
const content = resource.content;
|
|
76
|
-
if (content.length > this.options.maxResourceSize) {
|
|
77
|
-
throw new Error("JavaScript resource too large");
|
|
78
|
-
}
|
|
79
|
-
const sanitized = this.sanitizeJavaScript(content);
|
|
80
|
-
this.logger.debug("JavaScript resource loaded successfully", {
|
|
81
|
-
topicId,
|
|
82
|
-
size: content.length,
|
|
83
|
-
sanitized: sanitized.length !== content.length
|
|
84
|
-
});
|
|
85
|
-
return sanitized;
|
|
86
|
-
} catch (error) {
|
|
87
|
-
this.logger.error("Failed to load JavaScript resource", {
|
|
88
|
-
topicId,
|
|
89
|
-
error
|
|
90
|
-
});
|
|
91
|
-
throw new Error(
|
|
92
|
-
`Failed to load JavaScript resource: ${error instanceof Error ? error.message : "Unknown error"}`
|
|
93
|
-
);
|
|
36
|
+
getBlockState(blockId) {
|
|
37
|
+
if (!this.blockStates.has(blockId)) {
|
|
38
|
+
return null;
|
|
94
39
|
}
|
|
40
|
+
return { ...this.blockStates.get(blockId) };
|
|
95
41
|
}
|
|
96
42
|
/**
|
|
97
|
-
*
|
|
43
|
+
* Check if block state exists
|
|
98
44
|
*/
|
|
99
|
-
|
|
100
|
-
this.
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
45
|
+
hasBlockState(blockId) {
|
|
46
|
+
return this.blockStates.has(blockId);
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Update block state and emit events
|
|
50
|
+
*/
|
|
51
|
+
updateBlockState(blockId, updates) {
|
|
52
|
+
if (!this.blockStates.has(blockId)) {
|
|
53
|
+
throw new Error(`Block state not found: ${blockId}`);
|
|
54
|
+
}
|
|
55
|
+
const oldState = { ...this.blockStates.get(blockId) };
|
|
56
|
+
const newState = { ...oldState, ...updates };
|
|
57
|
+
if (this.schemas.has(blockId)) {
|
|
58
|
+
this.validateState(blockId, newState);
|
|
59
|
+
}
|
|
60
|
+
this.blockStates.set(blockId, newState);
|
|
61
|
+
const listeners = this.stateListeners.get(blockId) || [];
|
|
62
|
+
for (const listener of listeners) {
|
|
63
|
+
try {
|
|
64
|
+
listener(newState, oldState, blockId);
|
|
65
|
+
} catch (error) {
|
|
66
|
+
this.logger.error("State change listener error", { blockId, error });
|
|
105
67
|
}
|
|
106
|
-
const content = resource.content;
|
|
107
|
-
const view = new Uint8Array(content);
|
|
108
|
-
const blob = new Blob([view.buffer], { type: resource.contentType });
|
|
109
|
-
this.logger.debug("Image resource loaded successfully", {
|
|
110
|
-
topicId,
|
|
111
|
-
size: content.length,
|
|
112
|
-
type: resource.contentType
|
|
113
|
-
});
|
|
114
|
-
return blob;
|
|
115
|
-
} catch (error) {
|
|
116
|
-
this.logger.error("Failed to load image resource", { topicId, error });
|
|
117
|
-
throw new Error(
|
|
118
|
-
`Failed to load image resource: ${error instanceof Error ? error.message : "Unknown error"}`
|
|
119
|
-
);
|
|
120
68
|
}
|
|
69
|
+
this.logger.debug("Block state updated", { blockId, updates });
|
|
121
70
|
}
|
|
122
71
|
/**
|
|
123
|
-
*
|
|
72
|
+
* Destroy block state and cleanup
|
|
124
73
|
*/
|
|
125
|
-
|
|
126
|
-
this.logger.debug("
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
);
|
|
74
|
+
destroyBlockState(blockId) {
|
|
75
|
+
this.logger.debug("Destroying block state", { blockId });
|
|
76
|
+
this.blockStates.delete(blockId);
|
|
77
|
+
this.stateListeners.delete(blockId);
|
|
78
|
+
this.messageHandlers.delete(blockId);
|
|
79
|
+
this.schemas.delete(blockId);
|
|
80
|
+
this.persistentBlocks.delete(blockId);
|
|
81
|
+
this.unusedBlocks.delete(blockId);
|
|
82
|
+
this.logger.debug("Block state destroyed", { blockId });
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Listen for state changes on a block
|
|
86
|
+
*/
|
|
87
|
+
onStateChange(blockId, listener) {
|
|
88
|
+
if (!this.stateListeners.has(blockId)) {
|
|
89
|
+
this.stateListeners.set(blockId, []);
|
|
142
90
|
}
|
|
91
|
+
this.stateListeners.get(blockId).push(listener);
|
|
143
92
|
}
|
|
144
93
|
/**
|
|
145
|
-
*
|
|
94
|
+
* Remove state change listener
|
|
146
95
|
*/
|
|
147
|
-
|
|
148
|
-
this.
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
const resource = await this.loadResource(topicId);
|
|
154
|
-
const verified = await this.verifyIntegrity(
|
|
155
|
-
resource.content,
|
|
156
|
-
expectedHash
|
|
157
|
-
);
|
|
158
|
-
if (!verified) {
|
|
159
|
-
throw new Error("Resource integrity verification failed");
|
|
96
|
+
removeStateChangeListener(blockId, listener) {
|
|
97
|
+
const listeners = this.stateListeners.get(blockId);
|
|
98
|
+
if (listeners) {
|
|
99
|
+
const index = listeners.indexOf(listener);
|
|
100
|
+
if (index > -1) {
|
|
101
|
+
listeners.splice(index, 1);
|
|
160
102
|
}
|
|
161
|
-
this.logger.debug("Resource integrity verified", { topicId });
|
|
162
|
-
return {
|
|
163
|
-
content: resource.content,
|
|
164
|
-
verified,
|
|
165
|
-
contentType: resource.contentType
|
|
166
|
-
};
|
|
167
|
-
} catch (error) {
|
|
168
|
-
this.logger.error("Resource integrity check failed", { topicId, error });
|
|
169
|
-
throw error;
|
|
170
103
|
}
|
|
171
104
|
}
|
|
172
105
|
/**
|
|
173
|
-
*
|
|
106
|
+
* Listen for messages sent to a block
|
|
174
107
|
*/
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
108
|
+
onBlockMessage(blockId, handler) {
|
|
109
|
+
if (!this.messageHandlers.has(blockId)) {
|
|
110
|
+
this.messageHandlers.set(blockId, []);
|
|
111
|
+
}
|
|
112
|
+
this.messageHandlers.get(blockId).push(handler);
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Send message from one block to another
|
|
116
|
+
*/
|
|
117
|
+
sendBlockMessage(fromBlock, toBlock, type, payload) {
|
|
118
|
+
const message = {
|
|
119
|
+
type,
|
|
120
|
+
payload,
|
|
121
|
+
fromBlock,
|
|
122
|
+
toBlock
|
|
123
|
+
};
|
|
124
|
+
const handlers = this.messageHandlers.get(toBlock) || [];
|
|
125
|
+
for (const handler of handlers) {
|
|
126
|
+
try {
|
|
127
|
+
handler(message);
|
|
128
|
+
} catch (error) {
|
|
129
|
+
this.logger.error("Block message handler error", {
|
|
130
|
+
fromBlock,
|
|
131
|
+
toBlock,
|
|
132
|
+
type,
|
|
133
|
+
error
|
|
134
|
+
});
|
|
180
135
|
}
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
136
|
+
}
|
|
137
|
+
this.logger.debug("Block message sent", { fromBlock, toBlock, type });
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Broadcast message to all blocks
|
|
141
|
+
*/
|
|
142
|
+
broadcastMessage(type, payload) {
|
|
143
|
+
for (const blockId of this.blockStates.keys()) {
|
|
144
|
+
const handlers = this.messageHandlers.get(blockId) || [];
|
|
145
|
+
const message = {
|
|
146
|
+
type,
|
|
147
|
+
payload,
|
|
148
|
+
fromBlock: "system",
|
|
149
|
+
toBlock: blockId
|
|
150
|
+
};
|
|
151
|
+
for (const handler of handlers) {
|
|
152
|
+
try {
|
|
153
|
+
handler(message);
|
|
154
|
+
} catch (error) {
|
|
155
|
+
this.logger.error("Broadcast message handler error", {
|
|
156
|
+
blockId,
|
|
157
|
+
type,
|
|
158
|
+
error
|
|
159
|
+
});
|
|
160
|
+
}
|
|
187
161
|
}
|
|
188
|
-
const buffer = typeof content === "string" ? new TextEncoder().encode(content) : content;
|
|
189
|
-
const bytes = buffer instanceof Uint8Array ? buffer : new Uint8Array(buffer);
|
|
190
|
-
const copy = new Uint8Array(bytes);
|
|
191
|
-
const hashBuffer = await webCrypto.subtle.digest("SHA-256", copy.buffer);
|
|
192
|
-
const hashArray = Array.from(new Uint8Array(hashBuffer));
|
|
193
|
-
const actualHash = hashArray.map((b) => b.toString(16).padStart(2, "0")).join("");
|
|
194
|
-
return actualHash === expectedHash.toLowerCase();
|
|
195
|
-
} catch (error) {
|
|
196
|
-
this.logger.error("Error verifying integrity", { error });
|
|
197
|
-
return false;
|
|
198
162
|
}
|
|
163
|
+
this.logger.debug("Message broadcasted", {
|
|
164
|
+
type,
|
|
165
|
+
blockCount: this.blockStates.size
|
|
166
|
+
});
|
|
199
167
|
}
|
|
200
168
|
/**
|
|
201
|
-
*
|
|
169
|
+
* Bind action result to block state
|
|
202
170
|
*/
|
|
203
|
-
async
|
|
204
|
-
this.
|
|
171
|
+
async bindActionResult(blockId, actionName, result, binding) {
|
|
172
|
+
if (!this.blockStates.has(blockId)) {
|
|
173
|
+
throw new Error(`Block state not found: ${blockId}`);
|
|
174
|
+
}
|
|
175
|
+
const currentState = this.getBlockState(blockId);
|
|
176
|
+
let newState;
|
|
205
177
|
try {
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
case "css":
|
|
213
|
-
content = await this.loadCSS(dep.topicId);
|
|
214
|
-
break;
|
|
215
|
-
case "js":
|
|
216
|
-
content = await this.loadJS(dep.topicId);
|
|
217
|
-
break;
|
|
218
|
-
case "template":
|
|
219
|
-
content = await this.loadTemplate(dep.topicId);
|
|
220
|
-
break;
|
|
221
|
-
case "image":
|
|
222
|
-
const blob = await this.loadImage(dep.topicId);
|
|
223
|
-
content = new Uint8Array(await blob.arrayBuffer());
|
|
224
|
-
break;
|
|
225
|
-
default:
|
|
226
|
-
throw new Error(`Unsupported dependency type: ${dep.type}`);
|
|
227
|
-
}
|
|
228
|
-
results.push({
|
|
229
|
-
topicId: dep.topicId,
|
|
230
|
-
content,
|
|
231
|
-
contentType: this.getContentTypeForType(dep.type),
|
|
232
|
-
type: dep.type
|
|
233
|
-
});
|
|
178
|
+
if (result.success && binding.onSuccess) {
|
|
179
|
+
newState = binding.onSuccess(currentState, result);
|
|
180
|
+
} else if (!result.success && binding.onError) {
|
|
181
|
+
newState = binding.onError(currentState, result);
|
|
182
|
+
} else {
|
|
183
|
+
return;
|
|
234
184
|
}
|
|
235
|
-
|
|
236
|
-
|
|
185
|
+
if (newState) {
|
|
186
|
+
this.updateBlockState(blockId, newState);
|
|
187
|
+
}
|
|
188
|
+
this.logger.debug("Action result bound to state", {
|
|
189
|
+
blockId,
|
|
190
|
+
actionName,
|
|
191
|
+
success: result.success
|
|
237
192
|
});
|
|
238
|
-
return results;
|
|
239
193
|
} catch (error) {
|
|
240
|
-
this.logger.error("
|
|
194
|
+
this.logger.error("Action result binding failed", {
|
|
195
|
+
blockId,
|
|
196
|
+
actionName,
|
|
197
|
+
error
|
|
198
|
+
});
|
|
241
199
|
throw error;
|
|
242
200
|
}
|
|
243
201
|
}
|
|
244
202
|
/**
|
|
245
|
-
*
|
|
203
|
+
* Persist block state to storage
|
|
246
204
|
*/
|
|
247
|
-
|
|
248
|
-
this.
|
|
249
|
-
|
|
250
|
-
|
|
205
|
+
async persistBlockState(blockId) {
|
|
206
|
+
if (!this.storageBackend) {
|
|
207
|
+
this.logger.warn("No storage backend configured");
|
|
208
|
+
this.persistentBlocks.add(blockId);
|
|
209
|
+
return;
|
|
210
|
+
}
|
|
211
|
+
if (!this.blockStates.has(blockId)) {
|
|
212
|
+
throw new Error(`Block state not found: ${blockId}`);
|
|
213
|
+
}
|
|
214
|
+
try {
|
|
215
|
+
const state = this.blockStates.get(blockId);
|
|
216
|
+
await this.storageBackend.setItem(blockId, JSON.stringify(state));
|
|
217
|
+
this.persistentBlocks.add(blockId);
|
|
218
|
+
this.logger.debug("Block state persisted", { blockId });
|
|
219
|
+
} catch (error) {
|
|
220
|
+
this.logger.error("Failed to persist block state", { blockId, error });
|
|
221
|
+
}
|
|
251
222
|
}
|
|
252
223
|
/**
|
|
253
|
-
*
|
|
224
|
+
* Restore block state from storage
|
|
254
225
|
*/
|
|
255
|
-
|
|
256
|
-
|
|
226
|
+
async restoreBlockState(blockId) {
|
|
227
|
+
if (!this.storageBackend) {
|
|
228
|
+
this.logger.warn("No storage backend configured");
|
|
229
|
+
return;
|
|
230
|
+
}
|
|
231
|
+
try {
|
|
232
|
+
const stored = await this.storageBackend.getItem(blockId);
|
|
233
|
+
if (stored) {
|
|
234
|
+
const state = JSON.parse(stored);
|
|
235
|
+
this.blockStates.set(blockId, state);
|
|
236
|
+
this.persistentBlocks.add(blockId);
|
|
237
|
+
this.logger.debug("Block state restored", { blockId });
|
|
238
|
+
}
|
|
239
|
+
} catch (error) {
|
|
240
|
+
this.logger.error("Failed to restore block state", { blockId, error });
|
|
241
|
+
}
|
|
257
242
|
}
|
|
258
243
|
/**
|
|
259
|
-
*
|
|
244
|
+
* Check if block state is persistent
|
|
260
245
|
*/
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
if (cached) {
|
|
264
|
-
this.logger.debug("Resource loaded from cache", { topicId });
|
|
265
|
-
return cached;
|
|
266
|
-
}
|
|
267
|
-
const blob = await this.hcs.retrieveHCS1Data(topicId);
|
|
268
|
-
const contentType = blob.type || "application/octet-stream";
|
|
269
|
-
let content;
|
|
270
|
-
if (contentType.startsWith("text/") || contentType.includes("javascript") || contentType.includes("json")) {
|
|
271
|
-
content = await blob.text();
|
|
272
|
-
} else {
|
|
273
|
-
content = new Uint8Array(await blob.arrayBuffer());
|
|
274
|
-
}
|
|
275
|
-
const resource = {
|
|
276
|
-
content,
|
|
277
|
-
contentType,
|
|
278
|
-
size: blob.size
|
|
279
|
-
};
|
|
280
|
-
this.addToCache(topicId, resource);
|
|
281
|
-
return resource;
|
|
246
|
+
isPersistent(blockId) {
|
|
247
|
+
return this.persistentBlocks.has(blockId);
|
|
282
248
|
}
|
|
283
249
|
/**
|
|
284
|
-
*
|
|
250
|
+
* Set storage backend
|
|
285
251
|
*/
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
if (!entry) return null;
|
|
289
|
-
if (Date.now() - entry.timestamp > this.options.cacheTTL) {
|
|
290
|
-
this.removeFromCache(topicId);
|
|
291
|
-
return null;
|
|
292
|
-
}
|
|
293
|
-
return entry.data;
|
|
252
|
+
setStorageBackend(backend) {
|
|
253
|
+
this.storageBackend = backend;
|
|
294
254
|
}
|
|
295
255
|
/**
|
|
296
|
-
*
|
|
256
|
+
* Set validation schema for a block
|
|
297
257
|
*/
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
this.logger.warn("Resource too large for cache", { topicId, size });
|
|
302
|
-
return;
|
|
303
|
-
}
|
|
304
|
-
while (this.currentCacheSize + size > this.options.maxCacheSize && this.cache.size > 0) {
|
|
305
|
-
this.evictOldestEntry();
|
|
306
|
-
}
|
|
307
|
-
const entry = {
|
|
308
|
-
data: resource,
|
|
309
|
-
timestamp: Date.now(),
|
|
310
|
-
size
|
|
311
|
-
};
|
|
312
|
-
this.cache.set(topicId, entry);
|
|
313
|
-
this.currentCacheSize += size;
|
|
314
|
-
this.logger.debug("Resource added to cache", {
|
|
315
|
-
topicId,
|
|
316
|
-
size,
|
|
317
|
-
totalCacheSize: this.currentCacheSize
|
|
318
|
-
});
|
|
258
|
+
setBlockStateSchema(blockId, schema) {
|
|
259
|
+
this.schemas.set(blockId, schema);
|
|
260
|
+
this.logger.debug("Block state schema set", { blockId });
|
|
319
261
|
}
|
|
320
262
|
/**
|
|
321
|
-
*
|
|
263
|
+
* Set maximum number of block states
|
|
322
264
|
*/
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
if (entry) {
|
|
326
|
-
this.cache.delete(topicId);
|
|
327
|
-
this.currentCacheSize -= entry.size;
|
|
328
|
-
}
|
|
265
|
+
setMaxBlockStates(max) {
|
|
266
|
+
this.maxBlockStates = max;
|
|
329
267
|
}
|
|
330
268
|
/**
|
|
331
|
-
*
|
|
269
|
+
* Get active block count
|
|
332
270
|
*/
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
let oldestTime = Date.now();
|
|
336
|
-
for (const [topicId, entry] of this.cache) {
|
|
337
|
-
if (entry.timestamp < oldestTime) {
|
|
338
|
-
oldestTime = entry.timestamp;
|
|
339
|
-
oldest = topicId;
|
|
340
|
-
}
|
|
341
|
-
}
|
|
342
|
-
if (oldest) {
|
|
343
|
-
this.removeFromCache(oldest);
|
|
344
|
-
this.logger.debug("Evicted oldest cache entry", { topicId: oldest });
|
|
345
|
-
}
|
|
271
|
+
getActiveBlockCount() {
|
|
272
|
+
return this.blockStates.size;
|
|
346
273
|
}
|
|
347
274
|
/**
|
|
348
|
-
*
|
|
275
|
+
* Mark block as unused for cleanup
|
|
349
276
|
*/
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
for (const pattern of this.dangerousCSSPatterns) {
|
|
353
|
-
sanitized = sanitized.replace(pattern, "");
|
|
354
|
-
}
|
|
355
|
-
return sanitized;
|
|
277
|
+
markBlockUnused(blockId) {
|
|
278
|
+
this.unusedBlocks.add(blockId);
|
|
356
279
|
}
|
|
357
280
|
/**
|
|
358
|
-
*
|
|
281
|
+
* Clean up unused block states
|
|
359
282
|
*/
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
sanitized = sanitized.replace(pattern, "");
|
|
283
|
+
cleanupUnusedStates() {
|
|
284
|
+
for (const blockId of this.unusedBlocks) {
|
|
285
|
+
this.destroyBlockState(blockId);
|
|
364
286
|
}
|
|
365
|
-
|
|
287
|
+
this.unusedBlocks.clear();
|
|
288
|
+
this.logger.debug("Unused states cleaned up");
|
|
366
289
|
}
|
|
367
290
|
/**
|
|
368
|
-
*
|
|
291
|
+
* Evict oldest non-persistent block to make room
|
|
369
292
|
*/
|
|
370
|
-
|
|
371
|
-
|
|
293
|
+
evictOldestBlock() {
|
|
294
|
+
for (const blockId of this.blockStates.keys()) {
|
|
295
|
+
if (!this.persistentBlocks.has(blockId)) {
|
|
296
|
+
this.destroyBlockState(blockId);
|
|
297
|
+
this.logger.debug("Evicted block to make room", { blockId });
|
|
298
|
+
return;
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
this.logger.warn("Cannot evict blocks - all are persistent");
|
|
372
302
|
}
|
|
373
303
|
/**
|
|
374
|
-
*
|
|
304
|
+
* Get listener count for a block (for testing)
|
|
375
305
|
*/
|
|
376
|
-
|
|
377
|
-
const
|
|
378
|
-
const
|
|
379
|
-
|
|
380
|
-
throw new Error("Invalid template syntax: unmatched braces");
|
|
381
|
-
}
|
|
382
|
-
const openBlocks = (template.match(/\{\{#\w+/g) || []).length;
|
|
383
|
-
const closeBlocks = (template.match(/\{\{\/\w+/g) || []).length;
|
|
384
|
-
if (openBlocks !== closeBlocks) {
|
|
385
|
-
throw new Error("Invalid template syntax: unclosed block helpers");
|
|
386
|
-
}
|
|
306
|
+
getListenerCount(blockId) {
|
|
307
|
+
const stateListeners = this.stateListeners.get(blockId)?.length || 0;
|
|
308
|
+
const messageHandlers = this.messageHandlers.get(blockId)?.length || 0;
|
|
309
|
+
return stateListeners + messageHandlers;
|
|
387
310
|
}
|
|
388
311
|
/**
|
|
389
|
-
*
|
|
312
|
+
* Validate state against schema
|
|
390
313
|
*/
|
|
391
|
-
|
|
392
|
-
const
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
const visiting = /* @__PURE__ */ new Set();
|
|
398
|
-
const visit = (topicId) => {
|
|
399
|
-
if (visiting.has(topicId)) {
|
|
400
|
-
throw new Error("Circular dependency detected");
|
|
314
|
+
validateState(blockId, state) {
|
|
315
|
+
const schema = this.schemas.get(blockId);
|
|
316
|
+
if (!schema) return;
|
|
317
|
+
if (schema.type === "object") {
|
|
318
|
+
if (typeof state !== "object" || state === null) {
|
|
319
|
+
throw new Error("State validation failed: expected object");
|
|
401
320
|
}
|
|
402
|
-
if (
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
321
|
+
if (schema.required) {
|
|
322
|
+
for (const prop of schema.required) {
|
|
323
|
+
if (!(prop in state)) {
|
|
324
|
+
throw new Error(
|
|
325
|
+
`State validation failed: missing required property '${prop}'`
|
|
326
|
+
);
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
if (schema.properties) {
|
|
331
|
+
for (const [prop, propSchema] of Object.entries(schema.properties)) {
|
|
332
|
+
if (prop in state) {
|
|
333
|
+
const value = state[prop];
|
|
334
|
+
const expectedType = propSchema.type;
|
|
335
|
+
if (expectedType === "string" && typeof value !== "string") {
|
|
336
|
+
throw new Error(
|
|
337
|
+
`State validation failed: property '${prop}' must be string`
|
|
338
|
+
);
|
|
339
|
+
}
|
|
340
|
+
if (expectedType === "number" && typeof value !== "number") {
|
|
341
|
+
throw new Error(
|
|
342
|
+
`State validation failed: property '${prop}' must be number`
|
|
343
|
+
);
|
|
344
|
+
}
|
|
345
|
+
if (expectedType === "number" && propSchema.minimum !== void 0) {
|
|
346
|
+
if (value < propSchema.minimum) {
|
|
347
|
+
throw new Error(
|
|
348
|
+
`State validation failed: property '${prop}' below minimum`
|
|
349
|
+
);
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
}
|
|
407
354
|
}
|
|
408
|
-
visiting.delete(topicId);
|
|
409
|
-
visited.add(topicId);
|
|
410
|
-
};
|
|
411
|
-
for (const dep of dependencies) {
|
|
412
|
-
visit(dep.topicId);
|
|
413
355
|
}
|
|
414
356
|
}
|
|
415
357
|
/**
|
|
416
|
-
*
|
|
358
|
+
* Set block state (alias for updateBlockState)
|
|
417
359
|
*/
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
dependsMap.set(dep.topicId, dep.depends || []);
|
|
360
|
+
setBlockState(blockId, state) {
|
|
361
|
+
if (!this.blockStates.has(blockId)) {
|
|
362
|
+
this.createBlockState(blockId, state);
|
|
363
|
+
} else {
|
|
364
|
+
this.updateBlockState(blockId, state);
|
|
424
365
|
}
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
366
|
+
}
|
|
367
|
+
/**
|
|
368
|
+
* Remove block state
|
|
369
|
+
*/
|
|
370
|
+
removeBlockState(blockId) {
|
|
371
|
+
this.blockStates.delete(blockId);
|
|
372
|
+
this.stateListeners.delete(blockId);
|
|
373
|
+
this.messageHandlers.delete(blockId);
|
|
374
|
+
this.persistentBlocks.delete(blockId);
|
|
375
|
+
this.schemas.delete(blockId);
|
|
376
|
+
if (this.storageBackend) {
|
|
377
|
+
this.storageBackend.removeItem(blockId).catch((error) => {
|
|
378
|
+
this.logger.error("Failed to remove persisted state", {
|
|
379
|
+
blockId,
|
|
380
|
+
error
|
|
381
|
+
});
|
|
382
|
+
});
|
|
441
383
|
}
|
|
442
|
-
|
|
384
|
+
this.logger.debug("Block state removed", { blockId });
|
|
443
385
|
}
|
|
444
386
|
/**
|
|
445
|
-
*
|
|
387
|
+
* Send message to a block
|
|
446
388
|
*/
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
389
|
+
sendMessage(blockId, type, data, fromBlock = "system") {
|
|
390
|
+
const handlers = this.messageHandlers.get(blockId) || [];
|
|
391
|
+
const message = {
|
|
392
|
+
type,
|
|
393
|
+
payload: data,
|
|
394
|
+
fromBlock,
|
|
395
|
+
toBlock: blockId
|
|
396
|
+
};
|
|
397
|
+
for (const handler of handlers) {
|
|
398
|
+
try {
|
|
399
|
+
handler(message);
|
|
400
|
+
} catch (error) {
|
|
401
|
+
this.logger.error("Message handler error", { blockId, type, error });
|
|
402
|
+
}
|
|
459
403
|
}
|
|
460
404
|
}
|
|
461
405
|
}
|
|
462
406
|
export {
|
|
463
|
-
|
|
407
|
+
BlockStateManager
|
|
464
408
|
};
|
|
465
409
|
//# sourceMappingURL=standards-sdk.es47.js.map
|