Add syndicate_webextension_native_messager

This commit is contained in:
Emery Hemingway 2024-05-10 14:19:35 +02:00
parent 3a0bd1cd02
commit fb78a3d3d2
6 changed files with 101 additions and 3 deletions

View File

@ -425,6 +425,8 @@ Example
$ FS=':' syndump '<Observe ? _>' | 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.

View File

@ -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
'';
}

View File

@ -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 <send …> 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)

View File

@ -0,0 +1,9 @@
{
"name": "syndicate",
"description": "Native messaging Syndicate proxy",
"path": "@path@",
"type": "stdio",
"allowed_extensions": [
"syndicate_webextension_native_messager@syndicate-lang.org"
]
}

View File

@ -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

View File

@ -0,0 +1,9 @@
{
"name": "syndicate",
"description": "Native messaging Syndicate proxy",
"path": "@path@",
"type": "stdio",
"allowed_extensions": [
"syndicate_webextension_native_messager@syndicate-lang.org"
]
}