Skip to content

Static msg types using msgspec#311

Closed
goodboy wants to merge 2 commits intomainfrom
msgtypes
Closed

Static msg types using msgspec#311
goodboy wants to merge 2 commits intomainfrom
msgtypes

Conversation

@goodboy
Copy link
Owner

@goodboy goodboy commented Jul 7, 2022

WIP typed msg layer using msgspec.

Relates to:

Further motivation for the approach being taken is hashed out somewhat in jcrist/msgspec#140

still needs lootttsa work..

goodboy added a commit to pikers/piker that referenced this pull request Jul 7, 2022
Syncs with goodboy/tractor#311
which is nowhere near ready and this approach didn't end up being
as straight forward as hoped. We're going to need a top level
`Msg`-boxing type/protocol in `tractor` first...
@goodboy goodboy mentioned this pull request Jul 8, 2022
3 tasks
goodboy added a commit to pikers/piker that referenced this pull request Jul 8, 2022
Syncs with goodboy/tractor#311
which is nowhere near ready and this approach didn't end up being
as straight forward as hoped. We're going to need a top level
`Msg`-boxing type/protocol in `tractor` first...
@goodboy goodboy force-pushed the signint_saviour branch 4 times, most recently from 8cd8eb5 to 54af0d4 Compare July 15, 2022 19:24
@goodboy goodboy force-pushed the signint_saviour branch 5 times, most recently from d1ddfa4 to 2d387f2 Compare August 2, 2022 16:18
Base automatically changed from signint_saviour to master August 3, 2022 13:26
@goodboy
Copy link
Owner Author

goodboy commented Aug 23, 2022

Needs a rebase onto master.

goodboy added 2 commits May 15, 2023 10:18
The greasy details are strewn throughout a `msgspec` issue:
jcrist/msgspec#140

and specifically this code was mostly written as part of POC example in
this comment:
jcrist/msgspec#140 (comment)

This work obviously pertains to our desire and prep for typed messaging
and capabilities aware msg-oriented-protocols in #196, caps sec nods in

I added a "wants to have" method to `Context` showing how I think we
could offer a pretty neat msg-type-set-as-capability-for-protocol
system.
@goodboy goodboy added enhancement New feature or request discussion experiment Exploratory design and testing IPC and transport messaging messaging patterns and protocols labels May 15, 2023
goodboy added a commit that referenced this pull request Mar 27, 2025
As per the long outstanding GH issue this starts our rigorous journey
into an attempt at a type-safe, cross-actor SC, IPC protocol Bo

boop -> #36

The idea is to "formally" define our SC "shuttle (dialog) protocol" by
specifying a new `.msg.types.Msg` subtype-set which can fully
encapsulate all IPC msg schemas needed in order to accomplish
cross-process SC!

The msg set deviated a little in terms of (type) names from the existing
`dict`-msgs currently used in the runtime impl but, I think the name
changes are much better in terms of explicitly representing the internal
semantics of the actor runtime machinery/subsystems and the
IPC-msg-dialog required for SC enforced RPC.

------ - ------

In cursory, the new formal msgs-spec includes the following msg-subtypes
of a new top-level `Msg` boxing type (that holds the base field schema
for all msgs):

- `Start` to request RPC task scheduling by passing a `FuncSpec` payload
  (to replace the currently used `{'cmd': ... }` dict msg impl)

- `StartAck` to allow the RPC task callee-side to report a `IpcCtxSpec`
  payload immediately back to the caller (currently responded naively via
  a `{'functype': ... }` msg)

- `Started` to deliver the first value from `Context.started()`
  (instead of the existing `{'started': ... }`)

- `Yield` to shuttle `MsgStream.send()`-ed values (instead of
  our `{'yield': ... }`)

- `Stop` to terminate a `Context.open_stream()` session/block
  (over `{'stop': True }`)

- `Return` to deliver the final value from the `Actor.start_remote_task()`
  (which is a `{'return': ... }`)

- `Error` to box `RemoteActorError` exceptions via a `.pld: ErrorData`
  payload, planned to replace/extend the current `RemoteActorError.msgdata`
  mechanism internal to `._exceptions.pack/unpack_error()`

The new `tractor.msg.types` includes all the above msg defs as well an API
for rendering a "payload type specification" using a
`payload_type_spec: Union[Type]` that can be passed to
`msgspec.msgpack.Decoder(type=payload_type_spec)`. This ensures that
(for a subset of the above msg set) `Msg.pld: PayloadT` data is
type-parameterized using `msgspec`'s new `Generic[PayloadT]` field
support and thus enables providing for an API where IPC `Context`
dialogs can strictly define the allowed payload-datatype-set via type
union!

Iow, this is the foundation for supporting `Channel`/`Context`/`MsgStream`
IPC primitives which are type checked/safe as desired in GH issue:
- #365

Misc notes on current impl(s) status:
------ - ------
- add a `.msg.types.mk_msg_spec()` which uses the new `msgspec` support
  for `class MyStruct[Struct, Generic[T]]` parameterize-able fields and
  delivers our boxing SC-msg-(sub)set with the desired `payload_types`
  applied to `.pld`:
  - https://jcristharif.com/msgspec/supported-types.html#generic-types
  - as a note this impl seems to need to use `type.new_class()` dynamic
    subtype generation, though i don't really get *why* still.. but
    without that the `msgspec.msgpack.Decoder` doesn't seem to reject
    `.pld` limited `Msg` subtypes as demonstrated in the new test.

- around this ^ add a `.msg._codec.limit_msg_spec()` cm which exposes
  this payload type limiting API such that it can be applied per task
  via a `MsgCodec` in app code.

- the orig approach in #311 was
  the idea of making payload fields `.pld: Raw` wherein we could have
  per-field/sub-msg decoders dynamically loaded depending on the
  particular application-layer schema in use. I don't want to lose the
  idea of this since I think it might be useful for an idea I have about
  capability-based-fields(-sharing, maybe using field-subset
  encryption?), and as such i've kept the (ostensibly) working impls in
  TODO-comments in `.msg._codec` wherein maybe we can add
  a `MsgCodec._payload_decs: dict` table for this later on.
  |_ also left in the `.msg.types.enc/decmsg()` impls but renamed as
    `enc/dec_payload()` (but reworked to not rely on the lifo codec
    stack tables; now removed) such that we can prolly move them to
    `MsgCodec` methods in the future.

- add an unused `._codec.mk_tagged_union_dec()` helper which was
  originally factored out the #311 proto-code but didn't end up working
  as desired with the new parameterized generic fields approach (now
  in `msg.types.mk_msg_spec()`)

Testing/deps work:
------ - ------
- new `test_limit_msgspec()` which ensures all the `.types` content is
  correct but without using the wrapping APIs in `._codec`; i.e. using
  a in-line `Decoder` instead of a `MsgCodec`.

- pin us to `msgspec>=0.18.5` which has the needed generic-types support
  (which took me way too long yester to figure out when implementing all
  this XD)!
@goodboy
Copy link
Owner Author

goodboy commented Aug 20, 2025

Was replaced (long ago) by https://pikers.dev/goodboy/tractor/pulls/19.

@goodboy goodboy closed this Aug 20, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

discussion enhancement New feature or request experiment Exploratory design and testing IPC and transport messaging messaging patterns and protocols

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant