Compare commits

...

90 Commits

Author SHA1 Message Date
Tony Garnock-Jones 600d9b3c15 Update 2024-06-07 12:09:26 +02:00
Tony Garnock-Jones f2fc6fdfba Publish
- @syndicate-lang/browser-stdenv@0.36.1
 - @syndicate-lang/create@0.26.1
 - @syndicate-lang/ws-relay@0.37.1
2024-06-07 12:07:20 +02:00
Tony Garnock-Jones d84f02ebfb Assert answers to the correct space 2024-06-07 12:07:01 +02:00
Tony Garnock-Jones c430f03e7d Remove unused import 2024-06-07 12:06:53 +02:00
Tony Garnock-Jones 05d1e9c692 Update dependencies 2024-06-07 11:59:57 +02:00
Tony Garnock-Jones 86538dad31 Publish
- @syndicate-lang/browser-stdenv@0.36.0
 - @syndicate-lang/core@0.35.0
 - @syndicate-lang/create@0.26.0
 - @syndicate-lang/fs@0.36.0
 - @syndicate-lang/html@0.36.0
 - @syndicate-lang/html2@0.36.0
 - @syndicate-lang/loader@0.36.0
 - @syndicate-lang/service@0.36.0
 - @syndicate-lang/syndicatec@0.37.0
 - @syndicate-lang/timer@0.36.0
 - @syndicate-lang/ts-plugin@0.37.0
 - @syndicate-lang/tsc@0.37.0
 - @syndicate-lang/ws-relay@0.37.0
2024-06-07 11:56:43 +02:00
Tony Garnock-Jones 2fd8319105 git subtree push for protocols 2024-06-07 11:56:16 +02:00
Tony Garnock-Jones d4abbe33f6 Update dependencies 2024-06-07 11:54:35 +02:00
Tony Garnock-Jones 6fb100ee60 Simplify gatekeeper client-side protocols 2024-06-07 11:53:22 +02:00
Tony Garnock-Jones f45ab47175 Catch exit hook failures 2024-06-07 09:56:22 +02:00
Tony Garnock-Jones 078c34632b Publish
- @syndicate-lang/browser-stdenv@0.35.10
 - @syndicate-lang/core@0.34.9
 - @syndicate-lang/fs@0.35.9
 - @syndicate-lang/html@0.35.9
 - @syndicate-lang/html2@0.35.10
 - @syndicate-lang/loader@0.35.9
 - @syndicate-lang/service@0.35.9
 - @syndicate-lang/syndicatec@0.36.9
 - @syndicate-lang/timer@0.35.9
 - @syndicate-lang/ts-plugin@0.36.9
 - @syndicate-lang/tsc@0.36.9
 - @syndicate-lang/ws-relay@0.36.9
2024-06-04 14:14:19 +02:00
Tony Garnock-Jones 626194fc99 More tests, more bugs, more fixes 2024-06-04 14:13:56 +02:00
Tony Garnock-Jones a8fd5aa2fe Actually-useful tests 2024-06-04 12:05:28 +02:00
Tony Garnock-Jones 44fe1ff7b5 A few simple tests 2024-06-04 11:48:40 +02:00
Tony Garnock-Jones d9fe78edf7 TODO 2024-05-30 13:26:02 +02:00
Tony Garnock-Jones 8fcea8362c Publish
- @syndicate-lang/browser-stdenv@0.35.9
 - @syndicate-lang/core@0.34.8
 - @syndicate-lang/fs@0.35.8
 - @syndicate-lang/html@0.35.8
 - @syndicate-lang/html2@0.35.9
 - @syndicate-lang/loader@0.35.8
 - @syndicate-lang/service@0.35.8
 - @syndicate-lang/syndicatec@0.36.8
 - @syndicate-lang/timer@0.35.8
 - @syndicate-lang/ts-plugin@0.36.8
 - @syndicate-lang/tsc@0.36.8
 - @syndicate-lang/ws-relay@0.36.8
2024-05-30 13:12:14 +02:00
Tony Garnock-Jones 4292c5f40f Repair error in grabImportedOid: it is OK for there to be no mapping 2024-05-30 13:12:00 +02:00
Tony Garnock-Jones a0ba43cfae Membrane-tracing infrastructure 2024-05-30 13:11:42 +02:00
Tony Garnock-Jones c59506fe0e Publish
- @syndicate-lang/browser-stdenv@0.35.8
 - @syndicate-lang/core@0.34.7
 - @syndicate-lang/fs@0.35.7
 - @syndicate-lang/html@0.35.7
 - @syndicate-lang/html2@0.35.8
 - @syndicate-lang/loader@0.35.7
 - @syndicate-lang/service@0.35.7
 - @syndicate-lang/syndicatec@0.36.7
 - @syndicate-lang/timer@0.35.7
 - @syndicate-lang/ts-plugin@0.36.7
 - @syndicate-lang/tsc@0.36.7
 - @syndicate-lang/ws-relay@0.36.7
2024-05-29 21:52:06 +02:00
Tony Garnock-Jones ffea85ece9 Allow strip_binds in Pattern.drop_lit 2024-05-29 17:37:01 +02:00
Tony Garnock-Jones 4c3eaeff1c Publish
- @syndicate-lang/browser-stdenv@0.35.7
 - @syndicate-lang/html2@0.35.7
2024-05-29 16:38:52 +02:00
Tony Garnock-Jones 830652d71c Repair relationship between ValueWidget and Widget constructors 2024-05-29 16:31:20 +02:00
Tony Garnock-Jones d008cc3f94 Publish
- @syndicate-lang/browser-stdenv@0.35.6
 - @syndicate-lang/compiler@0.22.3
 - @syndicate-lang/core@0.34.6
 - @syndicate-lang/fs@0.35.6
 - @syndicate-lang/html@0.35.6
 - @syndicate-lang/html2@0.35.6
 - @syndicate-lang/loader@0.35.6
 - @syndicate-lang/service@0.35.6
 - @syndicate-lang/syndicatec@0.36.6
 - @syndicate-lang/timer@0.35.6
 - @syndicate-lang/ts-plugin@0.36.6
 - @syndicate-lang/tsc@0.36.6
 - @syndicate-lang/ws-relay@0.36.6
2024-05-29 13:30:45 +02:00
Tony Garnock-Jones 333f743114 Experimental sealing 2024-05-29 11:50:23 +02:00
Tony Garnock-Jones 9c85ac5a85 Cosmetic: whitespace 2024-05-29 11:49:00 +02:00
Tony Garnock-Jones 248d22a3ef Dynamic currentSyndicateTarget 2024-05-29 11:48:45 +02:00
Tony Garnock-Jones 7a34dc9716 Publish
- @syndicate-lang/browser-stdenv@0.35.5
 - @syndicate-lang/core@0.34.5
 - @syndicate-lang/fs@0.35.5
 - @syndicate-lang/html@0.35.5
 - @syndicate-lang/html2@0.35.5
 - @syndicate-lang/loader@0.35.5
 - @syndicate-lang/service@0.35.5
 - @syndicate-lang/syndicatec@0.36.5
 - @syndicate-lang/timer@0.35.5
 - @syndicate-lang/ts-plugin@0.36.5
 - @syndicate-lang/tsc@0.36.5
 - @syndicate-lang/ws-relay@0.36.5
2024-05-28 22:50:34 +02:00
Tony Garnock-Jones 63ae985d83 Add Syndicate.suspend 2024-05-28 22:50:10 +02:00
Tony Garnock-Jones 4c5c93820b Publish
- @syndicate-lang/browser-stdenv@0.35.4
 - @syndicate-lang/core@0.34.4
 - @syndicate-lang/fs@0.35.4
 - @syndicate-lang/html@0.35.4
 - @syndicate-lang/html2@0.35.4
 - @syndicate-lang/loader@0.35.4
 - @syndicate-lang/service@0.35.4
 - @syndicate-lang/syndicatec@0.36.4
 - @syndicate-lang/timer@0.35.4
 - @syndicate-lang/ts-plugin@0.36.4
 - @syndicate-lang/tsc@0.36.4
 - @syndicate-lang/ws-relay@0.36.4
2024-05-28 22:28:07 +02:00
Tony Garnock-Jones ff1b013d66 Properly convert dataflow-assertions to simple values to allow the `is` check to work 2024-05-28 22:27:53 +02:00
Tony Garnock-Jones 25c701cd4e Compile in JS-only mode for files ending in ".js" 2024-05-28 22:06:10 +02:00
Tony Garnock-Jones 300c4046f8 Publish
- @syndicate-lang/browser-stdenv@0.35.3
 - @syndicate-lang/compiler@0.22.2
 - @syndicate-lang/core@0.34.3
 - @syndicate-lang/fs@0.35.3
 - @syndicate-lang/html@0.35.3
 - @syndicate-lang/html2@0.35.3
 - @syndicate-lang/loader@0.35.3
 - @syndicate-lang/service@0.35.3
 - @syndicate-lang/syndicatec@0.36.3
 - @syndicate-lang/timer@0.35.3
 - @syndicate-lang/ts-plugin@0.36.3
 - @syndicate-lang/tsc@0.36.3
 - @syndicate-lang/ws-relay@0.36.3
2024-05-28 21:15:39 +02:00
Tony Garnock-Jones 81696a90b4 Add syntax for sync. Closes #6 2024-05-28 21:14:53 +02:00
Tony Garnock-Jones d14ddc39f7 Do not deliver an action if the target relay is dead 2024-05-28 16:13:19 +02:00
Tony Garnock-Jones 1e08230027 Slightly less unhelpful error handler 2024-05-28 13:54:03 +02:00
Tony Garnock-Jones 27c1c08bb6 Publish
- @syndicate-lang/browser-stdenv@0.35.2
 - @syndicate-lang/compiler@0.22.1
 - @syndicate-lang/core@0.34.2
 - @syndicate-lang/fs@0.35.2
 - @syndicate-lang/html@0.35.2
 - @syndicate-lang/html2@0.35.2
 - @syndicate-lang/loader@0.35.2
 - @syndicate-lang/service@0.35.2
 - @syndicate-lang/syndicatec@0.36.2
 - @syndicate-lang/timer@0.35.2
 - @syndicate-lang/ts-plugin@0.36.2
 - @syndicate-lang/tsc@0.36.2
 - @syndicate-lang/ws-relay@0.36.2
2024-05-28 10:08:28 +02:00
Tony Garnock-Jones c7bb1035a6 Repair outdated reference to local dataspace 2024-05-28 10:07:43 +02:00
Tony Garnock-Jones c8741c9c36 Repair detection of transient references 2024-05-21 12:29:49 +02:00
Tony Garnock-Jones df692507d9 Cope with Packet::Nop 2024-05-19 21:52:08 +02:00
Tony Garnock-Jones 3141582223 Merge latest changes from the syndicate-protocols repository 2024-05-19 21:50:23 +02:00
Tony Garnock-Jones 599b4ed469 Packet::Nop 2024-05-19 21:32:44 +02:00
Tony Garnock-Jones b4b5f5b111 Skip padding in noise 2024-05-19 21:13:22 +02:00
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 6e555c9fd5 Update binary schemas 2024-04-19 12:57:14 +02:00
Emery Hemingway 8ebde104ca http: order absent fields first
This makes the absent variants the default initialization for
some implementations.
2024-04-19 10:51:40 +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 7797a3cd09 Updated description of gatekeeper protocol 2024-03-22 10:11:57 +01:00
74 changed files with 1922 additions and 1165 deletions

View File

@ -30,6 +30,10 @@ pull-protocols:
-m 'Merge latest changes from the syndicate-protocols repository' \
git@git.syndicate-lang.org:syndicate-lang/syndicate-protocols \
$(PROTOCOLS_BRANCH)
push-protocols:
git subtree push -P packages/core/protocols \
git@git.syndicate-lang.org:syndicate-lang/syndicate-protocols \
$(PROTOCOLS_BRANCH)
fixcopyright:
-fixcopyright.rkt --preset-typescript --file-pattern 'packages/**.ts' GPL-3.0-or-later

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,10 +1,10 @@
/// 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, 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";
import { boot as bootWsRelay, contactRemote } from "@syndicate-lang/ws-relay";
import { Present, Says } from './gen/simpleChatProtocol';
import G = Schemas.gatekeeper;
import N = Schemas.noise;
@ -38,20 +38,9 @@ function bootChat(ds: Ref) {
console.error(e);
}
assert UIAttribute('#route', 'class', 'invalid') when (!route);
if (route) contactRemote(route);
}
function contactRemote(route: G.Route<Ref>) {
if (route) {
console.log('contactRemote', route);
during G.ResolvePath({
"route": route,
"addr": $addr,
"control": $control_e: Embedded,
"resolved": G.Resolved.accepted($remoteDs_e: Embedded),
}) => {
const remoteDs = remoteDs_e.embeddedValue;
const control = control_e.embeddedValue;
contactRemote(route, (remoteDs, control, addr) => {
on message WakeEvent() => at control {
send message G.ForceDisconnect();
}
@ -82,6 +71,7 @@ function bootChat(ds: Ref) {
outputUtterance(who, what);
}
}
}, ds);
}
}
}

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.206":
version "0.995.206"
resolved "https://registry.yarnpkg.com/@preserves/core/-/core-0.995.206.tgz#f13507aa39dbc8cbd5d10ac18d107c06e92bf519"
integrity sha512-Uc4SSSXHQG6xYER9cCc0bkbLYM8fGVbO4kXw3DI8BaQjeUFPOX3yYNYPAvRNzmaF4MuMOZY+jSJpjJ9o5g6A0w==
"@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.206"
resolved "https://registry.yarnpkg.com/@preserves/schema-cli/-/schema-cli-0.995.206.tgz#709c96d938dce3bf5b132a3da1304ca3c84bbe2e"
integrity sha512-870rwjKtQHA8huwt8MpMImnKC2cBHKYzcJi4811k5RuYs/HdbT9B81NMSiSn+Hq19/v9fEBicwwEmao3oM7hJw==
dependencies:
"@preserves/core" "^0.995.0"
"@preserves/schema" "^0.995.1"
"@preserves/core" "^0.995.206"
"@preserves/schema" "^0.995.206"
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.206":
version "0.995.206"
resolved "https://registry.yarnpkg.com/@preserves/schema/-/schema-0.995.206.tgz#8e35a7db5363374f6794009d394510871f86746e"
integrity sha512-JmXGxSqsNSEzZNpvOYPupSZhffvMIvgnUmKE+Yt5oiPiD/8H52EbKRrqBUQuVpvI4hvwgThWAtNIg3+q42vI2w==
dependencies:
"@preserves/core" "^0.995.0"
"@preserves/core" "^0.995.206"
"@rollup/pluginutils@^3.0.9":
version "3.1.0"
@ -36,50 +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.22.3":
version "0.22.3"
resolved "https://registry.yarnpkg.com/@syndicate-lang/compiler/-/compiler-0.22.3.tgz#05430d2e807aec547d910211ae8580e7d7f32401"
integrity sha512-x8zys6Y5NGto72muWVQakE+sPVcweaFLARNg4MWvQj3ZmBv49osvEHxvsyr1fIW610HLbi33zInUGF7KDH8dUQ==
"@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.35.0":
version "0.35.0"
resolved "https://registry.yarnpkg.com/@syndicate-lang/core/-/core-0.35.0.tgz#6eadbea6acfc412092c8bb833a23a42de6adb73e"
integrity sha512-Wz//RcbxdaQBGI2BYq2DaY35m8R9FM+Ae7eyFXRRANtO6ifSh6iLSz/XtE4ziyqaerO3rrG8+/7xId3/MviZzw==
dependencies:
salty-crypto "0.3.1"
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.36.0"
resolved "https://registry.yarnpkg.com/@syndicate-lang/html/-/html-0.36.0.tgz#e2c59eda24c8678cf05b9f11192a78b050ccbd7d"
integrity sha512-DYxkJSomAmD4tt8RPv4hI9k/IBFrGzEjSJP0LtT/259Jo9KAphEN/T+K+0v4Bxhqk6Mho86q+2M04MFG64uWnA==
dependencies:
"@syndicate-lang/core" "^0.27.0"
"@syndicate-lang/core" "^0.35.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.37.0"
resolved "https://registry.yarnpkg.com/@syndicate-lang/ts-plugin/-/ts-plugin-0.37.0.tgz#7764a9f94e8cf54d3d3c43e49b0928f851b2f6b3"
integrity sha512-rp9QmBrGbs6ABPAmgZkmWumkk5URVHF8Q62/va9lm457QPWce3JoYoDi2/qSzcMdYUM/JjBxK0vhYsdw3GemkA==
dependencies:
"@syndicate-lang/compiler" "^0.20.0"
"@syndicate-lang/core" "^0.27.0"
"@syndicate-lang/compiler" "^0.22.3"
"@syndicate-lang/core" "^0.35.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.37.0"
resolved "https://registry.yarnpkg.com/@syndicate-lang/tsc/-/tsc-0.37.0.tgz#30ef6704c37ceb10d23cc688fbd2a2436a593cd4"
integrity sha512-54wUyu392eIa9n4K8CV6qxz+GcRUmrmBZW+hU+pMcApKkIYyiXmg09MrOXrLYcVtHowYVWRXb7d8Cpui3vaGCQ==
dependencies:
"@syndicate-lang/compiler" "^0.20.0"
"@syndicate-lang/core" "^0.27.0"
"@syndicate-lang/compiler" "^0.22.3"
"@syndicate-lang/core" "^0.35.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.37.1"
resolved "https://registry.yarnpkg.com/@syndicate-lang/ws-relay/-/ws-relay-0.37.1.tgz#196982bd91c7ebe1e5bdb049d23a04d92475f668"
integrity sha512-DZLFYSeAzxuBtcA9ER2+o78KGKiHr7/ofP/YTtlNfwTGdIJ0xbxAsXVSzYwSvtlHNk1ZcriZOOHFf1ZWpnjMiA==
dependencies:
"@syndicate-lang/core" "^0.27.0"
salty-crypto "0.3"
"@syndicate-lang/core" "^0.35.0"
"@types/estree@0.0.39":
version "0.0.39"
@ -117,9 +116,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"
@ -130,11 +129,11 @@ brace-expansion@^1.1.7:
concat-map "0.0.1"
braces@~3.0.2:
version "3.0.2"
resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107"
integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==
version "3.0.3"
resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789"
integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==
dependencies:
fill-range "^7.0.1"
fill-range "^7.1.1"
chalk@^4.1:
version "4.1.2"
@ -210,10 +209,10 @@ estree-walker@^1.0.1:
resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-1.0.1.tgz#31bc5d612c96b704106b477e6dd5d8aa138cb700"
integrity sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==
fill-range@^7.0.1:
version "7.0.1"
resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40"
integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==
fill-range@^7.1.1:
version "7.1.1"
resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292"
integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==
dependencies:
to-regex-range "^5.0.1"
@ -354,7 +353,7 @@ rollup@^2.60:
optionalDependencies:
fsevents "~2.3.2"
salty-crypto@0.3, salty-crypto@0.3.1:
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==

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.101",
"@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.31.2",
"version": "0.36.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.101",
"@preserves/schema": "0.995.100",
"@syndicate-lang/compiler": "^0.21.1",
"@syndicate-lang/core": "^0.30.1",
"@syndicate-lang/html2": "^0.31.2",
"@syndicate-lang/ws-relay": "^0.32.2"
"@preserves/core": "^0.995.200",
"@preserves/schema": "^0.995.201",
"@syndicate-lang/compiler": "^0.22.3",
"@syndicate-lang/core": "^0.35.0",
"@syndicate-lang/html2": "^0.36.0",
"@syndicate-lang/ws-relay": "^0.37.1"
}
}

View File

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

View File

@ -194,10 +194,10 @@ ${joinItems(sa.captureBinders.map(binderTypeGuard(t)), '\n')}
))
})`;
if (s.test === void 0) {
return t`assertDataflow(() => ({ target: currentSyndicateTarget, assertion: ${assertion} }));`;
return t`assertDataflow(() => ({ target: currentSyndicateTarget(), assertion: ${assertion} }));`;
} else {
return t`assertDataflow(() => (${walk(s.test)})
? ({ target: currentSyndicateTarget, assertion: ${assertion} })
? ({ target: currentSyndicateTarget(), assertion: ${assertion} })
: ({ target: void 0, assertion: void 0 }));`;
}
});
@ -222,7 +222,7 @@ ${joinItems(sa.captureBinders.map(binderTypeGuard(t)), '\n')}
});
x(ctx.parser.atStatement, (s, t) => {
return t`(((${ctx.argDecl(t, 'currentSyndicateTarget', '__SYNDICATE__.Ref')}) => {${walk(s.body)}})(${walk(s.target)}));`;
return t`(((${ctx.argDecl(t, 'currentSyndicateTarget', '() => __SYNDICATE__.Ref')}) => {${walk(s.body)}})(() => (${walk(s.target)})));`;
});
x(ctx.parser.createExpression, (s, t) => {
@ -232,17 +232,17 @@ ${joinItems(sa.captureBinders.map(binderTypeGuard(t)), '\n')}
xf(ctx.parser.assertionEndpointStatement, (s, t) => {
if (s.isDynamic) {
if (s.test === void 0) {
return t`assertDataflow(() => ({ target: currentSyndicateTarget, assertion: ${walk(s.template)} }));`;
return t`assertDataflow(() => ({ target: currentSyndicateTarget(), assertion: ${walk(s.template)} }));`;
} else {
return t`assertDataflow(() => (${walk(s.test)})
? ({ target: currentSyndicateTarget, assertion: ${walk(s.template)} })
? ({ target: currentSyndicateTarget(), assertion: ${walk(s.template)} })
: ({ target: void 0, assertion: void 0 }));`;
}
} else {
if (s.test === void 0) {
return t`assert(currentSyndicateTarget, ${walk(s.template)});`;
return t`assert(currentSyndicateTarget(), ${walk(s.template)});`;
} else {
return t`replace(currentSyndicateTarget, void 0, (${walk(s.test)}) ? (${walk(s.template)}) : void 0);`;
return t`replace(currentSyndicateTarget(), void 0, (${walk(s.test)}) ? (${walk(s.template)}) : void 0);`;
}
}
});
@ -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.replace(currentSyndicateTarget, void 0, ${assertion});`
);
return wrap(t`__SYNDICATE__.Turn.active.assertDataflow(() => (${walk(s.test)})
? ({ target: currentSyndicateTarget(), assertion: ${assertion} })
: ({ target: void 0, assertion: void 0 }));`);
}
} else {
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);`);
}
}
});
@ -317,12 +322,14 @@ ${joinItems(sa.captureBinders.map(binderTypeGuard(t)), '\n')}
return t`const ${[s.label]} = __SYNDICATE__.Record.makeConstructor${fs}()(${maybeWalk(s.wireName) ?? l}, ${fns});`;
});
xf(ctx.parser.messageSendStatement, (s, t) => t`message(currentSyndicateTarget, ${walk(s.expr)});`);
xf(ctx.parser.messageSendStatement, (s, t) => t`message(currentSyndicateTarget(), ${walk(s.expr)});`);
x(ctx.parser.reactStatement, (s, t) => facetWrap(t, s.label ?? 'default', s.body));
x(ctx.parser.stopStatement, (s, t) => t`${terminalWrap(t, s.facetToStop, s.body)};`);
xf(ctx.parser.syncStatement, (s, t) => t`_sync(${walk(s.peerToSyncWith)}, __SYNDICATE__.Turn.ref({ message() {${walk(s.body)}} }));`);
return tree;
}

View File

@ -57,6 +57,10 @@ export interface StopStatement extends StatementTurnAction {
facetToStop: FacetToStop;
}
export interface SyncStatement extends StatementTurnAction {
peerToSyncWith: Expr;
}
export interface GenericEventEndpointStatement extends StatementTurnAction {
facetToStop: FacetToStop | 'none' | 'once-wrapper';
once: boolean;
@ -75,6 +79,7 @@ export interface PseudoEventEndpointStatement extends GenericEventEndpointStatem
export interface AssertionEventEndpointStatement extends GenericEventEndpointStatement {
triggerType: 'asserted' | 'retracted' | 'message';
pattern: ValuePattern;
test?: Expr,
}
export type EventHandlerEndpointStatement =
@ -325,7 +330,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))))));
});
@ -380,6 +389,15 @@ export class SyndicateParser {
alt(this.block(o.body), this.statementBoundary));
});
// Principal: Turn
readonly syncStatement: Pattern<SyncStatement> =
this.turnAction(o => {
o.body = [];
return seq(atom('sync'),
map(this.expr1(), e => o.peerToSyncWith = e),
this.block(o.body));
});
// Principal: none
readonly atStatement: Pattern<AtStatement> =
scope(o => {

View File

@ -2,10 +2,11 @@
/// SPDX-FileCopyrightText: Copyright © 2023-2024 Tony Garnock-Jones <tonyg@leastfixedpoint.com>
const __SYNDICATE__ = Syndicate;
const currentSyndicateTarget = Syndicate.Dataspace.global;
const currentSyndicateTarget = () => Syndicate.Dataspace.local;
(() => {
async function translateScripts() {
if (SchemaReady) await SchemaReady;
const syndicateScripts =
Array.from(document.getElementsByTagName('script'))

View File

@ -46,6 +46,35 @@ __SYNDICATE__.Turn.active.facet(() => {
});
describe('sync', () => {
it('empty body', () => expectCodeEqual(`sync p {}`, `
__SYNDICATE__.Turn.active._sync(p, __SYNDICATE__.Turn.ref({
message() {}
}));`));
it('nonempty body', () => expectCodeEqual(`sync p {q(); r();}`, `
__SYNDICATE__.Turn.active._sync(p, __SYNDICATE__.Turn.ref({
message() {
q();
r();
}
}));`));
});
describe('at', () => {
it('produces a closure for currentSyndicateTarget', () => {
expectCodeEqual(`at someField.value { foo(); }`,
`(((currentSyndicateTarget) => {
foo();
})(() => (someField.value)));`);
expectCodeEqual(`at someField.value { foo(); }`,
`(((currentSyndicateTarget: () => __SYNDICATE__.Ref) => {
foo();
})(() => (someField.value)));`,
{ typescript: true });
});
});
describe('spawn', () => {
it('without name', () => expectCodeEqual(`spawn { a; b; c; }`, `
@ -132,7 +161,7 @@ describe('during', () => {
it('stop in body', () => expectCodeEqual(`during P => { a; stop; b; }`, `
__SYNDICATE__.Turn.active.assertDataflow(() => ({
target: currentSyndicateTarget,
target: currentSyndicateTarget(),
assertion: __SYNDICATE__.Observe({
pattern: __SYNDICATE__.QuasiValue.finish((__SYNDICATE__.QuasiValue.lit(__SYNDICATE__.fromJS(P)))),
observer: __SYNDICATE__.Turn.ref(__SYNDICATE__.assertionFacetObserver(
@ -152,7 +181,7 @@ __SYNDICATE__.Turn.active.assertDataflow(() => ({
it('capture with type at top', () => expectCodeEqual(`during $v: T => { ok() }`, `
__SYNDICATE__.Turn.active.assertDataflow(() => ({
target: currentSyndicateTarget,
target: currentSyndicateTarget(),
assertion: __SYNDICATE__.Observe({
pattern: __SYNDICATE__.QuasiValue.finish((__SYNDICATE__.QuasiValue.bind((__SYNDICATE__.QuasiValue._)))),
observer: __SYNDICATE__.Turn.ref(__SYNDICATE__.assertionFacetObserver(
@ -176,7 +205,7 @@ describe('once', () => {
__SYNDICATE__.Turn.active.facet(() => {
const __once_facet = __SYNDICATE__.Turn.activeFacet;
__SYNDICATE__.Turn.active.assertDataflow(() => ({
target: currentSyndicateTarget,
target: currentSyndicateTarget(),
assertion: __SYNDICATE__.Observe({
pattern: __SYNDICATE__.QuasiValue.finish((__SYNDICATE__.QuasiValue.lit(__SYNDICATE__.fromJS(P)))),
observer: __SYNDICATE__.Turn.ref({
@ -187,7 +216,7 @@ __SYNDICATE__.Turn.active.facet(() => {
}
}
}),
}),
})
}));
});`));
@ -195,7 +224,7 @@ __SYNDICATE__.Turn.active.facet(() => {
__SYNDICATE__.Turn.active.facet(() => {
const __once_facet = __SYNDICATE__.Turn.activeFacet;
__SYNDICATE__.Turn.active.assertDataflow(() => ({
target: currentSyndicateTarget,
target: currentSyndicateTarget(),
assertion: __SYNDICATE__.Observe({
pattern: __SYNDICATE__.QuasiValue.finish((__SYNDICATE__.QuasiValue.lit(__SYNDICATE__.fromJS(P)))),
observer: __SYNDICATE__.Turn.ref({
@ -206,8 +235,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.30.1",
"version": "0.35.0",
"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.101",
"@preserves/schema-cli": "0.995.100"
"@preserves/core": "^0.995.200",
"@preserves/schema-cli": "^0.995.201"
},
"peerDependencies": {
"@preserves/core": "0.995.101"
"@preserves/core": ">=0.995.200"
},
"dependencies": {
"salty-crypto": "0.3.1"
"salty-crypto": "^0.3.1"
}
}

View File

@ -1,16 +1,16 @@
´³bundle·µ³tcp„´³schema·³version°³ definitions·³TcpLocal´³rec´³lit³ tcp-local„´³tupleµ´³named³host´³atom³String„„´³named³port´³atom³ SignedInteger„„„„„³ TcpRemote´³rec´³lit³
´³bundle·µ³rpc„´³schema·³version°³ definitions·³Answer´³rec´³lit³a„´³tupleµ´³named³request³any„´³named³response³any„„„„³Result´³orµµ±ok´³rec´³lit³ok„´³tupleµ´³named³value³any„„„„„µ±error´³rec´³lit³error„´³tupleµ´³named³error³any„„„„„„„³Question´³rec´³lit³q„´³tupleµ´³named³request³any„„„„„³ embeddedType´³refµ³ EntityRef„³Cap„„„µ³tcp„´³schema·³version°³ definitions·³TcpLocal´³rec´³lit³ tcp-local„´³tupleµ´³named³host´³atom³String„„´³named³port´³atom³ SignedInteger„„„„„³ TcpRemote´³rec´³lit³
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µ„³
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„„„„„„„„³ 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µµ±absent´³lit€„„µ±present´³atom³
ByteString„„„„³ RequestHost´³orµµ±absent´³lit€„„µ±present´³atom³String„„„„³ 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„„„„³
@ -38,7 +38,7 @@ Parameters
Parameters„³SturdyDescriptionDetail´³dict·³key´³named³key´³atom³
ByteString„„³oid´³named³oid³any„„„„³ embeddedType´³refµ³ EntityRef„³Cap„„„µ³worker„´³schema·³version°³ definitions·³Instance´³rec´³lit³Instance„´³tupleµ´³named³name´³atom³String„„´³named³argument³any„„„„„³ embeddedType´³refµ³ EntityRef„³Cap„„„µ³service„´³schema·³version°³ definitions·³State´³orµµ±started´³lit³started„„µ±ready´³lit³ready„„µ±failed´³lit³failed„„µ±complete´³lit³complete„„µ± userDefined³any„„„³
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„„„µ³
depends-on„´³tupleµ´³named³depender³any„´³named³dependee´³refµ„³ ServiceState„„„„„„³ embeddedType´³refµ³ EntityRef„³Cap„„„µ³protocol„´³schema·³version°³ definitions·³Nop´³lit€„³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„„µ±Nop´³refµ„³Nop„„„„³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„„„„„³ BindObserver´³orµµ±present´³embedded´³refµ„³Bound„„„µ±absent´³lit€„„„„³ ResolvedPath´³rec´³lit³ resolved-path„´³tupleµ´³named³addr³any„´³named³control´³embedded´³refµ„³TransportControl„„„´³named³responderSession´³embedded³any„„„„„³ForceDisconnect´³rec´³lit³force-disconnect„´³tupleµ„„„³ResolvePathStep´³rec´³lit³resolve-path-step„´³tupleµ´³named³origin´³embedded´³refµ„³Resolve„„„´³named³pathStep´³refµ„³PathStep„„„„„³ConnectTransport´³rec´³lit³connect-transport„´³tupleµ´³named³addr³any„„„„³ResolvedPathStep´³embedded³any„³TransportControl´³refµ„³ForceDisconnect„³ConnectedTransport´³rec´³lit³connected-transport„´³tupleµ´³named³addr³any„´³named³control´³embedded´³refµ„³TransportControl„„„´³named³responderSession´³embedded³any„„„„„„³ 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 .
@ -23,14 +52,23 @@ Bound = <bound @pathStep PathStep> / Rejected .
# ---------------------------------------------------------------------------
# Protocol at client-side dataspaces, for resolution utilities
# Assertion. In response to observation of this with appropriate captures/wildcards in `addr`
# and `resolved`, respondent will follow `route.pathSteps` starting from one of the
# `route.transports`, asserting `ResolvePath` with the final `Resolved` as well as the selected
# transport `addr` and a `control` for it.
ResolvePath = <resolve-path @route Route @addr any @control #:TransportControl @resolved Resolved> .
# The client-side operates using `rpc.Question`s and `rpc.Answer`s.
TransportConnection = <connect-transport @addr any @control #:TransportControl @resolved Resolved> .
ResolvedPathStep = <path-step @origin #:Resolve @pathStep PathStep @resolved Resolved> .
# Assert `rpc.Question` with `ResolvePath` to request resolution of `Route`. The resolution
# utility will continuously try to satisfy the request, following `route.pathSteps` starting
# from one of the `route.transports`, ultimately asserting `rpc.Answer` with an `rpc.Result` in
# response. If the process completes successfully, the `rpc.Result.ok` will carry a
# `ResolvedPath`.
ResolvePath = <resolve-path @route Route> .
ResolvedPath = <resolved-path @addr any @control #:TransportControl @responderSession #:any> .
# Assertions. As `ResolvePath`/`ResolvedPath`, but just for an initial transport link setup.
ConnectTransport = <connect-transport @addr any> .
ConnectedTransport = <connected-transport @addr any @control #:TransportControl @responderSession #:any> .
# Assertions. Like `ResolvePath`/`ResolvedPath`, but for incremental resolution along a route.
ResolvePathStep = <resolve-path-step @origin #:Resolve @pathStep PathStep> .
ResolvedPathStep = #:any .
PathStep = <<rec> @stepType symbol [@detail any]> .
# A `Route` describes a network path that can be followed to reach some target entity.

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 ...]
@ -31,14 +31,25 @@ HttpRequest = <http-request
Headers = {@"Lowercase" symbol: string ...:...} .
QueryValue = @string string / <file @filename string @headers Headers @body bytes> .
RequestBody = @present bytes / @absent #f .
RequestBody = @absent #f / @present bytes .
RequestHost = @absent #f / @present string .
# 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,8 +1,9 @@
version 1 .
Packet = Turn / Error / Extension .
Packet = Turn / Error / Extension / Nop .
Extension = <<rec> @label any @fields [any ...]> .
Nop = #f .
Error = <error @message string @detail any>.

View File

@ -0,0 +1,11 @@
version 1 .
embeddedType EntityRef.Cap .
# Assertion. Establishes a frame for a request.
Question = <q @request any> .
# Assertion or message. Responds to a question.
Answer = <a @request any @response any> .
# Value. Captures a common "ok-or-error" pattern as seen in e.g. Rust.
Result = <ok @value any> / <error @error any> .

View File

@ -16,12 +16,16 @@ export * as Pattern from './runtime/pattern.js';
export * as QuasiValue from './runtime/quasivalue.js';
export * from './runtime/randomid.js';
export * as Rewrite from './runtime/rewrite.js';
export * from './runtime/rpc.js';
export * as Rpc from './runtime/rpc.js';
export * as Skeleton from './runtime/skeleton.js';
export * from './runtime/space.js';
export * from './runtime/supervise.js';
export * as SaltyCrypto from 'salty-crypto';
export * as Cryptography from './transport/cryptography.js';
export * as WireProtocol from './transport/protocol.js';
export * as Membrane from './transport/membrane.js';
export * as Relay from './transport/relay.js';
export * as Sturdy from './transport/sturdy.js';

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;
}
}
@ -78,7 +80,10 @@ export function toRef(_v: any): Ref | undefined {
return isRef(_v) ? _v : void 0;
}
export function assertionFrom(a: Assertable): Assertion {
export function assertionFrom(a: Assertable): Assertion;
export function assertionFrom(a: Assertable | undefined): Assertion | undefined;
export function assertionFrom(a: Assertable | undefined): Assertion | undefined {
if (a === void 0) return void 0;
if (typeof a === 'object' && '__as_preserve__' in a) {
return fromJS(a);
} else {
@ -153,7 +158,13 @@ export class Actor {
if (!reason.ok) {
console.error(`${this} crashed:`, reason.err);
}
this.exitHooks.forEach(hook => hook());
this.exitHooks.forEach(hook => {
try {
hook();
} catch (e) {
console.error(`${this} exit hook ${hook} failed:`, e);
}
});
this.root._terminate(reason.ok);
this.space.deregister(this);
}
@ -223,7 +234,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,
};
@ -277,6 +288,32 @@ export class Facet {
}
}
export function suspend(asyncFn: (resume: <T>(v: T) => T) => void) {
// TODO: consider how this should/could interact with preventInertCheck
const facet = Turn.activeFacet;
const resume = <T>(v: T) => {
if (!facet.actor.space.isRunning()) {
throw new Error('Cannot resume into inactive actor space'); // TODO
}
const t = Turn.___new(facet);
queueMicrotask(() => {
try {
facet.actor.repairDataflowGraph();
t.deliver();
} catch (err) {
Turn.for(facet.actor.root, () => facet.actor._terminateWith({ ok: false, err }));
}
if (Turn.active === t) Turn.active = void 0 as unknown as Turn;
});
Turn.active = t;
return v;
};
return asyncFn(resume);
}
export const STOP_ON_RETRACT = Symbol('stop-on-retract'); // NB. NOT A GLOBAL SYMBOL
export class StopOnRetract implements Partial<Entity> {
@ -336,6 +373,10 @@ export class Turn {
}
}
static ___new(facet: Facet): Turn {
return new Turn(facet);
}
private constructor(facet: Facet, queues = new Map<Actor, StructuredTask<TaskAction>[]>()) {
this._activeFacet = facet;
this.queues = queues;
@ -401,7 +442,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 +471,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> {
@ -462,6 +503,7 @@ export class Turn {
let assertion: Assertable | undefined = void 0;
this.dataflow(() => {
let {target: nextTarget, assertion: nextAssertion} = assertionFunction();
nextAssertion = assertionFrom(nextAssertion);
if (target !== nextTarget || !is(assertion, nextAssertion)) {
target = nextTarget;
assertion = nextAssertion;
@ -588,7 +630,7 @@ export class Turn {
throw new Error("Attempt to reuse a committed Turn");
}
const a: StructuredTask<TaskAction> = {
perform() { Turn.active._inFacet(relay, a0); },
perform() { relay.isLive && Turn.active._inFacet(relay, a0); },
describe() { return { targetFacet: relay, action: detail() }; },
};
this.queues.get(relay.actor)?.push(a) ?? this.queues.set(relay.actor, [a]);

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,35 +102,23 @@ 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()) {
for (const [stepIndex, pp] of p.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++);
if (vv === void 0 || !walk(pp, vv)) return false;
}
return true;
}
}
}
@ -135,46 +129,34 @@ 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()) {
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);
}
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,
});
}
}
}
@ -185,57 +167,97 @@ 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)));
}
} 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)));
return P.Pattern.group({
type: P.GroupType.arr(),
entries: lit_seq_entries(v),
});
}
}
export function drop_lit(p: P.Pattern): AnyValue | null {
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, strip_binds = false): 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': {
const v = [] as AnyValue[];
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)));
return v;
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);
case 'bind':
if (strip_binds) {
return walk(p.pattern);
}
// fall through
default:
throw e;
}
@ -249,13 +271,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,11 +80,8 @@ 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(
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 {
@ -267,7 +278,10 @@ export function ctor(info: QuasiValueConstructorInfo, ... items: QuasiValue[]):
} else if ('quasiValue' in info) {
return info.quasiValue(... items);
} else {
((_i: never) => { throw new Error("INTERNAL ERROR"); })(info);
((info: never) => {
console.error('ctor() in quasivalue.ts cannot handle', info);
throw new Error("INTERNAL ERROR");
})(info);
}
}
@ -284,10 +298,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 '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

@ -2,7 +2,7 @@
/// SPDX-FileCopyrightText: Copyright © 2016-2024 Tony Garnock-Jones <tonyg@leastfixedpoint.com>
import { Turn, Ref } from "./actor.js";
import { Bytes, Dictionary, DoubleFloat, IdentityMap, is, isEmbedded, Record, Tuple, stringify } from "@preserves/core";
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";
@ -89,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;
}
@ -136,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();
}
}
}
@ -243,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 {
@ -303,7 +304,7 @@ export function tArr(... items: Array<Template>): Template {
}
export function tDict(... entries: [SturdyValue, Template][]): Template {
return Template.TCompound(TCompound.dict(new Dictionary<_embedded, Template>(entries)));
return Template.TCompound(TCompound.dict(new KeyedDictionary<_embedded, SturdyValue, Template>(entries)));
}
export function tLit(value: SturdyValue): Template {

View File

@ -0,0 +1,51 @@
/// SPDX-License-Identifier: GPL-3.0-or-later
/// SPDX-FileCopyrightText: Copyright © 2024 Tony Garnock-Jones <tonyg@leastfixedpoint.com>
import { Assertable, Ref } from './actor.js';
import { ctor, dict, QuasiValue } from './quasivalue.js';
import * as R from '../gen/rpc.js';
import { fromJS } from '@preserves/core';
export { Result } from '../gen/rpc.js';
export function Question<Q extends Assertable>(q: Q): R.Question<Ref> {
return R.Question(fromJS<Ref>(q));
}
export namespace Question {
export function quasiValue(q: QuasiValue): QuasiValue {
return ctor(R.Question, q);
}
}
export function Answer<Q extends Assertable, A extends Assertable>(q: Q, a: A): R.Answer<Ref> {
return R.Answer({ request: fromJS<Ref>(q), response: fromJS<Ref>(a) });
}
export namespace Answer {
export function quasiValue(q: QuasiValue, a: QuasiValue): QuasiValue {
return ctor(R.Answer, dict(
["request", q],
["response", a]));
}
}
export function resultOk<V extends Assertable>(v: V): R.Result<Ref> {
return R.Result.ok(fromJS<Ref>(v));
}
export namespace resultOk {
export function quasiValue(v: QuasiValue): QuasiValue {
return ctor(R.Result.ok, v);
}
}
export function resultError<E extends Assertable>(e: E): R.Result<Ref> {
return R.Result.error(fromJS<Ref>(e));
}
export namespace resultError {
export function quasiValue(e: QuasiValue): QuasiValue {
return ctor(R.Result.error, e);
}
}

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

@ -6,6 +6,7 @@ export * as dataspace from './gen/dataspace.js';
export * as gatekeeper from './gen/gatekeeper.js';
export * as protocol from './gen/protocol.js';
export * as noise from './gen/noise.js';
export * as rpc from './gen/rpc.js';
export * as service from './gen/service.js';
export * as stdenv from './gen/stdenv.js';
export * as stream from './gen/stream.js';

View File

@ -2,11 +2,26 @@
/// 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';
export type MembraneTraceEvent = { type: 'grab' | 'drop', oid: IO.Oid, ref: Ref, delta: number, newCount: number };
export type LayerMembraneTraceEvent = MembraneTraceEvent & { table: 'exported' | 'imported' };
export type LayerTraceEvent =
| LayerMembraneTraceEvent
| { type: 'outbound' | 'inbound', target: any, event: 'assert', assertion: Value<any>, handle: Handle }
| { type: 'outbound' | 'inbound', event: 'retract', handle: Handle }
| { type: 'outbound' | 'inbound', event: 'message', assertion: Value<any> }
| { type: 'outbound' | 'inbound', target: any, event: 'sync', peer: any }
;
export type LayerTracer = (e: LayerTraceEvent) => void;
let defaultLayerTracer: LayerTracer | undefined = void 0;
export function getDefaultLayerTracer(): LayerTracer | undefined { return defaultLayerTracer; }
export function setDefaultLayerTracer(t: LayerTracer | undefined) { defaultLayerTracer = t; }
export class WireSymbol {
count = 0;
@ -18,6 +33,7 @@ export class WireSymbol {
drop(): void {
this.count--;
this.side.tracer?.({ type: 'drop', oid: this.oid, ref: this.ref, delta: -1, newCount: this.count });
if (this.count === 0) {
this.side.byOid.delete(this.oid);
this.side.byRef.delete(this.ref);
@ -31,6 +47,8 @@ export class Membrane {
readonly byOid = new IdentityMap<IO.Oid, WireSymbol>();
readonly byRef = new IdentityMap<Ref, WireSymbol>();
tracer?: (e: MembraneTraceEvent) => void;
grab<Table extends WhichTable>(table: Table,
key: Parameters<Membrane[Table]['get']>[0],
transient: boolean,
@ -51,14 +69,14 @@ export class Membrane {
this.byOid.set(e.oid, e);
}
if (!transient) e.count++;
this.tracer?.({ type: 'grab', oid: e.oid, ref: e.ref, delta: transient ? 0 : +1, newCount: e.count });
return e;
}
}
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;
@ -81,11 +99,19 @@ export abstract class LayerBoundary implements ProxyOutbound, ProxyInbound {
readonly exported = new Membrane();
readonly imported = new Membrane();
constructor(public trustPeer = true, public nextLocalOid: IO.Oid = 0) {}
readonly tracer: LayerTracer | undefined = defaultLayerTracer;
constructor(public trustPeer = true, public nextLocalOid: IO.Oid = 0) {
if (this.tracer) {
this.exported.tracer = e => { const f = e as LayerMembraneTraceEvent; f.table = 'exported'; this.tracer?.(f); };
this.imported.tracer = e => { const f = e as LayerMembraneTraceEvent; f.table = 'imported'; this.tracer?.(f); };
}
}
abstract send(remoteOid: IO.Oid, event: IO.Event<Embedded<WireRef>>): void;
proxyAssertion(targetRemoteOid: IO.Oid, assertion: Assertion, handle: Handle): Value<Embedded<WireRef>> {
this.tracer?.({ type: 'outbound', target: targetRemoteOid, event: 'assert', assertion, handle });
const pins: Array<WireSymbol> = [];
const rewritten = mapEmbeddeds(assertion, r => this.rewriteRefOut(r, false, pins));
this.grabImportedOid(targetRemoteOid, pins);
@ -94,16 +120,19 @@ export abstract class LayerBoundary implements ProxyOutbound, ProxyInbound {
}
proxyRetract(handle: Handle): void {
this.tracer?.({ type: 'outbound', event: 'retract', handle });
(this.outboundAssertions.get(handle) ?? []).forEach(e => e.drop());
this.outboundAssertions.delete(handle);
}
proxyMessage(assertion: Assertion): Value<Embedded<WireRef>> {
this.tracer?.({ type: 'outbound', event: 'message', assertion });
const pins: Array<WireSymbol> = [];
return mapEmbeddeds(assertion, r => this.rewriteRefOut(r, true, pins));
}
proxySync(targetRemoteOid: IO.Oid, peer: Ref): Embedded<WireRef> {
this.tracer?.({ type: 'outbound', target: targetRemoteOid, event: 'sync', peer });
const peerEntity = new SyncPeerEntity(peer);
this.grabImportedOid(targetRemoteOid, peerEntity.pins);
return this.rewriteRefOut(Turn.ref(peerEntity), false, peerEntity.pins);
@ -112,10 +141,15 @@ export abstract class LayerBoundary implements ProxyOutbound, ProxyInbound {
grabImportedOid(oid: IO.Oid, pins: Array<WireSymbol>): void {
const e = this.imported.grab("byOid", oid, false, null);
if (e === null) {
throw new Error("Internal error: import table missing entry for oid " + oid);
}
// This can happen if
// 1. remote peer asserts a value causing oid to be allocated
// 2. some local actor holds a reference to that entity
// 3. remote peer retracts the value
// 4. local actor uses the ref
} else {
pins.push(e);
}
}
grabExportedOid(oid: IO.Oid, pins: Array<WireSymbol>): Ref {
const e = this.exported.grab("byOid", oid, false, null);
@ -164,10 +198,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));
@ -193,6 +227,7 @@ export abstract class LayerBoundary implements ProxyOutbound, ProxyInbound {
handle(localOid: IO.Oid, m: IO.Event<Embedded<WireRef>>): void {
switch (m._variant) {
case 'Assert': {
this.tracer?.({ type: 'inbound', event: 'assert', target: localOid, assertion: m.value.assertion, handle: m.value.handle });
const [a, pins] = this.rewriteIn(m.value.assertion);
const r = this.grabExportedOid(localOid, pins);
this.inboundAssertions.set(m.value.handle, {
@ -202,6 +237,7 @@ export abstract class LayerBoundary implements ProxyOutbound, ProxyInbound {
break;
}
case 'Retract': {
this.tracer?.({ type: 'inbound', event: 'retract', handle: m.value.handle });
const remoteHandle = m.value.handle;
const h = this.inboundAssertions.get(remoteHandle);
if (h === void 0) throw new Error(`Peer retracted invalid handle ${remoteHandle}`);
@ -211,13 +247,18 @@ export abstract class LayerBoundary implements ProxyOutbound, ProxyInbound {
break;
}
case 'Message': {
this.tracer?.({ type: 'inbound', event: 'message', assertion: m.value.body });
const [a, pins] = this.rewriteIn(m.value.body);
if (pins.length > 0) throw new Error("Cannot receive transient reference");
pins.forEach(e => {
e.drop();
if (e.count === 0) throw new Error("Cannot receive transient reference");
});
const r = this.exported.byOid.get(localOid)?.ref;
if (r) Turn.active.message(r, a);
break;
}
case 'Sync': {
this.tracer?.({ type: 'inbound', event: 'sync', target: localOid, peer: m.value.peer });
const pins: Array<WireSymbol> = [];
const r = this.grabExportedOid(localOid, pins);
const k = this.rewriteRefIn(m.value.peer, pins);
@ -240,6 +281,9 @@ export abstract class LayerBoundary implements ProxyOutbound, ProxyInbound {
case 'Extension':
// Ignore unknown extensions.
break;
case 'Nop':
// Ignore no-ops.
break;
}
}
}

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.2",
"version": "0.26.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.101",
"@preserves/core": "^0.995.200",
"@syndicate-lang/core": "*",
"@syndicate-lang/html2": "*",
"@syndicate-lang/ws-relay": "*"

View File

@ -1,7 +1,7 @@
/// SPDX-License-Identifier: GPL-3.0-or-later
/// SPDX-FileCopyrightText: Copyright © 2023-2024 Tony Garnock-Jones <tonyg@leastfixedpoint.com>
import { Dataspace, Ref, Sturdy, Reader, Schemas, Embedded, randomId, fromJS } from "@syndicate-lang/core";
import { Dataspace, Ref, Sturdy, Reader, Schemas, randomId, fromJS, Question, resultOk, Answer } from "@syndicate-lang/core";
import { boot as bootHtml, Widget } from "@syndicate-lang/html2";
import wsRelay from "@syndicate-lang/ws-relay";
import { ExampleDefinition } from './gen/example';
@ -34,11 +34,10 @@ function bootApp(ds: Ref) {
'<ref {oid: "syndicate" sig: #[acowDB2/oI+6aSEC3YIxGg==]}>').next())))],
});
during G.ResolvePath({
"route": route,
"resolved": G.Resolved.accepted($remoteDs_e: Embedded),
}) => {
const remoteDs = remoteDs_e.embeddedValue;
assert Question(G.ResolvePath(route));
during Answer(G.ResolvePath(route), resultOk(G.ResolvedPath({
responderSession: $remoteDs: Ref,
}))) => {
at remoteDs {
assert ExampleDefinition(this_instance);
during ExampleDefinition($who: string) => {

View File

@ -1,6 +1,6 @@
{
"name": "@syndicate-lang/fs",
"version": "0.31.2",
"version": "0.36.0",
"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.101"
"@preserves/core": "^0.995.200"
},
"dependencies": {
"@syndicate-lang/core": "^0.30.1",
"@syndicate-lang/service": "^0.31.2",
"@syndicate-lang/core": "^0.35.0",
"@syndicate-lang/service": "^0.36.0",
"chokidar": "^3.5.3"
},
"devDependencies": {
"@preserves/schema-cli": "0.995.100",
"@syndicate-lang/ts-plugin": "^0.32.2",
"@syndicate-lang/tsc": "^0.32.2"
"@preserves/schema-cli": ">=0.995.201",
"@syndicate-lang/ts-plugin": "^0.37.0",
"@syndicate-lang/tsc": "^0.37.0"
}
}

View File

@ -1,6 +1,6 @@
{
"name": "@syndicate-lang/html",
"version": "0.31.2",
"version": "0.36.0",
"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.30.1"
"@syndicate-lang/core": "^0.35.0"
},
"devDependencies": {
"@syndicate-lang/ts-plugin": "^0.32.2",
"@syndicate-lang/tsc": "^0.32.2"
"@syndicate-lang/ts-plugin": "^0.37.0",
"@syndicate-lang/tsc": "^0.37.0"
}
}

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

@ -0,0 +1,7 @@
/// SPDX-License-Identifier: GPL-3.0-or-later
/// SPDX-FileCopyrightText: Copyright © 2016-2024 Tony Garnock-Jones <tonyg@leastfixedpoint.com>
export default {
preset: 'ts-jest',
testEnvironment: './patched-jsdom.mjs',
};

View File

@ -1,6 +1,6 @@
{
"name": "@syndicate-lang/html2",
"version": "0.31.2",
"version": "0.36.0",
"description": "DOM/HTML UI for Syndicate/JS",
"homepage": "https://github.com/syndicate-lang/syndicate-js/tree/main/packages/html2",
"license": "GPL-3.0+",
@ -22,13 +22,15 @@
"rollup": "rollup -c",
"rollup:watch": "rollup -c -w",
"clean": "rm -rf lib/ dist/ index.js index.js.map",
"veryclean": "yarn run clean && rm -rf node_modules"
"veryclean": "yarn run clean && rm -rf node_modules",
"test": "../../node_modules/.bin/jest",
"test:watch": "yarn test --watch"
},
"dependencies": {
"@syndicate-lang/core": "^0.30.1"
"@syndicate-lang/core": "^0.35.0"
},
"devDependencies": {
"@syndicate-lang/ts-plugin": "^0.32.2",
"@syndicate-lang/tsc": "^0.32.2"
"@syndicate-lang/ts-plugin": "^0.37.0",
"@syndicate-lang/tsc": "^0.37.0"
}
}

View File

@ -0,0 +1,14 @@
/// SPDX-License-Identifier: GPL-3.0-or-later
/// SPDX-FileCopyrightText: Copyright © 2024 Tony Garnock-Jones <tonyg@leastfixedpoint.com>
// https://github.com/jsdom/jsdom/issues/2524
import { TextEncoder, TextDecoder } from 'util';
import $JSDOMEnvironment from 'jest-environment-jsdom';
export default class JSDOMEnvironment extends $JSDOMEnvironment {
constructor(... args) {
const { global } = super(... args);
if (!global.TextEncoder) global.TextEncoder = TextEncoder;
if (!global.TextDecoder) global.TextDecoder = TextDecoder;
}
}

View File

@ -58,10 +58,31 @@ function followPath(topNodes: ChildNode[], path: number[]): Node {
return n;
}
type PlaceholderAction = (variableParts: HtmlFragment[], node: Node) => void;
type PlaceholderState = { [key: string]: any };
function nodeInserter(n: number): PlaceholderAction {
return (vs, node) => {
interface PlaceholderAction {
reset(state: PlaceholderState, node: Node): void;
act(state: PlaceholderState, variableParts: HtmlFragment[], node: Node): void;
}
class NodeInserter implements PlaceholderAction {
constructor(public variablePartIndex: number) {}
reset(state: PlaceholderState, node: Node) {
if ('nodeCount' in state) {
const previouslyInsertedNodes = state.nodeCount as number;
node.parentNode?.insertBefore(makePlaceholder(), node);
for (let n = 0; n < previouslyInsertedNodes; n++) {
const nextNode = node.nextSibling;
node.parentNode?.removeChild(node);
if (nextNode === null) break;
node = nextNode;
}
}
state.nodeCount = 0;
}
act(state: PlaceholderState, vs: HtmlFragment[], node: Node): void {
function walk(f: HtmlFragment) {
if (Array.isArray(f)) {
f.forEach(walk);
@ -70,38 +91,98 @@ 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);
state.nodeCount++;
}
}
walk(vs[n]);
walk(vs[this.variablePartIndex]);
node.parentNode?.removeChild(node);
};
}
}
function attributesInserter(n: number): PlaceholderAction {
return (vs, node) => {
class AttributesInserter implements PlaceholderAction {
constructor(public variablePartIndex: number) {}
reset(state: PlaceholderState, node: Node): void {
const attrNames: string[] = (state.attrNames ?? []);
attrNames.forEach(n => (node as Element).removeAttribute(n));
state.attrNames = [];
}
act(state: PlaceholderState, vs: HtmlFragment[], node: Node): void {
const e = document.createElement('template');
const n = this.variablePartIndex;
e.innerHTML = `<x-dummy ${renderFragment(vs[n], false).join('')}></x-dummy>`;
Array.from(e.content.firstElementChild!.attributes).forEach(a =>
(node as Element).setAttribute(a.name, a.value));
};
Array.from(e.content.firstElementChild!.attributes).forEach(a => {
state.attrNames.push(a.name);
(node as Element).setAttribute(a.name, a.value);
});
}
}
function attributeValueInserter(
attrName: string,
constantParts: string[],
placeholders: number[],
): PlaceholderAction {
return (vs, node) => {
const pieces = [constantParts[0]];
placeholders.forEach((n, i) => {
class AttributeValueInserter implements PlaceholderAction {
constructor(
public attrName: string,
public constantParts: string[],
public placeholders: number[],
) {}
reset(_state: PlaceholderState, _node: Node): void {}
act(_state: PlaceholderState, vs: HtmlFragment[], node: Node): void {
const pieces = [this.constantParts[0]];
this.placeholders.forEach((n, i) => {
pieces.push(...renderFragment(vs[n], false));
pieces.push(constantParts[i + 1]);
pieces.push(this.constantParts[i + 1]);
});
(node as Element).setAttribute(attrName, pieces.join(''));
};
(node as Element).setAttribute(this.attrName, pieces.join(''));
}
}
class CompoundAction implements PlaceholderAction {
constructor(public actions: PlaceholderAction[]) {}
reset(states: PlaceholderState, n: Node) {
this.actions.forEach((a, i) => {
const state = states[i] ??= {};
a.reset(state, n);
});
}
act(states: PlaceholderState, vs: HtmlFragment[], n: Node) {
this.actions.forEach((a, i) => {
const state = states[i] ??= {};
a.act(state, vs, n);
});
}
}
export class HtmlFragmentInstance {
state: { [path: string]: PlaceholderState } = {};
constructor(
public container: ChildNode[],
) {}
}
function makePlaceholder(): Element {
return document.createElement('x-placeholder');
}
export class HtmlFragmentBuilder {
@ -123,8 +204,7 @@ export class HtmlFragmentBuilder {
splitByPlaceholders(n.textContent ?? '');
constantParts.forEach((c, i) => {
if (i > 0) {
const placeholder = document.createElement('x-placeholder');
n.parentNode?.insertBefore(placeholder, n);
n.parentNode?.insertBefore(makePlaceholder(), n);
}
n.parentNode?.insertBefore(document.createTextNode(c), n);
});
@ -132,10 +212,10 @@ export class HtmlFragmentBuilder {
n.parentNode?.removeChild(n);
placeholders.forEach((n, i) => {
const currentPath = path.slice();
currentPath[currentPath.length - 1] = i * 2 + 1;
currentPath[currentPath.length - 1] += i * 2 + 1;
this.placeholderActions.push({
path: currentPath,
action: nodeInserter(n),
action: new NodeInserter(n),
});
});
path[path.length - 1] += constantParts.length + placeholders.length;
@ -152,12 +232,12 @@ export class HtmlFragmentBuilder {
e.removeAttributeNode(attr);
i--;
const n = parseInt(nameIsPlaceholder[1], 10);
actions.push(attributesInserter(n));
actions.push(new AttributesInserter(n));
} else {
const { constantParts, placeholders } =
splitByPlaceholders(attr.value);
if (constantParts.length !== 1) {
actions.push(attributeValueInserter(
actions.push(new AttributeValueInserter(
attrName,
constantParts,
placeholders));
@ -167,7 +247,7 @@ export class HtmlFragmentBuilder {
if (actions.length) {
this.placeholderActions.push({
path: path.slice(),
action: (vs, n) => actions.forEach(a => a(vs, n)),
action: actions.length === 1 ? actions[0] : new CompoundAction(actions),
});
}
}
@ -202,14 +282,19 @@ export class HtmlFragmentBuilder {
walk(this.template.content);
}
clone(): ChildNode[] {
return Array.from(
(this.template.cloneNode(true) as HTMLTemplateElement).content.childNodes);
clone(): HtmlFragmentInstance {
return new HtmlFragmentInstance(Array.from(
(this.template.cloneNode(true) as HTMLTemplateElement).content.childNodes));
}
update(template: ChildNode[], variableParts: Array<HtmlFragment>) {
update(template: HtmlFragmentInstance, variableParts: Array<HtmlFragment>) {
this.placeholderActions.forEach(({ path, action }) => {
action(variableParts, followPath(template, path));
const state = template.state[path.map(n => '' + n).join('.')] ??= {};
action.reset(state, followPath(template.container, path));
});
this.placeholderActions.forEach(({ path, action }) => {
const state = template.state[path.map(n => '' + n).join('.')] ??= {};
action.act(state, variableParts, followPath(template.container, path));
});
}
}
@ -223,17 +308,17 @@ export type HtmlTemplater =
=> ChildNode[];
export function template(): HtmlTemplater {
let container: ChildNode[] | null = null;
let instance: HtmlFragmentInstance | null = null;
return (constantParts, ... variableParts) => {
let b = templateCache.get(constantParts);
if (b === void 0) {
b = new HtmlFragmentBuilder(constantParts);
templateCache.set(constantParts, b);
}
if (container === null) {
container = b.clone();
if (instance === null) {
instance = b.clone();
}
b.update(container, variableParts);
return container;
b.update(instance, variableParts);
return instance.container;
};
}

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,31 @@ 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 (typeof data === 'object') {
nodeGenerator = templateGenerator(arg0 as (string | HTMLTemplateElement), data);
} else {
// `data` is either undefined or "garbage" e.g. a string given to us by
// ValueWidget's constructor.
if (typeof arg0 === 'function') {
nodeGenerator = arg0 as NodeGenerator;
} else {
nodeGenerator = () => [arg0 as ChildNode];
}
}
this.facet = Turn.activeFacet;
const cancelAtExit = this.facet.actor.atExit(() => this.node.remove());
@ -40,7 +57,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 +67,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();
get _nodeAsParent(): ParentNode | null {
if (this._node && 'querySelector' in this._node) {
return this._node as unknown as ParentNode;
} else {
p.appendChild(this.node);
}
}
return null;
}
}
get parent(): ParentNode | null {
return this.parentField.value;
return this.node.parentNode;
}
set parent(p: string | ParentNode | null) {
@ -78,10 +89,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 +186,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 +199,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 +244,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 +265,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

@ -0,0 +1,102 @@
/// SPDX-License-Identifier: GPL-3.0-or-later
/// SPDX-FileCopyrightText: Copyright © 2024 Tony Garnock-Jones <tonyg@leastfixedpoint.com>
import { template } from '../src/html';
import './test-utils';
function compareHTML(nodes: ChildNode[], expected: string) {
expect(nodes.map((n: any) => n.outerHTML).join('')).toEqual(expected);
}
describe('basic templating', () => {
it('should produce a node', () => {
const x = document.createElement('x');
x.appendChild(document.createTextNode('y'));
expect(template()`<x>y</x>`).toEqual([x]);
});
it('should substitute a string', () => {
const y = 'abc';
compareHTML(template()`<x>${y}</x>`, '<x>abc</x>');
});
it('should substitute multiple strings', () => {
const y = 'abc';
compareHTML(template()`<x>${y} ${y} ${y}</x>`, '<x>abc abc abc</x>');
});
it('should substitute a node', () => {
const y = template()`<z>q</z>`;
compareHTML(template()`<x>${y}</x>`, '<x><z>q</z></x>');
});
it('should substitute an array of strings', () => {
const y = ['abc', 'def'];
compareHTML(template()`<x>${y}</x>`, '<x>abcdef</x>');
});
it('should substitute an array of strings and nodes', () => {
const y = ['abc', template()`<z>q</z>`, 'def'];
compareHTML(template()`<x>${y}</x>`, '<x>abc<z>q</z>def</x>');
});
it('should substitute into attributes', () => {
const v = () => 'aaa';
const ps = [() => '123', () => '234'];
compareHTML(template()`<q><x t="${v()}">${ps.map(p => p())}</x></q>`,
'<q><x t="aaa">123234</x></q>');
});
it('should substitute into attributes, with children', () => {
const v = () => 'aaa';
const ps = [() => '123', () => '234'];
const f = 'z';
compareHTML(template()`<q><x t="${v()}">${f}</x>${ps.map(p => p())}</q>`,
'<q><x t="aaa">z</x>123234</q>');
});
it('should substitute into attributes, with children and whitespace', () => {
const v = () => 'aaa';
const ps = [() => '123', () => '234'];
const f = 'z';
compareHTML(template()`<q><x ttt="${v()}">${f}</x>
${ps.map(p => p())}
</q>`,
`<q><x ttt="aaa">z</x>
123234
</q>`);
});
it('example from paradise.js', () => {
const pieces = ['C', 'D'];
compareHTML(template()`<p class="event">
<span class="timestamp" title="${'A'}">${'B'}</span>
${pieces.map(p => p)}
</p>`,
`<p class="event">
<span class="timestamp" title="A">B</span>
CD
</p>`);
});
it('should be callable multiple times', () => {
const v = () => 'aaa';
const ps = [() => '123', () => '234', () => '345'];
const expected = '<q><x t="aaa">123234345</x></q>';
const t = template();
compareHTML(t`<q><x t="${v()}">${ps.map(p => p())}</x></q>`, expected);
compareHTML(t`<q><x t="${v()}">${ps.map(p => p())}</x></q>`, expected);
compareHTML(t`<q><x t="${v()}">${ps.map(p => p())}</x></q>`, expected);
});
it('should be callable multiple times with extra items', () => {
const v = () => 'aaa';
const t = template();
const ps = [() => '1'];
compareHTML(t`<q><x t="${v()}">${ps.map(p => p())}</x></q>`, '<q><x t="aaa">1</x></q>');
ps.push(() => '2');
compareHTML(t`<q><x t="${v()}">${ps.map(p => p())}</x></q>`, '<q><x t="aaa">12</x></q>');
ps.push(() => '3');
compareHTML(t`<q><x t="${v()}">${ps.map(p => p())}</x></q>`, '<q><x t="aaa">123</x></q>');
});
});

View File

@ -0,0 +1,38 @@
/// SPDX-License-Identifier: GPL-3.0-or-later
/// SPDX-FileCopyrightText: Copyright © 2016-2024 Tony Garnock-Jones <tonyg@leastfixedpoint.com>
import { is, preserves } from '@preserves/core';
declare global {
namespace jest {
interface Matchers<R> {
is(expected: any): R;
toThrowFilter(f: (e: Error) => boolean): R;
}
}
}
expect.extend({
is(actual, expected) {
return is(actual, expected)
? { message: () => preserves`expected ${actual} not to be Preserves.is to ${expected}`,
pass: true }
: { message: () => preserves`expected ${actual} to be Preserves.is to ${expected}`,
pass: false };
},
toThrowFilter(thunk, f) {
try {
thunk();
return { message: () => preserves`expected an exception`, pass: false };
} catch (e) {
if (f(e)) {
return { message: () => preserves`expected an exception not matching the filter`,
pass: true };
} else {
return { message: () => preserves`expected an exception matching the filter: ${(e as any)?.constructor?.name}`,
pass: false };
}
}
}
});

View File

@ -1,6 +1,6 @@
{
"name": "@syndicate-lang/loader",
"version": "0.31.2",
"version": "0.36.0",
"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.1",
"@syndicate-lang/core": "^0.30.1",
"@syndicate-lang/service": "^0.31.2"
"@syndicate-lang/compiler": "^0.22.3",
"@syndicate-lang/core": "^0.35.0",
"@syndicate-lang/service": "^0.36.0"
}
}

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.31.2",
"version": "0.36.0",
"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.30.1"
"@syndicate-lang/core": "^0.35.0"
},
"devDependencies": {
"@syndicate-lang/ts-plugin": "^0.32.2",
"@syndicate-lang/tsc": "^0.32.2"
"@syndicate-lang/ts-plugin": "^0.37.0",
"@syndicate-lang/tsc": "^0.37.0"
}
}

View File

@ -1,6 +1,6 @@
{
"name": "@syndicate-lang/syndicatec",
"version": "0.32.2",
"version": "0.37.0",
"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.1",
"@syndicate-lang/core": "^0.30.1",
"@syndicate-lang/compiler": "^0.22.3",
"@syndicate-lang/core": "^0.35.0",
"glob": "^7.1.6",
"yargs": "^16.2.0"
},

View File

@ -1,6 +1,6 @@
{
"name": "@syndicate-lang/timer",
"version": "0.31.2",
"version": "0.36.0",
"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.30.1"
"@syndicate-lang/core": "^0.35.0"
},
"devDependencies": {
"@syndicate-lang/ts-plugin": "^0.32.2",
"@syndicate-lang/tsc": "^0.32.2"
"@syndicate-lang/ts-plugin": "^0.37.0",
"@syndicate-lang/tsc": "^0.37.0"
}
}

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.32.2",
"version": "0.37.0",
"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.1",
"@syndicate-lang/core": "^0.30.1"
"@syndicate-lang/compiler": "^0.22.3",
"@syndicate-lang/core": "^0.35.0"
},
"devDependencies": {
"typescript": "^4.9"

View File

@ -160,7 +160,7 @@ const boot: tslib.server.PluginModuleFactory = ({ typescript: ts }) => {
const { text: expandedText, targetToSourceMap, sourceToTargetMap } = compile({
source,
name,
typescript: true,
typescript: !name.toLowerCase().endsWith('.js'),
emitError: (message, start, end) => {
console.error(`${Syntax.formatPos(start)}-${Syntax.formatPos(end)}: ${message}`);
diagnostics.push({ message, start, end });

View File

@ -1,6 +1,6 @@
{
"name": "@syndicate-lang/tsc",
"version": "0.32.2",
"version": "0.37.0",
"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.1",
"@syndicate-lang/core": "^0.30.1",
"@syndicate-lang/compiler": "^0.22.3",
"@syndicate-lang/core": "^0.35.0",
"glob": "^7.1.6",
"yargs": "^16.2.0"
},

View File

@ -1,6 +1,6 @@
{
"name": "@syndicate-lang/ws-relay",
"version": "0.32.2",
"version": "0.37.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,13 @@
"types": "lib/index.d.ts",
"author": "Tony Garnock-Jones <tonyg@leastfixedpoint.com>",
"peerDependencies": {
"@preserves/core": "0.995.101"
"@preserves/core": "^0.995.200"
},
"dependencies": {
"@syndicate-lang/core": "^0.30.1",
"salty-crypto": "0.3"
"@syndicate-lang/core": "^0.35.0"
},
"devDependencies": {
"@syndicate-lang/ts-plugin": "^0.32.2",
"@syndicate-lang/tsc": "^0.32.2"
"@syndicate-lang/ts-plugin": "^0.37.0",
"@syndicate-lang/tsc": "^0.37.0"
}
}

View File

@ -7,7 +7,6 @@ import {
Bytes,
Dataspace,
IdentitySet,
Observe,
QuasiValue as Q,
Record,
Ref,
@ -19,45 +18,46 @@ import {
canonicalEncode,
decode,
fromJS,
isEmbedded,
parse,
stringify,
underlying,
Embeddable,
SaltyCrypto,
Question,
Answer,
Result,
resultOk,
resultError,
} from "@syndicate-lang/core";
import G = Schemas.gatekeeper;
import S = Schemas.sturdy;
import N = Schemas.noise;
import T = Schemas.transportAddress;
import E = Schemas.stdenv;
import * as SaltyCrypto from 'salty-crypto';
export * as SaltyCrypto from 'salty-crypto';
import R = Schemas.rpc;
export * from './seal.js';
type TransportState = {
addr: T.WebSocket,
addr: AnyValue,
control: Ref,
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({
"addr": \$addrPatValue,
"control": \_,
"resolved": \_,
}) }) => {
const addr = Q.drop_lit(addrPatValue, T.toWebSocket);
if (!addr) return;
during Question(G.ConnectTransport(T.WebSocket($url: string))) => {
let counter =0;
Supervisor.always(() => ['transportConnector', fromJS(addr), counter++], () => {
console.log('connecting', addr.url, counter);
connectTo(addr);
Supervisor.always(() => ['wsTransport', fromJS(url), counter++], () => {
console.log('connecting', url, counter);
connectWs(url);
});
}
}
}
function connectTo(addr: T.WebSocket) {
function connectWs(url: string) {
const facet = Turn.activeFacet;
facet.preventInertCheck();
const controlEntity = {
@ -71,9 +71,9 @@ export function boot(ds = Dataspace.global, debug: boolean = false, WebSocketCon
function succeed(ws: WebSocket) {
if (final) return;
final = true;
console.log('opened', addr.url);
console.log('opened', url);
on stop {
console.log('closing', addr.url);
console.log('closing', url);
ws.close();
}
ws.onclose = () => facet.turn(() => { stop facet; });
@ -85,60 +85,50 @@ export function boot(ds = Dataspace.global, debug: boolean = false, WebSocketCon
setup: r => ws.onmessage = e => r.accept(new Uint8Array(e.data)),
initialOid: 0,
});
console.log('succeed', addr.url);
console.log('succeed', url);
at ds {
assert G.TransportConnection<Ref>({
"addr": fromJS(addr),
assert Answer(G.ConnectTransport(fromJS<Ref>(T.WebSocket(url))), resultOk(G.ConnectedTransport({
"addr": fromJS<Ref>(T.WebSocket(url)),
"control": create controlEntity,
"resolved": G.Resolved.accepted(relay.peer!),
});
"responderSession": relay.peer!,
})));
}
}
function fail(detail: Assertion) {
if (final) return;
final = true;
console.log('fail', addr.url, detail);
console.log('fail', url, detail);
at ds {
assert G.TransportConnection<Ref>({
"addr": fromJS(addr),
"control": create controlEntity,
"resolved": G.Resolved.Rejected(G.Rejected(detail)),
});
assert Answer(G.ConnectTransport(fromJS<Ref>(T.WebSocket(url))), resultError(detail));
}
setTimeout(() => facet.turn(() => { stop facet; }), 10000);
}
try {
const ws = new (WebSocketConstructor ?? WebSocket)(addr.url);
const ws = new (WebSocketConstructor ?? WebSocket)(url);
ws.binaryType = 'arraybuffer';
ws.onopen = () => facet.turn(() => succeed(ws));
ws.onclose = () => facet.turn(() => fail(Symbol.for('closed')));
ws.onerror = () => facet.turn(() => fail(Symbol.for('websocket-error-event')));
} catch (e) {
console.error('Failed opening websocket', addr.url, e);
console.error('Failed opening websocket', url, e);
fail(Symbol.for('websocket-exception'));
}
}
spawn named 'pathResolver' {
at ds {
during Observe({ "pattern": :pattern G.ResolvePath({
"route": \$routePatValue,
"addr": \_,
"control": \_,
"resolved": \_,
}) }) => {
const route = Q.drop_lit(routePatValue, G.toRoute);
during Question(G.ResolvePath($route0)) => {
const route = G.toRoute(route0);
if (!route) return;
field candidates: IdentitySet<TransportState> = new IdentitySet();
route.transports.forEach(t => {
const addr = T.toWebSocket(t);
if (!addr) return;
console.log('tracking', addr.url);
during G.TransportConnection({
route.transports.forEach(addr => {
console.log('tracking', addr);
assert Question(G.ConnectTransport(addr));
during Answer(G.ConnectTransport(addr), resultOk(G.ConnectedTransport({
"addr": addr,
"control": $control: Ref,
"resolved": G.Resolved.accepted($peer: Ref),
}) => {
"responderSession": $peer: Ref,
}))) => {
const entry = { addr, control, peer };
candidates.value.add(entry);
candidates.changed();
@ -159,39 +149,34 @@ export function boot(ds = Dataspace.global, debug: boolean = false, WebSocketCon
}
rootPeer.value = best.value?.peer ?? null;
}
resolve(() => rootPeer.value, route.pathSteps, (r) => {
console.log('leaf', best.value?.addr?.url);
assert G.ResolvePath<Ref>({
"route": route,
"addr": fromJS(best.value!.addr),
resolve(() => ({ ref: rootPeer.value, error: false }), route.pathSteps, (r) => {
console.log('leaf', best.value?.addr);
assert Answer(G.ResolvePath(route), resultOk(G.ResolvedPath({
"addr": best.value!.addr,
"control": best.value!.control,
"resolved": r()!
}) when (r());
"responderSession": r().ref!,
}))) when (r().ref);
assert Answer(G.ResolvePath(route), resultError(r().error)) when (!r().ref);
});
}
}
}
function resolve(
e: () => Ref | null,
e: () => { ref: Ref | null, error: AnyValue }, // gross
steps: G.PathStep[],
k: (r: () => G.Resolved | null) => void,
k: (r: () => { ref: Ref | null, error: AnyValue }) => void,
) {
if (steps.length === 0) {
k(() => {
const peer = e();
return peer === null ? null : G.Resolved.accepted(peer);
});
k(e);
} else {
const [step, ...more] = steps;
at ds {
during G.ResolvedPathStep({
"origin": (e()!),
"pathStep": step,
"resolved": $resolved: G.Resolved,
}) when (e()) => {
switch (resolved._variant) {
case "accepted":
const q = () => G.ResolvePathStep({ origin: (e().ref!), pathStep: step });
assert Question(q()) when (e().ref);
during Answer(((q)()) /* omg */, $a: Result) when (e().ref) => {
switch (a._variant) {
case "ok":
// Include a call to our e() in the e we pass in to the recursive
// call to resolve(). e() returning non-null is a precondition for
// the call; if that precondition ever changes, we want to NOT
@ -206,10 +191,18 @@ export function boot(ds = Dataspace.global, debug: boolean = false, WebSocketCon
// best.value!, which is now null, boom. With the call to e(), we
// short circuit and so the assertion becomes null at that point.
//
resolve(() => e() && resolved.responderSession, more, k);
const nextRef = G.toResolvedPathStep(a.value);
const nextResult = (nextRef === void 0)
? { ref: null, error: 'bad ResolvedPathStep' }
: { ref: nextRef, error: false };
const nextE = () => {
const result = e();
return result.ref ? nextResult : result;
};
resolve(nextE, more, k);
break;
case "Rejected":
k(() => resolved);
case "error":
k(() => ({ ref: null, error: a.error }));
break;
}
}
@ -219,45 +212,86 @@ export function boot(ds = Dataspace.global, debug: boolean = false, WebSocketCon
spawn named 'noiseStep' {
at ds {
during Observe({ "pattern": :pattern G.ResolvedPathStep({
"origin": \$originPatValue,
"pathStep": G.PathStep({
"stepType": N.$noise,
"detail": \$detailPatValue,
during Question($q(G.ResolvePathStep({
origin: $origin: Ref,
pathStep: G.PathStep({
stepType: N.$noise,
detail: $spec: N.NoisePathStepDetail,
}),
"resolved": \_,
}) }) => {
const origin0 = Q.drop_lit(originPatValue);
if (!origin0 || !isEmbedded(origin0)) return;
const origin = origin0;
const spec = Q.drop_lit(detailPatValue, N.toNoisePathStepDetail);
if (!spec) return;
}))) => {
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;
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 Answer(q, resultError(response.value.detail));
}
}
}
}),
});
}
}
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 responderSession: Ref | 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,
@ -273,63 +307,10 @@ export function boot(ds = Dataspace.global, debug: boolean = false, WebSocketCon
setup: r => relay = r,
initialOid: 0,
}).peer!;
assert G.ResolvedPathStep<Ref>({
"origin": origin,
"pathStep": G.PathStep({
"stepType": N.$noise,
"detail": fromJS(spec),
}),
"resolved": G.Resolved.accepted(peer),
});
}
assert Answer(q, resultOk(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) {
function handlePacket(body: Assertion) {
const p = N.asPacket(body);
if (transportState) {
const packet = transportState.recv.decrypt_large(
@ -347,9 +328,6 @@ export function boot(ds = Dataspace.global, debug: boolean = false, WebSocketCon
}
maybeTransition(finished);
}
},
}),
});
}
}
}
@ -358,21 +336,13 @@ export function boot(ds = Dataspace.global, debug: boolean = false, WebSocketCon
spawn named 'sturdyRefStep' {
at ds {
during Observe({ "pattern": :pattern G.ResolvedPathStep({
"origin": \$originPatValue,
"pathStep": G.PathStep({
"stepType": S.$ref,
"detail": \$detailPatValue,
during Question($q(G.ResolvePathStep({
origin: $origin: Ref,
pathStep: G.PathStep({
stepType: S.$ref,
detail: $parameters: S.SturdyPathStepDetail,
}),
"resolved": \_,
}) }) => {
const origin0 = Q.drop_lit(originPatValue);
if (!origin0 || !isEmbedded(origin0)) return;
const origin = origin0;
const parameters = Q.drop_lit(detailPatValue, S.toSturdyPathStepDetail);
if (!parameters) return;
}))) => {
at origin {
assert G.Resolve({
"step": G.Step({
@ -383,14 +353,14 @@ export function boot(ds = Dataspace.global, debug: boolean = false, WebSocketCon
const response = G.toResolved(e);
if (!response) return;
at ds {
assert G.ResolvedPathStep<Ref>({
"origin": origin,
"pathStep": G.PathStep({
"stepType": S.$ref,
"detail": fromJS(parameters),
}),
"resolved": response,
});
switch (response._variant) {
case "accepted":
assert Answer(q, resultOk(response.responderSession));
break;
case "Rejected":
assert Answer(q, resultError(response.value.detail));
break;
}
}
}),
});
@ -434,10 +404,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);
@ -446,22 +425,22 @@ export function decodeStandardRoute(s: string): G.Route | null {
}
export function contactRemote(
route: G.Route<Ref> | Record<AnyValue, Array<AnyValue>, Ref>,
route: G.Route | Record<AnyValue, Array<AnyValue>, Ref> ,
connectedFacet: (
remoteObject: Ref,
controlObject: Ref,
transportAddr: AnyValue,
) => void,
ds = Dataspace.global,
ds = Dataspace.local,
) {
const routeValue = 'pathSteps' in route ? G.fromRoute(G.Route(route)) : route;
const routeValue = 'pathSteps' in route ? route : G.asRoute(route);
at ds {
during G.ResolvePath({
"route": routeValue,
assert Question(G.ResolvePath(routeValue));
during Answer(G.ResolvePath(routeValue), resultOk(G.ResolvedPath({
"addr": $addr,
"control": $control: Ref,
"resolved": G.Resolved.accepted($resolved: Ref),
}) => {
"responderSession": $resolved: Ref,
}))) => {
connectedFacet(resolved, control, addr);
}
}

View File

@ -0,0 +1,71 @@
/// SPDX-License-Identifier: GPL-3.0-or-later
/// SPDX-FileCopyrightText: Copyright © 2024 Tony Garnock-Jones <tonyg@leastfixedpoint.com>
import { Bytes, Value, encode, decode, isEmbedded, isSequence } from "@preserves/core";
import { SaltyCrypto, Ref } from "@syndicate-lang/core";
const aead = SaltyCrypto.ChaCha20Poly1305_RFC8439;
export type Sealed = [Bytes, number, number, number];
export function makeSeal() {
const key = new DataView(SaltyCrypto.randomBytes(aead.KEYBYTES).buffer);
const n = new SaltyCrypto.Nonce();
return {
seal(v: Value<Ref>): Promise<Sealed> {
return new Promise(k => {
at this.sealer {
send message [v, create ({
message(reply) { k(reply as Sealed); }
})];
}
});
},
unseal(sealed: Sealed): Promise<{ ok: true, value: Value } | { ok: false }> {
return new Promise(k => {
at this.unsealer {
send message [sealed, create ({
message(reply) { k(reply as any); }
})];
}
});
},
sealer: create ({
message(req) {
if (isSequence(req) && req.length === 2 && isEmbedded(req[1])) {
try {
const [term, k] = req;
const m = encode(term);
const c = aead.encrypt(m._view, key, n);
at k { send message [Bytes.from(c), n.lo, n.hi, n.extra]; }
n.increment();
} catch (_e) { console.error('Failed sealing: ' + _e); }
}
}
}),
unsealer: create ({
message(req) {
if (
isSequence(req) && req.length === 2 && isEmbedded(req[1]) &&
isSequence(req[0]) && req[0].length === 4 &&
Bytes.isBytes(req[0][0]) &&
typeof req[0][1] === 'number' &&
typeof req[0][2] === 'number' &&
typeof req[0][3] === 'number'
) {
const [[c, lo, hi, extra], k] = req;
try {
const n = new SaltyCrypto.Nonce(lo, hi, extra);
const m = aead.decrypt(c._view, key, n);
at k { send message { ok: true, value: decode(Bytes.from(m)) }; }
} catch (e) {
at k { send message { ok: false }; }
}
}
},
}),
};
}

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

542
yarn.lock
View File

@ -10,156 +10,159 @@
"@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":
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==
"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.24.7":
version "7.24.7"
resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.24.7.tgz#882fd9e09e8ee324e496bd040401c6f046ef4465"
integrity sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==
dependencies:
"@babel/highlight" "^7.24.2"
"@babel/highlight" "^7.24.7"
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==
"@babel/compat-data@^7.24.7":
version "7.24.7"
resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.24.7.tgz#d23bbea508c3883ba8251fb4164982c36ea577ed"
integrity sha512-qJzAIcv03PyaWqxRgO4mSU3lihncDT296vnyuE2O8uA4w3UHWI4S3hgeZd1L8W1Bft40w9JxJ2b412iDUFFRhw==
"@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.7"
resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.24.7.tgz#b676450141e0b52a3d43bc91da86aa608f950ac4"
integrity sha512-nykK+LEK86ahTkX/3TgauT0ikKoNCfKHEaZYTUVupJdTLzGNvrblu4u6fa7DhZONAltdf8e662t/abY8idrd/g==
dependencies:
"@ampproject/remapping" "^2.2.0"
"@babel/code-frame" "^7.24.2"
"@babel/generator" "^7.24.1"
"@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/template" "^7.24.0"
"@babel/traverse" "^7.24.1"
"@babel/types" "^7.24.0"
"@babel/code-frame" "^7.24.7"
"@babel/generator" "^7.24.7"
"@babel/helper-compilation-targets" "^7.24.7"
"@babel/helper-module-transforms" "^7.24.7"
"@babel/helpers" "^7.24.7"
"@babel/parser" "^7.24.7"
"@babel/template" "^7.24.7"
"@babel/traverse" "^7.24.7"
"@babel/types" "^7.24.7"
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.7", "@babel/generator@^7.7.2":
version "7.24.7"
resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.24.7.tgz#1654d01de20ad66b4b4d99c135471bc654c55e6d"
integrity sha512-oipXieGC3i45Y1A41t4tAqpnEZWgB/lC6Ehh6+rOviR5XWpTtMmLN+fGjz9vOiNRt0p6RtO6DtD0pdU3vpqdSA==
dependencies:
"@babel/types" "^7.24.0"
"@babel/types" "^7.24.7"
"@jridgewell/gen-mapping" "^0.3.5"
"@jridgewell/trace-mapping" "^0.3.25"
jsesc "^2.5.1"
"@babel/helper-compilation-targets@^7.23.6":
version "7.23.6"
resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz#4d79069b16cbcf1461289eccfbbd81501ae39991"
integrity sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==
"@babel/helper-compilation-targets@^7.24.7":
version "7.24.7"
resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.24.7.tgz#4eb6c4a80d6ffeac25ab8cd9a21b5dfa48d503a9"
integrity sha512-ctSdRHBi20qWOfy27RUb4Fhp07KSJ3sXcuSvTrXrc4aG8NSYDo1ici3Vhg9bg69y5bj0Mr1lh0aeEgTvc12rMg==
dependencies:
"@babel/compat-data" "^7.23.5"
"@babel/helper-validator-option" "^7.23.5"
"@babel/compat-data" "^7.24.7"
"@babel/helper-validator-option" "^7.24.7"
browserslist "^4.22.2"
lru-cache "^5.1.1"
semver "^6.3.1"
"@babel/helper-environment-visitor@^7.22.20":
version "7.22.20"
resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz#96159db61d34a29dba454c959f5ae4a649ba9167"
integrity sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==
"@babel/helper-function-name@^7.23.0":
version "7.23.0"
resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz#1f9a3cdbd5b2698a670c30d2735f9af95ed52759"
integrity sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==
"@babel/helper-environment-visitor@^7.24.7":
version "7.24.7"
resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.24.7.tgz#4b31ba9551d1f90781ba83491dd59cf9b269f7d9"
integrity sha512-DoiN84+4Gnd0ncbBOM9AZENV4a5ZiL39HYMyZJGZ/AZEykHYdJw0wW3kdcsh9/Kn+BRXHLkkklZ51ecPKmI1CQ==
dependencies:
"@babel/template" "^7.22.15"
"@babel/types" "^7.23.0"
"@babel/types" "^7.24.7"
"@babel/helper-hoist-variables@^7.22.5":
version "7.22.5"
resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz#c01a007dac05c085914e8fb652b339db50d823bb"
integrity sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==
"@babel/helper-function-name@^7.24.7":
version "7.24.7"
resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.24.7.tgz#75f1e1725742f39ac6584ee0b16d94513da38dd2"
integrity sha512-FyoJTsj/PEUWu1/TYRiXTIHc8lbw+TDYkZuoE43opPS5TrI7MyONBE1oNvfguEXAD9yhQRrVBnXdXzSLQl9XnA==
dependencies:
"@babel/types" "^7.22.5"
"@babel/template" "^7.24.7"
"@babel/types" "^7.24.7"
"@babel/helper-module-imports@^7.22.15":
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==
"@babel/helper-hoist-variables@^7.24.7":
version "7.24.7"
resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.24.7.tgz#b4ede1cde2fd89436397f30dc9376ee06b0f25ee"
integrity sha512-MJJwhkoGy5c4ehfoRyrJ/owKeMl19U54h27YYftT0o2teQ3FJ3nQUf/I3LlJsX4l3qlw7WRXUmiyajvHXoTubQ==
dependencies:
"@babel/types" "^7.24.0"
"@babel/types" "^7.24.7"
"@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-imports@^7.24.7":
version "7.24.7"
resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.24.7.tgz#f2f980392de5b84c3328fc71d38bd81bbb83042b"
integrity sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==
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/traverse" "^7.24.7"
"@babel/types" "^7.24.7"
"@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==
"@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-module-transforms@^7.24.7":
version "7.24.7"
resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.24.7.tgz#31b6c9a2930679498db65b685b1698bfd6c7daf8"
integrity sha512-1fuJEwIrp+97rM4RWdO+qrRsZlAeL1lQJoPqtCYWv0NL115XM93hIH4CSRln2w52SqvmY5hqdtauB6QFCDiZNQ==
dependencies:
"@babel/types" "^7.22.5"
"@babel/helper-environment-visitor" "^7.24.7"
"@babel/helper-module-imports" "^7.24.7"
"@babel/helper-simple-access" "^7.24.7"
"@babel/helper-split-export-declaration" "^7.24.7"
"@babel/helper-validator-identifier" "^7.24.7"
"@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-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.7", "@babel/helper-plugin-utils@^7.8.0":
version "7.24.7"
resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.7.tgz#98c84fe6fe3d0d3ae7bfc3a5e166a46844feb2a0"
integrity sha512-Rq76wjt7yz9AAc1KnlRKNAi/dMSVWgDRx43FHoJEbcYU6xOWaE2dVPwcdTukJrjxS65GITyfbvEYHvkirZ6uEg==
"@babel/helper-simple-access@^7.24.7":
version "7.24.7"
resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.24.7.tgz#bcade8da3aec8ed16b9c4953b74e506b51b5edb3"
integrity sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==
dependencies:
"@babel/types" "^7.22.5"
"@babel/traverse" "^7.24.7"
"@babel/types" "^7.24.7"
"@babel/helper-string-parser@^7.23.4":
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-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/helper-split-export-declaration@^7.24.7":
version "7.24.7"
resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.7.tgz#83949436890e07fa3d6873c61a96e3bbf692d856"
integrity sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==
dependencies:
"@babel/template" "^7.24.0"
"@babel/traverse" "^7.24.1"
"@babel/types" "^7.24.0"
"@babel/types" "^7.24.7"
"@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==
"@babel/helper-string-parser@^7.24.7":
version "7.24.7"
resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.24.7.tgz#4d2d0f14820ede3b9807ea5fc36dfc8cd7da07f2"
integrity sha512-7MbVt6xrwFQbunH2DNQsAP5sTGxfqQtErvBIvIMi6EQnbgUOuVYanvREcmFrOPhoXBrTtjhhP+lW+o5UfK+tDg==
"@babel/helper-validator-identifier@^7.24.7":
version "7.24.7"
resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz#75b889cfaf9e35c2aaf42cf0d72c8e91719251db"
integrity sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==
"@babel/helper-validator-option@^7.24.7":
version "7.24.7"
resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.24.7.tgz#24c3bb77c7a425d1742eec8fb433b5a1b38e62f6"
integrity sha512-yy1/KvjhV/ZCL+SM7hBrvnZJ3ZuT9OuZgIJAGpPEToANvc3iM6iDvBnRjtElWibHU6n8/LPR/EjX9EtIEYO3pw==
"@babel/helpers@^7.24.7":
version "7.24.7"
resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.24.7.tgz#aa2ccda29f62185acb5d42fb4a3a1b1082107416"
integrity sha512-NlmJJtvcw72yRJRcnCmGvSi+3jDEg8qFu3z0AFoymmzLx5ERVWyzd9kVXr7Th9/8yIJi2Zc6av4Tqz3wFs8QWg==
dependencies:
"@babel/helper-validator-identifier" "^7.22.20"
"@babel/template" "^7.24.7"
"@babel/types" "^7.24.7"
"@babel/highlight@^7.24.7":
version "7.24.7"
resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.24.7.tgz#a05ab1df134b286558aae0ed41e6c5f731bf409d"
integrity sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==
dependencies:
"@babel/helper-validator-identifier" "^7.24.7"
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.7":
version "7.24.7"
resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.24.7.tgz#9a5226f92f0c5c8ead550b750f5608e766c8ce85"
integrity sha512-9uUYRm6OqQrCqQdG1iCBwBPZgN8ciDBro2nIOFaiRz1/BCxaI7CNvQbDHvsArAC7Tw9Hda/B3U+6ui9u4HWXPw==
"@babel/plugin-syntax-async-generators@^7.8.4":
version "7.8.4"
@ -246,44 +249,44 @@
"@babel/helper-plugin-utils" "^7.14.5"
"@babel/plugin-syntax-typescript@^7.7.2":
version "7.24.1"
resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.24.1.tgz#b3bcc51f396d15f3591683f90239de143c076844"
integrity sha512-Yhnmvy5HZEnHUty6i++gcfH1/l68AHnItFHnaCv6hn9dNh0hQvvQJsxpi4BMBFN5DLeHBuucT/0DgzXif/OyRw==
version "7.24.7"
resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.24.7.tgz#58d458271b4d3b6bb27ee6ac9525acbb259bad1c"
integrity sha512-c/+fVeJBB0FeKsFvwytYiUD+LBvhHjGSI0g446PRGdSVGZLRNArBUno2PETbAly3tpiNAQR5XaZ+JslxkotsbA==
dependencies:
"@babel/helper-plugin-utils" "^7.24.0"
"@babel/helper-plugin-utils" "^7.24.7"
"@babel/template@^7.22.15", "@babel/template@^7.24.0", "@babel/template@^7.3.3":
version "7.24.0"
resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.24.0.tgz#c6a524aa93a4a05d66aaf31654258fae69d87d50"
integrity sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==
"@babel/template@^7.24.7", "@babel/template@^7.3.3":
version "7.24.7"
resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.24.7.tgz#02efcee317d0609d2c07117cb70ef8fb17ab7315"
integrity sha512-jYqfPrU9JTF0PmPy1tLYHW4Mp4KlgxJD9l2nP9fD6yT/ICi554DmrWBAEYpIelzjHf1msDP3PxJIRt/nFNfBig==
dependencies:
"@babel/code-frame" "^7.23.5"
"@babel/parser" "^7.24.0"
"@babel/types" "^7.24.0"
"@babel/code-frame" "^7.24.7"
"@babel/parser" "^7.24.7"
"@babel/types" "^7.24.7"
"@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.7", "@babel/traverse@^7.7.2":
version "7.24.7"
resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.24.7.tgz#de2b900163fa741721ba382163fe46a936c40cf5"
integrity sha512-yb65Ed5S/QAcewNPh0nZczy9JdYXkkAbIsEo+P7BE7yO3txAY30Y/oPa3QkQ5It3xVG2kpKMg9MsdxZaO31uKA==
dependencies:
"@babel/code-frame" "^7.24.1"
"@babel/generator" "^7.24.1"
"@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/code-frame" "^7.24.7"
"@babel/generator" "^7.24.7"
"@babel/helper-environment-visitor" "^7.24.7"
"@babel/helper-function-name" "^7.24.7"
"@babel/helper-hoist-variables" "^7.24.7"
"@babel/helper-split-export-declaration" "^7.24.7"
"@babel/parser" "^7.24.7"
"@babel/types" "^7.24.7"
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.24.7", "@babel/types@^7.3.3":
version "7.24.7"
resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.24.7.tgz#6027fe12bc1aa724cd32ab113fb7f1988f1f66f2"
integrity sha512-XEFXSlxiG5td2EJRe8vOmRbaXVgfcBlszKujvVmWIK/UpywWljQCfzAv3RQCGujWQ1RD4YYWEAqDXfuJiy8f5Q==
dependencies:
"@babel/helper-string-parser" "^7.23.4"
"@babel/helper-validator-identifier" "^7.22.20"
"@babel/helper-string-parser" "^7.24.7"
"@babel/helper-validator-identifier" "^7.24.7"
to-fast-properties "^2.0.0"
"@bcoe/v8-coverage@^0.2.3":
@ -1426,30 +1429,30 @@
resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33"
integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==
"@preserves/core@0.995.101", "@preserves/core@^0.995.100":
version "0.995.101"
resolved "https://registry.yarnpkg.com/@preserves/core/-/core-0.995.101.tgz#8b28d77f69c09b19aa79bb40ae8125ba1c8209c0"
integrity sha512-2KYi0qq3/tahtddI21Newyh5gvHzc9LcVD1rgHEVrGxMsCRc/B/+SnEF2tRxniGmh9bniN54htBzt94xp0xjKw==
"@preserves/core@^0.995.200", "@preserves/core@^0.995.201", "@preserves/core@^0.995.206":
version "0.995.206"
resolved "https://registry.yarnpkg.com/@preserves/core/-/core-0.995.206.tgz#f13507aa39dbc8cbd5d10ac18d107c06e92bf519"
integrity sha512-Uc4SSSXHQG6xYER9cCc0bkbLYM8fGVbO4kXw3DI8BaQjeUFPOX3yYNYPAvRNzmaF4MuMOZY+jSJpjJ9o5g6A0w==
"@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.206"
resolved "https://registry.yarnpkg.com/@preserves/schema-cli/-/schema-cli-0.995.206.tgz#709c96d938dce3bf5b132a3da1304ca3c84bbe2e"
integrity sha512-870rwjKtQHA8huwt8MpMImnKC2cBHKYzcJi4811k5RuYs/HdbT9B81NMSiSn+Hq19/v9fEBicwwEmao3oM7hJw==
dependencies:
"@preserves/core" "^0.995.100"
"@preserves/schema" "^0.995.100"
"@preserves/core" "^0.995.206"
"@preserves/schema" "^0.995.206"
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.206":
version "0.995.206"
resolved "https://registry.yarnpkg.com/@preserves/schema/-/schema-0.995.206.tgz#8e35a7db5363374f6794009d394510871f86746e"
integrity sha512-JmXGxSqsNSEzZNpvOYPupSZhffvMIvgnUmKE+Yt5oiPiD/8H52EbKRrqBUQuVpvI4hvwgThWAtNIg3+q42vI2w==
dependencies:
"@preserves/core" "^0.995.100"
"@preserves/core" "^0.995.206"
"@rollup/plugin-node-resolve@^13.0":
version "13.3.0"
@ -1492,9 +1495,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"
@ -1538,9 +1541,9 @@
"@babel/types" "^7.0.0"
"@types/babel__traverse@*", "@types/babel__traverse@^7.0.4", "@types/babel__traverse@^7.0.6":
version "7.20.5"
resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.20.5.tgz#7b7502be0aa80cc4ef22978846b983edaafcd4dd"
integrity sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ==
version "7.20.6"
resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.20.6.tgz#8dc9f0ae0f202c08d8d4dab648912c8d6038e3f7"
integrity sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==
dependencies:
"@babel/types" "^7.20.7"
@ -1612,9 +1615,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.14.2"
resolved "https://registry.yarnpkg.com/@types/node/-/node-20.14.2.tgz#a5f4d2bcb4b6a87bffcaa717718c5a0f208f4a18"
integrity sha512-xyu6WAMVwv6AKFLB+e/7ySZVr/0zLCzOa7rSpq6jNwpqOrUbcACDWC+53d4n2QHOnDou0fbIsg8wZu/sxrnI4Q==
dependencies:
undici-types "~5.26.4"
@ -1963,9 +1966,9 @@ aws-sign2@~0.7.0:
integrity sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==
aws4@^1.8.0:
version "1.12.0"
resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.12.0.tgz#ce1c9d143389679e253b314241ea9aa5cec980d3"
integrity sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==
version "1.13.0"
resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.13.0.tgz#d9b802e9bb9c248d7be5f7f5ef178dc3684e9dcc"
integrity sha512-3AungXC4I8kKsS9PuS4JH2nc+0bVY/mjgrephHTIi8fpEeGsTHBUJeosp0Wc1myYMElmD0B3Oc4XL/HVJ4PV2g==
babel-jest@^27.5.1:
version "27.5.1"
@ -2083,12 +2086,12 @@ brace-expansion@^2.0.1:
dependencies:
balanced-match "^1.0.0"
braces@^3.0.2, braces@~3.0.2:
version "3.0.2"
resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107"
integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==
braces@^3.0.3, braces@~3.0.2:
version "3.0.3"
resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789"
integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==
dependencies:
fill-range "^7.0.1"
fill-range "^7.1.1"
browser-process-hrtime@^1.0.0:
version "1.0.0"
@ -2214,9 +2217,9 @@ camelcase@^6.2.0:
integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==
caniuse-lite@^1.0.30001587:
version "1.0.30001600"
resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001600.tgz#93a3ee17a35aa6a9f0c6ef1b2ab49507d1ab9079"
integrity sha512-+2S9/2JFhYmYaDpZvo0lKkfvuKIglrx68MwOBqMGHhQsNkLjB5xtc/TGoEPs+MxjSyN/72qer2g97nzR641mOQ==
version "1.0.30001629"
resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001629.tgz#907a36f4669031bd8a1a8dbc2fa08b29e0db297e"
integrity sha512-c3dl911slnQhmxUIT4HhYzT7wnBK/XYpGnYLOj4nJBaRiw52Ibe7YxlDaAeRECvA786zCuExhxIUJ2K7nHMrBw==
caseless@~0.12.0:
version "0.12.0"
@ -2293,9 +2296,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"
@ -2647,9 +2650,9 @@ dateformat@^3.0.0:
integrity sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==
debug@4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.3:
version "4.3.4"
resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865"
integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==
version "4.3.5"
resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.5.tgz#e83444eceb9fedd4a1da56d671ae2446a01a6e1e"
integrity sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==
dependencies:
ms "2.1.2"
@ -2707,7 +2710,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 +2838,9 @@ editorconfig@^1.0.4:
semver "^7.5.3"
electron-to-chromium@^1.4.668:
version "1.4.715"
resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.715.tgz#bb16bcf2a3537962fccfa746b5c98c5f7404ff46"
integrity sha512-XzWNH4ZSa9BwVUQSDorPWAUQ5WGuYz7zJUNpNif40zFCiCl20t8zgylmreNmn26h5kiyw2lg7RfTmeMBsDklqg==
version "1.4.794"
resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.794.tgz#cca7762998f6c42517770666e272f52a53c08605"
integrity sha512-6FApLtsYhDCY0Vglq3AptsdxQ+PJLc6AxlAM0HjEihUAiOPPbkASEsq9gtxUeZY9o0sJIEa3WnF0vVH4VT4iug==
emittery@^0.8.1:
version "0.8.1"
@ -2867,9 +2870,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"
@ -2884,9 +2887,9 @@ error-ex@^1.3.1:
is-arrayish "^0.2.1"
es-abstract@^1.22.1, es-abstract@^1.22.3, 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==
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"
@ -2927,11 +2930,11 @@ es-abstract@^1.22.1, es-abstract@^1.22.3, es-abstract@^1.23.0, es-abstract@^1.23
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"
@ -2977,7 +2980,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==
@ -3129,10 +3132,10 @@ figures@^3.0.0:
dependencies:
escape-string-regexp "^1.0.5"
fill-range@^7.0.1:
version "7.0.1"
resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40"
integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==
fill-range@^7.1.1:
version "7.1.1"
resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292"
integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==
dependencies:
to-regex-range "^5.0.1"
@ -3391,15 +3394,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.4.1"
resolved "https://registry.yarnpkg.com/glob/-/glob-10.4.1.tgz#0cfb01ab6a6b438177bfe6a58e2576f6efe909c2"
integrity sha512-2jelhlq3E4ho74ZyVLN03oKdAZVUa6UDZzFLVH1H7dnoax+y9qyaq8zBkfDIggjniU19z0wU18y16jMB2eyVIw==
dependencies:
foreground-child "^3.1.0"
jackspeak "^2.3.5"
minimatch "^9.0.1"
minipass "^5.0.0 || ^6.0.2 || ^7.0.0"
path-scurry "^1.10.1"
jackspeak "^3.1.2"
minimatch "^9.0.4"
minipass "^7.1.2"
path-scurry "^1.11.1"
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"
@ -3419,11 +3422,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"
@ -4018,10 +4022,10 @@ istanbul-reports@^3.1.3:
html-escaper "^2.0.0"
istanbul-lib-report "^3.0.0"
jackspeak@^2.3.5:
version "2.3.6"
resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-2.3.6.tgz#647ecc472238aee4b06ac0e461acc21a8c505ca8"
integrity sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==
jackspeak@^3.1.2:
version "3.4.0"
resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-3.4.0.tgz#a75763ff36ad778ede6a156d8ee8b124de445b4a"
integrity sha512-JVYhQnN59LVPFCEcVa2C3CrEKYacvjRfqIQl+h8oi91aLYQVWRYbxjPcv1bUiUy/kLmQaANrYfNMCO3kuEDHfw==
dependencies:
"@isaacs/cliui" "^8.0.2"
optionalDependencies:
@ -4712,6 +4716,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"
@ -4726,11 +4735,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"
@ -4846,11 +4850,11 @@ merge2@^1.3.0, merge2@^1.4.1:
integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==
micromatch@^4.0.4:
version "4.0.5"
resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6"
integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==
version "4.0.7"
resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.7.tgz#33e8190d9fe474a9895525f5618eee136d46c2e5"
integrity sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==
dependencies:
braces "^3.0.2"
braces "^3.0.3"
picomatch "^2.3.1"
mime-db@1.52.0:
@ -4889,10 +4893,10 @@ minimatch@^3.0, minimatch@^3.0.4, minimatch@^3.1.1:
dependencies:
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==
minimatch@^9.0.4:
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"
@ -4977,10 +4981,10 @@ 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":
version "7.0.4"
resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.0.4.tgz#dbce03740f50a4786ba994c1fb908844d27b038c"
integrity sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==
"minipass@^5.0.0 || ^6.0.2 || ^7.0.0", minipass@^7.1.2:
version "7.1.2"
resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.1.2.tgz#93a9626ce5e5e66bd4db86849e7515e92340a707"
integrity sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==
minizlib@^1.3.3:
version "1.3.3"
@ -5130,9 +5134,9 @@ nopt@^5.0.0:
abbrev "1"
nopt@^7.2.0:
version "7.2.0"
resolved "https://registry.yarnpkg.com/nopt/-/nopt-7.2.0.tgz#067378c68116f602f552876194fd11f1292503d7"
integrity sha512-CVDtwCdhYIvnAzFoJ6NJ6dX3oga9/HyciQDnG1vQDjSLMeKLJ4A93ZqYKDrgYSr1FBY5/hMYC+2VCi24pgpkGA==
version "7.2.1"
resolved "https://registry.yarnpkg.com/nopt/-/nopt-7.2.1.tgz#1cac0eab9b8e97c9093338446eddd40b2c8ca1e7"
integrity sha512-taM24ViiimT/XntxbPyJQzCG+p4EKOpgD3mxFwW38mGjVUrfERQOeY4EDHjdnptttfHuHQXFx+lTP08Q+mLa/w==
dependencies:
abbrev "^2.0.0"
@ -5277,9 +5281,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.10"
resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.10.tgz#0b77a68e21a0b483db70b11fad055906e867cda8"
integrity sha512-QK0sRs7MKv0tKe1+5uZIQk/C8XGza4DAnztJG8iD+TpJIORARrCxczA738awHrZoHeTjSSoHqao2teO0dC/gFQ==
oauth-sign@~0.9.0:
version "0.9.0"
@ -5543,12 +5547,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.11.1:
version "1.11.1"
resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.11.1.tgz#7960a668888594a0720b12a911d1a742ab9f11d2"
integrity sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==
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:
@ -5568,10 +5572,10 @@ performance-now@^2.1.0:
resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b"
integrity sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==
picocolors@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c"
integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==
picocolors@^1.0.0, picocolors@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.1.tgz#a8ad579b571952f0e5d25892de5445bcfe25aaa1"
integrity sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==
picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.2, picomatch@^2.2.3, picomatch@^2.3.1:
version "2.3.1"
@ -5688,9 +5692,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"
@ -6065,7 +6069,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.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==
@ -6083,11 +6087,9 @@ saxes@^5.0.1:
integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==
semver@7.x, semver@^7.1.1, semver@^7.1.3, semver@^7.3.2, semver@^7.3.4, semver@^7.3.5, semver@^7.5.3:
version "7.6.0"
resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.0.tgz#1a46a4db4bffcccd97b743b5005c8325f23d4e2d"
integrity sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==
dependencies:
lru-cache "^6.0.0"
version "7.6.2"
resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.2.tgz#1e3b34759f896e8f14d6134732ce798aeb0c6e13"
integrity sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==
semver@^6.0.0, semver@^6.3.0, semver@^6.3.1:
version "6.3.1"
@ -6211,9 +6213,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"
@ -6280,9 +6282,9 @@ spdx-expression-parse@^3.0.0:
spdx-license-ids "^3.0.0"
spdx-license-ids@^3.0.0:
version "3.0.17"
resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.17.tgz#887da8aa73218e51a1d917502d79863161a93f9c"
integrity sha512-sh8PWc/ftMqAAdFiBu6Fy6JUOYjqDJBJvIhpfDMyHrr0Rbp5liZqd4TjtQ/RgfLjKFZb+LMx5hpml5qOWy0qvg==
version "3.0.18"
resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.18.tgz#22aa922dcf2f2885a6494a261f2d8b75345d0326"
integrity sha512-xxRs31BqRYHwiMzudOrpSiHtZ8i/GeionCBDSilhYRj+9gIcI8wCZTlXZKu9vZIVqViP3dcp9qE5G6AlIaD+TQ==
split-on-first@^1.0.0:
version "1.1.0"
@ -6410,7 +6412,7 @@ string.prototype.trimend@^1.0.8:
define-properties "^1.2.1"
es-object-atoms "^1.0.0"
string.prototype.trimstart@^1.0.7:
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==
@ -6591,9 +6593,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.1"
resolved "https://registry.yarnpkg.com/terser/-/terser-5.31.1.tgz#735de3c987dd671e95190e6b98cfe2f07f3cf0d4"
integrity sha512-37upzU1+viGvuFtBo9NPufCb9dwM0+l9hMxYyWfBA+fbwrPqNJAhbZ6W47bBFnZHKHTUBnMvi87434qq+qnxOg==
dependencies:
"@jridgewell/source-map" "^0.3.3"
acorn "^8.8.2"
@ -6664,9 +6666,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"
@ -6858,7 +6860,7 @@ typed-array-byte-offset@^1.0.2:
has-proto "^1.0.3"
is-typed-array "^1.1.13"
typed-array-length@^1.0.5:
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==
@ -6973,12 +6975,12 @@ 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.16"
resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.16.tgz#f6d489ed90fb2f07d67784eb3f53d7891f736356"
integrity sha512-KVbTxlBYlckhF5wgfyZXTWnMn7MMZjMu9XG8bPlliUOP9ThaF4QnhP8qrjrH7DRzHfSk0oQv1wToW+iA5GajEQ==
dependencies:
escalade "^3.1.1"
picocolors "^1.0.0"
escalade "^3.1.2"
picocolors "^1.0.1"
uri-js@^4.2.2:
version "4.4.1"