docs: move Dilation up next to Serialization, as both are speculative
This commit is contained in:
parent
194f0be471
commit
ba36562482
102
docs/api.md
102
docs/api.md
|
@ -443,7 +443,7 @@ method to be called.
|
||||||
|
|
||||||
## Serialization
|
## Serialization
|
||||||
|
|
||||||
(this section is speculative: this code has not yet been written)
|
(NOTE: this section is speculative: this code has not yet been written)
|
||||||
|
|
||||||
Wormhole objects can be serialized. This can be useful for apps which save
|
Wormhole objects can be serialized. This can be useful for apps which save
|
||||||
their own state before shutdown, and restore it when they next start up
|
their own state before shutdown, and restore it when they next start up
|
||||||
|
@ -468,6 +468,56 @@ To ensure correct behavior, serialization should probably only be done in
|
||||||
If you use serialization, be careful to never use the same partial wormhole
|
If you use serialization, be careful to never use the same partial wormhole
|
||||||
object twice.
|
object twice.
|
||||||
|
|
||||||
|
## Dilation
|
||||||
|
|
||||||
|
(NOTE: this section is speculative: this code has not yet been written)
|
||||||
|
|
||||||
|
In the longer term, the Wormhole object will incorporate the "Transit"
|
||||||
|
functionality (see transit.md) directly, removing the need to instantiate a
|
||||||
|
second object. A Wormhole can be "dilated" into a form that is suitable for
|
||||||
|
bulk data transfer.
|
||||||
|
|
||||||
|
All wormholes start out "undilated". In this state, all messages are queued
|
||||||
|
on the Rendezvous Server for the lifetime of the wormhole, and server-imposed
|
||||||
|
number/size/rate limits apply. Calling `w.dilate()` initiates the dilation
|
||||||
|
process, and success is signalled via either `d=w.when_dilated()` firing, or
|
||||||
|
`dg.wormhole_dilated()` being called. Once dilated, the Wormhole can be used
|
||||||
|
as an IConsumer/IProducer, and messages will be sent on a direct connection
|
||||||
|
(if possible) or through the transit relay (if not).
|
||||||
|
|
||||||
|
What's good about a non-dilated wormhole?:
|
||||||
|
|
||||||
|
* setup is faster: no delay while it tries to make a direct connection
|
||||||
|
* survives temporary network outages, since messages are queued
|
||||||
|
* works with "journaled mode", allowing progress to be made even when both
|
||||||
|
sides are never online at the same time, by serializing the wormhole
|
||||||
|
|
||||||
|
What's good about dilated wormholes?:
|
||||||
|
|
||||||
|
* they support bulk data transfer
|
||||||
|
* you get flow control (backpressure), and IProducer/IConsumer
|
||||||
|
* throughput is faster: no store-and-forward step
|
||||||
|
|
||||||
|
Use non-dilated wormholes when your application only needs to exchange a
|
||||||
|
couple of messages, for example to set up public keys or provision access
|
||||||
|
tokens. Use a dilated wormhole to move large files.
|
||||||
|
|
||||||
|
Dilated wormholes can provide multiple "channels": these are multiplexed
|
||||||
|
through the single (encrypted) TCP connection. Each channel is a separate
|
||||||
|
stream (offering IProducer/IConsumer)
|
||||||
|
|
||||||
|
To create a channel, call `c = w.create_channel()` on a dilated wormhole. The
|
||||||
|
"channel ID" can be obtained with `c.get_id()`. This ID will be a short
|
||||||
|
(unicode) string, which can be sent to the other side via a normal
|
||||||
|
`w.send()`, or any other means. On the other side, use `c =
|
||||||
|
w.open_channel(channel_id)` to get a matching channel object.
|
||||||
|
|
||||||
|
Then use `c.send(data)` and `d=c.when_received()` to exchange data, or wire
|
||||||
|
them up with `c.registerProducer()`. Note that channels do not close until
|
||||||
|
the wormhole connection is closed, so they do not have separate `close()`
|
||||||
|
methods or events. Therefore if you plan to send files through them, you'll
|
||||||
|
need to inform the recipient ahead of time about how many bytes to expect.
|
||||||
|
|
||||||
## Bytes, Strings, Unicode, and Python 3
|
## Bytes, Strings, Unicode, and Python 3
|
||||||
|
|
||||||
All cryptographically-sensitive parameters are passed as bytes ("str" in
|
All cryptographically-sensitive parameters are passed as bytes ("str" in
|
||||||
|
@ -503,53 +553,3 @@ key=w.derive_key(purpose, length) | |
|
||||||
w.close() | | dg.wormhole_closed(result)
|
w.close() | | dg.wormhole_closed(result)
|
||||||
. | d=w.close() |
|
. | d=w.close() |
|
||||||
|
|
||||||
|
|
||||||
## Dilation
|
|
||||||
|
|
||||||
(this section is speculative: this code has not yet been written)
|
|
||||||
|
|
||||||
In the longer term, the Wormhole object will incorporate the "Transit"
|
|
||||||
functionality (see transit.md) directly, removing the need to instantiate a
|
|
||||||
second object. A Wormhole can be "dilated" into a form that is suitable for
|
|
||||||
bulk data transfer.
|
|
||||||
|
|
||||||
All wormholes start out "undilated". In this state, all messages are queued
|
|
||||||
on the Rendezvous Server for the lifetime of the wormhole, and server-imposed
|
|
||||||
number/size/rate limits apply. Calling `w.dilate()` initiates the dilation
|
|
||||||
process, and success is signalled via either `d=w.when_dilated()` firing, or
|
|
||||||
`dg.wormhole_dilated()` being called. Once dilated, the Wormhole can be used
|
|
||||||
as an IConsumer/IProducer, and messages will be sent on a direct connection
|
|
||||||
(if possible) or through the transit relay (if not).
|
|
||||||
|
|
||||||
What's good about a non-dilated wormhole?:
|
|
||||||
|
|
||||||
* setup is faster: no delay while it tries to make a direct connection
|
|
||||||
* survives temporary network outages, since messages are queued
|
|
||||||
* works with "journaled mode", allowing progress to be made even when both
|
|
||||||
sides are never online at the same time, by serializing the wormhole
|
|
||||||
|
|
||||||
What's good about dilated wormholes?:
|
|
||||||
|
|
||||||
* they support bulk data transfer
|
|
||||||
* you get flow control (backpressure), and provide IProducer/IConsumer
|
|
||||||
* throughput is faster: no store-and-forward step
|
|
||||||
|
|
||||||
Use non-dilated wormholes when your application only needs to exchange a
|
|
||||||
couple of messages, for example to set up public keys or provision access
|
|
||||||
tokens. Use a dilated wormhole to move large files.
|
|
||||||
|
|
||||||
Dilated wormholes can provide multiple "channels": these are multiplexed
|
|
||||||
through the single (encrypted) TCP connection. Each channel is a separate
|
|
||||||
stream (offering IProducer/IConsumer)
|
|
||||||
|
|
||||||
To create a channel, call `c = w.create_channel()` on a dilated wormhole. The
|
|
||||||
"channel ID" can be obtained with `c.get_id()`. This ID will be a short
|
|
||||||
(unicode) string, which can be sent to the other side via a normal
|
|
||||||
`w.send()`, or any other means. On the other side, use `c =
|
|
||||||
w.open_channel(channel_id)` to get a matching channel object.
|
|
||||||
|
|
||||||
Then use `c.send(data)` and `d=c.when_received()` to exchange data, or wire
|
|
||||||
them up with `c.registerProducer()`. Note that channels do not close until
|
|
||||||
the wormhole connection is closed, so they do not have separate `close()`
|
|
||||||
methods or events. Therefore if you plan to send files through them, you'll
|
|
||||||
need to inform the recipient ahead of time about how many bytes to expect.
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user