Compare commits

...

2 Commits

Author SHA1 Message Date
Emery Hemingway 54aefcb22e Put TDLib messages in a dedicated local dataspace
Communicating with TDLib on a remote dataspace is wasteful.
Create and assert a local dataspace so that only messages observed
by remote actors are relayed. This also allows the TDLib interface
to be isolated from high-level actors.
2024-05-22 05:59:13 +02:00
Emery Hemingway be910a5ffa Update pin of syndicate-nim 2024-05-22 05:58:46 +02:00
6 changed files with 55 additions and 46 deletions

View File

@ -26,13 +26,19 @@ let ?ds = dataspace
]
$ds [
?? <recv {"@type": "error", "code": ?code, "message": ?message}> [
$log ! <log "-" { error: {code: $code, message: $message } }>
? ?v [
$log ! <log "-" { |+++|: $v }>
?- $log ! <log "-" { |---|: $v }>
]
?? <send ?v> [ $log ! <log "-" { |>>>|: $v }> ]
?? <recv ?v> [ $log ! <log "-" { |<<<|: $v }> ]
? ?v [ $log ! <log "-" { assertion: $v }> ]
? <telegram-ready> [
# Raw TDLib interaction.
? <tdlib ?messages> $messages [
?? <send ?v> [ $log ! <log "-" { |>>>|: $v }> ]
?? <recv ?v> [ $log ! <log "-" { |<<<|: $v }> ]
?? <recv {"@type": "error", "code": ?code, "message": ?message}> [
$log ! <log "-" { error: {code: $code, message: $message } }>
]
! <send {"@type": "getOption", "name":"version"}>
?? <recv {"@type": "updateAuthorizationState", "authorization_state": {"@type": "authorizationStateWaitTdlibParameters"}}> [
@ -100,9 +106,7 @@ $ds [
}
}
}> [
$ds ? <user $user_id ?first_name> [
$log ! <log "-" { chat_id: $chat_id, first_name: $first_name, updateChatLastMessage: $text, date: $date, user_id: $user_id }>
]
$log ! <log "-" { updateChatLastMessage: { chat_id: $chat_id, date: $date, text: $text, user_id: $user_id } }>
]
]

View File

@ -1,8 +1,14 @@
version 1 .
# Assert to the actor to register a dataspace for interaction.
TelegramArguments = <telegram-client {
dataspace: #:any
}>.
# Assertion made when the client is ready to process messages.
# Assertion made to when the client is ready to process messages.
TelegramReady = <telegram-ready> .
# Asserted to telegram-client to expose TDLib messages.
# Messages received from and sent to TDLib are in the
# form of <recv {…}> and <sent {…}> respectively.
TDLibClient = <tdlib @messages #:any>.

View File

@ -1,5 +1,22 @@
{
"depends": [
{
"date": "2024-05-22T05:31:33+02:00",
"deepClone": false,
"fetchLFS": false,
"fetchSubmodules": true,
"hash": "sha256-OJW1ZSOgT3lxtgwnKumay9xbH9LlObgiU+sVdP3Wl8o=",
"leaveDotGit": false,
"method": "git",
"packages": [
"syndicate"
],
"path": "/nix/store/dkaj279b40qgmyb9l78jj620czchmi1v-syndicate-nim",
"rev": "54b711b28a48e6c6d1aeeb3c3fc7085d4d9debf8",
"sha256": "1jlpsvyp85gbacibhfg5s8gmpp6bkbljl9qcnrqpjkx04djvb59q",
"srcDir": "src",
"url": "https://git.syndicate-lang.org/ehmry/syndicate-nim.git"
},
{
"method": "fetchzip",
"packages": [
@ -33,27 +50,16 @@
"srcDir": "src",
"url": "https://git.sr.ht/~ehmry/getdns-nim/archive/c73cbe288d9f9480586b8fa87f6d794ffb6a6ce6.tar.gz"
},
{
"method": "fetchzip",
"packages": [
"hashlib"
],
"path": "/nix/store/fav82xdbicvlk34nmcbl89zx99lr3mbs-source",
"rev": "f9455d4be988e14e3dc7933eb7cc7d7c4820b7ac",
"sha256": "1sx6j952lj98629qfgr7ds5aipyw9d6lldcnnqs205wpj4pkcjb3",
"srcDir": "",
"url": "https://github.com/ehmry/hashlib/archive/f9455d4be988e14e3dc7933eb7cc7d7c4820b7ac.tar.gz"
},
{
"method": "fetchzip",
"packages": [
"nimcrypto"
],
"path": "/nix/store/m1qrs3hwcl5a3bkd8f7nbx5p5syid1dh-source",
"rev": "50e8a9b41d221b4eb9981358f65a9ea1a904b471",
"sha256": "0w3pwrg4mjpnzsm16jqg0862v3rgb3pdaxzjrrhwz1rbl04gxa6i",
"path": "/nix/store/fkrcpp8lzj2yi21na79xm63xk0ggnqsp-source",
"rev": "485f7b3cfa83c1beecc0e31be0e964d697aa74d7",
"sha256": "1h3dzdbc9kacwpi10mj73yjglvn7kbizj1x8qc9099ax091cj5xn",
"srcDir": "",
"url": "https://github.com/cheatfate/nimcrypto/archive/50e8a9b41d221b4eb9981358f65a9ea1a904b471.tar.gz"
"url": "https://github.com/cheatfate/nimcrypto/archive/485f7b3cfa83c1beecc0e31be0e964d697aa74d7.tar.gz"
},
{
"method": "fetchzip",
@ -88,17 +94,6 @@
"srcDir": "",
"url": "https://github.com/status-im/nim-stew/archive/3c91b8694e15137a81ec7db37c6c58194ec94a6a.tar.gz"
},
{
"method": "fetchzip",
"packages": [
"syndicate"
],
"path": "/nix/store/dw30cq9gxz3353zgaq4a36ajq6chvbwc-source",
"rev": "3a4dc1f13392830b587138199643d30fdbec8541",
"sha256": "1mbd17rjm1fsx7d0ckzyjih2nzdjqs52ck9wscqcg9nvf3ib5mvh",
"srcDir": "src",
"url": "https://git.syndicate-lang.org/ehmry/syndicate-nim/archive/3a4dc1f13392830b587138199643d30fdbec8541.tar.gz"
},
{
"method": "fetchzip",
"packages": [

View File

@ -25,21 +25,22 @@ let actor = bootActor("main") do (turn: Turn):
state.initialRef = ds
during(turn, ds, TelegramArguments.grabTypeFlat) do (ds: Cap):
# Extern actors assert themselves here and a ClientId
# is used to isolate their conversations with tdlib.
let client = td_create_client_id()
state.subscribers[client.int] = ds
let
client = td_create_client_id()
tdlib = turn.newDataspace()
state.subscribers[client.int] = tdlib
onMessage(turn, ds, grabRecord("send", grab())) do (v: Value):
onMessage(turn, tdlib, grabRecord("send", grab())) do (v: Value):
state.buffer.setPosition 0
state.buffer.writeText(v, textJson)
state.buffer.data.setLen state.buffer.getPosition
td_send(client, state.buffer.data)
# TODO: enforce that the subscriber has not set "@client_id"?
publish(turn, ds, TelegramReady())
# Assert to the subscriber that the messages
# it sends will be processed.
publish(turn, ds, TDLibClient(messages: tdlib.embed))
do:
state.subscribers.del client.int

View File

@ -3,6 +3,9 @@ import
preserves
type
TDLibClient* {.preservesRecord: "tdlib".} = object
`messages`* {.preservesEmbedded.}: Value
TelegramReady* {.preservesRecord: "telegram-ready".} = object
TelegramArgumentsField0* {.preservesDictionary.} = object
@ -11,8 +14,8 @@ type
TelegramArguments* {.preservesRecord: "telegram-client".} = object
`field0`*: TelegramArgumentsField0
proc `$`*(x: TelegramReady | TelegramArguments): string =
proc `$`*(x: TDLibClient | TelegramReady | TelegramArguments): string =
`$`(toPreserves(x))
proc encode*(x: TelegramReady | TelegramArguments): seq[byte] =
proc encode*(x: TDLibClient | TelegramReady | TelegramArguments): seq[byte] =
encode(toPreserves(x))

View File

@ -1,8 +1,8 @@
version = "20240521"
version = "20240522"
author = "Emery Hemingway"
description = "Telegram client as a Syndicated Actor"
license = "Unlicense"
srcDir = "src"
bin = @["telegram_actor"]
requires "syndicate"
requires "https://git.syndicate-lang.org/ehmry/syndicate-nim.git >= 20240522"