Compare commits

...

57 Commits

Author SHA1 Message Date
Tony Garnock-Jones a8438f9191 Publish
- @syndicate-lang/browser-stdenv@0.35.1
 - @syndicate-lang/core@0.34.1
 - @syndicate-lang/create@0.25.1
 - @syndicate-lang/fs@0.35.1
 - @syndicate-lang/html@0.35.1
 - @syndicate-lang/html2@0.35.1
 - @syndicate-lang/loader@0.35.1
 - @syndicate-lang/service@0.35.1
 - @syndicate-lang/syndicatec@0.36.1
 - @syndicate-lang/timer@0.35.1
 - @syndicate-lang/ts-plugin@0.36.1
 - @syndicate-lang/tsc@0.36.1
 - @syndicate-lang/ws-relay@0.36.1
2024-05-03 16:41:45 +02:00
Tony Garnock-Jones 047bded3af Repair preserves dependency specifications 2024-05-03 16:41:19 +02:00
Tony Garnock-Jones 221208dbbd Slightly nicer dev compilation watch automation 2024-04-17 14:59:39 +02:00
Tony Garnock-Jones e3d419deab Publish
- @syndicate-lang/browser-stdenv@0.35.0
 - @syndicate-lang/compiler@0.22.0
 - @syndicate-lang/core@0.34.0
 - @syndicate-lang/fs@0.35.0
 - @syndicate-lang/html@0.35.0
 - @syndicate-lang/html2@0.35.0
 - @syndicate-lang/loader@0.35.0
 - @syndicate-lang/service@0.35.0
 - @syndicate-lang/syndicatec@0.36.0
 - @syndicate-lang/timer@0.35.0
 - @syndicate-lang/ts-plugin@0.36.0
 - @syndicate-lang/tsc@0.36.0
 - @syndicate-lang/ws-relay@0.36.0
2024-04-17 13:26:31 +02:00
Tony Garnock-Jones ebe7700cee Allow "when (...)" clause on "on" endpoints 2024-04-17 13:26:06 +02:00
Tony Garnock-Jones f4f2ad0783 Await SchemaReady before translating and running Syndicate scripts 2024-04-17 13:25:40 +02:00
Tony Garnock-Jones c1cdf3660f Allow changes to trigger event in ValueWidget after construction (messy still, but possible) 2024-04-17 13:25:06 +02:00
Tony Garnock-Jones 9d8e7f5ccd querySelector/querySelectorAll on Widgets 2024-04-17 13:24:48 +02:00
Tony Garnock-Jones bf9d10813e More flexible Widget node specification 2024-04-17 13:24:37 +02:00
Tony Garnock-Jones 80250fdac9 Better treatment of invalid HtmlFragments 2024-04-17 13:23:50 +02:00
Tony Garnock-Jones 305c0c26ee Cosmetic: whitespace 2024-04-17 13:22:21 +02:00
Tony Garnock-Jones 782f24687f Track observers per-assertion, not per-observer-ref, to repair incremental updates of pattern (!) 2024-04-17 13:22:05 +02:00
Tony Garnock-Jones 6d904d276e Proper treatment of annotations through dataspaces 2024-04-17 13:21:28 +02:00
Tony Garnock-Jones 4b5eccad24 Publish
- @syndicate-lang/browser-stdenv@0.34.0
 - @syndicate-lang/core@0.33.0
 - @syndicate-lang/fs@0.34.0
 - @syndicate-lang/html@0.34.0
 - @syndicate-lang/html2@0.34.0
 - @syndicate-lang/loader@0.34.0
 - @syndicate-lang/service@0.34.0
 - @syndicate-lang/syndicatec@0.35.0
 - @syndicate-lang/timer@0.34.0
 - @syndicate-lang/ts-plugin@0.35.0
 - @syndicate-lang/tsc@0.35.0
 - @syndicate-lang/ws-relay@0.35.0
2024-04-15 10:26:49 +02:00
Tony Garnock-Jones 4a05bbad73 Rename Dataspace.global to Dataspace.local 2024-04-15 10:26:27 +02:00
Tony Garnock-Jones 40bc9aadd3 Bring examples up-to-date 2024-04-12 10:40:17 +02:00
Tony Garnock-Jones 17890a6b97 syndicate-js.code-workspace 2024-04-12 10:28:55 +02:00
Tony Garnock-Jones 3b20a58dce Publish
- @syndicate-lang/browser-stdenv@0.33.0
 - @syndicate-lang/core@0.32.0
 - @syndicate-lang/create@0.25.0
 - @syndicate-lang/fs@0.33.0
 - @syndicate-lang/html@0.33.0
 - @syndicate-lang/html2@0.33.0
 - @syndicate-lang/loader@0.33.0
 - @syndicate-lang/service@0.33.0
 - @syndicate-lang/syndicatec@0.34.0
 - @syndicate-lang/timer@0.33.0
 - @syndicate-lang/ts-plugin@0.34.0
 - @syndicate-lang/tsc@0.34.0
 - @syndicate-lang/ws-relay@0.34.0
2024-04-12 10:25:41 +02:00
Tony Garnock-Jones 4cce2fb6f2 Update chat example code 2024-04-12 10:25:04 +02:00
Tony Garnock-Jones 96a8367667 Update to new dataspace pattern language 2024-04-12 10:21:54 +02:00
Tony Garnock-Jones bdb759fe52 Merge latest changes from the syndicate-protocols repository 2024-04-11 16:23:45 +02:00
Tony Garnock-Jones c0239cf322 And with that we are almost back where we started with http.prs! 2024-04-10 15:16:35 +02:00
Tony Garnock-Jones 9cc4175f24 Cope with HTTP/1.0's optional Host header 2024-04-10 14:54:19 +02:00
Tony Garnock-Jones 70f42dd931 Another revision of http.prs 2024-04-10 14:31:27 +02:00
Tony Garnock-Jones ef1ebe6412 Sigh. <done> turns out to be a good idea in addition to <processing> 2024-04-10 13:24:25 +02:00
Tony Garnock-Jones ca18ca08df Alternative representation of dataspacePatterns 2024-04-09 09:15:21 +02:00
Tony Garnock-Jones 40ca168eac Repair typo 2024-04-09 09:13:51 +02:00
Tony Garnock-Jones 5a73e8d4c3 Alter dataspacePatterns language to make rec and arr more like dict 2024-04-04 16:31:09 +02:00
Tony Garnock-Jones b6092b2a98 Cosmetic 2024-04-04 15:52:52 +02:00
Tony Garnock-Jones 6b58ef9f0f Generalise dataspace patterns to permit extensibility 2024-04-04 15:52:43 +02:00
Tony Garnock-Jones 29959c055e Missed a couple of changes for js-preserves2 2024-04-04 15:46:19 +02:00
Tony Garnock-Jones 1708274401 Bump @preserves/schema dep 2024-04-04 13:47:44 +02:00
Tony Garnock-Jones 39e7eaac8d Publish
- @syndicate-lang/browser-stdenv@0.32.0
 - @syndicate-lang/core@0.31.0
 - @syndicate-lang/create@0.24.0
 - @syndicate-lang/fs@0.32.0
 - @syndicate-lang/html@0.32.0
 - @syndicate-lang/html2@0.32.0
 - @syndicate-lang/loader@0.32.0
 - @syndicate-lang/service@0.32.0
 - @syndicate-lang/syndicatec@0.33.0
 - @syndicate-lang/timer@0.32.0
 - @syndicate-lang/ts-plugin@0.33.0
 - @syndicate-lang/tsc@0.33.0
 - @syndicate-lang/ws-relay@0.33.0
2024-04-03 22:44:49 +02:00
Tony Garnock-Jones 687dff648f Preserves dep bump 2024-04-03 22:44:29 +02:00
Tony Garnock-Jones 710ff91a64 Revise http protocol 2024-04-01 15:56:07 +02:00
Tony Garnock-Jones fd491b5c71 Updates for js-preserves2 Preserves implementation 2024-03-28 16:31:27 +01:00
Tony Garnock-Jones cbcd4b9ad9 Repair noise session introduction 2024-03-28 16:30:27 +01:00
Tony Garnock-Jones bfef60eaa9 Merge latest changes from the syndicate-protocols repository 2024-03-28 16:14:11 +01:00
Tony Garnock-Jones c59e044695 Set embeddedType for noise 2024-03-28 15:49:48 +01:00
Tony Garnock-Jones bf0d47f1b7 Repair noise protocol 2024-03-28 15:17:28 +01:00
Tony Garnock-Jones 85b2299061 Use constructor instead of ad-hoc objects for various `Ref`s 2024-03-28 12:40:25 +01:00
Tony Garnock-Jones 90aa9656ca Repair bogus ref syntax 2024-03-28 12:36:45 +01:00
Tony Garnock-Jones de596ae408 location.hash is URI-encoded 2024-03-28 12:36:28 +01:00
Tony Garnock-Jones 8ce11ddb12 More flexible `decodeStandardRoute` 2024-03-28 12:36:13 +01:00
Tony Garnock-Jones f105736694 html2 templateGenerator 2024-03-28 10:22:21 +01:00
Tony Garnock-Jones 8031eb1a17 Publish
- @syndicate-lang/browser-stdenv@0.31.2
 - @syndicate-lang/core@0.30.1
 - @syndicate-lang/create@0.23.2
 - @syndicate-lang/fs@0.31.2
 - @syndicate-lang/html@0.31.2
 - @syndicate-lang/html2@0.31.2
 - @syndicate-lang/loader@0.31.2
 - @syndicate-lang/service@0.31.2
 - @syndicate-lang/syndicatec@0.32.2
 - @syndicate-lang/timer@0.31.2
 - @syndicate-lang/ts-plugin@0.32.2
 - @syndicate-lang/tsc@0.32.2
 - @syndicate-lang/ws-relay@0.32.2
2024-03-23 11:19:07 +01:00
Tony Garnock-Jones 906717121a Bump preserves and other deps 2024-03-23 11:18:53 +01:00
Tony Garnock-Jones e0d5e86da8 Publish
- @syndicate-lang/browser-stdenv@0.31.1
 - @syndicate-lang/compiler@0.21.1
 - @syndicate-lang/fs@0.31.1
 - @syndicate-lang/html@0.31.1
 - @syndicate-lang/html2@0.31.1
 - @syndicate-lang/loader@0.31.1
 - @syndicate-lang/service@0.31.1
 - @syndicate-lang/syndicatec@0.32.1
 - @syndicate-lang/timer@0.31.1
 - @syndicate-lang/ts-plugin@0.32.1
 - @syndicate-lang/tsc@0.32.1
 - @syndicate-lang/ws-relay@0.32.1
2024-03-23 10:44:16 +01:00
Tony Garnock-Jones 2dca2c2d77 Repair span of identifier after `$` 2024-03-23 10:43:42 +01:00
Tony Garnock-Jones da97db8548 Publish
- @syndicate-lang/browser-stdenv@0.31.0
 - @syndicate-lang/core@0.30.0
 - @syndicate-lang/fs@0.31.0
 - @syndicate-lang/html@0.31.0
 - @syndicate-lang/html2@0.31.0
 - @syndicate-lang/loader@0.31.0
 - @syndicate-lang/service@0.31.0
 - @syndicate-lang/syndicatec@0.32.0
 - @syndicate-lang/timer@0.31.0
 - @syndicate-lang/ts-plugin@0.32.0
 - @syndicate-lang/tsc@0.32.0
 - @syndicate-lang/ws-relay@0.32.0
2024-03-22 20:50:07 +01:00
Tony Garnock-Jones 63b5d23391 Repair rewrite.ts attenuate() 2024-03-22 20:49:05 +01:00
Tony Garnock-Jones 036c342264 Template and rewrite-building routines in rewrite.ts 2024-03-22 12:19:02 +01:00
Tony Garnock-Jones 7797a3cd09 Updated description of gatekeeper protocol 2024-03-22 10:11:57 +01:00
Tony Garnock-Jones f5501ccb64 Publish
- @syndicate-lang/browser-stdenv@0.30.1
 - @syndicate-lang/core@0.29.1
 - @syndicate-lang/fs@0.30.1
 - @syndicate-lang/html@0.30.1
 - @syndicate-lang/html2@0.30.1
 - @syndicate-lang/loader@0.30.1
 - @syndicate-lang/service@0.30.1
 - @syndicate-lang/syndicatec@0.31.1
 - @syndicate-lang/timer@0.30.1
 - @syndicate-lang/ts-plugin@0.31.1
 - @syndicate-lang/tsc@0.31.1
 - @syndicate-lang/ws-relay@0.31.1
2024-03-21 21:58:52 +01:00
Tony Garnock-Jones 3b7543845a Repair mac() function to produce correct output width 2024-03-21 21:58:32 +01:00
Tony Garnock-Jones a25cafdabb Publish
- @syndicate-lang/browser-stdenv@0.30.0
 - @syndicate-lang/core@0.29.0
 - @syndicate-lang/fs@0.30.0
 - @syndicate-lang/html@0.30.0
 - @syndicate-lang/html2@0.30.0
 - @syndicate-lang/loader@0.30.0
 - @syndicate-lang/service@0.30.0
 - @syndicate-lang/syndicatec@0.31.0
 - @syndicate-lang/timer@0.30.0
 - @syndicate-lang/ts-plugin@0.31.0
 - @syndicate-lang/tsc@0.31.0
 - @syndicate-lang/ws-relay@0.31.0
2024-03-21 21:28:08 +01:00
Tony Garnock-Jones 291ec1805b Synchronous cryptography; convenient `mint` overload for producing a ref and a bind at once 2024-03-21 21:27:23 +01:00
63 changed files with 1196 additions and 894 deletions

View File

@ -16,13 +16,13 @@
"author": "Tony Garnock-Jones <tonyg@leastfixedpoint.com>",
"license": "GPL-3.0+",
"dependencies": {
"@preserves/core": "0.995",
"@preserves/core": "^0.995.200",
"@syndicate-lang/core": "*",
"@syndicate-lang/html": "*",
"@syndicate-lang/ws-relay": "*"
},
"devDependencies": {
"@preserves/schema-cli": "0.995",
"@preserves/schema-cli": ">=0.995.201",
"@syndicate-lang/ts-plugin": "*",
"@syndicate-lang/tsc": "*",
"rollup": "^2.60",

View File

@ -1,6 +1,6 @@
let ?ds = dataspace
# Connect using <route [<ws "...">] <ref "syndicate" [] #[acowDB2/oI+6aSEC3YIxGg]>>
# Connect using <route [<ws "...">] <ref {oid: "syndicate" sig: #[acowDB2/oI+6aSEC3YIxGg]}>
<bind <ref {oid: "syndicate" key: #x""}> $ds #f>
# Connect using <route [<ws "...">] <noise { service: "syndicate", key: #x"21f6cd4e11e7e37711d6b3084ff18cded8fc8abf293aa47d43e8bb86dda65516" }>>

View File

@ -1,7 +1,7 @@
/// SPDX-License-Identifier: GPL-3.0-or-later
/// SPDX-FileCopyrightText: Copyright © 2016-2021 Tony Garnock-Jones <tonyg@leastfixedpoint.com>
import { fromJS, Bytes, Dataspace, Ref, Sturdy, AnyValue, Reader, Schemas, Embedded, stringify } from "@syndicate-lang/core";
import { fromJS, Bytes, Dataspace, Ref, Sturdy, AnyValue, Reader, Schemas, stringify } from "@syndicate-lang/core";
import { boot as bootHtml, Anchor, template as html, HtmlFragments, GlobalEvent, UIAttribute, UIChangeableProperty } from "@syndicate-lang/html";
import { boot as bootWakeDetector, WakeEvent } from "./wake-detector";
import { boot as bootWsRelay } from "@syndicate-lang/ws-relay";
@ -46,12 +46,9 @@ function bootChat(ds: Ref) {
during G.ResolvePath({
"route": route,
"addr": $addr,
"control": $control_e: Embedded,
"resolved": G.Resolved.accepted($remoteDs_e: Embedded),
"control": $control: Ref,
"resolved": G.Resolved.accepted($remoteDs: Ref),
}) => {
const remoteDs = remoteDs_e.embeddedValue;
const control = control_e.embeddedValue;
on message WakeEvent() => at control {
send message G.ForceDisconnect();
}

View File

@ -2,30 +2,30 @@
# yarn lockfile v1
"@preserves/core@0.995", "@preserves/core@^0.995.0":
version "0.995.0"
resolved "https://registry.yarnpkg.com/@preserves/core/-/core-0.995.0.tgz#d6badccd1fe56e45f23e01b4c8a33f421749e76b"
integrity sha512-0ICNcZ7HkBal1OJwoUuc1+KqoTQNJl2kYI3/nMtfrtNMem908unpydLo20k44Fgh/SRJekWaiRYSzKTcOo0+Tg==
"@preserves/core@0.995.200", "@preserves/core@^0.995.200":
version "0.995.200"
resolved "https://registry.yarnpkg.com/@preserves/core/-/core-0.995.200.tgz#65575cf8f9320e73b5d37fa9ac9d6881a33fd3a6"
integrity sha512-htZ2x+hltUpKoPsviWSuelzZW96po9zVSsN0RZEih60FahNX0R2LCqFJ6v5lyATuQ9oHALVi0w8w4rtf8oiAJw==
"@preserves/schema-cli@0.995":
version "0.995.1"
resolved "https://registry.yarnpkg.com/@preserves/schema-cli/-/schema-cli-0.995.1.tgz#056027c76c54ef3395c787a58def12b17dcbd79c"
integrity sha512-9LSb5P+00P1ocx/saXy5d31bRastSJT7VQmrAltMgcx3BI5f/ChVVhBdn8P4+tRLUo02pTbGy4wBceHsyqCSZQ==
"@preserves/schema-cli@0.995.201":
version "0.995.201"
resolved "https://registry.yarnpkg.com/@preserves/schema-cli/-/schema-cli-0.995.201.tgz#e87cb7ba51b225ff6ea96f177c5388907adf6717"
integrity sha512-n/lpVgWBY1UTRySPXIwWG4Yu87OrQ9b7Xo8zPPQzD/DJDTEDT3y3SUujY7UTF1pQn09xRGnfPnDu1RoRCv2J3w==
dependencies:
"@preserves/core" "^0.995.0"
"@preserves/schema" "^0.995.1"
"@preserves/core" "^0.995.200"
"@preserves/schema" "^0.995.201"
chalk "^4.1"
chokidar "^3.5"
commander "^7.2"
glob "^7.1"
minimatch "^3.0"
"@preserves/schema@^0.995.1":
version "0.995.1"
resolved "https://registry.yarnpkg.com/@preserves/schema/-/schema-0.995.1.tgz#e218a4257171f1c3c6e7a2f4d7e1b88ce3ae998e"
integrity sha512-oh3SHMVOhqwFFZrzxnrAacBdUpdXtOyAoGyEOm9x0xehQ5NpYEnz/DdjXmW6iKeQ7Igoa1rSyibWbYfHV6fzvg==
"@preserves/schema@^0.995.201":
version "0.995.201"
resolved "https://registry.yarnpkg.com/@preserves/schema/-/schema-0.995.201.tgz#827ad539afb0fdf68ba885ee3ff43db0fd473aa5"
integrity sha512-0SuhwOEAfxtrAeOTZ8V1yNEcHHHEbfUmoFawrF+vzTQFNZRz/X3LF1FM6wOiJlHtb7tBr4B+rHXX8jfNrqrdkA==
dependencies:
"@preserves/core" "^0.995.0"
"@preserves/core" "^0.995.200"
"@rollup/pluginutils@^3.0.9":
version "3.1.0"
@ -36,49 +36,49 @@
estree-walker "^1.0.1"
picomatch "^2.2.2"
"@syndicate-lang/compiler@^0.20.0":
version "0.20.0"
resolved "https://registry.yarnpkg.com/@syndicate-lang/compiler/-/compiler-0.20.0.tgz#cb0f94a272413c0b982f1009409696c9fdf6f9a9"
integrity sha512-tOZCi/AHD0jbXlIwFEmFmUPRC2rsLNNhwH8BvenwiAAni5SX7chxGYEOnLtCsx0/6pPUbNEKsisgv6eJOprCEA==
"@syndicate-lang/compiler@^0.21.1":
version "0.21.1"
resolved "https://registry.yarnpkg.com/@syndicate-lang/compiler/-/compiler-0.21.1.tgz#b6316bac14d053c313b3442be68f532a60c47cb3"
integrity sha512-daaYh1i0XmoHt6eTtO4gWblfVKMjp9trwxqR62wUSONY3gtJ5Bn4hG3dMgfoMz2NvOWbJHaGz/95J0jRubITxA==
"@syndicate-lang/core@*", "@syndicate-lang/core@^0.27.0":
version "0.27.0"
resolved "https://registry.yarnpkg.com/@syndicate-lang/core/-/core-0.27.0.tgz#e62a85925663cc478be7ef8a5264c004df879872"
integrity sha512-1YwT21NEO2ShAP3GXtiUcvok99YISGDR7oq2eNie+Q3F4gKGWD11PaJfgQyK15Fd23wdsoiejb6OtJOPvolfHA==
"@syndicate-lang/core@*", "@syndicate-lang/core@^0.32.0":
version "0.32.0"
resolved "https://registry.yarnpkg.com/@syndicate-lang/core/-/core-0.32.0.tgz#0efbbff176cac2969c2b6ba70a19965add3a2c61"
integrity sha512-ERVXk0W1xLaKvUa79Ek74YvqfBU543cUTb2GJvp76TP5k1jA97q9GzhddicS/s8lqu8SUC1+IXmKiJk0NX2TWQ==
dependencies:
salty-crypto "0.3.1"
"@syndicate-lang/html@*":
version "0.28.0"
resolved "https://registry.yarnpkg.com/@syndicate-lang/html/-/html-0.28.0.tgz#6071997edfd03fe42d28f300394291549a622011"
integrity sha512-yhVwbArxu58wdMUtoQEzVpNc63zRed1YBnXAFND8Q5jfBp2Maefr/FWyRg1VCTOb8yltxBvENwmAL3xNUrqYtg==
version "0.33.0"
resolved "https://registry.yarnpkg.com/@syndicate-lang/html/-/html-0.33.0.tgz#c53e6bf8a52b17c3747f4270713a8c9234f984af"
integrity sha512-xhN6NZOgLxlAQOyWG0JAgtyF1e1yQvrpNh5RBAPnucFYC024yo1ggZ08+KiaulhsoIKvRbBE6FU6p9dDm4/tpQ==
dependencies:
"@syndicate-lang/core" "^0.27.0"
"@syndicate-lang/core" "^0.32.0"
"@syndicate-lang/ts-plugin@*":
version "0.28.0"
resolved "https://registry.yarnpkg.com/@syndicate-lang/ts-plugin/-/ts-plugin-0.28.0.tgz#c22cc66b11bca74228f2c5ed10049cf9e347025f"
integrity sha512-ieIlKV8ty2caIy1WlZpfydDYFEYAdHVm+cJxBnVvTRYmQkPjqQa7/2vOTdTHeTXEGabfdtQHwj+RCwCLhRa54g==
version "0.34.0"
resolved "https://registry.yarnpkg.com/@syndicate-lang/ts-plugin/-/ts-plugin-0.34.0.tgz#df92f9044eeba528c80c41c5c9df49ee28902411"
integrity sha512-OCO6Hm0euz2hZk6tYTrJQNEM8iDBeQ/dgpW2a/UP52XSP6fYj0OvUVfn+35ZkIL64S+zDsJjL/6XFN05UZyRGA==
dependencies:
"@syndicate-lang/compiler" "^0.20.0"
"@syndicate-lang/core" "^0.27.0"
"@syndicate-lang/compiler" "^0.21.1"
"@syndicate-lang/core" "^0.32.0"
"@syndicate-lang/tsc@*":
version "0.28.0"
resolved "https://registry.yarnpkg.com/@syndicate-lang/tsc/-/tsc-0.28.0.tgz#17a7fbcb1f76016c9391c269c134edc1ced49747"
integrity sha512-+4rfCvodZ1Lbc6MDjL33JMUQNpffItd5/Ab9toww2DDXlsuLQhPYqwBY3PQfJ5KOneV4uUBPFxfc4LoRNqKGEQ==
version "0.34.0"
resolved "https://registry.yarnpkg.com/@syndicate-lang/tsc/-/tsc-0.34.0.tgz#1056fba7f639bbf436d0c2ecd2717edc4c1e612a"
integrity sha512-Ufj3xsdXMbMCavWsEkX/pFyXRpNIWRW+LFew1icD14DoSLqyBcoUEvskolOSgkSzC53tDjbd4/LXDVofIjIyUA==
dependencies:
"@syndicate-lang/compiler" "^0.20.0"
"@syndicate-lang/core" "^0.27.0"
"@syndicate-lang/compiler" "^0.21.1"
"@syndicate-lang/core" "^0.32.0"
glob "^7.1.6"
yargs "^16.2.0"
"@syndicate-lang/ws-relay@*":
version "0.29.0"
resolved "https://registry.yarnpkg.com/@syndicate-lang/ws-relay/-/ws-relay-0.29.0.tgz#25d8db2e21a141e0fc0ed3acbe9f55480dc72c56"
integrity sha512-cU1Ktj8uAhH71LpW1Oyb1qLowZLGf4v+cjTZ+ZScIJbgA2eZ4VGYQSqCfeaM+CzVWFDNI2Bpqb8J9uDI9ZDCig==
version "0.34.0"
resolved "https://registry.yarnpkg.com/@syndicate-lang/ws-relay/-/ws-relay-0.34.0.tgz#8b450ef18b22ca8e0c159c7925a1068796ad2c71"
integrity sha512-PT24Pp+ol/wWMSp/6H8i5zu7CgXm5nh0UsfpxJ3ZpvWFs/rIsoMflL/g+C1Q4DW9oFTn6/WFs07VdSLmE2/Uog==
dependencies:
"@syndicate-lang/core" "^0.27.0"
"@syndicate-lang/core" "^0.32.0"
salty-crypto "0.3"
"@types/estree@0.0.39":
@ -117,9 +117,9 @@ balanced-match@^1.0.0:
integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==
binary-extensions@^2.0.0:
version "2.2.0"
resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d"
integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==
version "2.3.0"
resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.3.0.tgz#f6e14a97858d327252200242d4ccfe522c445522"
integrity sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==
brace-expansion@^1.1.7:
version "1.1.11"

View File

@ -12,8 +12,8 @@
"author": "Tony Garnock-Jones <tonyg@leastfixedpoint.com>",
"license": "GPL-3.0+",
"dependencies": {
"@preserves/core": "0.995",
"@preserves/schema": "0.995",
"@preserves/core": "^0.995.200",
"@preserves/schema": "^0.995.201",
"@syndicate-lang/core": "*"
},
"devDependencies": {

View File

@ -2,17 +2,17 @@
# yarn lockfile v1
"@preserves/core@0.995", "@preserves/core@^0.995.0":
version "0.995.0"
resolved "https://registry.yarnpkg.com/@preserves/core/-/core-0.995.0.tgz#d6badccd1fe56e45f23e01b4c8a33f421749e76b"
integrity sha512-0ICNcZ7HkBal1OJwoUuc1+KqoTQNJl2kYI3/nMtfrtNMem908unpydLo20k44Fgh/SRJekWaiRYSzKTcOo0+Tg==
"@preserves/core@0.995.200", "@preserves/core@^0.995.200":
version "0.995.200"
resolved "https://registry.yarnpkg.com/@preserves/core/-/core-0.995.200.tgz#65575cf8f9320e73b5d37fa9ac9d6881a33fd3a6"
integrity sha512-htZ2x+hltUpKoPsviWSuelzZW96po9zVSsN0RZEih60FahNX0R2LCqFJ6v5lyATuQ9oHALVi0w8w4rtf8oiAJw==
"@preserves/schema@0.995":
version "0.995.1"
resolved "https://registry.yarnpkg.com/@preserves/schema/-/schema-0.995.1.tgz#e218a4257171f1c3c6e7a2f4d7e1b88ce3ae998e"
integrity sha512-oh3SHMVOhqwFFZrzxnrAacBdUpdXtOyAoGyEOm9x0xehQ5NpYEnz/DdjXmW6iKeQ7Igoa1rSyibWbYfHV6fzvg==
"@preserves/schema@0.995.201":
version "0.995.201"
resolved "https://registry.yarnpkg.com/@preserves/schema/-/schema-0.995.201.tgz#827ad539afb0fdf68ba885ee3ff43db0fd473aa5"
integrity sha512-0SuhwOEAfxtrAeOTZ8V1yNEcHHHEbfUmoFawrF+vzTQFNZRz/X3LF1FM6wOiJlHtb7tBr4B+rHXX8jfNrqrdkA==
dependencies:
"@preserves/core" "^0.995.0"
"@preserves/core" "^0.995.200"
"@rollup/pluginutils@^3.0.9":
version "3.1.0"
@ -23,43 +23,43 @@
estree-walker "^1.0.1"
picomatch "^2.2.2"
"@syndicate-lang/compiler@^0.20.0":
version "0.20.0"
resolved "https://registry.yarnpkg.com/@syndicate-lang/compiler/-/compiler-0.20.0.tgz#cb0f94a272413c0b982f1009409696c9fdf6f9a9"
integrity sha512-tOZCi/AHD0jbXlIwFEmFmUPRC2rsLNNhwH8BvenwiAAni5SX7chxGYEOnLtCsx0/6pPUbNEKsisgv6eJOprCEA==
"@syndicate-lang/compiler@^0.21.1":
version "0.21.1"
resolved "https://registry.yarnpkg.com/@syndicate-lang/compiler/-/compiler-0.21.1.tgz#b6316bac14d053c313b3442be68f532a60c47cb3"
integrity sha512-daaYh1i0XmoHt6eTtO4gWblfVKMjp9trwxqR62wUSONY3gtJ5Bn4hG3dMgfoMz2NvOWbJHaGz/95J0jRubITxA==
"@syndicate-lang/core@*", "@syndicate-lang/core@^0.27.0":
version "0.27.0"
resolved "https://registry.yarnpkg.com/@syndicate-lang/core/-/core-0.27.0.tgz#e62a85925663cc478be7ef8a5264c004df879872"
integrity sha512-1YwT21NEO2ShAP3GXtiUcvok99YISGDR7oq2eNie+Q3F4gKGWD11PaJfgQyK15Fd23wdsoiejb6OtJOPvolfHA==
"@syndicate-lang/core@*", "@syndicate-lang/core@^0.32.0":
version "0.32.0"
resolved "https://registry.yarnpkg.com/@syndicate-lang/core/-/core-0.32.0.tgz#0efbbff176cac2969c2b6ba70a19965add3a2c61"
integrity sha512-ERVXk0W1xLaKvUa79Ek74YvqfBU543cUTb2GJvp76TP5k1jA97q9GzhddicS/s8lqu8SUC1+IXmKiJk0NX2TWQ==
dependencies:
salty-crypto "0.3.1"
"@syndicate-lang/syndicatec@*":
version "0.28.0"
resolved "https://registry.yarnpkg.com/@syndicate-lang/syndicatec/-/syndicatec-0.28.0.tgz#0d9f27b13971c91ee769e1ce39a9da1936b8b117"
integrity sha512-+pD0qPTX3Ve/AS1yZcSy1RcdYI70S7LzhLQLjpCzmwchvuySUhGHPlWlVHujA4TIrFB9A7+wtxREZ9IyZ6/P8Q==
version "0.34.0"
resolved "https://registry.yarnpkg.com/@syndicate-lang/syndicatec/-/syndicatec-0.34.0.tgz#f3b88507b633552fe1f41f24def5121c0cafeaeb"
integrity sha512-h3MPifJdXZTS3JVcvRG8GXMJMPBH4RYmJ3B7c2sjM826Pf6O8zT47Vuv1y2WyD9PS8BiSCI01uOR0W5AVJJT5w==
dependencies:
"@syndicate-lang/compiler" "^0.20.0"
"@syndicate-lang/core" "^0.27.0"
"@syndicate-lang/compiler" "^0.21.1"
"@syndicate-lang/core" "^0.32.0"
glob "^7.1.6"
yargs "^16.2.0"
"@syndicate-lang/ts-plugin@*":
version "0.28.0"
resolved "https://registry.yarnpkg.com/@syndicate-lang/ts-plugin/-/ts-plugin-0.28.0.tgz#c22cc66b11bca74228f2c5ed10049cf9e347025f"
integrity sha512-ieIlKV8ty2caIy1WlZpfydDYFEYAdHVm+cJxBnVvTRYmQkPjqQa7/2vOTdTHeTXEGabfdtQHwj+RCwCLhRa54g==
version "0.34.0"
resolved "https://registry.yarnpkg.com/@syndicate-lang/ts-plugin/-/ts-plugin-0.34.0.tgz#df92f9044eeba528c80c41c5c9df49ee28902411"
integrity sha512-OCO6Hm0euz2hZk6tYTrJQNEM8iDBeQ/dgpW2a/UP52XSP6fYj0OvUVfn+35ZkIL64S+zDsJjL/6XFN05UZyRGA==
dependencies:
"@syndicate-lang/compiler" "^0.20.0"
"@syndicate-lang/core" "^0.27.0"
"@syndicate-lang/compiler" "^0.21.1"
"@syndicate-lang/core" "^0.32.0"
"@syndicate-lang/tsc@*":
version "0.28.0"
resolved "https://registry.yarnpkg.com/@syndicate-lang/tsc/-/tsc-0.28.0.tgz#17a7fbcb1f76016c9391c269c134edc1ced49747"
integrity sha512-+4rfCvodZ1Lbc6MDjL33JMUQNpffItd5/Ab9toww2DDXlsuLQhPYqwBY3PQfJ5KOneV4uUBPFxfc4LoRNqKGEQ==
version "0.34.0"
resolved "https://registry.yarnpkg.com/@syndicate-lang/tsc/-/tsc-0.34.0.tgz#1056fba7f639bbf436d0c2ecd2717edc4c1e612a"
integrity sha512-Ufj3xsdXMbMCavWsEkX/pFyXRpNIWRW+LFew1icD14DoSLqyBcoUEvskolOSgkSzC53tDjbd4/LXDVofIjIyUA==
dependencies:
"@syndicate-lang/compiler" "^0.20.0"
"@syndicate-lang/core" "^0.27.0"
"@syndicate-lang/compiler" "^0.21.1"
"@syndicate-lang/core" "^0.32.0"
glob "^7.1.6"
yargs "^16.2.0"

View File

@ -12,8 +12,8 @@
"author": "Tony Garnock-Jones <tonyg@leastfixedpoint.com>",
"license": "GPL-3.0+",
"dependencies": {
"@preserves/core": "0.995",
"@preserves/schema": "0.995",
"@preserves/core": "^0.995.200",
"@preserves/schema": "^0.995.201",
"@syndicate-lang/core": "*"
},
"devDependencies": {

View File

@ -2,17 +2,17 @@
# yarn lockfile v1
"@preserves/core@0.995", "@preserves/core@^0.995.0":
version "0.995.0"
resolved "https://registry.yarnpkg.com/@preserves/core/-/core-0.995.0.tgz#d6badccd1fe56e45f23e01b4c8a33f421749e76b"
integrity sha512-0ICNcZ7HkBal1OJwoUuc1+KqoTQNJl2kYI3/nMtfrtNMem908unpydLo20k44Fgh/SRJekWaiRYSzKTcOo0+Tg==
"@preserves/core@0.995.200", "@preserves/core@^0.995.200":
version "0.995.200"
resolved "https://registry.yarnpkg.com/@preserves/core/-/core-0.995.200.tgz#65575cf8f9320e73b5d37fa9ac9d6881a33fd3a6"
integrity sha512-htZ2x+hltUpKoPsviWSuelzZW96po9zVSsN0RZEih60FahNX0R2LCqFJ6v5lyATuQ9oHALVi0w8w4rtf8oiAJw==
"@preserves/schema@0.995":
version "0.995.1"
resolved "https://registry.yarnpkg.com/@preserves/schema/-/schema-0.995.1.tgz#e218a4257171f1c3c6e7a2f4d7e1b88ce3ae998e"
integrity sha512-oh3SHMVOhqwFFZrzxnrAacBdUpdXtOyAoGyEOm9x0xehQ5NpYEnz/DdjXmW6iKeQ7Igoa1rSyibWbYfHV6fzvg==
"@preserves/schema@0.995.201":
version "0.995.201"
resolved "https://registry.yarnpkg.com/@preserves/schema/-/schema-0.995.201.tgz#827ad539afb0fdf68ba885ee3ff43db0fd473aa5"
integrity sha512-0SuhwOEAfxtrAeOTZ8V1yNEcHHHEbfUmoFawrF+vzTQFNZRz/X3LF1FM6wOiJlHtb7tBr4B+rHXX8jfNrqrdkA==
dependencies:
"@preserves/core" "^0.995.0"
"@preserves/core" "^0.995.200"
"@rollup/pluginutils@^3.0.9":
version "3.1.0"
@ -23,25 +23,25 @@
estree-walker "^1.0.1"
picomatch "^2.2.2"
"@syndicate-lang/compiler@^0.20.0":
version "0.20.0"
resolved "https://registry.yarnpkg.com/@syndicate-lang/compiler/-/compiler-0.20.0.tgz#cb0f94a272413c0b982f1009409696c9fdf6f9a9"
integrity sha512-tOZCi/AHD0jbXlIwFEmFmUPRC2rsLNNhwH8BvenwiAAni5SX7chxGYEOnLtCsx0/6pPUbNEKsisgv6eJOprCEA==
"@syndicate-lang/compiler@^0.21.1":
version "0.21.1"
resolved "https://registry.yarnpkg.com/@syndicate-lang/compiler/-/compiler-0.21.1.tgz#b6316bac14d053c313b3442be68f532a60c47cb3"
integrity sha512-daaYh1i0XmoHt6eTtO4gWblfVKMjp9trwxqR62wUSONY3gtJ5Bn4hG3dMgfoMz2NvOWbJHaGz/95J0jRubITxA==
"@syndicate-lang/core@*", "@syndicate-lang/core@^0.27.0":
version "0.27.0"
resolved "https://registry.yarnpkg.com/@syndicate-lang/core/-/core-0.27.0.tgz#e62a85925663cc478be7ef8a5264c004df879872"
integrity sha512-1YwT21NEO2ShAP3GXtiUcvok99YISGDR7oq2eNie+Q3F4gKGWD11PaJfgQyK15Fd23wdsoiejb6OtJOPvolfHA==
"@syndicate-lang/core@*", "@syndicate-lang/core@^0.32.0":
version "0.32.0"
resolved "https://registry.yarnpkg.com/@syndicate-lang/core/-/core-0.32.0.tgz#0efbbff176cac2969c2b6ba70a19965add3a2c61"
integrity sha512-ERVXk0W1xLaKvUa79Ek74YvqfBU543cUTb2GJvp76TP5k1jA97q9GzhddicS/s8lqu8SUC1+IXmKiJk0NX2TWQ==
dependencies:
salty-crypto "0.3.1"
"@syndicate-lang/tsc@*":
version "0.28.0"
resolved "https://registry.yarnpkg.com/@syndicate-lang/tsc/-/tsc-0.28.0.tgz#17a7fbcb1f76016c9391c269c134edc1ced49747"
integrity sha512-+4rfCvodZ1Lbc6MDjL33JMUQNpffItd5/Ab9toww2DDXlsuLQhPYqwBY3PQfJ5KOneV4uUBPFxfc4LoRNqKGEQ==
version "0.34.0"
resolved "https://registry.yarnpkg.com/@syndicate-lang/tsc/-/tsc-0.34.0.tgz#1056fba7f639bbf436d0c2ecd2717edc4c1e612a"
integrity sha512-Ufj3xsdXMbMCavWsEkX/pFyXRpNIWRW+LFew1icD14DoSLqyBcoUEvskolOSgkSzC53tDjbd4/LXDVofIjIyUA==
dependencies:
"@syndicate-lang/compiler" "^0.20.0"
"@syndicate-lang/core" "^0.27.0"
"@syndicate-lang/compiler" "^0.21.1"
"@syndicate-lang/core" "^0.32.0"
glob "^7.1.6"
yargs "^16.2.0"

View File

@ -12,7 +12,7 @@
"author": "Tony Garnock-Jones <tonyg@leastfixedpoint.com>",
"license": "GPL-3.0+",
"dependencies": {
"@preserves/core": "0.995",
"@preserves/core": "^0.995.200",
"@syndicate-lang/core": "*"
},
"devDependencies": {

View File

@ -2,10 +2,10 @@
# yarn lockfile v1
"@preserves/core@0.995":
version "0.995.0"
resolved "https://registry.yarnpkg.com/@preserves/core/-/core-0.995.0.tgz#d6badccd1fe56e45f23e01b4c8a33f421749e76b"
integrity sha512-0ICNcZ7HkBal1OJwoUuc1+KqoTQNJl2kYI3/nMtfrtNMem908unpydLo20k44Fgh/SRJekWaiRYSzKTcOo0+Tg==
"@preserves/core@0.995.200":
version "0.995.200"
resolved "https://registry.yarnpkg.com/@preserves/core/-/core-0.995.200.tgz#65575cf8f9320e73b5d37fa9ac9d6881a33fd3a6"
integrity sha512-htZ2x+hltUpKoPsviWSuelzZW96po9zVSsN0RZEih60FahNX0R2LCqFJ6v5lyATuQ9oHALVi0w8w4rtf8oiAJw==
"@rollup/pluginutils@^3.0.9":
version "3.1.0"
@ -16,25 +16,25 @@
estree-walker "^1.0.1"
picomatch "^2.2.2"
"@syndicate-lang/compiler@^0.20.0":
version "0.20.0"
resolved "https://registry.yarnpkg.com/@syndicate-lang/compiler/-/compiler-0.20.0.tgz#cb0f94a272413c0b982f1009409696c9fdf6f9a9"
integrity sha512-tOZCi/AHD0jbXlIwFEmFmUPRC2rsLNNhwH8BvenwiAAni5SX7chxGYEOnLtCsx0/6pPUbNEKsisgv6eJOprCEA==
"@syndicate-lang/compiler@^0.21.1":
version "0.21.1"
resolved "https://registry.yarnpkg.com/@syndicate-lang/compiler/-/compiler-0.21.1.tgz#b6316bac14d053c313b3442be68f532a60c47cb3"
integrity sha512-daaYh1i0XmoHt6eTtO4gWblfVKMjp9trwxqR62wUSONY3gtJ5Bn4hG3dMgfoMz2NvOWbJHaGz/95J0jRubITxA==
"@syndicate-lang/core@*", "@syndicate-lang/core@^0.27.0":
version "0.27.0"
resolved "https://registry.yarnpkg.com/@syndicate-lang/core/-/core-0.27.0.tgz#e62a85925663cc478be7ef8a5264c004df879872"
integrity sha512-1YwT21NEO2ShAP3GXtiUcvok99YISGDR7oq2eNie+Q3F4gKGWD11PaJfgQyK15Fd23wdsoiejb6OtJOPvolfHA==
"@syndicate-lang/core@*", "@syndicate-lang/core@^0.32.0":
version "0.32.0"
resolved "https://registry.yarnpkg.com/@syndicate-lang/core/-/core-0.32.0.tgz#0efbbff176cac2969c2b6ba70a19965add3a2c61"
integrity sha512-ERVXk0W1xLaKvUa79Ek74YvqfBU543cUTb2GJvp76TP5k1jA97q9GzhddicS/s8lqu8SUC1+IXmKiJk0NX2TWQ==
dependencies:
salty-crypto "0.3.1"
"@syndicate-lang/syndicatec@*":
version "0.28.0"
resolved "https://registry.yarnpkg.com/@syndicate-lang/syndicatec/-/syndicatec-0.28.0.tgz#0d9f27b13971c91ee769e1ce39a9da1936b8b117"
integrity sha512-+pD0qPTX3Ve/AS1yZcSy1RcdYI70S7LzhLQLjpCzmwchvuySUhGHPlWlVHujA4TIrFB9A7+wtxREZ9IyZ6/P8Q==
version "0.34.0"
resolved "https://registry.yarnpkg.com/@syndicate-lang/syndicatec/-/syndicatec-0.34.0.tgz#f3b88507b633552fe1f41f24def5121c0cafeaeb"
integrity sha512-h3MPifJdXZTS3JVcvRG8GXMJMPBH4RYmJ3B7c2sjM826Pf6O8zT47Vuv1y2WyD9PS8BiSCI01uOR0W5AVJJT5w==
dependencies:
"@syndicate-lang/compiler" "^0.20.0"
"@syndicate-lang/core" "^0.27.0"
"@syndicate-lang/compiler" "^0.21.1"
"@syndicate-lang/core" "^0.32.0"
glob "^7.1.6"
yargs "^16.2.0"

View File

@ -12,8 +12,8 @@
"author": "Tony Garnock-Jones <tonyg@leastfixedpoint.com>",
"license": "GPL-3.0+",
"dependencies": {
"@preserves/core": "0.995",
"@preserves/schema": "0.995",
"@preserves/core": "^0.995.200",
"@preserves/schema": "^0.995.201",
"@syndicate-lang/core": "*"
},
"devDependencies": {

View File

@ -2,17 +2,17 @@
# yarn lockfile v1
"@preserves/core@0.995", "@preserves/core@^0.995.0":
version "0.995.0"
resolved "https://registry.yarnpkg.com/@preserves/core/-/core-0.995.0.tgz#d6badccd1fe56e45f23e01b4c8a33f421749e76b"
integrity sha512-0ICNcZ7HkBal1OJwoUuc1+KqoTQNJl2kYI3/nMtfrtNMem908unpydLo20k44Fgh/SRJekWaiRYSzKTcOo0+Tg==
"@preserves/core@0.995.200", "@preserves/core@^0.995.200":
version "0.995.200"
resolved "https://registry.yarnpkg.com/@preserves/core/-/core-0.995.200.tgz#65575cf8f9320e73b5d37fa9ac9d6881a33fd3a6"
integrity sha512-htZ2x+hltUpKoPsviWSuelzZW96po9zVSsN0RZEih60FahNX0R2LCqFJ6v5lyATuQ9oHALVi0w8w4rtf8oiAJw==
"@preserves/schema@0.995":
version "0.995.1"
resolved "https://registry.yarnpkg.com/@preserves/schema/-/schema-0.995.1.tgz#e218a4257171f1c3c6e7a2f4d7e1b88ce3ae998e"
integrity sha512-oh3SHMVOhqwFFZrzxnrAacBdUpdXtOyAoGyEOm9x0xehQ5NpYEnz/DdjXmW6iKeQ7Igoa1rSyibWbYfHV6fzvg==
"@preserves/schema@0.995.201":
version "0.995.201"
resolved "https://registry.yarnpkg.com/@preserves/schema/-/schema-0.995.201.tgz#827ad539afb0fdf68ba885ee3ff43db0fd473aa5"
integrity sha512-0SuhwOEAfxtrAeOTZ8V1yNEcHHHEbfUmoFawrF+vzTQFNZRz/X3LF1FM6wOiJlHtb7tBr4B+rHXX8jfNrqrdkA==
dependencies:
"@preserves/core" "^0.995.0"
"@preserves/core" "^0.995.200"
"@rollup/pluginutils@^3.0.9":
version "3.1.0"
@ -23,25 +23,25 @@
estree-walker "^1.0.1"
picomatch "^2.2.2"
"@syndicate-lang/compiler@^0.20.0":
version "0.20.0"
resolved "https://registry.yarnpkg.com/@syndicate-lang/compiler/-/compiler-0.20.0.tgz#cb0f94a272413c0b982f1009409696c9fdf6f9a9"
integrity sha512-tOZCi/AHD0jbXlIwFEmFmUPRC2rsLNNhwH8BvenwiAAni5SX7chxGYEOnLtCsx0/6pPUbNEKsisgv6eJOprCEA==
"@syndicate-lang/compiler@^0.21.1":
version "0.21.1"
resolved "https://registry.yarnpkg.com/@syndicate-lang/compiler/-/compiler-0.21.1.tgz#b6316bac14d053c313b3442be68f532a60c47cb3"
integrity sha512-daaYh1i0XmoHt6eTtO4gWblfVKMjp9trwxqR62wUSONY3gtJ5Bn4hG3dMgfoMz2NvOWbJHaGz/95J0jRubITxA==
"@syndicate-lang/core@*", "@syndicate-lang/core@^0.27.0":
version "0.27.0"
resolved "https://registry.yarnpkg.com/@syndicate-lang/core/-/core-0.27.0.tgz#e62a85925663cc478be7ef8a5264c004df879872"
integrity sha512-1YwT21NEO2ShAP3GXtiUcvok99YISGDR7oq2eNie+Q3F4gKGWD11PaJfgQyK15Fd23wdsoiejb6OtJOPvolfHA==
"@syndicate-lang/core@*", "@syndicate-lang/core@^0.32.0":
version "0.32.0"
resolved "https://registry.yarnpkg.com/@syndicate-lang/core/-/core-0.32.0.tgz#0efbbff176cac2969c2b6ba70a19965add3a2c61"
integrity sha512-ERVXk0W1xLaKvUa79Ek74YvqfBU543cUTb2GJvp76TP5k1jA97q9GzhddicS/s8lqu8SUC1+IXmKiJk0NX2TWQ==
dependencies:
salty-crypto "0.3.1"
"@syndicate-lang/syndicatec@*":
version "0.28.0"
resolved "https://registry.yarnpkg.com/@syndicate-lang/syndicatec/-/syndicatec-0.28.0.tgz#0d9f27b13971c91ee769e1ce39a9da1936b8b117"
integrity sha512-+pD0qPTX3Ve/AS1yZcSy1RcdYI70S7LzhLQLjpCzmwchvuySUhGHPlWlVHujA4TIrFB9A7+wtxREZ9IyZ6/P8Q==
version "0.34.0"
resolved "https://registry.yarnpkg.com/@syndicate-lang/syndicatec/-/syndicatec-0.34.0.tgz#f3b88507b633552fe1f41f24def5121c0cafeaeb"
integrity sha512-h3MPifJdXZTS3JVcvRG8GXMJMPBH4RYmJ3B7c2sjM826Pf6O8zT47Vuv1y2WyD9PS8BiSCI01uOR0W5AVJJT5w==
dependencies:
"@syndicate-lang/compiler" "^0.20.0"
"@syndicate-lang/core" "^0.27.0"
"@syndicate-lang/compiler" "^0.21.1"
"@syndicate-lang/core" "^0.32.0"
glob "^7.1.6"
yargs "^16.2.0"

View File

@ -12,8 +12,8 @@
"author": "Tony Garnock-Jones <tonyg@leastfixedpoint.com>",
"license": "GPL-3.0+",
"dependencies": {
"@preserves/core": "0.995",
"@preserves/schema": "0.995",
"@preserves/core": "^0.995.200",
"@preserves/schema": "^0.995.201",
"@syndicate-lang/core": "*",
"@syndicate-lang/html": "*",
"@syndicate-lang/timer": "*"

View File

@ -2,17 +2,17 @@
# yarn lockfile v1
"@preserves/core@0.995", "@preserves/core@^0.995.0":
version "0.995.0"
resolved "https://registry.yarnpkg.com/@preserves/core/-/core-0.995.0.tgz#d6badccd1fe56e45f23e01b4c8a33f421749e76b"
integrity sha512-0ICNcZ7HkBal1OJwoUuc1+KqoTQNJl2kYI3/nMtfrtNMem908unpydLo20k44Fgh/SRJekWaiRYSzKTcOo0+Tg==
"@preserves/core@0.995.200", "@preserves/core@^0.995.200":
version "0.995.200"
resolved "https://registry.yarnpkg.com/@preserves/core/-/core-0.995.200.tgz#65575cf8f9320e73b5d37fa9ac9d6881a33fd3a6"
integrity sha512-htZ2x+hltUpKoPsviWSuelzZW96po9zVSsN0RZEih60FahNX0R2LCqFJ6v5lyATuQ9oHALVi0w8w4rtf8oiAJw==
"@preserves/schema@0.995":
version "0.995.1"
resolved "https://registry.yarnpkg.com/@preserves/schema/-/schema-0.995.1.tgz#e218a4257171f1c3c6e7a2f4d7e1b88ce3ae998e"
integrity sha512-oh3SHMVOhqwFFZrzxnrAacBdUpdXtOyAoGyEOm9x0xehQ5NpYEnz/DdjXmW6iKeQ7Igoa1rSyibWbYfHV6fzvg==
"@preserves/schema@0.995.201":
version "0.995.201"
resolved "https://registry.yarnpkg.com/@preserves/schema/-/schema-0.995.201.tgz#827ad539afb0fdf68ba885ee3ff43db0fd473aa5"
integrity sha512-0SuhwOEAfxtrAeOTZ8V1yNEcHHHEbfUmoFawrF+vzTQFNZRz/X3LF1FM6wOiJlHtb7tBr4B+rHXX8jfNrqrdkA==
dependencies:
"@preserves/core" "^0.995.0"
"@preserves/core" "^0.995.200"
"@rollup/pluginutils@^3.0.9":
version "3.1.0"
@ -23,47 +23,47 @@
estree-walker "^1.0.1"
picomatch "^2.2.2"
"@syndicate-lang/compiler@^0.20.0":
version "0.20.0"
resolved "https://registry.yarnpkg.com/@syndicate-lang/compiler/-/compiler-0.20.0.tgz#cb0f94a272413c0b982f1009409696c9fdf6f9a9"
integrity sha512-tOZCi/AHD0jbXlIwFEmFmUPRC2rsLNNhwH8BvenwiAAni5SX7chxGYEOnLtCsx0/6pPUbNEKsisgv6eJOprCEA==
"@syndicate-lang/compiler@^0.21.1":
version "0.21.1"
resolved "https://registry.yarnpkg.com/@syndicate-lang/compiler/-/compiler-0.21.1.tgz#b6316bac14d053c313b3442be68f532a60c47cb3"
integrity sha512-daaYh1i0XmoHt6eTtO4gWblfVKMjp9trwxqR62wUSONY3gtJ5Bn4hG3dMgfoMz2NvOWbJHaGz/95J0jRubITxA==
"@syndicate-lang/core@*", "@syndicate-lang/core@^0.27.0":
version "0.27.0"
resolved "https://registry.yarnpkg.com/@syndicate-lang/core/-/core-0.27.0.tgz#e62a85925663cc478be7ef8a5264c004df879872"
integrity sha512-1YwT21NEO2ShAP3GXtiUcvok99YISGDR7oq2eNie+Q3F4gKGWD11PaJfgQyK15Fd23wdsoiejb6OtJOPvolfHA==
"@syndicate-lang/core@*", "@syndicate-lang/core@^0.32.0":
version "0.32.0"
resolved "https://registry.yarnpkg.com/@syndicate-lang/core/-/core-0.32.0.tgz#0efbbff176cac2969c2b6ba70a19965add3a2c61"
integrity sha512-ERVXk0W1xLaKvUa79Ek74YvqfBU543cUTb2GJvp76TP5k1jA97q9GzhddicS/s8lqu8SUC1+IXmKiJk0NX2TWQ==
dependencies:
salty-crypto "0.3.1"
"@syndicate-lang/html@*":
version "0.28.0"
resolved "https://registry.yarnpkg.com/@syndicate-lang/html/-/html-0.28.0.tgz#6071997edfd03fe42d28f300394291549a622011"
integrity sha512-yhVwbArxu58wdMUtoQEzVpNc63zRed1YBnXAFND8Q5jfBp2Maefr/FWyRg1VCTOb8yltxBvENwmAL3xNUrqYtg==
version "0.33.0"
resolved "https://registry.yarnpkg.com/@syndicate-lang/html/-/html-0.33.0.tgz#c53e6bf8a52b17c3747f4270713a8c9234f984af"
integrity sha512-xhN6NZOgLxlAQOyWG0JAgtyF1e1yQvrpNh5RBAPnucFYC024yo1ggZ08+KiaulhsoIKvRbBE6FU6p9dDm4/tpQ==
dependencies:
"@syndicate-lang/core" "^0.27.0"
"@syndicate-lang/core" "^0.32.0"
"@syndicate-lang/timer@*":
version "0.28.0"
resolved "https://registry.yarnpkg.com/@syndicate-lang/timer/-/timer-0.28.0.tgz#396499a37221d2b9d0a3c6fcb2bb751327d5f08c"
integrity sha512-nJASotUruo2aO7zj7K6oa6dKlCSmBQr57E3fcifaoOOnzVcKiTsTY8irtDP0gYSTSyePh0sdm/y3pH6vErnBwQ==
version "0.33.0"
resolved "https://registry.yarnpkg.com/@syndicate-lang/timer/-/timer-0.33.0.tgz#cdb38ebe777332ec58a5b0b9483db809275a61de"
integrity sha512-cBon+nk8zvNeU4zC6tg7nhgJnmrRoXHYE140UK3gscNFcg1LZ1d7q9WxfVTzFtRocRBslv6pworSwCDn3Go7TQ==
dependencies:
"@syndicate-lang/core" "^0.27.0"
"@syndicate-lang/core" "^0.32.0"
"@syndicate-lang/ts-plugin@*":
version "0.28.0"
resolved "https://registry.yarnpkg.com/@syndicate-lang/ts-plugin/-/ts-plugin-0.28.0.tgz#c22cc66b11bca74228f2c5ed10049cf9e347025f"
integrity sha512-ieIlKV8ty2caIy1WlZpfydDYFEYAdHVm+cJxBnVvTRYmQkPjqQa7/2vOTdTHeTXEGabfdtQHwj+RCwCLhRa54g==
version "0.34.0"
resolved "https://registry.yarnpkg.com/@syndicate-lang/ts-plugin/-/ts-plugin-0.34.0.tgz#df92f9044eeba528c80c41c5c9df49ee28902411"
integrity sha512-OCO6Hm0euz2hZk6tYTrJQNEM8iDBeQ/dgpW2a/UP52XSP6fYj0OvUVfn+35ZkIL64S+zDsJjL/6XFN05UZyRGA==
dependencies:
"@syndicate-lang/compiler" "^0.20.0"
"@syndicate-lang/core" "^0.27.0"
"@syndicate-lang/compiler" "^0.21.1"
"@syndicate-lang/core" "^0.32.0"
"@syndicate-lang/tsc@*":
version "0.28.0"
resolved "https://registry.yarnpkg.com/@syndicate-lang/tsc/-/tsc-0.28.0.tgz#17a7fbcb1f76016c9391c269c134edc1ced49747"
integrity sha512-+4rfCvodZ1Lbc6MDjL33JMUQNpffItd5/Ab9toww2DDXlsuLQhPYqwBY3PQfJ5KOneV4uUBPFxfc4LoRNqKGEQ==
version "0.34.0"
resolved "https://registry.yarnpkg.com/@syndicate-lang/tsc/-/tsc-0.34.0.tgz#1056fba7f639bbf436d0c2ecd2717edc4c1e612a"
integrity sha512-Ufj3xsdXMbMCavWsEkX/pFyXRpNIWRW+LFew1icD14DoSLqyBcoUEvskolOSgkSzC53tDjbd4/LXDVofIjIyUA==
dependencies:
"@syndicate-lang/compiler" "^0.20.0"
"@syndicate-lang/core" "^0.27.0"
"@syndicate-lang/compiler" "^0.21.1"
"@syndicate-lang/core" "^0.32.0"
glob "^7.1.6"
yargs "^16.2.0"

View File

@ -14,8 +14,8 @@
"author": "Tony Garnock-Jones <tonyg@leastfixedpoint.com>",
"license": "GPL-3.0+",
"dependencies": {
"@preserves/core": "0.995",
"@preserves/schema": "0.995",
"@preserves/core": "^0.995.200",
"@preserves/schema": "^0.995.201",
"@syndicate-lang/core": "*",
"@syndicate-lang/html": "*"
},

View File

@ -1,7 +1,7 @@
/// SPDX-License-Identifier: GPL-3.0-or-later
/// SPDX-FileCopyrightText: Copyright © 2016-2021 Tony Garnock-Jones <tonyg@leastfixedpoint.com>
import { Dataspace, Embedded, Value, Ref } from '@syndicate-lang/core';
import { Dataspace, Value, Ref } from '@syndicate-lang/core';
import { boot as bootHtml, UIEvent, GlobalEvent, HtmlFragments, template, Anchor } from '@syndicate-lang/html';
assertion type Person(id, firstName, lastName, address, age);
@ -42,7 +42,7 @@ Dataspace.boot(ds => {
spawn named 'controller' {
on message GlobalEvent('table#the-table th', 'click', $e) => {
const event = (e as Embedded<Ref>).embeddedValue.target.data as Event;
const event = (e as Ref).target.data as Event;
send message SetSortColumn(JSON.parse((event.target as HTMLElement).dataset.column!));
}
}

View File

@ -2,17 +2,17 @@
# yarn lockfile v1
"@preserves/core@0.995", "@preserves/core@^0.995.0":
version "0.995.0"
resolved "https://registry.yarnpkg.com/@preserves/core/-/core-0.995.0.tgz#d6badccd1fe56e45f23e01b4c8a33f421749e76b"
integrity sha512-0ICNcZ7HkBal1OJwoUuc1+KqoTQNJl2kYI3/nMtfrtNMem908unpydLo20k44Fgh/SRJekWaiRYSzKTcOo0+Tg==
"@preserves/core@0.995.200", "@preserves/core@^0.995.200":
version "0.995.200"
resolved "https://registry.yarnpkg.com/@preserves/core/-/core-0.995.200.tgz#65575cf8f9320e73b5d37fa9ac9d6881a33fd3a6"
integrity sha512-htZ2x+hltUpKoPsviWSuelzZW96po9zVSsN0RZEih60FahNX0R2LCqFJ6v5lyATuQ9oHALVi0w8w4rtf8oiAJw==
"@preserves/schema@0.995":
version "0.995.1"
resolved "https://registry.yarnpkg.com/@preserves/schema/-/schema-0.995.1.tgz#e218a4257171f1c3c6e7a2f4d7e1b88ce3ae998e"
integrity sha512-oh3SHMVOhqwFFZrzxnrAacBdUpdXtOyAoGyEOm9x0xehQ5NpYEnz/DdjXmW6iKeQ7Igoa1rSyibWbYfHV6fzvg==
"@preserves/schema@0.995.201":
version "0.995.201"
resolved "https://registry.yarnpkg.com/@preserves/schema/-/schema-0.995.201.tgz#827ad539afb0fdf68ba885ee3ff43db0fd473aa5"
integrity sha512-0SuhwOEAfxtrAeOTZ8V1yNEcHHHEbfUmoFawrF+vzTQFNZRz/X3LF1FM6wOiJlHtb7tBr4B+rHXX8jfNrqrdkA==
dependencies:
"@preserves/core" "^0.995.0"
"@preserves/core" "^0.995.200"
"@rollup/pluginutils@^3.0.9":
version "3.1.0"
@ -23,40 +23,40 @@
estree-walker "^1.0.1"
picomatch "^2.2.2"
"@syndicate-lang/compiler@^0.20.0":
version "0.20.0"
resolved "https://registry.yarnpkg.com/@syndicate-lang/compiler/-/compiler-0.20.0.tgz#cb0f94a272413c0b982f1009409696c9fdf6f9a9"
integrity sha512-tOZCi/AHD0jbXlIwFEmFmUPRC2rsLNNhwH8BvenwiAAni5SX7chxGYEOnLtCsx0/6pPUbNEKsisgv6eJOprCEA==
"@syndicate-lang/compiler@^0.21.1":
version "0.21.1"
resolved "https://registry.yarnpkg.com/@syndicate-lang/compiler/-/compiler-0.21.1.tgz#b6316bac14d053c313b3442be68f532a60c47cb3"
integrity sha512-daaYh1i0XmoHt6eTtO4gWblfVKMjp9trwxqR62wUSONY3gtJ5Bn4hG3dMgfoMz2NvOWbJHaGz/95J0jRubITxA==
"@syndicate-lang/core@*", "@syndicate-lang/core@^0.27.0":
version "0.27.0"
resolved "https://registry.yarnpkg.com/@syndicate-lang/core/-/core-0.27.0.tgz#e62a85925663cc478be7ef8a5264c004df879872"
integrity sha512-1YwT21NEO2ShAP3GXtiUcvok99YISGDR7oq2eNie+Q3F4gKGWD11PaJfgQyK15Fd23wdsoiejb6OtJOPvolfHA==
"@syndicate-lang/core@*", "@syndicate-lang/core@^0.32.0":
version "0.32.0"
resolved "https://registry.yarnpkg.com/@syndicate-lang/core/-/core-0.32.0.tgz#0efbbff176cac2969c2b6ba70a19965add3a2c61"
integrity sha512-ERVXk0W1xLaKvUa79Ek74YvqfBU543cUTb2GJvp76TP5k1jA97q9GzhddicS/s8lqu8SUC1+IXmKiJk0NX2TWQ==
dependencies:
salty-crypto "0.3.1"
"@syndicate-lang/html@*":
version "0.28.0"
resolved "https://registry.yarnpkg.com/@syndicate-lang/html/-/html-0.28.0.tgz#6071997edfd03fe42d28f300394291549a622011"
integrity sha512-yhVwbArxu58wdMUtoQEzVpNc63zRed1YBnXAFND8Q5jfBp2Maefr/FWyRg1VCTOb8yltxBvENwmAL3xNUrqYtg==
version "0.33.0"
resolved "https://registry.yarnpkg.com/@syndicate-lang/html/-/html-0.33.0.tgz#c53e6bf8a52b17c3747f4270713a8c9234f984af"
integrity sha512-xhN6NZOgLxlAQOyWG0JAgtyF1e1yQvrpNh5RBAPnucFYC024yo1ggZ08+KiaulhsoIKvRbBE6FU6p9dDm4/tpQ==
dependencies:
"@syndicate-lang/core" "^0.27.0"
"@syndicate-lang/core" "^0.32.0"
"@syndicate-lang/ts-plugin@*":
version "0.28.0"
resolved "https://registry.yarnpkg.com/@syndicate-lang/ts-plugin/-/ts-plugin-0.28.0.tgz#c22cc66b11bca74228f2c5ed10049cf9e347025f"
integrity sha512-ieIlKV8ty2caIy1WlZpfydDYFEYAdHVm+cJxBnVvTRYmQkPjqQa7/2vOTdTHeTXEGabfdtQHwj+RCwCLhRa54g==
version "0.34.0"
resolved "https://registry.yarnpkg.com/@syndicate-lang/ts-plugin/-/ts-plugin-0.34.0.tgz#df92f9044eeba528c80c41c5c9df49ee28902411"
integrity sha512-OCO6Hm0euz2hZk6tYTrJQNEM8iDBeQ/dgpW2a/UP52XSP6fYj0OvUVfn+35ZkIL64S+zDsJjL/6XFN05UZyRGA==
dependencies:
"@syndicate-lang/compiler" "^0.20.0"
"@syndicate-lang/core" "^0.27.0"
"@syndicate-lang/compiler" "^0.21.1"
"@syndicate-lang/core" "^0.32.0"
"@syndicate-lang/tsc@*":
version "0.28.0"
resolved "https://registry.yarnpkg.com/@syndicate-lang/tsc/-/tsc-0.28.0.tgz#17a7fbcb1f76016c9391c269c134edc1ced49747"
integrity sha512-+4rfCvodZ1Lbc6MDjL33JMUQNpffItd5/Ab9toww2DDXlsuLQhPYqwBY3PQfJ5KOneV4uUBPFxfc4LoRNqKGEQ==
version "0.34.0"
resolved "https://registry.yarnpkg.com/@syndicate-lang/tsc/-/tsc-0.34.0.tgz#1056fba7f639bbf436d0c2ecd2717edc4c1e612a"
integrity sha512-Ufj3xsdXMbMCavWsEkX/pFyXRpNIWRW+LFew1icD14DoSLqyBcoUEvskolOSgkSzC53tDjbd4/LXDVofIjIyUA==
dependencies:
"@syndicate-lang/compiler" "^0.20.0"
"@syndicate-lang/core" "^0.27.0"
"@syndicate-lang/compiler" "^0.21.1"
"@syndicate-lang/core" "^0.32.0"
glob "^7.1.6"
yargs "^16.2.0"

View File

@ -6,7 +6,7 @@
"packages/*/examples/*/"
],
"devDependencies": {
"@preserves/core": "0.995.100",
"@preserves/core": "^0.995.201",
"@rollup/plugin-node-resolve": "^13.0",
"@types/jest": "^27.0",
"@types/node": "^14",

View File

@ -1,5 +1,9 @@
#!/bin/sh
set -e
cd "$(dirname "$0")"
M=../../node_modules
cat \
@ -39,3 +43,5 @@ cp \
$M/@syndicate-lang/ws-relay/dist/syndicate-ws-relay.min.js.map \
$M/@syndicate-lang/compiler/dist/syndicate-compiler.min.js.map \
.
echo $(date) $(pwd) 'build complete.'

View File

@ -1,6 +1,6 @@
{
"name": "@syndicate-lang/browser-stdenv",
"version": "0.29.0",
"version": "0.35.1",
"description": "Aggregated Syndicate and Preserves scripts for in-browser use",
"homepage": "https://github.com/syndicate-lang/syndicate-js/tree/main/packages/browser-stdenv",
"license": "GPL-3.0+",
@ -15,15 +15,16 @@
"author": "Tony Garnock-Jones <tonyg@leastfixedpoint.com>",
"scripts": {
"prepare": "./build-aggregate.sh",
"prepare:watch": "cd ..; exec inotifytest browser-stdenv/build-aggregate.sh",
"clean": "rm -rf index.js index.min.js *.js.map",
"veryclean": "yarn run clean && rm -rf node_modules"
},
"dependencies": {
"@preserves/core": "0.995.100",
"@preserves/schema": "0.995.100",
"@syndicate-lang/compiler": "^0.21.0",
"@syndicate-lang/core": "^0.28.2",
"@syndicate-lang/html2": "^0.29.3",
"@syndicate-lang/ws-relay": "^0.30.3"
"@preserves/core": "^0.995.200",
"@preserves/schema": "^0.995.201",
"@syndicate-lang/compiler": "^0.22.0",
"@syndicate-lang/core": "^0.34.1",
"@syndicate-lang/html2": "^0.35.1",
"@syndicate-lang/ws-relay": "^0.36.1"
}
}

View File

@ -1,6 +1,6 @@
{
"name": "@syndicate-lang/compiler",
"version": "0.21.0",
"version": "0.22.0",
"description": "Syndicate/JS compiler library",
"homepage": "https://github.com/syndicate-lang/syndicate-js/tree/main/packages/compiler",
"license": "GPL-3.0+",

View File

@ -296,14 +296,19 @@ ${joinItems(sa.captureBinders.map(binderTypeGuard(t)), '\n')}
})`;
if (s.isDynamic) {
return wrap(t`__SYNDICATE__.Turn.active.assertDataflow(() => ({
target: currentSyndicateTarget,
assertion: ${assertion},
}));`);
if (s.test === void 0) {
return wrap(t`__SYNDICATE__.Turn.active.assertDataflow(() => ({ target: currentSyndicateTarget, assertion: ${assertion} }));`);
} else {
return wrap(t`__SYNDICATE__.Turn.active.assertDataflow(() => (${walk(s.test)})
? ({ target: currentSyndicateTarget, assertion: ${assertion} })
: ({ target: void 0, assertion: void 0 }));`);
}
} else {
return wrap(
t`__SYNDICATE__.Turn.active.replace(currentSyndicateTarget, void 0, ${assertion});`
);
if (s.test === void 0) {
return wrap(t`__SYNDICATE__.Turn.active.replace(currentSyndicateTarget, void 0, ${assertion});`);
} else {
return wrap(t`__SYNDICATE__.Turn.active.replace(currentSyndicateTarget, void 0, (${walk(s.test)}) ? ${assertion} : void 0);`);
}
}
});

View File

@ -2,9 +2,10 @@
/// SPDX-FileCopyrightText: Copyright © 2016-2024 Tony Garnock-Jones <tonyg@leastfixedpoint.com>
import {
Token, Items, TokenBase, TokenType,
Token, Items, TokenBase, TokenType, Pos,
Pattern,
foldItems, match, anonymousTemplate as template, commaJoin,
advancePos,
scope, bind, seq, seqTuple, alt, upTo, atom, atomString, group,
repeat, option, withoutSpace, map, mapm, rest, discard,
@ -74,6 +75,7 @@ export interface PseudoEventEndpointStatement extends GenericEventEndpointStatem
export interface AssertionEventEndpointStatement extends GenericEventEndpointStatement {
triggerType: 'asserted' | 'retracted' | 'message';
pattern: ValuePattern;
test?: Expr,
}
export type EventHandlerEndpointStatement =
@ -324,7 +326,11 @@ export class SyndicateParser {
atomString('message'))),
option(map(kw('snapshot'), _ => o.isDynamic = false)),
bind(o as AssertionEventEndpointStatement, 'pattern',
this.valuePattern(1, atom('=>'))),
this.valuePattern(1, atom('=>'),
seq(atom('when'), group('(', discard)))),
option(seq(atom('when'), group(
'(', bind(o as AssertionEventEndpointStatement, 'test',
this.expr())))),
this.mandatoryIfNotTerminal(
o, seq(atom('=>'), this.statement(o.body))))));
});
@ -410,9 +416,18 @@ export class SyndicateParser {
pCaptureBinder = (b: Pattern<Binder>): Pattern<Binder> =>
mapm(b, i => {
return i.id.text.startsWith('$')
? succeed({ id: { ... i.id, text: i.id.text.slice(1) }, type: i.type })
: fail;
if (i.id.text.startsWith('$')) {
const adjustedStart: Pos = { ... i.id.start };
advancePos(adjustedStart, ' ');
const adjustedId: Token = {
... i.id,
start: adjustedStart,
text: i.id.text.slice(1),
};
return succeed({ id: adjustedId, type: i.type });
} else {
return fail;
}
});
readonly pCaptureDefaultBinder = this.pCaptureBinder(this.defaultBinder);

View File

@ -6,6 +6,7 @@ const currentSyndicateTarget = Syndicate.Dataspace.global;
(() => {
async function translateScripts() {
if (SchemaReady) await SchemaReady;
const syndicateScripts =
Array.from(document.getElementsByTagName('script'))

View File

@ -187,7 +187,7 @@ __SYNDICATE__.Turn.active.facet(() => {
}
}
}),
}),
})
}));
});`));
@ -206,8 +206,57 @@ __SYNDICATE__.Turn.active.facet(() => {
}
}
}),
}),
})
}));
});`));
});
describe('on', () => {
it('message with guard', () => expectCodeEqual(`
on message S.Focus(entity) when (isLast.value) => {
text.node.focus();
}`, `__SYNDICATE__.Turn.active.assertDataflow(() => (isLast.value) ?
({
target: currentSyndicateTarget,
assertion: __SYNDICATE__.Observe({
pattern: __SYNDICATE__.QuasiValue.finish((__SYNDICATE__.QuasiValue.ctor(S.Focus, (__SYNDICATE__.QuasiValue.lit(__SYNDICATE__.fromJS(entity)))))),
observer: __SYNDICATE__.Turn.ref({
message: (__vs) => {
if (Array.isArray(__vs)) {
text.node.focus();
}
}
}),
})
}) :
({
target: void 0,
assertion: void 0
}));`));
it('asserted with guard', () => expectCodeEqual(`on asserted P when (someTest) => x;`, `
__SYNDICATE__.Turn.active.assertDataflow(() => (someTest) ?
({
target: currentSyndicateTarget,
assertion: __SYNDICATE__.Observe({
pattern: __SYNDICATE__.QuasiValue.finish((__SYNDICATE__.QuasiValue.lit(__SYNDICATE__.fromJS(P)))),
observer: __SYNDICATE__.Turn.ref({
assert: (__vs, __handle) => {
if (Array.isArray(__vs)) {
x;
}
}
}),
})
}) :
({
target: void 0,
assertion: void 0
}));`));
});

View File

@ -1,6 +1,6 @@
{
"name": "@syndicate-lang/core",
"version": "0.28.2",
"version": "0.34.1",
"description": "Syndicate/JS for browser and node.js",
"homepage": "https://github.com/syndicate-lang/syndicate-js/tree/main/packages/core",
"license": "GPL-3.0+",
@ -29,13 +29,13 @@
"types": "lib/index.d.ts",
"author": "Tony Garnock-Jones <tonyg@leastfixedpoint.com>",
"devDependencies": {
"@preserves/core": "0.995.100",
"@preserves/schema-cli": "0.995.100"
"@preserves/core": "^0.995.200",
"@preserves/schema-cli": "^0.995.201"
},
"peerDependencies": {
"@preserves/core": "0.995.100"
"@preserves/core": ">=0.995.200"
},
"dependencies": {
"salty-crypto": "0.3.1"
"salty-crypto": "^0.3.1"
}
}

View File

@ -2,15 +2,15 @@
tcp-remote„´³tupleµ´³named³host´³atom³String„„´³named³port´³atom³ SignedInteger„„„„„³ TcpPeerInfo´³rec´³lit³tcp-peer„´³tupleµ´³named³handle´³embedded³any„„´³named³local´³refµ„³TcpLocal„„´³named³remote´³refµ„³ TcpRemote„„„„„„³ embeddedType´³refµ³ EntityRef„³Cap„„„µ³http„´³schema·³version°³ definitions·³Chunk´³orµµ±string´³atom³String„„µ±bytes´³atom³
ByteString„„„„³Headers´³dictof´³atom³Symbol„´³atom³String„„³MimeType´³atom³Symbol„³
QueryValue´³orµµ±string´³atom³String„„µ±file´³rec´³lit³file„´³tupleµ´³named³filename´³atom³String„„´³named³headers´³refµ„³Headers„„´³named³body´³atom³
ByteString„„„„„„„„³ HostPattern´³orµµ±host´³atom³String„„µ±any´³lit€„„„„³ HttpBinding´³rec´³lit³ http-bind„´³tupleµ´³named³host´³refµ„³ HostPattern„„´³named³port´³atom³ SignedInteger„„´³named³method´³refµ„³ MethodPattern„„´³named³path´³refµ„³ PathPattern„„´³named³handler´³embedded´³refµ„³ HttpRequest„„„„„„³ HttpContext´³rec´³lit³request„´³tupleµ´³named³req´³refµ„³ HttpRequest„„´³named³res´³embedded´³refµ„³ HttpResponse„„„„„„³ HttpRequest´³rec´³lit³ http-request„´³tupleµ´³named³sequenceNumber´³atom³ SignedInteger„„´³named³host´³atom³String„„´³named³port´³atom³ SignedInteger„„´³named³method´³atom³Symbol„„´³named³path´³seqof´³atom³String„„„´³named³headers´³refµ„³Headers„„´³named³query´³dictof´³atom³Symbol„´³seqof´³refµ„³
ByteString„„„„„„„„³ HostPattern´³orµµ±host´³atom³String„„µ±any´³lit€„„„„³ HttpBinding´³rec´³lit³ http-bind„´³tupleµ´³named³host´³refµ„³ HostPattern„„´³named³port´³atom³ SignedInteger„„´³named³method´³refµ„³ MethodPattern„„´³named³path´³refµ„³ PathPattern„„´³named³handler´³embedded´³refµ„³ HttpRequest„„„„„„³ HttpContext´³rec´³lit³request„´³tupleµ´³named³req´³refµ„³ HttpRequest„„´³named³res´³embedded´³refµ„³ HttpResponse„„„„„„³ HttpRequest´³rec´³lit³ http-request„´³tupleµ´³named³sequenceNumber´³atom³ SignedInteger„„´³named³host´³refµ„³ RequestHost„„´³named³port´³atom³ SignedInteger„„´³named³method´³atom³Symbol„„´³named³path´³seqof´³atom³String„„„´³named³headers´³refµ„³Headers„„´³named³query´³dictof´³atom³Symbol„´³seqof´³refµ„³
QueryValue„„„„´³named³body´³refµ„³ RequestBody„„„„„³ HttpService´³rec´³lit³ http-service„´³tupleµ´³named³host´³refµ„³ HostPattern„„´³named³port´³atom³ SignedInteger„„´³named³method´³refµ„³ MethodPattern„„´³named³path´³refµ„³ PathPattern„„„„„³ PathPattern´³seqof´³refµ„³PathPatternElement„„³ RequestBody´³orµµ±present´³atom³
ByteString„„µ±absent´³lit€„„„„³ HttpListener´³rec´³lit³ http-listener„´³tupleµ´³named³port´³atom³ SignedInteger„„„„„³ HttpResponse´³orµµ±status´³rec´³lit³status„´³tupleµ´³named³code´³atom³ SignedInteger„„´³named³message´³atom³String„„„„„„µ±header´³rec´³lit³header„´³tupleµ´³named³name´³atom³Symbol„„´³named³value´³atom³String„„„„„„µ±chunk´³rec´³lit³chunk„´³tupleµ´³named³chunk´³refµ„³Chunk„„„„„„µ±done´³rec´³lit³done„´³tupleµ´³named³chunk´³refµ„³Chunk„„„„„„„„³ MethodPattern´³orµµ±any´³lit€„„µ±specific´³atom³Symbol„„„„³PathPatternElement´³orµµ±label´³atom³String„„µ±wildcard´³lit³_„„µ±rest´³lit³...„„„„„³ embeddedType€„„µ³noise„´³schema·³version°³ definitions·³Packet´³orµµ±complete´³atom³
ByteString„„µ±absent´³lit€„„„„³ RequestHost´³orµµ±present´³atom³String„„µ±absent´³lit€„„„„³ HttpListener´³rec´³lit³ http-listener„´³tupleµ´³named³port´³atom³ SignedInteger„„„„„³ HttpResponse´³orµµ±status´³rec´³lit³status„´³tupleµ´³named³code´³atom³ SignedInteger„„´³named³message´³atom³String„„„„„„µ±header´³rec´³lit³header„´³tupleµ´³named³name´³atom³Symbol„„´³named³value´³atom³String„„„„„„µ±chunk´³rec´³lit³chunk„´³tupleµ´³named³chunk´³refµ„³Chunk„„„„„„µ±done´³rec´³lit³done„´³tupleµ´³named³chunk´³refµ„³Chunk„„„„„„„„³ MethodPattern´³orµµ±any´³lit€„„µ±specific´³atom³Symbol„„„„³PathPatternElement´³orµµ±label´³atom³String„„µ±wildcard´³lit³_„„µ±rest´³lit³...„„„„„³ embeddedType€„„µ³noise„´³schema·³version°³ definitions·³Packet´³orµµ±complete´³atom³
ByteString„„µ±
fragmented´³seqof´³atom³
ByteString„„„„„³ NoiseSpec´³andµ´³dict·³key´³named³key´³atom³
ByteString„„³service´³named³service´³refµ„³ServiceSelector„„„„´³named³protocol´³refµ„³ NoiseProtocol„„´³named³ preSharedKeys´³refµ„³NoisePreSharedKeys„„„„³ NoiseProtocol´³orµµ±present´³dict·³protocol´³named³protocol´³atom³String„„„„„µ±invalid´³dict·³protocol´³named³protocol³any„„„„µ±absent´³dict·„„„„„³ NoiseStepType´³lit³noise„³SecretKeyField´³orµµ±present´³dict·³ secretKey´³named³ secretKey´³atom³
ByteString„„„„„³ Initiator´³rec´³lit³ initiator„´³tupleµ´³named³initiatorSession´³embedded´³refµ„³Packet„„„„„„³ NoiseSpec´³andµ´³dict·³key´³named³key´³atom³
ByteString„„³service´³named³service´³refµ„³ServiceSelector„„„„´³named³protocol´³refµ„³ NoiseProtocol„„´³named³ preSharedKeys´³refµ„³NoisePreSharedKeys„„„„³ SessionItem´³orµµ± Initiator´³refµ„³ Initiator„„µ±Packet´³refµ„³Packet„„„„³ NoiseProtocol´³orµµ±present´³dict·³protocol´³named³protocol´³atom³String„„„„„µ±invalid´³dict·³protocol´³named³protocol³any„„„„µ±absent´³dict·„„„„„³ NoiseStepType´³lit³noise„³SecretKeyField´³orµµ±present´³dict·³ secretKey´³named³ secretKey´³atom³
ByteString„„„„„µ±invalid´³dict·³ secretKey´³named³ secretKey³any„„„„µ±absent´³dict·„„„„„³DefaultProtocol´³lit±!Noise_NK_25519_ChaChaPoly_BLAKE2s„³NoiseStepDetail´³refµ„³ServiceSelector„³ServiceSelector³any³NoiseServiceSpec´³andµ´³named³base´³refµ„³ NoiseSpec„„´³named³ secretKey´³refµ„³SecretKeyField„„„„³NoisePreSharedKeys´³orµµ±present´³dict·³ preSharedKeys´³named³ preSharedKeys´³seqof´³atom³
ByteString„„„„„„µ±invalid´³dict·³ preSharedKeys´³named³ preSharedKeys³any„„„„µ±absent´³dict·„„„„„³NoisePathStepDetail´³refµ„³ NoiseSpec„³NoiseDescriptionDetail´³refµ„³NoiseServiceSpec„„³ embeddedType„„µ³timer„´³schema·³version°³ definitions·³SetTimer´³rec´³lit³ set-timer„´³tupleµ´³named³label³any„´³named³seconds´³atom³Double„„´³named³kind´³refµ„³ TimerKind„„„„„³ LaterThan´³rec´³lit³
ByteString„„„„„„µ±invalid´³dict·³ preSharedKeys´³named³ preSharedKeys³any„„„„µ±absent´³dict·„„„„„³NoisePathStepDetail´³refµ„³ NoiseSpec„³NoiseDescriptionDetail´³refµ„³NoiseServiceSpec„„³ embeddedType´³refµ³ EntityRef„³Cap„„„µ³timer„´³schema·³version°³ definitions·³SetTimer´³rec´³lit³ set-timer„´³tupleµ´³named³label³any„´³named³seconds´³atom³Double„„´³named³kind´³refµ„³ TimerKind„„„„„³ LaterThan´³rec´³lit³
later-than„´³tupleµ´³named³seconds´³atom³Double„„„„„³ TimerKind´³orµµ±relative´³lit³relative„„µ±absolute´³lit³absolute„„µ±clear´³lit³clear„„„„³ TimerExpired´³rec´³lit³ timer-expired„´³tupleµ´³named³label³any„´³named³seconds´³atom³Double„„„„„„³ embeddedType€„„µ³trace„´³schema·³version°³ definitions·³Oid³any³Name´³orµµ± anonymous´³rec´³lit³ anonymous„´³tupleµ„„„„µ±named´³rec´³lit³named„´³tupleµ´³named³name³any„„„„„„„³Target´³rec´³lit³entity„´³tupleµ´³named³actor´³refµ„³ActorId„„´³named³facet´³refµ„³FacetId„„´³named³oid´³refµ„³Oid„„„„„³TaskId³any³TurnId³any³ActorId³any³FacetId³any³ TurnCause´³orµµ±turn´³rec´³lit³ caused-by„´³tupleµ´³named³id´³refµ„³TurnId„„„„„„µ±cleanup´³rec´³lit³cleanup„´³tupleµ„„„„µ±linkedTaskRelease´³rec´³lit³linked-task-release„´³tupleµ´³named³id´³refµ„³TaskId„„´³named³reason´³refµ„³LinkedTaskReleaseReason„„„„„„µ±periodicActivation´³rec´³lit³periodic-activation„´³tupleµ´³named³period´³atom³Double„„„„„„µ±delay´³rec´³lit³delay„´³tupleµ´³named³ causingTurn´³refµ„³TurnId„„´³named³amount´³atom³Double„„„„„„µ±external´³rec´³lit³external„´³tupleµ´³named³ description³any„„„„„„„³ TurnEvent´³orµµ±assert´³rec´³lit³assert„´³tupleµ´³named³ assertion´³refµ„³AssertionDescription„„´³named³handle´³refµ³protocol„³Handle„„„„„„µ±retract´³rec´³lit³retract„´³tupleµ´³named³handle´³refµ³protocol„³Handle„„„„„„µ±message´³rec´³lit³message„´³tupleµ´³named³body´³refµ„³AssertionDescription„„„„„„µ±sync´³rec´³lit³sync„´³tupleµ´³named³peer´³refµ„³Target„„„„„„µ± breakLink´³rec´³lit³
break-link„´³tupleµ´³named³source´³refµ„³ActorId„„´³named³handle´³refµ³protocol„³Handle„„„„„„„„³
ExitStatus´³orµµ±ok´³lit³ok„„µ±Error´³refµ³protocol„³Error„„„„³
@ -40,5 +40,5 @@ ByteString
RunService´³rec´³lit³ run-service„´³tupleµ´³named³ serviceName³any„„„„³ ServiceState´³rec´³lit³ service-state„´³tupleµ´³named³ serviceName³any„´³named³state´³refµ„³State„„„„„³ ServiceObject´³rec´³lit³service-object„´³tupleµ´³named³ serviceName³any„´³named³object³any„„„„³RequireService´³rec´³lit³require-service„´³tupleµ´³named³ serviceName³any„„„„³RestartService´³rec´³lit³restart-service„´³tupleµ´³named³ serviceName³any„„„„³ServiceDependency´³rec´³lit³
depends-on„´³tupleµ´³named³depender³any„´³named³dependee´³refµ„³ ServiceState„„„„„„³ embeddedType´³refµ³ EntityRef„³Cap„„„µ³protocol„´³schema·³version°³ definitions·³Oid´³atom³ SignedInteger„³Sync´³rec´³lit³S„´³tupleµ´³named³peer´³embedded´³lit<69>„„„„„„³Turn´³seqof´³refµ„³ TurnEvent„„³Error´³rec´³lit³error„´³tupleµ´³named³message´³atom³String„„´³named³detail³any„„„„³Event´³orµµ±Assert´³refµ„³Assert„„µ±Retract´³refµ„³Retract„„µ±Message´³refµ„³Message„„µ±Sync´³refµ„³Sync„„„„³Assert´³rec´³lit³A„´³tupleµ´³named³ assertion´³refµ„³ Assertion„„´³named³handle´³refµ„³Handle„„„„„³Handle´³atom³ SignedInteger„³Packet´³orµµ±Turn´³refµ„³Turn„„µ±Error´³refµ„³Error„„µ± Extension´³refµ„³ Extension„„„„³Message´³rec´³lit³M„´³tupleµ´³named³body´³refµ„³ Assertion„„„„„³Retract´³rec´³lit³R„´³tupleµ´³named³handle´³refµ„³Handle„„„„„³ Assertion³any³ Extension´³rec´³named³label³any„´³named³fields´³seqof³any„„„³ TurnEvent´³tupleµ´³named³oid´³refµ„³Oid„„´³named³event´³refµ„³Event„„„„„³ embeddedType€„„µ³ dataspace„´³schema·³version°³ definitions·³Observe´³rec´³lit³Observe„´³tupleµ´³named³pattern´³refµ³dataspacePatterns„³Pattern„„´³named³observer´³embedded³any„„„„„„³ embeddedType´³refµ³ EntityRef„³Cap„„„µ³
gatekeeper„´³schema·³version°³ definitions·³Bind´³rec´³lit³bind„´³tupleµ´³named³ description´³refµ„³ Description„„´³named³target´³embedded³any„„´³named³observer´³refµ„³ BindObserver„„„„„³Step´³rec´³named³stepType´³atom³Symbol„„´³tupleµ´³named³detail³any„„„„³Bound´³orµµ±bound´³rec´³lit³bound„´³tupleµ´³named³pathStep´³refµ„³PathStep„„„„„„µ±Rejected´³refµ„³Rejected„„„„³Route´³rec´³lit³route„´³ tuplePrefixµ´³named³
transports´³seqof³any„„„´³named³ pathSteps´³seqof´³refµ„³PathStep„„„„„³Resolve´³rec´³lit³resolve„´³tupleµ´³named³step´³refµ„³Step„„´³named³observer´³embedded´³refµ„³Resolved„„„„„„³PathStep´³rec´³named³stepType´³atom³Symbol„„´³tupleµ´³named³detail³any„„„„³Rejected´³rec´³lit³rejected„´³tupleµ´³named³detail³any„„„„³Resolved´³orµµ±accepted´³rec´³lit³accepted„´³tupleµ´³named³responderSession´³embedded³any„„„„„„µ±Rejected´³refµ„³Rejected„„„„³ Description´³rec´³named³stepType´³atom³Symbol„„´³tupleµ´³named³detail³any„„„„³ ResolvePath´³rec´³lit³ resolve-path„´³tupleµ´³named³route´³refµ„³Route„„´³named³addr³any„´³named³control´³embedded´³refµ„³TransportControl„„„´³named³resolved´³refµ„³Resolved„„„„„³ BindObserver´³orµµ±present´³embedded´³refµ„³Bound„„„µ±absent´³lit€„„„„³ForceDisconnect´³rec´³lit³force-disconnect„´³tupleµ„„„³ResolvedPathStep´³rec´³lit³ path-step„´³tupleµ´³named³origin´³embedded´³refµ„³Resolve„„„´³named³pathStep´³refµ„³PathStep„„´³named³resolved´³refµ„³Resolved„„„„„³TransportControl´³refµ„³ForceDisconnect„³TransportConnection´³rec´³lit³connect-transport„´³tupleµ´³named³addr³any„´³named³control´³embedded´³refµ„³TransportControl„„„´³named³resolved´³refµ„³Resolved„„„„„„³ embeddedType´³refµ³ EntityRef„³Cap„„„µ³transportAddress„´³schema·³version°³ definitions·³Tcp´³rec´³lit³tcp„´³tupleµ´³named³host´³atom³String„„´³named³port´³atom³ SignedInteger„„„„„³Unix´³rec´³lit³unix„´³tupleµ´³named³path´³atom³String„„„„„³Stdio´³rec´³lit³stdio„´³tupleµ„„„³ WebSocket´³rec´³lit³ws„´³tupleµ´³named³url´³atom³String„„„„„„³ embeddedType€„„µ³dataspacePatterns„´³schema·³version°³ definitions·³DLit´³rec´³lit³lit„´³tupleµ´³named³value´³refµ„³AnyAtom„„„„„³DBind´³rec´³lit³bind„´³tupleµ´³named³pattern´³refµ„³Pattern„„„„„³AnyAtom´³orµµ±bool´³atom³Boolean„„µ±double´³atom³Double„„µ±int´³atom³ SignedInteger„„µ±string´³atom³String„„µ±bytes´³atom³
ByteString„„µ±symbol´³atom³Symbol„„µ±embedded´³embedded³any„„„„³Pattern´³orµµ±DDiscard´³refµ„³DDiscard„„µ±DBind´³refµ„³DBind„„µ±DLit´³refµ„³DLit„„µ± DCompound´³refµ„³ DCompound„„„„³DDiscard´³rec´³lit³_„´³tupleµ„„„³ DCompound´³orµµ±rec´³rec´³lit³rec„´³tupleµ´³named³label³any„´³named³fields´³seqof´³refµ„³Pattern„„„„„„„µ±arr´³rec´³lit³arr„´³tupleµ´³named³items´³seqof´³refµ„³Pattern„„„„„„„µ±dict´³rec´³lit³dict„´³tupleµ´³named³entries´³dictof³any´³refµ„³Pattern„„„„„„„„„„³ embeddedType´³refµ³ EntityRef„³Cap„„„„„
transports´³seqof³any„„„´³named³ pathSteps´³seqof´³refµ„³PathStep„„„„„³Resolve´³rec´³lit³resolve„´³tupleµ´³named³step´³refµ„³Step„„´³named³observer´³embedded´³refµ„³Resolved„„„„„„³PathStep´³rec´³named³stepType´³atom³Symbol„„´³tupleµ´³named³detail³any„„„„³Rejected´³rec´³lit³rejected„´³tupleµ´³named³detail³any„„„„³Resolved´³orµµ±accepted´³rec´³lit³accepted„´³tupleµ´³named³responderSession´³embedded³any„„„„„„µ±Rejected´³refµ„³Rejected„„„„³ Description´³rec´³named³stepType´³atom³Symbol„„´³tupleµ´³named³detail³any„„„„³ ResolvePath´³rec´³lit³ resolve-path„´³tupleµ´³named³route´³refµ„³Route„„´³named³addr³any„´³named³control´³embedded´³refµ„³TransportControl„„„´³named³resolved´³refµ„³Resolved„„„„„³ BindObserver´³orµµ±present´³embedded´³refµ„³Bound„„„µ±absent´³lit€„„„„³ForceDisconnect´³rec´³lit³force-disconnect„´³tupleµ„„„³ResolvedPathStep´³rec´³lit³ path-step„´³tupleµ´³named³origin´³embedded´³refµ„³Resolve„„„´³named³pathStep´³refµ„³PathStep„„´³named³resolved´³refµ„³Resolved„„„„„³TransportControl´³refµ„³ForceDisconnect„³TransportConnection´³rec´³lit³connect-transport„´³tupleµ´³named³addr³any„´³named³control´³embedded´³refµ„³TransportControl„„„´³named³resolved´³refµ„³Resolved„„„„„„³ embeddedType´³refµ³ EntityRef„³Cap„„„µ³transportAddress„´³schema·³version°³ definitions·³Tcp´³rec´³lit³tcp„´³tupleµ´³named³host´³atom³String„„´³named³port´³atom³ SignedInteger„„„„„³Unix´³rec´³lit³unix„´³tupleµ´³named³path´³atom³String„„„„„³Stdio´³rec´³lit³stdio„´³tupleµ„„„³ WebSocket´³rec´³lit³ws„´³tupleµ´³named³url´³atom³String„„„„„„³ embeddedType€„„µ³dataspacePatterns„´³schema·³version°³ definitions·³AnyAtom´³orµµ±bool´³atom³Boolean„„µ±double´³atom³Double„„µ±int´³atom³ SignedInteger„„µ±string´³atom³String„„µ±bytes´³atom³
ByteString„„µ±symbol´³atom³Symbol„„µ±embedded´³embedded³any„„„„³Pattern´³orµµ±discard´³rec´³lit³_„´³tupleµ„„„„µ±bind´³rec´³lit³bind„´³tupleµ´³named³pattern´³refµ„³Pattern„„„„„„µ±lit´³rec´³lit³lit„´³tupleµ´³named³value´³refµ„³AnyAtom„„„„„„µ±group´³rec´³lit³group„´³tupleµ´³named³type´³refµ„³ GroupType„„´³named³entries´³dictof³any´³refµ„³Pattern„„„„„„„„„³ GroupType´³orµµ±rec´³rec´³lit³rec„´³tupleµ´³named³label³any„„„„„µ±arr´³rec´³lit³arr„´³tupleµ„„„„µ±dict´³rec´³lit³dict„´³tupleµ„„„„„„„³ embeddedType´³refµ³ EntityRef„³Cap„„„„„

View File

@ -1,15 +1,23 @@
version 1 .
embeddedType EntityRef.Cap .
# Dataspace patterns: a sublanguage of attenuation patterns.
Pattern = DDiscard / DBind / DLit / DCompound .
# Dataspace patterns: *almost* a sublanguage of attenuation patterns.
#
# One key difference is that Dataspace patterns are extensible, in that
# they ignore fields not mentioned in group patterns.
DDiscard = <_>.
DBind = <bind @pattern Pattern>.
DLit = <lit @value AnyAtom>.
DCompound = <rec @label any @fields [Pattern ...]>
/ <arr @items [Pattern ...]>
/ <dict @entries { any: Pattern ...:... }> .
Pattern =
/ @discard <_>
/ <bind @pattern Pattern>
/ <lit @value AnyAtom>
/ <group @type GroupType @entries { any: Pattern ...:... }>
.
GroupType =
/ <rec @label any>
/ <arr>
/ <dict>
.
AnyAtom =
/ @bool bool

View File

@ -13,8 +13,37 @@ Step = <<rec> @stepType symbol [@detail any]> .
# ---------------------------------------------------------------------------
# Protocol at dataspaces *associated* with gatekeeper entities
# Assertion. Gatekeeper will compute an appropriate PathStep from `description` pointing at
# `target`, and will respond with a `Bound` to `observer` (if supplied).
# ## Handling `Resolve` requests
#
# When the gatekeeper entity receives a `Resolve` assertion (call it R1), it
#
# 1. asserts a `Resolve` (call it R2) into its associated dataspace that
# is the same as R1 except it has a different `observer`; and
#
# 2. observes a `Bind` with `description` matching the `step` of R1/R2
# according to `stepType` (e.g. treatment of SturdyStepType is not the
# same as treatment of NoiseStepType).
#
# Normally, an appropriate `Bind` is expected to exist. If the gatekeeper
# sees the `Bind` first, it takes the `target` from it and does whatever
# `stepType` mandates before replying to R1's observer.
#
# However, if a `Resolved` is asserted to R2's observer before a `Bind`
# appears, that resolution is relayed on to R1's observer directly, be it
# positive or negative, and the gatekeeper stops waiting for a `Bind`.
#
# This way, entities can keep an eye out for `Resolve` requests that will
# never complete, and answer `Rejected` to them even when no matching
# `Bind` exists. Entities could also use `Resolve` requests to synthesize a
# `Bind` in a "just-in-time" fashion.
#
# ## General treatment of `Bind` assertions
#
# When the gatekeeper sees a `Bind`, independently of any potential
# `Resolve` requests, it computes an appropriate PathStep from
# `description` pointing at `target`, and responds with a `Bound` to
# `observer` (if supplied).
#
Bind = <bind @description Description @target #:any @observer BindObserver> .
Description = <<rec> @stepType symbol [@detail any]> .
BindObserver = @present #:Bound / @absent #f .

View File

@ -21,7 +21,7 @@ MethodPattern = @any #f / @specific @"Lowercase" symbol .
# Assertion in driver DS
HttpRequest = <http-request
@sequenceNumber int
@host string
@host RequestHost
@port int
@method @"Lowercase" symbol
@path [string ...]
@ -32,13 +32,24 @@ HttpRequest = <http-request
Headers = {@"Lowercase" symbol: string ...:...} .
QueryValue = @string string / <file @filename string @headers Headers @body bytes> .
RequestBody = @present bytes / @absent #f .
RequestHost = @present string / @absent #f .
# Assertion to handler entity
HttpContext = <request @req HttpRequest @res #:HttpResponse> .
# HttpResponse protocol. Delivered to the `res` ref in `HttpContext`.
#
# (status | header)* . chunk* . done
#
# Done triggers completion of the response and retraction of the frame by the peer. If the
# HttpBinding responsible for the request is withdrawn mid-way through a response (i.e. when
# chunked transfer is used and at least one chunk has been sent) the request is abruptly
# closed; if it is withdrawn at any other moment in the lifetime of the request, a 500 Internal
# Server Error is send to the client.
#
@<TODO "trailers?">
# Messages
HttpResponse =
# Messages.
/ <status @code int @message string>
/ <header @name symbol @value string>
/ <chunk @chunk Chunk>

View File

@ -1,4 +1,5 @@
version 1 .
embeddedType EntityRef.Cap .
# https://noiseprotocol.org/
@ -42,13 +43,30 @@ DefaultProtocol = "Noise_NK_25519_ChaChaPoly_BLAKE2s" .
# sequence is exhausted or not supplied, an all-zeros key is used each time a PSK is needed.
NoisePreSharedKeys = @present { preSharedKeys: [bytes ...] } / @invalid { preSharedKeys: any } / @absent {} .
# Sessions proceed by sending Packets to the initiatorSession and responderSession according to
# the Noise protocol definition. Each Packet represents a complete logical unit of
# ---------------------------------------------------------------------------
# Handshaking and running a session
# 1. initiator asserts <resolve <noise ServiceSelector> #:A> at Gatekeeper
# 2. gatekeeper asserts <accepted #:B> at #:A
# 3. initiator asserts <initiator #:C> at #:B and then sends `Packet`s to #:B
# 4. responder sends `Packet`s to #:C
#
# Sessions begin with introduction of initiator (#:C) and responder (#:B) to each other, and
# then proceed by sending `Packet`s (from #:C) to #:B and (from #:B) to #:C according to
# the Noise protocol definition. Each `Packet` represents a complete logical unit of
# communication; for example, a complete Turn when layering the Syndicate protocol over Noise.
# Note well the restriction on Noise messages: no individual complete packet or packet fragment
# may exceed 65535 bytes (N.B. not 65536!). When `fragmented`, each portion of a Packet is a
# may exceed 65535 bytes (N.B. not 65536!). When `fragmented`, each portion of a `Packet` is a
# complete Noise "transport message"; when `complete`, the whole thing is likewise a complete
# "transport message".
#
# Retraction of the `Initiator` ends the session from the initiator-side; retraction of the
# `<accepted ...>` assertion ends the session from the responder-side.
SessionItem = Initiator / Packet .
# Assertion
Initiator = <initiator @initiatorSession #:Packet> .
# Message
Packet = @complete bytes / @fragmented [bytes ...] .
# When layering Syndicate protocol over noise,

View File

@ -1,7 +1,7 @@
/// SPDX-License-Identifier: GPL-3.0-or-later
/// SPDX-FileCopyrightText: Copyright © 2016-2024 Tony Garnock-Jones <tonyg@leastfixedpoint.com>
import { IdentitySet, Value, embeddedId, is, fromJS, stringify, Dictionary, KeyedSet, Tuple, Embeddable } from '@preserves/core';
import { IdentitySet, Value, embeddedId, is, fromJS, stringify, KeyedSet, Tuple, Embeddable, IsEmbedded } from '@preserves/core';
import { Cell, Field, Graph } from './dataflow.js';
import { Caveat, runRewrites } from './rewrite.js';
import { ActorSpace } from './space.js';
@ -40,6 +40,8 @@ export interface Entity {
export type Cap = Ref;
export class Ref {
get [IsEmbedded](): true { return true; }
readonly relay: Facet;
readonly target: Partial<Entity>;
readonly attenuation?: Caveat[];
@ -64,7 +66,7 @@ export class Ref {
}
static __from_preserve__(v: AnyValue): undefined | Ref {
return typeof v === 'object' && 'relay' in v ? v : void 0;
return typeof v === 'object' && IsEmbedded in v && 'relay' in v ? v : void 0;
}
}
@ -223,7 +225,7 @@ export class Facet {
const h = nextHandle++;
const e = {
handle: h,
peer: { relay: other, target: new StopOnRetract() },
peer: new Ref(other, new StopOnRetract()),
crossSpace: null,
established: true,
};
@ -401,7 +403,7 @@ export class Turn {
});
},
() => {
const a = new KeyedSet<number, Ref>();
const a = new KeyedSet<Ref, number>();
initialAssertions.forEach(h => a.add(h));
return Q.ActionDescription.spawnActor({ detail, initialAssertions: a });
});
@ -430,10 +432,10 @@ export class Turn {
crash(err: Error): void {
this.enqueue(this.activeFacet.actor.root,
() => this.activeFacet.actor._terminateWith({ ok: false, err }),
() => Q.ActionDescription.stopActor(Q.OptionalAny.some(Dictionary.fromJS({
() => Q.ActionDescription.stopActor(Q.OptionalAny.some<Ref>({
message: err.message,
stack: err.stack ? err.stack : false,
}))));
})));
}
field<V>(initial: V, name?: string): Field<V> {

View File

@ -13,9 +13,9 @@ export enum ChangeDescription {
}
export class Bag<T extends Embeddable, V extends Value<T> = Value<T>> {
_items: KeyedDictionary<V, number, T>;
_items: KeyedDictionary<T, V, number>;
constructor(s?: KeyedSet<V, T>) {
constructor(s?: KeyedSet<T, V>) {
this._items = new KeyedDictionary();
if (s) s.forEach((v) => this._items.set(v, 1));
}
@ -68,7 +68,7 @@ export class Bag<T extends Embeddable, V extends Value<T> = Value<T>> {
this._items.forEach((c, v) => f(c, v));
}
snapshot(): KeyedDictionary<V, number, T> {
snapshot(): KeyedDictionary<T, V, number> {
return this._items.clone();
}

View File

@ -1,7 +1,7 @@
/// SPDX-License-Identifier: GPL-3.0-or-later
/// SPDX-FileCopyrightText: Copyright © 2016-2024 Tony Garnock-Jones <tonyg@leastfixedpoint.com>
import { IdentityMap, KeyedDictionary, stringify } from '@preserves/core';
import { IdentityMap, KeyedDictionary, stringify, strip } from '@preserves/core';
import { Index, IndexObserver } from './skeleton.js';
import { Actor, AnyValue, Assertion, DetailedAction, Entity, Facet, Handle, LocalAction, Ref, Turn } from './actor.js';
import { Observe, toObserve } from '../gen/dataspace.js';
@ -16,7 +16,7 @@ export type DataspaceOptions = {
};
export class DataspaceObserver implements IndexObserver<Turn> {
readonly captureMap = new KeyedDictionary<Array<AnyValue>, Handle, Ref>();
readonly captureMap = new KeyedDictionary<Ref, Array<AnyValue>, Handle>();
constructor(
public readonly target: Ref,
@ -46,17 +46,16 @@ export class DataspaceObserver implements IndexObserver<Turn> {
}
export class Dataspace implements Partial<Entity> {
private static _global: Ref | undefined = void 0;
private static _local: Ref | undefined = void 0;
static get global(): Ref {
if (Dataspace._global === void 0) {
static get local(): Ref {
if (Dataspace._local === void 0) {
Dataspace.boot(ds => {
Turn.activeFacet.actor.name = Symbol.for('Dataspace.global');
// Cast to any because `global` is otherwise readonly (!)
Dataspace._global = ds;
Turn.activeFacet.actor.name = Symbol.for('Dataspace.local');
Dataspace._local = ds;
});
}
return Dataspace._global!;
return Dataspace._local!;
}
// Alias for syndicatec code generator to use, plus hook for fallback use outside a Turn
@ -73,14 +72,14 @@ export class Dataspace implements Partial<Entity> {
if (Turn.active) {
return Turn.active._spawn(bootProc);
} else {
return Actor.boot(bootProc, void 0, Dataspace.global.relay.actor.space);
return Actor.boot(bootProc, void 0, Dataspace.local.relay.actor.space);
}
}
readonly options: DataspaceOptions;
readonly index = new Index();
readonly handleMap = new IdentityMap<Handle, Assertion>();
readonly observerMap = new IdentityMap<Ref, DataspaceObserver>();
readonly observerMap = new KeyedDictionary<Ref, Observe, DataspaceObserver>();
readonly data = this;
constructor(options?: DataspaceOptions) {
@ -91,12 +90,11 @@ export class Dataspace implements Partial<Entity> {
const is_new = this.index.addAssertion(v, Turn.active);
this.options.tracer?.('+', v, this, is_new);
if (is_new) {
const o = toObserve(v);
const o = toObserve(strip(v));
if (o !== void 0) {
const target = o.observer;
const observer = new DataspaceObserver(target);
this.observerMap.set(target, observer);
this.index.addObserver(o.pattern, observer, Turn.active);
const io = new DataspaceObserver(o.observer);
this.observerMap.set(o, io);
this.index.addObserver(o.pattern, io, Turn.active);
}
if (this.options.dumpIndex ?? false) this.index.dump();
}
@ -110,12 +108,12 @@ export class Dataspace implements Partial<Entity> {
const is_last = this.index.removeAssertion(v, Turn.active);
this.options.tracer?.('-', v, this, is_last);
if (is_last) {
const o = toObserve(v);
const o = toObserve(strip(v));
if (o !== void 0) {
const io = this.observerMap.get(o.observer);
const io = this.observerMap.get(o);
if (io !== void 0) {
this.index.removeObserver(o.pattern, io, Turn.active);
this.observerMap.delete(o.observer);
this.observerMap.delete(o);
}
}
if (this.options.dumpIndex ?? false) this.index.dump();

View File

@ -1,7 +1,7 @@
/// SPDX-License-Identifier: GPL-3.0-or-later
/// SPDX-FileCopyrightText: Copyright © 2016-2024 Tony Garnock-Jones <tonyg@leastfixedpoint.com>
import { canonicalString, KeyedDictionary, Dictionary, is, Record, RecordConstructorInfo, Value, CompoundKey, _iterMap } from '@preserves/core';
import { canonicalString, KeyedDictionary, is, Record, RecordConstructorInfo, Value, _iterMap, DictionaryMap, Dictionary, EncodableDictionary, unannotate } from '@preserves/core';
import { AnyValue, Ref } from './actor.js';
import * as P from '../gen/dataspacePatterns.js';
@ -10,23 +10,24 @@ export type Path = Array<AnyValue>;
export type Shape = string;
export function classOfValue(v: any): Shape | null {
v = unannotate(v);
if (Record.isRecord(v)) {
return constructorInfoSignature(Record.constructorInfo(v));
} else if (Array.isArray(v)) {
return '' + v.length;
} else if (Map.isMap(v)) {
return '[]';
} else if (Dictionary.isDictionary(v)) {
return '{}';
} else {
return null;
}
}
export function classOfCtor(v: P.DCompound): Shape {
export function classOfCtor(v: P.GroupType): Shape {
switch (v._variant) {
case 'rec':
return canonicalString(v.label) + '/' + v.fields.length;
return canonicalString(v.label);
case 'arr':
return '' + v.items.length;
return '[]';
case 'dict':
return '{}';
}
@ -34,55 +35,60 @@ export function classOfCtor(v: P.DCompound): Shape {
// Called by generated code in addition to functions in this module
export function constructorInfoSignature(ci: RecordConstructorInfo<Value>): string {
return canonicalString(ci.label) + '/' + ci.arity;
return canonicalString(ci.label);
}
export function step(v: AnyValue, index: AnyValue): AnyValue | undefined {
if (Map.isMap(v)) {
return v.get(index);
v = unannotate(v);
const vMap = Dictionary.asMap<Ref>(v);
if (vMap) {
return vMap.get(index);
} else {
return (v as Array<AnyValue> /* includes Record! */)[index as number];
}
}
export type ConstantPositions = {
withValues: Array<Path>,
requiredToExist: Array<Path>,
}
export type PatternAnalysis = {
constPaths: Array<Path>,
constPositions: ConstantPositions,
constValues: Array<AnyValue>,
capturePaths: Array<Path>,
};
export function analysePattern(p: P.Pattern): PatternAnalysis {
const result: PatternAnalysis = {
constPaths: [],
constPositions: {
withValues: [],
requiredToExist: [],
},
constValues: [],
capturePaths: [],
};
const path: Path = [];
function walkKey(p: P.Pattern, key: AnyValue) {
path.push(key);
walk(p);
path.pop();
}
function walk(p: P.Pattern) {
switch (p._variant) {
case 'DCompound':
switch (p.value._variant) {
case 'rec': p.value.fields.forEach(walkKey); break;
case 'arr': p.value.items.forEach(walkKey); break;
case 'dict': p.value.entries.forEach(walkKey); break;
}
case 'group':
p.entries.forEach((p, k) => {
path.push(k);
walk(p);
path.pop();
});
break;
case 'DBind':
case 'bind':
result.capturePaths.push(path.slice());
walk(p.value.pattern);
walk(p.pattern);
break;
case 'DDiscard':
case 'discard':
result.constPositions.requiredToExist.push(path.slice());
break;
case 'DLit':
result.constPaths.push(path.slice());
result.constValues.push(P.fromAnyAtom(p.value.value));
case 'lit':
result.constPositions.withValues.push(path.slice());
result.constValues.push(P.fromAnyAtom(p.value));
break;
}
}
@ -96,32 +102,20 @@ export function match(p: P.Pattern, v: AnyValue): Array<AnyValue> | false {
function walk(p: P.Pattern, v: AnyValue): boolean {
switch (p._variant) {
case 'DBind': {
case 'bind': {
captures.push(v);
return walk(p.value.pattern, v);
return walk(p.pattern, v);
}
case 'DDiscard':
case 'discard':
return true;
case 'DLit':
return is(p.value.value, v);
case 'DCompound': {
const pcls = classOfCtor(p.value);
case 'lit':
return is(p.value, v);
case 'group': {
const pcls = classOfCtor(p.type);
const vcls = classOfValue(v);
if (pcls !== vcls) return false;
let items: Array<P.Pattern>;
switch (p.value._variant) {
case 'dict':
for (const [stepIndex, pp] of p.value.entries.entries()) {
const vv = step(v, stepIndex);
if (vv === void 0 || !walk(pp, vv)) return false;
}
return true;
case 'rec': items = p.value.fields; break;
case 'arr': items = p.value.items; break;
}
let index = 0;
for (const pp of items) {
const vv = step(v, index++);
for (const [stepIndex, pp] of p.entries.entries()) {
const vv = step(v, stepIndex);
if (vv === void 0 || !walk(pp, vv)) return false;
}
return true;
@ -135,19 +129,14 @@ export function match(p: P.Pattern, v: AnyValue): Array<AnyValue> | false {
export function isCompletelyConcrete(p: P.Pattern): boolean {
function walk(p: P.Pattern): boolean {
switch (p._variant) {
case 'DBind': return false;
case 'DDiscard': return false;
case 'DLit': return true;
case 'DCompound': switch (p.value._variant) {
case 'rec': return p.value.fields.every(isCompletelyConcrete);
case 'arr': return p.value.items.every(isCompletelyConcrete);
case 'dict': {
for (const pp of p.value.entries.values()) {
if (!walk(pp)) return false;
}
return true;
case 'bind': return false;
case 'discard': return false;
case 'lit': return true;
case 'group':
for (const pp of p.entries.values()) {
if (!walk(pp)) return false;
}
}
return true;
}
}
return walk(p);
@ -156,26 +145,19 @@ export function isCompletelyConcrete(p: P.Pattern): boolean {
export function withoutCaptures(p: P.Pattern): P.Pattern {
function walk(p: P.Pattern): P.Pattern {
switch (p._variant) {
case 'DBind': return walk(p.value.pattern);
case 'DDiscard': return p;
case 'DLit': return p;
case 'DCompound':
switch (p.value._variant) {
case 'rec':
return P.Pattern.DCompound(P.DCompound.rec({
label: p.value.label,
fields: p.value.fields.map(walk),
}));
case 'arr':
return P.Pattern.DCompound(P.DCompound.arr(p.value.items.map(walk)));
case 'dict': {
const newDict = new KeyedDictionary<Value<Ref>, P.Pattern<Ref>, Ref>();
for (const [k, v] of p.value.entries) {
newDict.set(k, walk(v));
}
return P.Pattern.DCompound(P.DCompound.dict(newDict));
}
case 'bind': return walk(p.pattern);
case 'discard': return p;
case 'lit': return p;
case 'group': {
const newEntries = new KeyedDictionary<Ref, Value<Ref>, P.Pattern<Ref>>();
for (const [kk, pp] of p.entries) {
newEntries.set(kk, walk(pp));
}
return P.Pattern.group({
type: p.type,
entries: newEntries,
});
}
}
}
return walk(p);
@ -185,57 +167,92 @@ export function withoutCaptures(p: P.Pattern): P.Pattern {
// Constructor helpers
export function bind(p?: P.Pattern): P.Pattern {
return P.Pattern.DBind(P.DBind(p ?? _));
return P.Pattern.bind(p ?? _);
}
export function discard(): P.Pattern {
return P.Pattern.DDiscard(P.DDiscard());
return P.Pattern.discard();
}
export const _ = discard();
function lit_seq_entries(vs: AnyValue[]): KeyedDictionary<Ref, AnyValue, P.Pattern<Ref>> {
const entries = new KeyedDictionary<Ref, AnyValue, P.Pattern<Ref>>();
vs.forEach((v, i) => entries.set(i, lit(v)));
return entries;
}
export function lit(v: AnyValue): P.Pattern {
if (Array.isArray(v)) {
if ('label' in v) {
return P.Pattern.DCompound(P.DCompound.rec({
label: v.label,
fields: v.map(lit),
}));
return P.Pattern.group({
type: P.GroupType.rec(v.label),
entries: lit_seq_entries(v),
});
} else {
return P.Pattern.DCompound(P.DCompound.arr(v.map(lit)));
return P.Pattern.group({
type: P.GroupType.arr(),
entries: lit_seq_entries(v),
});
}
} else if (Map.isMap(v)) {
return P.Pattern.DCompound(P.DCompound.dict(v.mapEntries(
e => [e[0], lit(e[1])])));
} else if (Set.isSet(v)) {
throw new Error("Cannot express literal set in pattern");
} else {
return P.Pattern.DLit(P.DLit(P.asAnyAtom(v)));
}
const vMap = Dictionary.asMap<Ref>(v);
if (vMap) {
const r = new KeyedDictionary<Ref, AnyValue, P.Pattern>();
vMap.forEach((val, key) => r.set(key, lit(val)));
return P.Pattern.group({
type: P.GroupType.dict(),
entries: r,
});
}
if (Set.isSet(v)) {
throw new Error("Cannot express literal set in pattern");
}
return P.Pattern.lit(P.asAnyAtom(v));
}
export function drop_lit(p: P.Pattern): AnyValue | null {
const e = new Error();
function walkEntries(target: AnyValue[], entries: EncodableDictionary<Ref, AnyValue, P.Pattern<Ref>>): void {
let maxKey = -1;
for (const key of entries.keys()) {
if (typeof key !== 'number') throw e;
maxKey = Math.max(maxKey, key);
}
for (let i = 0; i < maxKey + 1; i++) {
const p = entries.get(i);
if (p === void 0) throw e;
target.push(walk(p));
}
}
function walk(p: P.Pattern): AnyValue {
switch (p._variant) {
case 'DCompound':
switch (p.value._variant) {
case 'group':
switch (p.type._variant) {
case 'rec': {
const v = [] as unknown as Record<AnyValue, AnyValue[], Ref>;
v.label = p.value.label;
p.value.fields.forEach(tt => v.push(walk(tt)));
v.label = p.type.label;
walkEntries(v, p.entries);
return v;
}
case 'arr':
return p.value.items.map(walk);
case 'dict': {
const v = new Dictionary<Ref, AnyValue>();
p.value.entries.forEach((pp, key) => v.set(key, walk(pp)));
case 'arr': {
const v = [] as AnyValue[];
walkEntries(v, p.entries);
return v;
}
case 'dict': {
const v = new DictionaryMap<Ref, AnyValue>();
p.entries.forEach((pp, key) => v.set(key, walk(pp)));
return v.simplifiedValue();
}
}
case 'DLit':
return P.fromAnyAtom(p.value.value);
case 'lit':
return P.fromAnyAtom(p.value);
default:
throw e;
}
@ -249,13 +266,22 @@ export function drop_lit(p: P.Pattern): AnyValue | null {
}
export function rec(label: AnyValue, ... fields: P.Pattern[]): P.Pattern {
return P.Pattern.DCompound(P.DCompound.rec({ label, fields }));
return P.Pattern.group({
type: P.GroupType.rec(label),
entries: new KeyedDictionary<Ref, AnyValue, P.Pattern>(fields.map((p, i) => [i, p])),
});
}
export function arr(... patterns: P.Pattern[]): P.Pattern {
return P.Pattern.DCompound(P.DCompound.arr(patterns));
return P.Pattern.group({
type: P.GroupType.arr(),
entries: new KeyedDictionary<Ref, AnyValue, P.Pattern>(patterns.map((p, i) => [i, p])),
});
}
export function dict(... entries: [AnyValue, P.Pattern][]): P.Pattern {
return P.Pattern.DCompound(P.DCompound.dict(new Dictionary<Ref, P.Pattern>(entries)));
return P.Pattern.group({
type: P.GroupType.dict(),
entries: new KeyedDictionary<Ref, AnyValue, P.Pattern>(entries),
});
}

View File

@ -2,9 +2,9 @@
/// SPDX-FileCopyrightText: Copyright © 2021-2024 Tony Garnock-Jones <tonyg@leastfixedpoint.com>
import { AnyValue, Ref } from './actor.js';
import { Pattern, toPattern } from '../gen/dataspacePatterns.js';
import { Pattern, toPattern, GroupType, fromGroupType } from '../gen/dataspacePatterns.js';
import * as P from './pattern.js';
import { RecordConstructorInfo, is, Record } from '@preserves/core';
import { RecordConstructorInfo, is, Record, JsDictionary } from '@preserves/core';
import { Meta, Type, GenType, SchemaDefinition } from '@preserves/schema';
export type QuasiValueConstructorInfo =
@ -17,9 +17,7 @@ export type QuasiValue =
| { type: 'bind', inner: QuasiValue }
| { type: 'discard' }
| { type: 'lit', value: AnyValue }
| { type: 'rec', label: AnyValue, items: QuasiValue[] }
| { type: 'arr', items: QuasiValue[] }
| { type: 'dict', entries: [AnyValue, QuasiValue][] }
| { type: 'group', groupType: GroupType, entries: [AnyValue, QuasiValue][] }
| { type: 'unquote', unquoted: QuasiValue }
;
@ -58,7 +56,8 @@ export function rec(label: AnyValue, ... items: QuasiValue[]): QuasiValue {
if (literals.length === items.length) {
return lit(Record(label, literals));
} else {
return { type: 'rec', label, items };
const entries = items.map((v, i) => [i, v] as [number, QuasiValue]);
return { type: 'group', groupType: GroupType.rec(label), entries };
}
}
@ -67,12 +66,13 @@ export function arr(... items: QuasiValue[]): QuasiValue {
if (literals.length === items.length) {
return lit(literals);
} else {
return { type: 'arr', items };
const entries = items.map((v, i) => [i, v] as [number, QuasiValue]);
return { type: 'group', groupType: GroupType.arr(), entries };
}
}
export function dict(... entries: [AnyValue, QuasiValue][]): QuasiValue {
return { type: 'dict', entries };
return { type: 'group', groupType: GroupType.dict(), entries };
}
export function quote(quoted: QuasiValue): QuasiValue {
@ -80,12 +80,9 @@ export function quote(quoted: QuasiValue): QuasiValue {
case 'bind': return quote(bind.quasiValue(quoted.inner));
case 'discard': return quote(discard.quasiValue());
case 'lit': return rec(Symbol.for('lit'), lit(quoted.value));
case 'arr': return rec(Symbol.for('arr'), arr(
... quoted.items.map(quote)));
case 'rec': return rec(Symbol.for('rec'), lit(quoted.label), arr(
... quoted.items.map(quote)));
case 'dict': return rec(Symbol.for('dict'), dict(
... quoted.entries.map(([k, qq]) => [k, quote(qq)] as [AnyValue, QuasiValue])));
case 'group':
return rec(Symbol.for('group'), lit(fromGroupType(quoted.groupType)), dict(
... quoted.entries.map(([k, qq]) => [k, quote(qq)] as [AnyValue, QuasiValue])));
case 'unquote': return quoted.unquoted;
}
}
@ -94,13 +91,27 @@ export function unquote(unquoted: QuasiValue): QuasiValue {
return { type: 'unquote', unquoted };
}
function entriesSeq<V>(entries: [AnyValue, V][], defaultValue: V): V[] {
let maxKey = -1;
const result: V[] = [];
for (const [k, q] of entries) {
if (typeof k !== 'number') throw new Error("Invalid sequence quasivalue entries key");
result[k] = q;
maxKey = Math.max(maxKey, k);
}
for (let i = 0; i < maxKey + 1; i++) {
if (result[i] === void 0) result[i] = defaultValue;
}
return result;
}
export function ctor(info: QuasiValueConstructorInfo, ... items: QuasiValue[]): QuasiValue {
if ('constructorInfo' in info) {
return rec(info.constructorInfo.label, ... items);
} else if ('schema' in info) {
const definfo = info.schema();
const schema = Meta.asSchema(definfo.schema);
const def = schema.definitions.get(definfo.definitionName)!;
const def = JsDictionary.get(schema.definitions, definfo.definitionName)!;
const defNameStr = definfo.definitionName.description!;
const ctorArgs = items.slice();
@ -158,7 +169,7 @@ export function ctor(info: QuasiValueConstructorInfo, ... items: QuasiValue[]):
if (d.type === 'discard') {
return d;
}
if (d.type !== 'dict') {
if (d.type !== 'group' || d.groupType._variant !== 'dict') {
throw new Error(`Dictionary argument needed to ${defNameStr}`);
}
for (const [k, p] of d.entries) {
@ -217,8 +228,8 @@ export function ctor(info: QuasiValueConstructorInfo, ... items: QuasiValue[]):
}
function qArr(q: QuasiValue): QuasiValue[] {
if (q.type === 'arr') {
return q.items;
if (q.type === 'group' && q.groupType._variant === 'arr') {
return entriesSeq(q.entries, discard());
} else if (q.type === 'lit' && Array.isArray(q.value)) {
return q.value.map(lit);
} else {
@ -284,10 +295,12 @@ function walk(q: QuasiValue): Pattern {
case 'bind': return P.bind(walk(q.inner));
case 'discard': return P._;
case 'lit': return P.lit(q.value);
case 'arr': return P.arr(... q.items.map(walk));
case 'rec': return P.rec(q.label, ... q.items.map(walk));
case 'dict': return P.dict(... q.entries.map(
([k, qq]) => [k, walk(qq)] as [AnyValue, Pattern]));
case 'group': switch (q.groupType._variant) {
case 'arr': return P.arr(... entriesSeq(q.entries, discard()).map(walk));
case 'rec': return P.rec(q.groupType.label, ... entriesSeq(q.entries, discard()).map(walk));
case 'dict': return P.dict(... q.entries.map(
([k, qq]) => [k, walk(qq)] as [AnyValue, Pattern]));
}
case 'unquote': throw new Error('Unexpected unquote in QuasiValue');
}
}

View File

@ -1,9 +1,9 @@
/// SPDX-License-Identifier: GPL-3.0-or-later
/// SPDX-FileCopyrightText: Copyright © 2016-2024 Tony Garnock-Jones <tonyg@leastfixedpoint.com>
import { Turn } from "./actor.js";
import { Bytes, Dictionary, DoubleFloat, IdentityMap, is, isEmbedded, Record, Tuple, stringify } from "@preserves/core";
import type { Assertion, Handle, Ref } from "./actor.js";
import { Turn, Ref } from "./actor.js";
import { Bytes, Dictionary, DictionaryMap, DoubleFloat, IdentityMap, KeyedDictionary, is, isEmbedded, Record, Tuple, stringify } from "@preserves/core";
import type { Assertion, Handle } from "./actor.js";
import type { SturdyValue } from "../transport/sturdy.js";
import {
@ -19,6 +19,8 @@ import {
PEmbedded,
Pattern,
Rewrite,
TAttenuate,
TCompound,
TRef,
Template,
_embedded,
@ -87,9 +89,10 @@ export function match(p: Pattern, v: Assertion): Bindings | null {
return true;
}
case 'dict':{
if (!Dictionary.isDictionary<Ref, Assertion>(v)) return false;
const vMap = Dictionary.asMap<Ref, Assertion>(v);
if (!vMap) return false;
for (const [key, pp] of p.value.entries.entries()) {
const vv = v.get(key);
const vv = vMap.get(key);
if (vv === void 0) return false;
if (!walk(pp, vv)) return false;
}
@ -134,9 +137,9 @@ export function instantiate(t: Template, b: Bindings): Assertion {
case 'arr':
return t.value.items.map(walk);
case 'dict': {
const v = new Dictionary<Ref, Assertion>();
const v = new DictionaryMap<Ref, Assertion>();
t.value.entries.forEach((tt, key) => v.set(key, walk(tt)));
return v;
return v.simplifiedValue();
}
}
}
@ -191,9 +194,14 @@ export function rfilter(... patterns: Pattern[]): Caveat {
return ps.length === 1 ? Caveat.Rewrite(ps[0]) : Caveat.Alts(Alts(ps));
}
export function rmap(... rewrites: [Pattern, Template][]): Caveat {
const rs = rewrites.map(([pattern, template]) => Rewrite({ pattern, template }));
return rs.length === 1 ? Caveat.Rewrite(rs[0]) : Caveat.Alts(Alts(rs));
}
export function attenuate(ref: Ref, ... a: Caveat[]): Ref {
if (a.length === 0) return ref;
return { ... ref, attenuation: [... (ref.attenuation ?? []), ... a] };
return new Ref(ref.relay, ref.target, [... (ref.attenuation ?? []), ... a]);
}
export function forwarder(ref: Ref): { proxy: Ref, revoker: Ref } {
@ -236,7 +244,7 @@ export function pArr(... items: Array<Pattern>): Pattern {
}
export function pDict(... entries: [SturdyValue, Pattern][]): Pattern {
return Pattern.PCompound(PCompound.dict(new Dictionary<_embedded, Pattern>(entries)));
return Pattern.PCompound(PCompound.dict(new KeyedDictionary<_embedded, SturdyValue, Pattern>(entries)));
}
export function pLit(value: SturdyValue): Pattern {
@ -286,3 +294,27 @@ export function pBoolean(): Pattern {
export function pDiscard(): Pattern {
return Pattern.PDiscard(PDiscard());
}
export function tRec(label: SturdyValue, ... fields: Array<Template>): Template {
return Template.TCompound(TCompound.rec({ label, fields }));
}
export function tArr(... items: Array<Template>): Template {
return Template.TCompound(TCompound.arr(items));
}
export function tDict(... entries: [SturdyValue, Template][]): Template {
return Template.TCompound(TCompound.dict(new KeyedDictionary<_embedded, SturdyValue, Template>(entries)));
}
export function tLit(value: SturdyValue): Template {
return Template.Lit(Lit(value));
}
export function tRef(binding: number): Template {
return Template.TRef(TRef(binding));
}
export function tAttenuate(template: Template, ... attenuation: Caveat[]): Template {
return Template.TAttenuate(TAttenuate({ template, attenuation }));
}

View File

@ -1,12 +1,12 @@
/// SPDX-License-Identifier: GPL-3.0-or-later
/// SPDX-FileCopyrightText: Copyright © 2016-2024 Tony Garnock-Jones <tonyg@leastfixedpoint.com>
import { Set, Dictionary, KeyedDictionary, IdentitySet, stringify, Value, Embeddable } from '@preserves/core';
import { Set, KeyedDictionary, IdentitySet, stringify, Value, Embeddable } from '@preserves/core';
import { AnyValue, Assertion, Ref } from './actor.js';
import { Bag, ChangeDescription } from './bag.js';
import * as Stack from './stack.js';
import * as P from '../gen/dataspacePatterns.js';
import { Path, analysePattern, classOfCtor, classOfValue, step } from './pattern.js';
import { Path, analysePattern, classOfCtor, classOfValue, step, Shape, ConstantPositions } from './pattern.js';
enum EventType {
ADDED = +1,
@ -31,13 +31,15 @@ export class Index<T> {
readonly root: Node<T> = new Node(new Continuation(new Set()));
addObserver(pattern: P.Pattern, observer: IndexObserver<T>, parameter: T) {
let {constPaths, constValues, capturePaths} = analysePattern(pattern);
let {constPositions, constValues, capturePaths} = analysePattern(pattern);
const continuation = this.root.extend(pattern);
let constValMap = continuation.leafMap.get(constPaths);
let constValMap = continuation.leafMap.get(constPositions);
if (!constValMap) {
constValMap = new Dictionary();
constValMap = new KeyedDictionary();
continuation.cachedAssertions.forEach((a) => {
const key = projectPaths(a, constPaths);
if (projectPaths(a, constPositions.requiredToExist) === void 0) return;
const key = projectPaths(a, constPositions.withValues);
if (key === void 0) return;
let leaf = constValMap!.get(key);
if (!leaf) {
leaf = new Leaf();
@ -45,7 +47,7 @@ export class Index<T> {
}
leaf.cachedAssertions.add(a);
});
continuation.leafMap.set(constPaths, constValMap);
continuation.leafMap.set(constPositions, constValMap);
}
let leaf = constValMap.get(constValues);
if (!leaf) {
@ -55,8 +57,10 @@ export class Index<T> {
let observerGroup = leaf.observerGroups.get(capturePaths);
if (!observerGroup) {
const cachedCaptures = new Bag<Ref, Array<AnyValue>>();
leaf.cachedAssertions.forEach((a) =>
cachedCaptures._items.update(projectPaths(a, capturePaths), n => n! + 1, 0));
leaf.cachedAssertions.forEach((a) => {
const vs = projectPaths(a, capturePaths);
if (vs !== void 0) cachedCaptures._items.update(vs, n => n! + 1, 0);
});
observerGroup = new ObserverGroup(cachedCaptures);
leaf.observerGroups.set(capturePaths, observerGroup);
}
@ -65,9 +69,9 @@ export class Index<T> {
}
removeObserver(pattern: P.Pattern, observer: IndexObserver<T>, parameter: T) {
let {constPaths, constValues, capturePaths} = analysePattern(pattern);
let {constPositions, constValues, capturePaths} = analysePattern(pattern);
const continuation = this.root.extend(pattern);
let constValMap = continuation.leafMap.get(constPaths);
let constValMap = continuation.leafMap.get(constPositions);
if (!constValMap) return;
let leaf = constValMap.get(constValues);
if (!leaf) return;
@ -82,7 +86,7 @@ export class Index<T> {
constValMap.delete(constValues);
}
if (constValMap.size === 0) {
continuation.leafMap.delete(constPaths);
continuation.leafMap.delete(constPositions);
}
}
@ -156,7 +160,7 @@ type Selector = [number, AnyValue];
class Node<T> {
readonly continuation: Continuation<T>;
readonly edges: KeyedDictionary<Selector, { [shape: string]: Node<T> }, Ref> = new KeyedDictionary();
readonly edges: KeyedDictionary<Ref, Selector, { [shape: Shape]: Node<T> }> = new KeyedDictionary();
constructor(continuation: Continuation<T>) {
this.continuation = continuation;
@ -168,19 +172,19 @@ class Node<T> {
function walkNode(node: Node<T>, popCount: number, stepIndex: AnyValue, p: P.Pattern): [number, Node<T>]
{
switch (p._variant) {
case 'DDiscard':
case 'DLit':
case 'discard':
case 'lit':
return [popCount, node];
case 'DBind':
return walkNode(node, popCount, stepIndex, p.value.pattern);
case 'DCompound': {
case 'bind':
return walkNode(node, popCount, stepIndex, p.pattern);
case 'group': {
const selector: Selector = [popCount, stepIndex];
let table = node.edges.get(selector);
if (!table) {
table = {};
node.edges.set(selector, table);
}
let cls = classOfCtor(p.value);
let cls = classOfCtor(p.type);
let nextNode = table[cls];
if (!nextNode) {
nextNode = new Node(new Continuation(
@ -189,16 +193,11 @@ class Node<T> {
table[cls] = nextNode;
}
popCount = 0;
function walkKey(pp: P.Pattern, stepIndex: AnyValue) {
p.entries.forEach((pp, stepIndex) => {
path.push(stepIndex);
[popCount, nextNode] = walkNode(nextNode, popCount, stepIndex, pp);
path.pop();
}
switch (p.value._variant) {
case 'rec': p.value.fields.forEach(walkKey); break;
case 'arr': p.value.items.forEach(walkKey); break;
case 'dict': p.value.entries.forEach(walkKey); break;
}
});
return [popCount + 1, nextNode];
}
}
@ -226,8 +225,10 @@ class Node<T> {
function walkContinuation(continuation: Continuation<T>) {
m_cont(continuation, outerValue);
continuation.leafMap.forEach((constValMap, constPaths) => {
let constValues = projectPaths(outerValue, constPaths);
continuation.leafMap.forEach((constValMap, constPositions) => {
if (projectPaths(outerValue, constPositions.requiredToExist) === void 0) return;
let constValues = projectPaths(outerValue, constPositions.withValues);
if (constValues === void 0) return;
let leaf = constValMap.get(constValues);
if (!leaf && operation === EventType.ADDED) {
leaf = new Leaf();
@ -236,12 +237,13 @@ class Node<T> {
if (leaf) {
m_leaf(leaf, outerValue);
leaf.observerGroups.forEach((observerGroup, capturePaths) => {
m_observerGroup(observerGroup, projectPaths(outerValue, capturePaths));
const vs = projectPaths(outerValue, capturePaths);
if (vs !== void 0) m_observerGroup(observerGroup, vs);
});
if (operation === EventType.REMOVED && leaf.isEmpty()) {
constValMap.delete(constValues);
if (constValMap.size === 0) {
continuation.leafMap.delete(constPaths);
continuation.leafMap.delete(constPositions);
}
}
}
@ -267,7 +269,7 @@ class Node<T> {
class Continuation<T> {
readonly cachedAssertions: Set<Ref>;
readonly leafMap: KeyedDictionary<Array<Path>, Dictionary<Ref, Leaf<T>>, Ref> = new KeyedDictionary();
readonly leafMap: KeyedDictionary<Ref, ConstantPositions, KeyedDictionary<Ref, Assertion, Leaf<T>>> = new KeyedDictionary();
constructor(cachedAssertions: Set<Ref>) {
this.cachedAssertions = cachedAssertions;
@ -286,7 +288,7 @@ class Continuation<T> {
class Leaf<T> {
readonly cachedAssertions: Set<Ref> = new Set();
readonly observerGroups: KeyedDictionary<Array<Path>, ObserverGroup<T>, Ref> = new KeyedDictionary();
readonly observerGroups: KeyedDictionary<Ref, Array<Path>, ObserverGroup<T>> = new KeyedDictionary();
isEmpty(): boolean {
return this.cachedAssertions.size === 0 && this.observerGroups.size === 0;
@ -320,15 +322,21 @@ class ObserverGroup<T> {
}
}
// Total by assumption that path is valid for v
function projectPath(v: AnyValue, path: Path): AnyValue {
function projectPath(v: AnyValue, path: Path): AnyValue | undefined {
for (let index of path) {
v = step(v, index)!;
const next = step(v, index);
if (next === void 0) return void 0;
v = next;
}
return v;
}
// Total by assumption that paths are valid for v
function projectPaths(v: AnyValue, paths: Array<Path>): AnyValue[] {
return paths.map((path) => projectPath(v, path));
function projectPaths(v: AnyValue, paths: Array<Path>): AnyValue[] | undefined {
const result = [];
for (const path of paths) {
const w = projectPath(v, path);
if (w === void 0) return void 0;
result.push(w);
}
return result;
}

View File

@ -18,6 +18,7 @@ export const newKey: () => Promise<Bytes> =
const HMAC_BLAKE2s = makeHMAC(BLAKE2s);
export async function mac(secretKey: Bytes, data: Bytes): Promise<Bytes> {
return Bytes.from(HMAC_BLAKE2s(underlying(secretKey), underlying(data)));
export function mac(secretKey: Bytes, data: Bytes): Bytes {
return Bytes.from(HMAC_BLAKE2s(underlying(secretKey), underlying(data))
.subarray(0, KEY_LENGTH));
}

View File

@ -2,7 +2,7 @@
/// SPDX-FileCopyrightText: Copyright © 2016-2024 Tony Garnock-Jones <tonyg@leastfixedpoint.com>
import { Actor, Ref, Handle, Assertion, Entity, Turn } from '../runtime/actor.js';
import { Value, Embedded, mapEmbeddeds, IdentityMap, Dictionary, stringify } from '@preserves/core';
import { Value, Embedded, mapEmbeddeds, IdentityMap, KeyedDictionary, stringify } from '@preserves/core';
import * as IO from '../gen/protocol.js';
import { fromCaveat, WireRef } from '../gen/sturdy.js';
import { attenuate } from '../runtime/rewrite.js';
@ -55,10 +55,9 @@ export class Membrane {
}
}
export const INERT_REF: Ref = {
relay: Actor.boot(() => Turn.active.stop(Turn.activeFacet)).root,
target: {},
};
export const INERT_REF = new Ref(
Actor.boot(() => Turn.active.stop(Turn.activeFacet)).root,
{});
export interface ProxyInbound {
proxyPacket(packet: IO.Packet<Embedded<WireRef>>): void;
@ -164,10 +163,10 @@ export abstract class LayerBoundary implements ProxyOutbound, ProxyInbound {
if (n.attenuation.length === 0) {
return r;
} else {
type AttenuatedRef = Ref & { __attenuations?: Dictionary<any, Ref> };
type AttenuatedRef = Ref & { __attenuations?: KeyedDictionary<Ref, Assertion, any> };
const ar = r as AttenuatedRef;
if (ar.__attenuations === void 0) {
ar.__attenuations = new Dictionary();
ar.__attenuations = new KeyedDictionary();
}
return ar.__attenuations.getOrSet(n.attenuation.map(fromCaveat), () =>
attenuate(r, ... n.attenuation));

View File

@ -10,8 +10,9 @@
// California: Internet Society, 2014.
import { mac } from './cryptography.js';
import { Bytes, decode, encode, is, neverEmbeddedType, Value } from '@preserves/core';
import { Bytes, decode, encode, is, neverEmbeddedType, Value, fromJS } from '@preserves/core';
import * as S from '../gen/sturdy.js';
import * as G from '../gen/gatekeeper.js';
export * from '../gen/sturdy.js';
export type SturdyValue = Value<S._embedded>;
@ -37,16 +38,42 @@ export function sturdyDecode(bs: Bytes): SturdyValue {
});
}
export async function mint(oid: SturdyValue, secretKey: Bytes): Promise<S.SturdyRef> {
return S.SturdyRef(S.Parameters({
oid,
sig: await mac(secretKey, sturdyEncode(oid)),
caveats: S.CaveatsField.absent(),
}));
export function sturdyBind(
oid: SturdyValue,
secretKey: Bytes,
target: S._embedded,
observer?: S._embedded,
): G.Bind {
return G.Bind({
description: G.Description({
stepType: fromJS(S.SturdyStepType()) as symbol,
detail: fromJS(S.SturdyDescriptionDetail({ oid, key: secretKey })),
}),
target,
observer: (observer === void 0) ? G.BindObserver.absent() : G.BindObserver.present(observer),
});
}
async function chainMac(key: Bytes | Promise<Bytes>, caveats: S.Caveat[]): Promise<Bytes> {
return caveats.reduce(async (key, c) => mac(await key, sturdyEncode(S.fromCaveat(c))), key);
type RefAndBind = { ref: S.SturdyRef, bind: G.Bind };
export function mint(oid: SturdyValue, secretKey: Bytes): S.SturdyRef;
export function mint(oid: SturdyValue, secretKey: Bytes, target: S._embedded, observer?: S._embedded): RefAndBind;
export function mint(
oid: SturdyValue,
secretKey: Bytes,
target?: S._embedded,
observer?: S._embedded,
): S.SturdyRef | RefAndBind {
const ref = S.SturdyRef(S.Parameters({
oid,
sig: mac(secretKey, sturdyEncode(oid)),
caveats: S.CaveatsField.absent(),
}));
if (target === void 0) return ref;
return { ref, bind: sturdyBind(oid, secretKey, target, observer) };
}
function chainMac(key: Bytes, caveats: S.Caveat[]): Bytes {
return caveats.reduce((key, c) => mac(key, sturdyEncode(S.fromCaveat(c))), key);
}
export function caveatChain(r: S.SturdyRef): S.Caveat[] {
@ -57,16 +84,16 @@ export function caveatChain(r: S.SturdyRef): S.Caveat[] {
}
}
export async function attenuate(r: S.SturdyRef, ... a: S.Caveat[]): Promise<S.SturdyRef> {
export function attenuate(r: S.SturdyRef, ... a: S.Caveat[]): S.SturdyRef {
if (a.length === 0) return r;
return S.SturdyRef(S.Parameters({
oid: r.parameters.oid,
caveats: S.CaveatsField.present([... caveatChain(r), ... a]),
sig: await chainMac(r.parameters.sig, a),
sig: chainMac(r.parameters.sig, a),
}));
}
export async function validate(r: S.SturdyRef, secretKey: Bytes): Promise<boolean> {
const sig = await chainMac(await mac(secretKey, sturdyEncode(r.parameters.oid)), caveatChain(r));
export function validate(r: S.SturdyRef, secretKey: Bytes): boolean {
const sig = chainMac(mac(secretKey, sturdyEncode(r.parameters.oid)), caveatChain(r));
return is(sig, r.parameters.sig);
}

View File

@ -1,12 +1,12 @@
/// SPDX-License-Identifier: GPL-3.0-or-later
/// SPDX-FileCopyrightText: Copyright © 2016-2024 Tony Garnock-Jones <tonyg@leastfixedpoint.com>
import { KeyedSet } from '@preserves/core';
import { GenericEmbedded, KeyedSet } from '@preserves/core';
import { Bag, ChangeDescription } from '../src/runtime/bag';
describe('bag', () => {
it('should be initializable from a set', () => {
const b = new Bag(new KeyedSet<string>(['a', 'b', 'c']));
const b = new Bag(new KeyedSet<GenericEmbedded, string>(['a', 'b', 'c']));
expect(b.size).toBe(3);
expect(b.get('a')).toBe(1);
expect(b.get('z')).toBe(0);
@ -28,7 +28,7 @@ describe('bag', () => {
});
it('should count down', () => {
const b = new Bag(new KeyedSet<string>(['a']));
const b = new Bag(new KeyedSet<GenericEmbedded, string>(['a']));
expect(b.change('a', 1)).toBe(ChangeDescription.PRESENT_TO_PRESENT);
expect(b.change('a', -1)).toBe(ChangeDescription.PRESENT_TO_PRESENT);
expect(b.size).toBe(1);

View File

@ -1,6 +1,6 @@
{
"name": "@syndicate-lang/create",
"version": "0.23.1",
"version": "0.25.1",
"description": "Create a new Syndicate/js package",
"author": "Tony Garnock-Jones <tonyg@leastfixedpoint.com>",
"homepage": "https://github.com/syndicate-lang/syndicate-js/tree/main/packages/create",

View File

@ -3,7 +3,7 @@
"version": "0.0.0",
"license": "GPL-3.0+",
"devDependencies": {
"@preserves/schema-cli": "0.995.100",
"@preserves/schema-cli": ">=0.995.201",
"@syndicate-lang/ts-plugin": "*",
"@syndicate-lang/tsc": "*",
"rollup": "^2.60",
@ -12,7 +12,7 @@
"typescript-language-server": "^3.0"
},
"dependencies": {
"@preserves/core": "0.995.100",
"@preserves/core": "^0.995.200",
"@syndicate-lang/core": "*",
"@syndicate-lang/html2": "*",
"@syndicate-lang/ws-relay": "*"

View File

@ -1,6 +1,6 @@
{
"name": "@syndicate-lang/fs",
"version": "0.29.3",
"version": "0.35.1",
"description": "Reflect contents of a portion of the file system as assertions",
"homepage": "https://github.com/syndicate-lang/syndicate-js/tree/main/packages/fs",
"license": "GPL-3.0+",
@ -27,16 +27,16 @@
"syndicate-fs": "./bin/syndicate-fs.js"
},
"peerDependencies": {
"@preserves/core": "0.995.100"
"@preserves/core": "^0.995.200"
},
"dependencies": {
"@syndicate-lang/core": "^0.28.2",
"@syndicate-lang/service": "^0.29.3",
"@syndicate-lang/core": "^0.34.1",
"@syndicate-lang/service": "^0.35.1",
"chokidar": "^3.5.3"
},
"devDependencies": {
"@preserves/schema-cli": "0.995.100",
"@syndicate-lang/ts-plugin": "^0.30.0",
"@syndicate-lang/tsc": "^0.30.0"
"@preserves/schema-cli": ">=0.995.201",
"@syndicate-lang/ts-plugin": "^0.36.1",
"@syndicate-lang/tsc": "^0.36.1"
}
}

View File

@ -1,6 +1,6 @@
{
"name": "@syndicate-lang/html",
"version": "0.29.3",
"version": "0.35.1",
"description": "DOM/HTML UI for Syndicate/JS",
"homepage": "https://github.com/syndicate-lang/syndicate-js/tree/main/packages/html",
"license": "GPL-3.0+",
@ -25,10 +25,10 @@
"veryclean": "yarn run clean && rm -rf node_modules"
},
"dependencies": {
"@syndicate-lang/core": "^0.28.2"
"@syndicate-lang/core": "^0.34.1"
},
"devDependencies": {
"@syndicate-lang/ts-plugin": "^0.30.0",
"@syndicate-lang/tsc": "^0.30.0"
"@syndicate-lang/ts-plugin": "^0.36.1",
"@syndicate-lang/tsc": "^0.36.1"
}
}

View File

@ -11,7 +11,7 @@ export type UIFragmentRecord = ReturnType<typeof P.UIFragment>;
import { HtmlFragments } from "./html";
export * from "./html";
export function boot(ds = Dataspace.global) {
export function boot(ds = Dataspace.local) {
spawnGlobalEventFactory(ds);
spawnWindowEventFactory(ds);
spawnUIFragmentFactory(ds);

View File

@ -1,6 +1,6 @@
{
"name": "@syndicate-lang/html2",
"version": "0.29.3",
"version": "0.35.1",
"description": "DOM/HTML UI for Syndicate/JS",
"homepage": "https://github.com/syndicate-lang/syndicate-js/tree/main/packages/html2",
"license": "GPL-3.0+",
@ -25,10 +25,10 @@
"veryclean": "yarn run clean && rm -rf node_modules"
},
"dependencies": {
"@syndicate-lang/core": "^0.28.2"
"@syndicate-lang/core": "^0.34.1"
},
"devDependencies": {
"@syndicate-lang/ts-plugin": "^0.30.0",
"@syndicate-lang/tsc": "^0.30.0"
"@syndicate-lang/ts-plugin": "^0.36.1",
"@syndicate-lang/tsc": "^0.36.1"
}
}

View File

@ -70,7 +70,22 @@ function nodeInserter(n: number): PlaceholderAction {
switch (typeof f) {
case 'string': newNode = document.createTextNode(f); break;
case 'number': newNode = document.createTextNode('' + f); break;
default: newNode = f; break;
case 'object':
if (f !== null && 'nodeType' in f) {
newNode = f;
break;
}
/* fall through */
default: {
let info;
try {
info = '' + f;
} catch (_e) {
info = (f as any).toString();
}
newNode = document.createTextNode(`<ERROR: invalid HtmlFragment: ${info}>`);
break;
}
}
node.parentNode?.insertBefore(newNode, node);
}

View File

@ -8,7 +8,7 @@ export { HtmlTemplater, template, HtmlFragment } from "./html";
export assertion type LocationHash(hash: string);
export type LocationHash = ReturnType<typeof LocationHash>;
export function boot(ds = Dataspace.global) {
export function boot(ds = Dataspace.local) {
spawnLocationHashTracker(ds);
}
@ -22,14 +22,28 @@ export type NodeGenerator = (t: HtmlTemplater) => ReturnType<HtmlTemplater>;
export class Widget implements EventTarget {
readonly facet: Facet;
private _node: ChildNode | null = null;
parentField: Dataflow.Field<ParentNode | null>;
callbacks = new Map<string, Map<EventListenerOrEventListenerObject, Wrapped>>();
get node(): ChildNode {
return this._node!;
}
constructor (private nodeGenerator: NodeGenerator) {
constructor (node: ChildNode);
constructor (nodeGenerator: NodeGenerator);
constructor (template: string | HTMLTemplateElement, data: object);
constructor (arg0: ChildNode | NodeGenerator | string | HTMLTemplateElement, data?: object) {
let nodeGenerator: NodeGenerator;
if (data === void 0) {
if (typeof arg0 === 'function') {
nodeGenerator = arg0 as NodeGenerator;
} else {
nodeGenerator = () => [arg0 as ChildNode];
}
} else {
nodeGenerator = templateGenerator(arg0 as (string | HTMLTemplateElement), data);
}
this.facet = Turn.activeFacet;
const cancelAtExit = this.facet.actor.atExit(() => this.node.remove());
@ -40,7 +54,7 @@ export class Widget implements EventTarget {
const thisTemplate = template();
dataflow {
const nodes = this.nodeGenerator(thisTemplate);
const nodes = nodeGenerator(thisTemplate);
if (nodes.length !== 1) {
throw new Error(`@syndicate-lang/html2: Expected exactly one node from template`);
}
@ -50,24 +64,18 @@ export class Widget implements EventTarget {
throw new Error(`@syndicate-lang/html2: Node generator is not stable`);
}
}
}
field parentField: ParentNode | null = this._node?.parentNode ?? null;
this.parentField = parentField;
dataflow {
const p = this.parentField.value;
if (this.node.parentNode !== p) {
if (p === null) {
this.node.remove();
} else {
p.appendChild(this.node);
}
}
get _nodeAsParent(): ParentNode | null {
if (this._node && 'querySelector' in this._node) {
return this._node as unknown as ParentNode;
} else {
return null;
}
}
get parent(): ParentNode | null {
return this.parentField.value;
return this.node.parentNode;
}
set parent(p: string | ParentNode | null) {
@ -78,10 +86,34 @@ export class Widget implements EventTarget {
if (typeof p === 'string') {
p = wrt.querySelector(p);
}
this.parentField.value = p;
if (this.node.parentNode !== p) {
if (p === null) {
this.node.remove();
} else {
p.appendChild(this.node);
}
}
return this;
}
querySelector(selector: string): Widget | null;
querySelector<T extends Widget>(selector: string, ctor: { new(e: Element): T }): T | null;
querySelector<T extends Widget>(selector: string, ctor?: { new(e: Element): T }): Widget | null {
const e = this._nodeAsParent?.querySelector(selector);
return e ? new (ctor ?? Widget)(e) : null;
}
querySelectorAll(selector: string): Widget[];
querySelectorAll<T extends Widget>(selector: string, ctor: { new(e: Element): T }): T[];
querySelectorAll<T extends Widget>(selector: string, ctor?: { new(e: Element): T }): Widget[] {
const es = this._nodeAsParent?.querySelectorAll(selector);
const ws: Widget[] = [];
if (es) es.forEach(e => ws.push(new (ctor ?? Widget)(e)));
return ws;
}
on(type: string, callback: EventListenerOrEventListenerObject): this {
this.addEventListener(type, callback);
return this;
@ -151,8 +183,11 @@ export class ValueWidget extends Widget {
_value: Dataflow.Field<string>;
_valueAsNumber: Dataflow.Field<number>;
constructor (nodeGenerator: NodeGenerator, triggerEvent: 'change' | 'input' = 'change') {
super(nodeGenerator);
constructor (nodeGenerator: NodeGenerator, triggerEvent?: 'change' | 'input');
constructor (template: string | HTMLTemplateElement, data: object, triggerEvent?: 'change' | 'input');
constructor (arg0: NodeGenerator | string | HTMLTemplateElement, arg1?: object | 'change' | 'input', arg2?: 'change' | 'input') {
super(arg0 as any, arg1 as any);
const triggerEvent = typeof arg1 === 'string' ? arg1 : typeof arg2 === 'string' ? arg2 : 'change';
field value: string = '';
this._value = value;
@ -161,20 +196,21 @@ export class ValueWidget extends Widget {
this._valueAsNumber = valueAsNumber;
if ('value' in this.node) {
const readValues = (n: any) => {
this.suppressCycleWarning();
this._value.value = n?.value ?? '';
this._valueAsNumber.value = n?.valueAsNumber ?? NaN;
};
this.on(triggerEvent, e => readValues(e.target));
readValues(this.node);
this.on(triggerEvent, () => this.readValues());
this.readValues();
dataflow { this.valueAsNumber = this._valueAsNumber.value; }
dataflow { this.value = this._value.value; }
}
}
readValues() {
const n = this.node as any;
this.suppressCycleWarning();
this._value.value = n.value ?? '';
this._valueAsNumber.value = n.valueAsNumber ?? NaN;
}
get value(): string {
return this._value.value;
}
@ -205,7 +241,7 @@ function spawnLocationHashTracker(ds: Ref) {
field hashValue: string = '/';
const loadHash = () => {
var h = window.location.hash;
var h = decodeURIComponent(window.location.hash);
if (h.length && h[0] === '#') {
h = h.slice(1);
}
@ -226,3 +262,17 @@ function spawnLocationHashTracker(ds: Ref) {
}
}
}
export function templateGenerator(
template0: string | HTMLTemplateElement,
data: object,
): NodeGenerator {
const template = typeof template0 === 'string' ? document.querySelector(template0) : template0;
if (template === null) throw new Error('Cannot find template: ' + template0);
const body = `return t => t\`${template.innerHTML.trim().split('`').join('\\`')}\``;
const kvs = Object.entries(data);
const keys = kvs.map(e => e[0]);
const values = kvs.map(e => e[1]);
const factory = new Function(... keys, body);
return factory(... values);
}

View File

@ -1,6 +1,6 @@
{
"name": "@syndicate-lang/loader",
"version": "0.29.0",
"version": "0.35.1",
"description": "Syndicate/JS node.js loader hook",
"homepage": "https://github.com/syndicate-lang/syndicate-js/tree/main/packages/loader",
"license": "GPL-3.0+",
@ -22,8 +22,8 @@
"types": "lib/index.d.ts",
"author": "Tony Garnock-Jones <tonyg@leastfixedpoint.com>",
"dependencies": {
"@syndicate-lang/compiler": "^0.21.0",
"@syndicate-lang/core": "^0.28.2",
"@syndicate-lang/service": "^0.29.3"
"@syndicate-lang/compiler": "^0.22.0",
"@syndicate-lang/core": "^0.34.1",
"@syndicate-lang/service": "^0.35.1"
}
}

View File

@ -7,7 +7,7 @@ import Pos = Syntax.Pos;
import * as Syndicate from '@syndicate-lang/core';
Object.defineProperty(globalThis, 'currentSyndicateTarget', {
value: Syndicate.Dataspace.global,
value: Syndicate.Dataspace.local,
writable: false,
});

View File

@ -1,6 +1,6 @@
{
"name": "@syndicate-lang/service",
"version": "0.29.3",
"version": "0.35.1",
"description": "Run a node.js program as a service within syndicate-server",
"homepage": "https://github.com/syndicate-lang/syndicate-js/tree/main/packages/service",
"license": "GPL-3.0+",
@ -22,10 +22,10 @@
"veryclean": "yarn run clean && rm -rf node_modules"
},
"dependencies": {
"@syndicate-lang/core": "^0.28.2"
"@syndicate-lang/core": "^0.34.1"
},
"devDependencies": {
"@syndicate-lang/ts-plugin": "^0.30.0",
"@syndicate-lang/tsc": "^0.30.0"
"@syndicate-lang/ts-plugin": "^0.36.1",
"@syndicate-lang/tsc": "^0.36.1"
}
}

View File

@ -1,6 +1,6 @@
{
"name": "@syndicate-lang/syndicatec",
"version": "0.30.0",
"version": "0.36.1",
"description": "Syndicate/JS compiler command-line tool",
"homepage": "https://github.com/syndicate-lang/syndicate-js/tree/main/packages/syndicatec",
"license": "GPL-3.0+",
@ -20,8 +20,8 @@
},
"author": "Tony Garnock-Jones <tonyg@leastfixedpoint.com>",
"dependencies": {
"@syndicate-lang/compiler": "^0.21.0",
"@syndicate-lang/core": "^0.28.2",
"@syndicate-lang/compiler": "^0.22.0",
"@syndicate-lang/core": "^0.34.1",
"glob": "^7.1.6",
"yargs": "^16.2.0"
},

View File

@ -1,6 +1,6 @@
{
"name": "@syndicate-lang/timer",
"version": "0.29.3",
"version": "0.35.1",
"description": "Time and timer driver for Syndicate",
"homepage": "https://github.com/syndicate-lang/syndicate-js/tree/main/packages/timer",
"license": "GPL-3.0+",
@ -25,10 +25,10 @@
"veryclean": "yarn run clean && rm -rf node_modules"
},
"dependencies": {
"@syndicate-lang/core": "^0.28.2"
"@syndicate-lang/core": "^0.34.1"
},
"devDependencies": {
"@syndicate-lang/ts-plugin": "^0.30.0",
"@syndicate-lang/tsc": "^0.30.0"
"@syndicate-lang/ts-plugin": "^0.36.1",
"@syndicate-lang/tsc": "^0.36.1"
}
}

View File

@ -20,7 +20,7 @@ export function sleep(ds: Ref, seconds: number, cb: () => void): void {
}
}
export function boot(ds = Dataspace.global) {
export function boot(ds = Dataspace.local) {
spawn named 'timer/PeriodicTick' {
at ds {
during Observe({

View File

@ -1,6 +1,6 @@
{
"name": "@syndicate-lang/ts-plugin",
"version": "0.30.0",
"version": "0.36.1",
"description": "Syndicate/JS TypeScript tsserver plugin",
"homepage": "https://github.com/syndicate-lang/syndicate-js/tree/main/packages/ts-plugin",
"license": "GPL-3.0+",
@ -22,8 +22,8 @@
"types": "lib/index.d.ts",
"author": "Tony Garnock-Jones <tonyg@leastfixedpoint.com>",
"dependencies": {
"@syndicate-lang/compiler": "^0.21.0",
"@syndicate-lang/core": "^0.28.2"
"@syndicate-lang/compiler": "^0.22.0",
"@syndicate-lang/core": "^0.34.1"
},
"devDependencies": {
"typescript": "^4.9"

View File

@ -1,6 +1,6 @@
{
"name": "@syndicate-lang/tsc",
"version": "0.30.0",
"version": "0.36.1",
"description": "Syndicate for TypeScript compiler command-line tool",
"homepage": "https://github.com/syndicate-lang/syndicate-js/tree/main/packages/tsc",
"license": "GPL-3.0+",
@ -20,8 +20,8 @@
},
"author": "Tony Garnock-Jones <tonyg@leastfixedpoint.com>",
"dependencies": {
"@syndicate-lang/compiler": "^0.21.0",
"@syndicate-lang/core": "^0.28.2",
"@syndicate-lang/compiler": "^0.22.0",
"@syndicate-lang/core": "^0.34.1",
"glob": "^7.1.6",
"yargs": "^16.2.0"
},

View File

@ -1,6 +1,6 @@
{
"name": "@syndicate-lang/ws-relay",
"version": "0.30.3",
"version": "0.36.1",
"description": "Browser WebSocket relay to a Syndicate server",
"homepage": "https://github.com/syndicate-lang/syndicate-js/tree/main/packages/ws-relay",
"license": "GPL-3.0+",
@ -25,14 +25,14 @@
"types": "lib/index.d.ts",
"author": "Tony Garnock-Jones <tonyg@leastfixedpoint.com>",
"peerDependencies": {
"@preserves/core": "0.995.100"
"@preserves/core": "^0.995.200"
},
"dependencies": {
"@syndicate-lang/core": "^0.28.2",
"@syndicate-lang/core": "^0.34.1",
"salty-crypto": "0.3"
},
"devDependencies": {
"@syndicate-lang/ts-plugin": "^0.30.0",
"@syndicate-lang/tsc": "^0.30.0"
"@syndicate-lang/ts-plugin": "^0.36.1",
"@syndicate-lang/tsc": "^0.36.1"
}
}

View File

@ -20,6 +20,7 @@ import {
decode,
fromJS,
isEmbedded,
parse,
stringify,
underlying,
Embeddable,
@ -38,7 +39,7 @@ type TransportState = {
peer: Ref,
};
export function boot(ds = Dataspace.global, debug: boolean = false, WebSocketConstructor?: typeof WebSocket) {
export function boot(ds = Dataspace.local, debug: boolean = false, WebSocketConstructor?: typeof WebSocket) {
spawn named 'transportConnector' {
at ds {
during Observe({ "pattern": :pattern G.TransportConnection({
@ -231,33 +232,90 @@ export function boot(ds = Dataspace.global, debug: boolean = false, WebSocketCon
if (!origin0 || !isEmbedded(origin0)) return;
const origin = origin0;
const spec = Q.drop_lit(detailPatValue, N.toNoisePathStepDetail);
if (!spec) return;
const spec0 = Q.drop_lit(detailPatValue, N.toNoisePathStepDetail);
if (!spec0) return;
const spec = spec0;
const algorithms = SaltyCrypto.Noise_25519_ChaChaPoly_BLAKE2s;
const protocol =
spec.protocol._variant === "present" ? spec.protocol.protocol :
spec.protocol._variant === "absent" ? N.fromDefaultProtocol(N.DefaultProtocol()) as string :
(() => { throw new Error("Invalid noise protocol name"); })();
const patternName = SaltyCrypto.matchPattern(algorithms, protocol);
if (patternName === null) throw new Error("Unsupported protocol " + protocol);
const patternName0 = SaltyCrypto.matchPattern(algorithms, protocol);
if (patternName0 === null) throw new Error("Unsupported protocol " + protocol);
const patternName = patternName0;
const preSharedKeys =
spec.preSharedKeys._variant === "present" ? spec.preSharedKeys.preSharedKeys :
spec.preSharedKeys._variant === "absent" ? [] :
(() => { throw new Error("Invalid pre-shared keys"); })();
const prologue = underlying(canonicalEncode(spec.service));
let H: SaltyCrypto.Handshake | null = null;
let transportState: SaltyCrypto.TransportState | null = null;
let responderSession: Ref | null = null;
let relay: Relay.Relay | null = null;
function maybeTransition(s: SaltyCrypto.TransportState | null) {
if (transportState !== null) {
throw new Error("Unexpected double-transition to transport state");
react {
at origin {
assert G.Resolve({
"step": G.Step({
"stepType": N.$noise,
"detail": fromJS(N.ServiceSelector(spec.service)),
}),
"observer": create assertionFacetObserver(e => {
const response = G.toResolved(e);
if (!response) return;
switch (response._variant) {
case "accepted":
runSession(response.responderSession);
break;
case "Rejected":
stop {
at ds {
assert G.ResolvedPathStep<Ref>({
"origin": origin,
"pathStep": G.PathStep({
"stepType": N.$noise,
"detail": fromJS(N.NoisePathStepDetail(spec)),
}),
"resolved": response,
});
}
}
}
}),
});
}
transportState = s;
if (transportState !== null) {
}
function runSession(responderSession: Ref) {
const H = new SaltyCrypto.Handshake(
algorithms,
patternName,
'initiator',
{
prologue,
remoteStaticPublicKey: underlying(spec.key),
preSharedKeys: preSharedKeys.map(underlying),
});
let transportState: SaltyCrypto.TransportState | null = null;
let relay: Relay.Relay | null = null;
const { packet, finished } = H.writeMessage(new Uint8Array());
at responderSession {
assert N.Initiator(create ({ message: handlePacket }));
send message Bytes.from(packet);
}
maybeTransition(finished);
function maybeTransition(s: SaltyCrypto.TransportState | null) {
if (transportState !== null) {
throw new Error("Unexpected double-transition to transport state");
}
transportState = s;
if (transportState !== null) {
actuallyTransition();
}
}
function actuallyTransition() {
const noiseSessionFacet = Turn.activeFacet;
const peer = new Relay.Relay({
debug,
@ -282,74 +340,25 @@ export function boot(ds = Dataspace.global, debug: boolean = false, WebSocketCon
"resolved": G.Resolved.accepted(peer),
});
}
}
react {
at origin {
assert G.Resolve({
"step": G.Step({
"stepType": N.$noise,
"detail": fromJS(N.ServiceSelector(spec.service)),
}),
"observer": create ({
... assertionFacetObserver(e => {
const response = G.toResolved(e);
if (!response) return;
switch (response._variant) {
case "accepted":
H = new SaltyCrypto.Handshake(
algorithms,
patternName,
'initiator',
{
prologue,
remoteStaticPublicKey: underlying(spec.key),
preSharedKeys: preSharedKeys.map(underlying),
});
transportState = null;
responderSession = response.responderSession;
const { packet, finished } = H.writeMessage(new Uint8Array());
at responderSession {
send message Bytes.from(packet);
}
maybeTransition(finished);
break;
case "Rejected":
stop {
at ds {
assert G.ResolvedPathStep<Ref>({
"origin": origin,
"pathStep": G.PathStep({
"stepType": N.$noise,
"detail": fromJS(N.NoisePathStepDetail(spec)),
}),
"resolved": response,
});
}
}
}
}),
message(body: Assertion) {
const p = N.asPacket(body);
if (transportState) {
const packet = transportState.recv.decrypt_large(
p._variant === 'complete'
? [underlying(p.value)]
: p.value.map(underlying));
relay!.accept(packet);
} else {
if (p._variant !== 'complete') {
throw new Error("Unexpected fragmentation in handshake");
}
const { message, finished } = H!.readMessage(underlying(p.value));
if (message.byteLength !== 0) {
throw new Error("Unexpected payload during handshake");
}
maybeTransition(finished);
}
},
}),
});
function handlePacket(body: Assertion) {
const p = N.asPacket(body);
if (transportState) {
const packet = transportState.recv.decrypt_large(
p._variant === 'complete'
? [underlying(p.value)]
: p.value.map(underlying));
relay!.accept(packet);
} else {
if (p._variant !== 'complete') {
throw new Error("Unexpected fragmentation in handshake");
}
const { message, finished } = H!.readMessage(underlying(p.value));
if (message.byteLength !== 0) {
throw new Error("Unexpected payload during handshake");
}
maybeTransition(finished);
}
}
}
}
@ -434,10 +443,19 @@ export function unpackStandardRoute<R extends Embeddable>(route: E.StandardRoute
});
}
// We support a couple of variations here: a string containing Base64-encoded machine-oriented
// Preserves, or a string containing text-syntax Preserves.
export function decodeStandardRoute(s: string): G.Route | null {
try {
const route = E.toStandardRoute<Ref>(decode(
Bytes.fromBase64(s.replace(/[^-_+/A-Za-z0-9=]/g, ''))));
let routeValue: AnyValue;
// A valid text-syntax representation of a StandardRoute must start with
// either '[' or '<', neither of which is valid Base64.
if (s[0] === '[' || s[0] === '<') {
routeValue = parse(s);
} else {
routeValue = decode(Bytes.fromBase64(s.replace(/[^-_+/A-Za-z0-9=]/g, '')));
}
const route = E.toStandardRoute(routeValue);
return route === void 0 ? null : unpackStandardRoute(route);
} catch (e) {
console.error('Decoding standard route:', e);
@ -452,7 +470,7 @@ export function contactRemote(
controlObject: Ref,
transportAddr: AnyValue,
) => void,
ds = Dataspace.global,
ds = Dataspace.local,
) {
const routeValue = 'pathSteps' in route ? G.fromRoute(G.Route(route)) : route;
at ds {

View File

@ -0,0 +1,17 @@
{
"folders": [
{
"path": "."
},
{
"name": "preserves-js",
"path": "../preserves/implementations/javascript"
}
],
"settings": {
"files.exclude": {
"**/node_modules/": true
},
"typescript.tsdk": "syndicate-js/node_modules/typescript/lib"
}
}

View File

@ -16,12 +16,14 @@ open() {
for d in packages/*/tsconfig.json
do
open "cd $(dirname $d); yarn compile:watch"
open "cd $(dirname $d); exec yarn compile:watch"
done
for d in packages/*/rollup.config.js
do
open "cd $(dirname $d); yarn rollup:watch"
open "cd $(dirname $d); exec yarn rollup:watch"
done
open "cd packages/browser-stdenv; exec yarn prepare:watch"
tmux select-layout even-vertical

402
yarn.lock
View File

@ -10,7 +10,7 @@
"@jridgewell/gen-mapping" "^0.3.5"
"@jridgewell/trace-mapping" "^0.3.24"
"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.23.5", "@babel/code-frame@^7.24.1", "@babel/code-frame@^7.24.2":
"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.23.5", "@babel/code-frame@^7.24.2":
version "7.24.2"
resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.24.2.tgz#718b4b19841809a58b29b68cde80bc5e1aa6d9ae"
integrity sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==
@ -19,37 +19,37 @@
picocolors "^1.0.0"
"@babel/compat-data@^7.23.5":
version "7.24.1"
resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.24.1.tgz#31c1f66435f2a9c329bb5716a6d6186c516c3742"
integrity sha512-Pc65opHDliVpRHuKfzI+gSA4zcgr65O4cl64fFJIWEEh8JoHIHh0Oez1Eo8Arz8zq/JhgKodQaxEwUPRtZylVA==
version "7.24.4"
resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.24.4.tgz#6f102372e9094f25d908ca0d34fc74c74606059a"
integrity sha512-vg8Gih2MLK+kOkHJp4gBEIkyaIi00jgWot2D9QOmmfLC8jINSOzmCLta6Bvz/JSBCqnegV0L80jhxkol5GWNfQ==
"@babel/core@^7.1.0", "@babel/core@^7.12.3", "@babel/core@^7.7.2", "@babel/core@^7.8.0":
version "7.24.3"
resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.24.3.tgz#568864247ea10fbd4eff04dda1e05f9e2ea985c3"
integrity sha512-5FcvN1JHw2sHJChotgx8Ek0lyuh4kCKelgMTTqhYJJtloNvUfpAFMeNQUtdlIaktwrSV9LtCdqwk48wL2wBacQ==
version "7.24.5"
resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.24.5.tgz#15ab5b98e101972d171aeef92ac70d8d6718f06a"
integrity sha512-tVQRucExLQ02Boi4vdPp49svNGcfL2GhdTCT9aldhXgCJVAI21EtRfBettiuLUwce/7r6bFdgs6JFkcdTiFttA==
dependencies:
"@ampproject/remapping" "^2.2.0"
"@babel/code-frame" "^7.24.2"
"@babel/generator" "^7.24.1"
"@babel/generator" "^7.24.5"
"@babel/helper-compilation-targets" "^7.23.6"
"@babel/helper-module-transforms" "^7.23.3"
"@babel/helpers" "^7.24.1"
"@babel/parser" "^7.24.1"
"@babel/helper-module-transforms" "^7.24.5"
"@babel/helpers" "^7.24.5"
"@babel/parser" "^7.24.5"
"@babel/template" "^7.24.0"
"@babel/traverse" "^7.24.1"
"@babel/types" "^7.24.0"
"@babel/traverse" "^7.24.5"
"@babel/types" "^7.24.5"
convert-source-map "^2.0.0"
debug "^4.1.0"
gensync "^1.0.0-beta.2"
json5 "^2.2.3"
semver "^6.3.1"
"@babel/generator@^7.24.1", "@babel/generator@^7.7.2":
version "7.24.1"
resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.24.1.tgz#e67e06f68568a4ebf194d1c6014235344f0476d0"
integrity sha512-DfCRfZsBcrPEHUfuBMgbJ1Ut01Y/itOs+hY2nFLgqsqXd52/iSiVq5TITtUasIUgm+IIKdY2/1I7auiQOEeC9A==
"@babel/generator@^7.24.5", "@babel/generator@^7.7.2":
version "7.24.5"
resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.24.5.tgz#e5afc068f932f05616b66713e28d0f04e99daeb3"
integrity sha512-x32i4hEXvr+iI0NEoEfDKzlemF8AmtOP8CcrRaEcpzysWuoEb1KknpcvMsHKPONoKZiDuItklgWhB18xEhr9PA==
dependencies:
"@babel/types" "^7.24.0"
"@babel/types" "^7.24.5"
"@jridgewell/gen-mapping" "^0.3.5"
"@jridgewell/trace-mapping" "^0.3.25"
jsesc "^2.5.1"
@ -85,81 +85,81 @@
dependencies:
"@babel/types" "^7.22.5"
"@babel/helper-module-imports@^7.22.15":
"@babel/helper-module-imports@^7.24.3":
version "7.24.3"
resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.24.3.tgz#6ac476e6d168c7c23ff3ba3cf4f7841d46ac8128"
integrity sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg==
dependencies:
"@babel/types" "^7.24.0"
"@babel/helper-module-transforms@^7.23.3":
version "7.23.3"
resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz#d7d12c3c5d30af5b3c0fcab2a6d5217773e2d0f1"
integrity sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==
"@babel/helper-module-transforms@^7.24.5":
version "7.24.5"
resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.24.5.tgz#ea6c5e33f7b262a0ae762fd5986355c45f54a545"
integrity sha512-9GxeY8c2d2mdQUP1Dye0ks3VDyIMS98kt/llQ2nUId8IsWqTF0l1LkSX0/uP7l7MCDrzXS009Hyhe2gzTiGW8A==
dependencies:
"@babel/helper-environment-visitor" "^7.22.20"
"@babel/helper-module-imports" "^7.22.15"
"@babel/helper-simple-access" "^7.22.5"
"@babel/helper-split-export-declaration" "^7.22.6"
"@babel/helper-validator-identifier" "^7.22.20"
"@babel/helper-module-imports" "^7.24.3"
"@babel/helper-simple-access" "^7.24.5"
"@babel/helper-split-export-declaration" "^7.24.5"
"@babel/helper-validator-identifier" "^7.24.5"
"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.24.0", "@babel/helper-plugin-utils@^7.8.0":
version "7.24.0"
resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.0.tgz#945681931a52f15ce879fd5b86ce2dae6d3d7f2a"
integrity sha512-9cUznXMG0+FxRuJfvL82QlTqIzhVW9sL0KjMPHhAOOvpQGL8QtdxnBKILjBqxlHyliz0yCa1G903ZXI/FuHy2w==
version "7.24.5"
resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.5.tgz#a924607dd254a65695e5bd209b98b902b3b2f11a"
integrity sha512-xjNLDopRzW2o6ba0gKbkZq5YWEBaK3PCyTOY1K2P/O07LGMhMqlMXPxwN4S5/RhWuCobT8z0jrlKGlYmeR1OhQ==
"@babel/helper-simple-access@^7.22.5":
version "7.22.5"
resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz#4938357dc7d782b80ed6dbb03a0fba3d22b1d5de"
integrity sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==
"@babel/helper-simple-access@^7.24.5":
version "7.24.5"
resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.24.5.tgz#50da5b72f58c16b07fbd992810be6049478e85ba"
integrity sha512-uH3Hmf5q5n7n8mz7arjUlDOCbttY/DW4DYhE6FUsjKJ/oYC1kQQUvwEQWxRwUpX9qQKRXeqLwWxrqilMrf32sQ==
dependencies:
"@babel/types" "^7.22.5"
"@babel/types" "^7.24.5"
"@babel/helper-split-export-declaration@^7.22.6":
version "7.22.6"
resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz#322c61b7310c0997fe4c323955667f18fcefb91c"
integrity sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==
"@babel/helper-split-export-declaration@^7.24.5":
version "7.24.5"
resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.5.tgz#b9a67f06a46b0b339323617c8c6213b9055a78b6"
integrity sha512-5CHncttXohrHk8GWOFCcCl4oRD9fKosWlIRgWm4ql9VYioKm52Mk2xsmoohvm7f3JoiLSM5ZgJuRaf5QZZYd3Q==
dependencies:
"@babel/types" "^7.22.5"
"@babel/types" "^7.24.5"
"@babel/helper-string-parser@^7.23.4":
"@babel/helper-string-parser@^7.24.1":
version "7.24.1"
resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.24.1.tgz#f99c36d3593db9540705d0739a1f10b5e20c696e"
integrity sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ==
"@babel/helper-validator-identifier@^7.22.20":
version "7.22.20"
resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz#c4ae002c61d2879e724581d96665583dbc1dc0e0"
integrity sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==
"@babel/helper-validator-identifier@^7.24.5":
version "7.24.5"
resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.5.tgz#918b1a7fa23056603506370089bd990d8720db62"
integrity sha512-3q93SSKX2TWCG30M2G2kwaKeTYgEUp5Snjuj8qm729SObL6nbtUldAi37qbxkD5gg3xnBio+f9nqpSepGZMvxA==
"@babel/helper-validator-option@^7.23.5":
version "7.23.5"
resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz#907a3fbd4523426285365d1206c423c4c5520307"
integrity sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==
"@babel/helpers@^7.24.1":
version "7.24.1"
resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.24.1.tgz#183e44714b9eba36c3038e442516587b1e0a1a94"
integrity sha512-BpU09QqEe6ZCHuIHFphEFgvNSrubve1FtyMton26ekZ85gRGi6LrTF7zArARp2YvyFxloeiRmtSCq5sjh1WqIg==
"@babel/helpers@^7.24.5":
version "7.24.5"
resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.24.5.tgz#fedeb87eeafa62b621160402181ad8585a22a40a"
integrity sha512-CiQmBMMpMQHwM5m01YnrM6imUG1ebgYJ+fAIW4FZe6m4qHTPaRHti+R8cggAwkdz4oXhtO4/K9JWlh+8hIfR2Q==
dependencies:
"@babel/template" "^7.24.0"
"@babel/traverse" "^7.24.1"
"@babel/types" "^7.24.0"
"@babel/traverse" "^7.24.5"
"@babel/types" "^7.24.5"
"@babel/highlight@^7.24.2":
version "7.24.2"
resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.24.2.tgz#3f539503efc83d3c59080a10e6634306e0370d26"
integrity sha512-Yac1ao4flkTxTteCDZLEvdxg2fZfz1v8M4QpaGypq/WPDqg3ijHYbDfs+LG5hvzSoqaSZ9/Z9lKSP3CjZjv+pA==
version "7.24.5"
resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.24.5.tgz#bc0613f98e1dd0720e99b2a9ee3760194a704b6e"
integrity sha512-8lLmua6AVh/8SLJRRVD6V8p73Hir9w5mJrhE+IPpILG31KKlI9iz5zmBYKcWPS59qSfgP9RaSBQSHHE81WKuEw==
dependencies:
"@babel/helper-validator-identifier" "^7.22.20"
"@babel/helper-validator-identifier" "^7.24.5"
chalk "^2.4.2"
js-tokens "^4.0.0"
picocolors "^1.0.0"
"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.24.0", "@babel/parser@^7.24.1":
version "7.24.1"
resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.24.1.tgz#1e416d3627393fab1cb5b0f2f1796a100ae9133a"
integrity sha512-Zo9c7N3xdOIQrNip7Lc9wvRPzlRtovHVE4lkz8WEDr7uYh/GMQhSiIgFxGIArRHYdJE5kxtZjAf8rT0xhdLCzg==
"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.24.0", "@babel/parser@^7.24.5":
version "7.24.5"
resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.24.5.tgz#4a4d5ab4315579e5398a82dcf636ca80c3392790"
integrity sha512-EOv5IK8arwh3LI47dz1b0tKUb/1uhHAnHJOrjgtQMIpu1uXd9mlFrJg9IUgGUgZ41Ch0K8REPTYpO7B76b4vJg==
"@babel/plugin-syntax-async-generators@^7.8.4":
version "7.8.4"
@ -261,29 +261,29 @@
"@babel/parser" "^7.24.0"
"@babel/types" "^7.24.0"
"@babel/traverse@^7.24.1", "@babel/traverse@^7.7.2":
version "7.24.1"
resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.24.1.tgz#d65c36ac9dd17282175d1e4a3c49d5b7988f530c"
integrity sha512-xuU6o9m68KeqZbQuDt2TcKSxUw/mrsvavlEqQ1leZ/B+C9tk6E4sRWy97WaXgvq5E+nU3cXMxv3WKOCanVMCmQ==
"@babel/traverse@^7.24.5", "@babel/traverse@^7.7.2":
version "7.24.5"
resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.24.5.tgz#972aa0bc45f16983bf64aa1f877b2dd0eea7e6f8"
integrity sha512-7aaBLeDQ4zYcUFDUD41lJc1fG8+5IU9DaNSJAgal866FGvmD5EbWQgnEC6kO1gGLsX0esNkfnJSndbTXA3r7UA==
dependencies:
"@babel/code-frame" "^7.24.1"
"@babel/generator" "^7.24.1"
"@babel/code-frame" "^7.24.2"
"@babel/generator" "^7.24.5"
"@babel/helper-environment-visitor" "^7.22.20"
"@babel/helper-function-name" "^7.23.0"
"@babel/helper-hoist-variables" "^7.22.5"
"@babel/helper-split-export-declaration" "^7.22.6"
"@babel/parser" "^7.24.1"
"@babel/types" "^7.24.0"
"@babel/helper-split-export-declaration" "^7.24.5"
"@babel/parser" "^7.24.5"
"@babel/types" "^7.24.5"
debug "^4.3.1"
globals "^11.1.0"
"@babel/types@^7.0.0", "@babel/types@^7.20.7", "@babel/types@^7.22.5", "@babel/types@^7.23.0", "@babel/types@^7.24.0", "@babel/types@^7.3.3":
version "7.24.0"
resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.24.0.tgz#3b951f435a92e7333eba05b7566fd297960ea1bf"
integrity sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==
"@babel/types@^7.0.0", "@babel/types@^7.20.7", "@babel/types@^7.22.5", "@babel/types@^7.23.0", "@babel/types@^7.24.0", "@babel/types@^7.24.5", "@babel/types@^7.3.3":
version "7.24.5"
resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.24.5.tgz#7661930afc638a5383eb0c4aee59b74f38db84d7"
integrity sha512-6mQNsaLeXTw0nxYUYu+NSa4Hx4BlF1x1x8/PMFbiR+GBSr+2DkECc69b8hgy2frEodNcvPffeH8YfWd3LI6jhQ==
dependencies:
"@babel/helper-string-parser" "^7.23.4"
"@babel/helper-validator-identifier" "^7.22.20"
"@babel/helper-string-parser" "^7.24.1"
"@babel/helper-validator-identifier" "^7.24.5"
to-fast-properties "^2.0.0"
"@bcoe/v8-coverage@^0.2.3":
@ -1426,30 +1426,30 @@
resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33"
integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==
"@preserves/core@0.995.100", "@preserves/core@^0.995.100":
version "0.995.100"
resolved "https://registry.yarnpkg.com/@preserves/core/-/core-0.995.100.tgz#9159d9ccd9a11314fbb09ad7db53090d5dccf98e"
integrity sha512-EpdAbWdel/upZ4QJT6JyiCiZ/cl70dyGRQLrExe0lh4Hvan/O59dv7GLuAWa5rtQJLp84bdYGXf8+iYcNM35WA==
"@preserves/core@^0.995.200", "@preserves/core@^0.995.201":
version "0.995.201"
resolved "https://registry.yarnpkg.com/@preserves/core/-/core-0.995.201.tgz#919635b8af3daf705b83656300c4c32136278171"
integrity sha512-ZFRheLOtOlFO2hkX2ZVKugTENBz37gSgm0nZp7xIYafRkPkEPcXSZ2cOGRDTXxXQOOEyu4y/iCi3RqJUTBPP+g==
"@preserves/schema-cli@0.995.100":
version "0.995.100"
resolved "https://registry.yarnpkg.com/@preserves/schema-cli/-/schema-cli-0.995.100.tgz#c3ee6a1509f85bf280336a1e351fe47c29e107a1"
integrity sha512-o+msStzLAkevIi85dqUWg7TjTauRXx61TmezoDhaxIKmElKYbHCBDUj3esJTr5u3j+nCt1LFAZBMyHewblBUvg==
"@preserves/schema-cli@>=0.995.201", "@preserves/schema-cli@^0.995.201":
version "0.995.202"
resolved "https://registry.yarnpkg.com/@preserves/schema-cli/-/schema-cli-0.995.202.tgz#8de6bda084ac66bb11b800b4a210eaff4b09dbaa"
integrity sha512-kAFdcgQgapk2q/kV9/dfC72QOX+lE0h8GOz2tva6DOzYiPRkjW/Xa9wmvt5IE0Ebv3pNyVfF/J6OTlXEelaqqw==
dependencies:
"@preserves/core" "^0.995.100"
"@preserves/schema" "^0.995.100"
"@preserves/core" "^0.995.201"
"@preserves/schema" "^0.995.202"
chalk "^4.1"
chokidar "^3.5"
commander "^7.2"
glob "^7.1"
minimatch "^3.0"
"@preserves/schema@0.995.100", "@preserves/schema@^0.995.100":
version "0.995.100"
resolved "https://registry.yarnpkg.com/@preserves/schema/-/schema-0.995.100.tgz#27c5dbe7e866137e7b8686c0c4ea926e96120966"
integrity sha512-gHtFZ+MZZZem34lFyLqE54x//GjRBN3kERmqo28guivs+EFVk7io333HFl2dCCeLQTZfNfFnoFNNHe0ipaKOvA==
"@preserves/schema@^0.995.201", "@preserves/schema@^0.995.202":
version "0.995.202"
resolved "https://registry.yarnpkg.com/@preserves/schema/-/schema-0.995.202.tgz#6334deea21d62f2ad709ba7d16a9f8fa7f899c3a"
integrity sha512-wnUBBeHsqLY+AGficWm6OsgpHiVWabv+Bkzn8l+xbVrhTRhMbirTUYKetaH658xxjbWLR3B4QVdbu9g5VBlehg==
dependencies:
"@preserves/core" "^0.995.100"
"@preserves/core" "^0.995.201"
"@rollup/plugin-node-resolve@^13.0":
version "13.3.0"
@ -1492,9 +1492,9 @@
integrity sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==
"@tsconfig/node10@^1.0.7":
version "1.0.9"
resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.9.tgz#df4907fc07a886922637b15e02d4cebc4c0021b2"
integrity sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==
version "1.0.11"
resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.11.tgz#6ee46400685f130e278128c7b38b7e031ff5b2f2"
integrity sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==
"@tsconfig/node12@^1.0.7":
version "1.0.11"
@ -1612,9 +1612,9 @@
integrity sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==
"@types/node@*":
version "20.11.30"
resolved "https://registry.yarnpkg.com/@types/node/-/node-20.11.30.tgz#9c33467fc23167a347e73834f788f4b9f399d66f"
integrity sha512-dHM6ZxwlmuZaRmUPfv1p+KrdD1Dci04FbdEm/9wEMouFqxYoFl5aMkt0VMAUtYRQDyYvD41WJLukhq/ha3YuTw==
version "20.12.8"
resolved "https://registry.yarnpkg.com/@types/node/-/node-20.12.8.tgz#35897bf2bfe3469847ab04634636de09552e8256"
integrity sha512-NU0rJLJnshZWdE/097cdCBbyW1h4hEg0xpovcoAQYHl8dnEyp/NAOiE45pvc+Bd1Dt+2r94v2eGFpQJ4R7g+2w==
dependencies:
undici-types "~5.26.4"
@ -2214,9 +2214,9 @@ camelcase@^6.2.0:
integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==
caniuse-lite@^1.0.30001587:
version "1.0.30001599"
resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001599.tgz#571cf4f3f1506df9bf41fcbb6d10d5d017817bce"
integrity sha512-LRAQHZ4yT1+f9LemSMeqdMpMxZcc4RMWdj4tiFe3G8tNkWK+E58g+/tzotb5cU6TbcVJLr4fySiAW7XmxQvZQA==
version "1.0.30001615"
resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001615.tgz#7c2c8772db681b6dee74d81d6550db68f2d28842"
integrity sha512-1IpazM5G3r38meiae0bHRnPhz+CBQ3ZLqbQMtrg+AsTPKAXgW38JNsXkyZ+v8waCsDmPq87lmfun5Q2AGysNEQ==
caseless@~0.12.0:
version "0.12.0"
@ -2293,9 +2293,9 @@ ci-info@^3.2.0:
integrity sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==
cjs-module-lexer@^1.0.0:
version "1.2.3"
resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz#6c370ab19f8a3394e318fe682686ec0ac684d107"
integrity sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==
version "1.3.1"
resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.3.1.tgz#c485341ae8fd999ca4ee5af2d7a1c9ae01e0099c"
integrity sha512-a3KdPAANPbNE4ZUv9h6LckSl9zLsYOP4MBmhIPkRaeyybt+r4UghLvq+xw/YwUcC1gqylCkL4rdVs3Lwupjm4Q==
clean-stack@^2.0.0:
version "2.2.0"
@ -2707,7 +2707,7 @@ define-data-property@^1.0.1, define-data-property@^1.1.4:
es-errors "^1.3.0"
gopd "^1.0.1"
define-properties@^1.1.3, define-properties@^1.2.0, define-properties@^1.2.1:
define-properties@^1.2.0, define-properties@^1.2.1:
version "1.2.1"
resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.1.tgz#10781cc616eb951a80a034bafcaa7377f6af2b6c"
integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==
@ -2835,9 +2835,9 @@ editorconfig@^1.0.4:
semver "^7.5.3"
electron-to-chromium@^1.4.668:
version "1.4.713"
resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.713.tgz#7cd8e4083c948f8d0cc686fcfdde97d97fd76556"
integrity sha512-vDarADhwntXiULEdmWd77g2dV6FrNGa8ecAC29MZ4TwPut2fvosD0/5sJd1qWNNe8HcJFAC+F5Lf9jW1NPtWmw==
version "1.4.755"
resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.755.tgz#e26b3f5955b9de75a24048587521bde22fa4e0a0"
integrity sha512-9nop+3jZxSHIxe1EzEUcjDXzK+3qOv3fY5w0sE88nIZUntbv1aXWmoxGWlklX5XSO4txCpLssWkUSh8RQPovBg==
emittery@^0.8.1:
version "0.8.1"
@ -2867,9 +2867,9 @@ env-paths@^2.2.0:
integrity sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==
envinfo@^7.7.4:
version "7.11.1"
resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.11.1.tgz#2ffef77591057081b0129a8fd8cf6118da1b94e1"
integrity sha512-8PiZgZNIB4q/Lw4AhOvAfB/ityHAd2bli3lESSWmWSzSsl5dKpy5N1d1Rfkd2teq/g9xN90lc6o98DOjMeYHpg==
version "7.13.0"
resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.13.0.tgz#81fbb81e5da35d74e814941aeab7c325a606fb31"
integrity sha512-cvcaMr7KqXVh4nyzGTVqTum+gAiL265x5jUWQIDLq//zOGbW+gSW/C+OWLleY/rs9Qole6AZLMXPbtIFQbqu+Q==
err-code@^2.0.2:
version "2.0.3"
@ -2883,57 +2883,10 @@ error-ex@^1.3.1:
dependencies:
is-arrayish "^0.2.1"
es-abstract@^1.22.1, es-abstract@^1.22.3:
version "1.22.5"
resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.22.5.tgz#1417df4e97cc55f09bf7e58d1e614bc61cb8df46"
integrity sha512-oW69R+4q2wG+Hc3KZePPZxOiisRIqfKBVo/HLx94QcJeWGU/8sZhCvc829rd1kS366vlJbzBfXf9yWwf0+Ko7w==
dependencies:
array-buffer-byte-length "^1.0.1"
arraybuffer.prototype.slice "^1.0.3"
available-typed-arrays "^1.0.7"
call-bind "^1.0.7"
es-define-property "^1.0.0"
es-errors "^1.3.0"
es-set-tostringtag "^2.0.3"
es-to-primitive "^1.2.1"
function.prototype.name "^1.1.6"
get-intrinsic "^1.2.4"
get-symbol-description "^1.0.2"
globalthis "^1.0.3"
gopd "^1.0.1"
has-property-descriptors "^1.0.2"
has-proto "^1.0.3"
has-symbols "^1.0.3"
hasown "^2.0.1"
internal-slot "^1.0.7"
is-array-buffer "^3.0.4"
is-callable "^1.2.7"
is-negative-zero "^2.0.3"
is-regex "^1.1.4"
is-shared-array-buffer "^1.0.3"
is-string "^1.0.7"
is-typed-array "^1.1.13"
is-weakref "^1.0.2"
object-inspect "^1.13.1"
object-keys "^1.1.1"
object.assign "^4.1.5"
regexp.prototype.flags "^1.5.2"
safe-array-concat "^1.1.0"
safe-regex-test "^1.0.3"
string.prototype.trim "^1.2.8"
string.prototype.trimend "^1.0.7"
string.prototype.trimstart "^1.0.7"
typed-array-buffer "^1.0.2"
typed-array-byte-length "^1.0.1"
typed-array-byte-offset "^1.0.2"
typed-array-length "^1.0.5"
unbox-primitive "^1.0.2"
which-typed-array "^1.1.14"
es-abstract@^1.23.0, es-abstract@^1.23.2:
version "1.23.2"
resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.23.2.tgz#693312f3940f967b8dd3eebacb590b01712622e0"
integrity sha512-60s3Xv2T2p1ICykc7c+DNDPLDMm9t4QxCOUU0K9JxiLjM3C1zB9YVdN7tjxrFd4+AkZ8CdX1ovUga4P2+1e+/w==
es-abstract@^1.22.1, es-abstract@^1.22.3, es-abstract@^1.23.0, es-abstract@^1.23.2:
version "1.23.3"
resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.23.3.tgz#8f0c5a35cd215312573c5a27c87dfd6c881a0aa0"
integrity sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==
dependencies:
array-buffer-byte-length "^1.0.1"
arraybuffer.prototype.slice "^1.0.3"
@ -2974,11 +2927,11 @@ es-abstract@^1.23.0, es-abstract@^1.23.2:
safe-regex-test "^1.0.3"
string.prototype.trim "^1.2.9"
string.prototype.trimend "^1.0.8"
string.prototype.trimstart "^1.0.7"
string.prototype.trimstart "^1.0.8"
typed-array-buffer "^1.0.2"
typed-array-byte-length "^1.0.1"
typed-array-byte-offset "^1.0.2"
typed-array-length "^1.0.5"
typed-array-length "^1.0.6"
unbox-primitive "^1.0.2"
which-typed-array "^1.1.15"
@ -3024,7 +2977,7 @@ es-to-primitive@^1.2.1:
is-date-object "^1.0.1"
is-symbol "^1.0.2"
escalade@^3.1.1:
escalade@^3.1.1, escalade@^3.1.2:
version "3.1.2"
resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.2.tgz#54076e9ab29ea5bf3d8f1ed62acffbb88272df27"
integrity sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==
@ -3438,15 +3391,15 @@ glob-parent@^5.1.1, glob-parent@^5.1.2, glob-parent@~5.1.2:
is-glob "^4.0.1"
glob@^10.3.3:
version "10.3.10"
resolved "https://registry.yarnpkg.com/glob/-/glob-10.3.10.tgz#0351ebb809fd187fe421ab96af83d3a70715df4b"
integrity sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==
version "10.3.12"
resolved "https://registry.yarnpkg.com/glob/-/glob-10.3.12.tgz#3a65c363c2e9998d220338e88a5f6ac97302960b"
integrity sha512-TCNv8vJ+xz4QiqTpfOJA7HvYv+tNIRHKfUWw/q+v2jdgN4ebz+KY9tGx5J4rHP0o84mNP+ApH66HRX8us3Khqg==
dependencies:
foreground-child "^3.1.0"
jackspeak "^2.3.5"
jackspeak "^2.3.6"
minimatch "^9.0.1"
minipass "^5.0.0 || ^6.0.2 || ^7.0.0"
path-scurry "^1.10.1"
minipass "^7.0.4"
path-scurry "^1.10.2"
glob@^7.1, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6:
version "7.2.3"
@ -3466,11 +3419,12 @@ globals@^11.1.0:
integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==
globalthis@^1.0.3:
version "1.0.3"
resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.3.tgz#5852882a52b80dc301b0660273e1ed082f0b6ccf"
integrity sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==
version "1.0.4"
resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.4.tgz#7430ed3a975d97bfb59bcce41f5cabbafa651236"
integrity sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==
dependencies:
define-properties "^1.1.3"
define-properties "^1.2.1"
gopd "^1.0.1"
globby@^11.0.2:
version "11.1.0"
@ -4065,7 +4019,7 @@ istanbul-reports@^3.1.3:
html-escaper "^2.0.0"
istanbul-lib-report "^3.0.0"
jackspeak@^2.3.5:
jackspeak@^2.3.6:
version "2.3.6"
resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-2.3.6.tgz#647ecc472238aee4b06ac0e461acc21a8c505ca8"
integrity sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==
@ -4759,6 +4713,11 @@ lodash@^4.17.15, lodash@^4.17.19, lodash@^4.7.0:
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c"
integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==
lru-cache@^10.2.0:
version "10.2.2"
resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.2.2.tgz#48206bc114c1252940c41b25b41af5b545aca878"
integrity sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==
lru-cache@^5.1.1:
version "5.1.1"
resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920"
@ -4773,11 +4732,6 @@ lru-cache@^6.0.0:
dependencies:
yallist "^4.0.0"
"lru-cache@^9.1.1 || ^10.0.0":
version "10.2.0"
resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.2.0.tgz#0bd445ca57363465900f4d1f9bd8db343a4d95c3"
integrity sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==
make-dir@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5"
@ -4937,9 +4891,9 @@ minimatch@^3.0, minimatch@^3.0.4, minimatch@^3.1.1:
brace-expansion "^1.1.7"
minimatch@^9.0.1:
version "9.0.3"
resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.3.tgz#a6e00c3de44c3a542bfaae70abfc22420a6da825"
integrity sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==
version "9.0.4"
resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.4.tgz#8e49c731d1749cbec05050ee5145147b32496a51"
integrity sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==
dependencies:
brace-expansion "^2.0.1"
@ -5024,7 +4978,7 @@ minipass@^5.0.0:
resolved "https://registry.yarnpkg.com/minipass/-/minipass-5.0.0.tgz#3e9788ffb90b694a5d0ec94479a45b5d8738133d"
integrity sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==
"minipass@^5.0.0 || ^6.0.2 || ^7.0.0":
"minipass@^5.0.0 || ^6.0.2 || ^7.0.0", minipass@^7.0.4:
version "7.0.4"
resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.0.4.tgz#dbce03740f50a4786ba994c1fb908844d27b038c"
integrity sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==
@ -5324,9 +5278,9 @@ number-is-nan@^1.0.0:
integrity sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==
nwsapi@^2.2.0:
version "2.2.7"
resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.7.tgz#738e0707d3128cb750dddcfe90e4610482df0f30"
integrity sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ==
version "2.2.9"
resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.9.tgz#7f3303218372db2e9f27c27766bcfc59ae7e61c6"
integrity sha512-2f3F0SEEer8bBu0dsNCFF50N0cTThV1nWFYcEYFZttdW0lDAoybv9cQoK7X7/68Z89S7FoRrVjP1LPX4XRf9vg==
oauth-sign@~0.9.0:
version "0.9.0"
@ -5590,12 +5544,12 @@ path-parse@^1.0.7:
resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735"
integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==
path-scurry@^1.10.1:
version "1.10.1"
resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.10.1.tgz#9ba6bf5aa8500fe9fd67df4f0d9483b2b0bfc698"
integrity sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==
path-scurry@^1.10.2:
version "1.10.2"
resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.10.2.tgz#8f6357eb1239d5fa1da8b9f70e9c080675458ba7"
integrity sha512-7xTavNy5RQXnsjANvVvMkEjvloOinkAjv/Z6Ildz9v2RinZ4SBKTWFOVRbaF8p0vpHnyjV/UwNDdKuUv6M5qcA==
dependencies:
lru-cache "^9.1.1 || ^10.0.0"
lru-cache "^10.2.0"
minipass "^5.0.0 || ^6.0.2 || ^7.0.0"
path-type@^3.0.0:
@ -5735,9 +5689,9 @@ q@^1.5.1:
integrity sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==
qs@^6.9.4:
version "6.12.0"
resolved "https://registry.yarnpkg.com/qs/-/qs-6.12.0.tgz#edd40c3b823995946a8a0b1f208669c7a200db77"
integrity sha512-trVZiI6RMOkO476zLGaBIzszOdFPnCCXHPG9kn0yuS1uz6xdVxPfZdB3vUig9pxPFDM9BRAgz/YUIVQ1/vuiUg==
version "6.12.1"
resolved "https://registry.yarnpkg.com/qs/-/qs-6.12.1.tgz#39422111ca7cbdb70425541cba20c7d7b216599a"
integrity sha512-zWmv4RSuB9r2mYQw3zxQuHWeU+42aKi1wWig/j4ele4ygELZ7PEO6MM7rim9oAQH2A5MWfsAVf/jPvTPgCbvUQ==
dependencies:
side-channel "^1.0.6"
@ -6078,7 +6032,7 @@ rxjs@^6.6.0:
dependencies:
tslib "^1.9.0"
safe-array-concat@^1.1.0, safe-array-concat@^1.1.2:
safe-array-concat@^1.1.2:
version "1.1.2"
resolved "https://registry.yarnpkg.com/safe-array-concat/-/safe-array-concat-1.1.2.tgz#81d77ee0c4e8b863635227c721278dd524c20edb"
integrity sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==
@ -6112,7 +6066,7 @@ safe-regex-test@^1.0.3:
resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a"
integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==
salty-crypto@0.3, salty-crypto@0.3.1:
salty-crypto@0.3, salty-crypto@^0.3.1:
version "0.3.1"
resolved "https://registry.yarnpkg.com/salty-crypto/-/salty-crypto-0.3.1.tgz#1242cd948d8152aff104d0945980996b1602ba0e"
integrity sha512-dCbF8/UzMV8oXPmMCHWzSp7u8G6NA+pHbaFBVqVgLVBiyxuwVn9iPbyt9WXT0EoXfL9sKt7U1mV+bgsGw5cV7A==
@ -6258,9 +6212,9 @@ socks-proxy-agent@^6.0.0:
socks "^2.6.2"
socks@^2.3.3, socks@^2.6.2:
version "2.8.1"
resolved "https://registry.yarnpkg.com/socks/-/socks-2.8.1.tgz#22c7d9dd7882649043cba0eafb49ae144e3457af"
integrity sha512-B6w7tkwNid7ToxjZ08rQMT8M9BJAf8DKx8Ft4NivzH0zBUfd6jldGcisJn/RLgxcX3FPNDdNQCUEMMT79b+oCQ==
version "2.8.3"
resolved "https://registry.yarnpkg.com/socks/-/socks-2.8.3.tgz#1ebd0f09c52ba95a09750afe3f3f9f724a800cb5"
integrity sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw==
dependencies:
ip-address "^9.0.5"
smart-buffer "^4.2.0"
@ -6438,7 +6392,7 @@ string-width@^5.0.1, string-width@^5.1.2:
emoji-regex "^9.2.2"
strip-ansi "^7.0.1"
string.prototype.trim@^1.2.8, string.prototype.trim@^1.2.9:
string.prototype.trim@^1.2.9:
version "1.2.9"
resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz#b6fa326d72d2c78b6df02f7759c73f8f6274faa4"
integrity sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==
@ -6448,7 +6402,7 @@ string.prototype.trim@^1.2.8, string.prototype.trim@^1.2.9:
es-abstract "^1.23.0"
es-object-atoms "^1.0.0"
string.prototype.trimend@^1.0.7, string.prototype.trimend@^1.0.8:
string.prototype.trimend@^1.0.8:
version "1.0.8"
resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz#3651b8513719e8a9f48de7f2f77640b26652b229"
integrity sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==
@ -6457,14 +6411,14 @@ string.prototype.trimend@^1.0.7, string.prototype.trimend@^1.0.8:
define-properties "^1.2.1"
es-object-atoms "^1.0.0"
string.prototype.trimstart@^1.0.7:
version "1.0.7"
resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz#d4cdb44b83a4737ffbac2d406e405d43d0184298"
integrity sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==
string.prototype.trimstart@^1.0.8:
version "1.0.8"
resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz#7ee834dda8c7c17eff3118472bb35bfedaa34dde"
integrity sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==
dependencies:
call-bind "^1.0.2"
define-properties "^1.2.0"
es-abstract "^1.22.1"
call-bind "^1.0.7"
define-properties "^1.2.1"
es-object-atoms "^1.0.0"
string_decoder@^1.1.1:
version "1.3.0"
@ -6602,9 +6556,9 @@ tar@^4.4.12:
yallist "^3.1.1"
tar@^6.0.2, tar@^6.1.0:
version "6.2.0"
resolved "https://registry.yarnpkg.com/tar/-/tar-6.2.0.tgz#b14ce49a79cb1cd23bc9b016302dea5474493f73"
integrity sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ==
version "6.2.1"
resolved "https://registry.yarnpkg.com/tar/-/tar-6.2.1.tgz#717549c541bc3c2af15751bea94b1dd068d4b03a"
integrity sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==
dependencies:
chownr "^2.0.0"
fs-minipass "^2.0.0"
@ -6638,9 +6592,9 @@ terminal-link@^2.0.0:
supports-hyperlinks "^2.0.0"
terser@^5.0.0:
version "5.29.2"
resolved "https://registry.yarnpkg.com/terser/-/terser-5.29.2.tgz#c17d573ce1da1b30f21a877bffd5655dd86fdb35"
integrity sha512-ZiGkhUBIM+7LwkNjXYJq8svgkd+QK3UUr0wJqY4MieaezBSAIPgbSPZyIx0idM6XWK5CMzSWa8MJIzmRcB8Caw==
version "5.31.0"
resolved "https://registry.yarnpkg.com/terser/-/terser-5.31.0.tgz#06eef86f17007dbad4593f11a574c7f5eb02c6a1"
integrity sha512-Q1JFAoUKE5IMfI4Z/lkE/E6+SwgzO+x4tq4v1AyBLRj8VSYvRO6A/rQrPg1yud4g0En9EKI1TvFRF2tQFcoUkg==
dependencies:
"@jridgewell/source-map" "^0.3.3"
acorn "^8.8.2"
@ -6711,9 +6665,9 @@ to-regex-range@^5.0.1:
is-number "^7.0.0"
tough-cookie@^4.0.0:
version "4.1.3"
resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.1.3.tgz#97b9adb0728b42280aa3d814b6b999b2ff0318bf"
integrity sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==
version "4.1.4"
resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.1.4.tgz#945f1461b45b5a8c76821c33ea49c3ac192c1b36"
integrity sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==
dependencies:
psl "^1.1.33"
punycode "^2.1.1"
@ -6905,10 +6859,10 @@ typed-array-byte-offset@^1.0.2:
has-proto "^1.0.3"
is-typed-array "^1.1.13"
typed-array-length@^1.0.5:
version "1.0.5"
resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.5.tgz#57d44da160296d8663fd63180a1802ebf25905d5"
integrity sha512-yMi0PlwuznKHxKmcpoOdeLwxBoVPkqZxd7q2FgMkmD3bNwvF5VW0+UlUQ1k1vmktTu4Yu13Q0RIxEP8+B+wloA==
typed-array-length@^1.0.6:
version "1.0.6"
resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.6.tgz#57155207c76e64a3457482dfdc1c9d1d3c4c73a3"
integrity sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==
dependencies:
call-bind "^1.0.7"
for-each "^0.3.3"
@ -7020,11 +6974,11 @@ upath@^2.0.1:
integrity sha512-1uEe95xksV1O0CYKXo8vQvN1JEbtJp7lb7C5U9HMsIp6IVwntkH/oNUzyVNQSd4S1sYk2FpSSW44FqMc8qee5w==
update-browserslist-db@^1.0.13:
version "1.0.13"
resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz#3c5e4f5c083661bd38ef64b6328c26ed6c8248c4"
integrity sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==
version "1.0.14"
resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.14.tgz#46a9367c323f8ade9a9dddb7f3ae7814b3a0b31c"
integrity sha512-JixKH8GR2pWYshIPUg/NujK3JO7JiqEEUiNArE86NQyrgUuZeTlZQN3xuS/yiV5Kb48ev9K6RqNkaJjXsdg7Jw==
dependencies:
escalade "^3.1.1"
escalade "^3.1.2"
picocolors "^1.0.0"
uri-js@^4.2.2: