From fb78a3d3d2f08598c7f57fcd2c5c8aab14e28618 Mon Sep 17 00:00:00 2001 From: Emery Hemingway Date: Fri, 10 May 2024 14:19:35 +0200 Subject: [PATCH] Add syndicate_webextension_native_messager --- README.md | 2 + default.nix | 12 ++++ ...syndicate_webextension_native_messager.nim | 67 +++++++++++++++++++ syndicate_native_messager.json | 9 +++ syndicate_utils.nimble | 5 +- syndicate_webextension_native_messager.json | 9 +++ 6 files changed, 101 insertions(+), 3 deletions(-) create mode 100644 src/syndicate_webextension_native_messager.nim create mode 100644 syndicate_native_messager.json create mode 100644 syndicate_webextension_native_messager.json diff --git a/README.md b/README.md index bca8064..6324ad3 100644 --- a/README.md +++ b/README.md @@ -425,6 +425,8 @@ Example $ FS=':' syndump '' | awk -F : '/^+/ { print $2 }' ``` +## Webextenstion Native Messager + ## XSLT processor Perform XML stylesheet transformations. For a given textual XSLT stylesheet and a textual XML document generate an abstract XML document in Preserves form. Inputs may be XML text or paths to XML files. diff --git a/default.nix b/default.nix index 77e1765..3f64327 100644 --- a/default.nix +++ b/default.nix @@ -31,4 +31,16 @@ buildNimPackage { ]; lockFile = ./lock.json; + + postInstall = '' + substituteInPlace syndicate_native_messager.json \ + --replace '@path@' $out/bin/syndicate_webextension_native_messager + + install -D -t \ + $out/etc/chromium/native-messaging-hosts \ + syndicate_webextension_native_messager.json + install -D -t \ + $out/lib/mozilla/native-messaging-hosts \ + syndicate_webextension_native_messager.json + ''; } diff --git a/src/syndicate_webextension_native_messager.nim b/src/syndicate_webextension_native_messager.nim new file mode 100644 index 0000000..ea27234 --- /dev/null +++ b/src/syndicate_webextension_native_messager.nim @@ -0,0 +1,67 @@ +# SPDX-FileCopyrightText: ☭ Emery Hemingway +# SPDX-License-Identifier: Unlicense + +## A "native application" for messaging with browser WebExtensions. +## +## https://developer.mozilla.org/en-US/Add-ons/WebExtensions/Native_messaging +## + +import + std/[sequtils, streams, os, oserrors, posix, strutils], + preserves, + pkg/sys/[files, handles, ioqueue], + syndicate, syndicate/relays, + ./schema/json_messages + +proc openAsync(file: syncio.File): AsyncFile = + let + fd = file.getOsFileHandle + flags = fcntl(fd.cint, F_GETFL, 0) + if flags < 0: raiseOSError(osLastError()) + if fcntl(fd.cint, F_SETFL, flags or O_NONBLOCK) < 0: + raiseOSError(osLastError()) + newAsyncFile(FD fd) + +proc inputLoop(app: Cap) {.asyncio.} = + ## Loop over stdin. + let + input = stdin.openAsync + buf = new(ref string) # are we safe yet? + while true: + var n: uint32 + if input.read(cast[ptr UncheckedArray[byte]](n.addr), 4) != 4: break + buf[].setLen(n) + if input.read(buf) != n.int: break + proc recvJson(turn: Turn) = + var pr = initRecord("recv", buf[].parsePreserves) + message(turn, app, pr) + app.relay.run(recvJson) + quit() + +runActor("app") do (turn: Turn): + let + app = turn.newDataspace() + buf = newStringStream() + + onMessage(turn, app, ?:SendJson) do (data: Value): + # Grab records and write them to stdout. + buf.setPosition 0 + buf.writeText(data, textJson) + buf.data.setLen buf.getPosition + var n = buf.data.len.uint32 + discard stdout.writeBuffer(n.addr, 4) + stdout.write buf.data + stdout.flushFile() + + resolveEnvironment(turn) do (turn: Turn; remote: Cap): + # Publish the "app" dataspace in a record built from the command line. + var pr = Value(kind: pkRecord) + pr.record.add app.embed + for f in commandLineParams(): + pr.record.add f.toPreserves + pr.record.add "webextension".toSymbol + publish(turn, remote, pr) + + discard trampoline: + # start a thread of continuations + whelp inputLoop(app) diff --git a/syndicate_native_messager.json b/syndicate_native_messager.json new file mode 100644 index 0000000..a8268cc --- /dev/null +++ b/syndicate_native_messager.json @@ -0,0 +1,9 @@ +{ + "name": "syndicate", + "description": "Native messaging Syndicate proxy", + "path": "@path@", + "type": "stdio", + "allowed_extensions": [ + "syndicate_webextension_native_messager@syndicate-lang.org" + ] +} diff --git a/syndicate_utils.nimble b/syndicate_utils.nimble index bc2bd7e..01fcd35 100644 --- a/syndicate_utils.nimble +++ b/syndicate_utils.nimble @@ -1,12 +1,11 @@ # Package -version = "20240509" +version = "20240510" author = "Emery Hemingway" description = "Utilites for Syndicated Actors and Synit" license = "unlicense" srcDir = "src" -bin = @["http_client", "mintsturdyref", "mount_actor", "msg", "postgre_actor", "preserve_process_environment", "rofi_script_actor", "sqlite_actor", "syndesizer", "syndump", "xslt_actor"] - +bin = @["http_client", "mintsturdyref", "mount_actor", "msg", "postgre_actor", "preserve_process_environment", "rofi_script_actor", "sqlite_actor", "syndesizer", "syndicate_webextension_native_messager", "syndump", "xslt_actor"] # Dependencies diff --git a/syndicate_webextension_native_messager.json b/syndicate_webextension_native_messager.json new file mode 100644 index 0000000..a8268cc --- /dev/null +++ b/syndicate_webextension_native_messager.json @@ -0,0 +1,9 @@ +{ + "name": "syndicate", + "description": "Native messaging Syndicate proxy", + "path": "@path@", + "type": "stdio", + "allowed_extensions": [ + "syndicate_webextension_native_messager@syndicate-lang.org" + ] +}