180 lines
5.7 KiB
Plaintext
180 lines
5.7 KiB
Plaintext
|
package wasi:sockets@0.2.0;
|
||
|
|
||
|
interface network {
|
||
|
resource network;
|
||
|
|
||
|
enum error-code {
|
||
|
unknown,
|
||
|
access-denied,
|
||
|
not-supported,
|
||
|
invalid-argument,
|
||
|
out-of-memory,
|
||
|
timeout,
|
||
|
concurrency-conflict,
|
||
|
not-in-progress,
|
||
|
would-block,
|
||
|
invalid-state,
|
||
|
new-socket-limit,
|
||
|
address-not-bindable,
|
||
|
address-in-use,
|
||
|
remote-unreachable,
|
||
|
connection-refused,
|
||
|
connection-reset,
|
||
|
connection-aborted,
|
||
|
datagram-too-large,
|
||
|
name-unresolvable,
|
||
|
temporary-resolver-failure,
|
||
|
permanent-resolver-failure,
|
||
|
}
|
||
|
|
||
|
enum ip-address-family {
|
||
|
ipv4,
|
||
|
ipv6,
|
||
|
}
|
||
|
|
||
|
type ipv4-address = tuple<u8, u8, u8, u8>;
|
||
|
|
||
|
type ipv6-address = tuple<u16, u16, u16, u16, u16, u16, u16, u16>;
|
||
|
|
||
|
variant ip-address {
|
||
|
ipv4(ipv4-address),
|
||
|
ipv6(ipv6-address),
|
||
|
}
|
||
|
|
||
|
record ipv4-socket-address {
|
||
|
port: u16,
|
||
|
address: ipv4-address,
|
||
|
}
|
||
|
|
||
|
record ipv6-socket-address {
|
||
|
port: u16,
|
||
|
flow-info: u32,
|
||
|
address: ipv6-address,
|
||
|
scope-id: u32,
|
||
|
}
|
||
|
|
||
|
variant ip-socket-address {
|
||
|
ipv4(ipv4-socket-address),
|
||
|
ipv6(ipv6-socket-address),
|
||
|
}
|
||
|
}
|
||
|
|
||
|
interface instance-network {
|
||
|
use network.{network};
|
||
|
|
||
|
instance-network: func() -> network;
|
||
|
}
|
||
|
|
||
|
interface udp {
|
||
|
use wasi:io/poll@0.2.0.{pollable};
|
||
|
use network.{network, error-code, ip-socket-address, ip-address-family};
|
||
|
|
||
|
record incoming-datagram {
|
||
|
data: list<u8>,
|
||
|
remote-address: ip-socket-address,
|
||
|
}
|
||
|
|
||
|
record outgoing-datagram {
|
||
|
data: list<u8>,
|
||
|
remote-address: option<ip-socket-address>,
|
||
|
}
|
||
|
|
||
|
resource udp-socket {
|
||
|
start-bind: func(network: borrow<network>, local-address: ip-socket-address) -> result<_, error-code>;
|
||
|
finish-bind: func() -> result<_, error-code>;
|
||
|
%stream: func(remote-address: option<ip-socket-address>) -> result<tuple<incoming-datagram-stream, outgoing-datagram-stream>, error-code>;
|
||
|
local-address: func() -> result<ip-socket-address, error-code>;
|
||
|
remote-address: func() -> result<ip-socket-address, error-code>;
|
||
|
address-family: func() -> ip-address-family;
|
||
|
unicast-hop-limit: func() -> result<u8, error-code>;
|
||
|
set-unicast-hop-limit: func(value: u8) -> result<_, error-code>;
|
||
|
receive-buffer-size: func() -> result<u64, error-code>;
|
||
|
set-receive-buffer-size: func(value: u64) -> result<_, error-code>;
|
||
|
send-buffer-size: func() -> result<u64, error-code>;
|
||
|
set-send-buffer-size: func(value: u64) -> result<_, error-code>;
|
||
|
subscribe: func() -> pollable;
|
||
|
}
|
||
|
|
||
|
resource incoming-datagram-stream {
|
||
|
receive: func(max-results: u64) -> result<list<incoming-datagram>, error-code>;
|
||
|
subscribe: func() -> pollable;
|
||
|
}
|
||
|
|
||
|
resource outgoing-datagram-stream {
|
||
|
check-send: func() -> result<u64, error-code>;
|
||
|
send: func(datagrams: list<outgoing-datagram>) -> result<u64, error-code>;
|
||
|
subscribe: func() -> pollable;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
interface udp-create-socket {
|
||
|
use network.{network, error-code, ip-address-family};
|
||
|
use udp.{udp-socket};
|
||
|
|
||
|
create-udp-socket: func(address-family: ip-address-family) -> result<udp-socket, error-code>;
|
||
|
}
|
||
|
|
||
|
interface tcp {
|
||
|
use wasi:io/streams@0.2.0.{input-stream, output-stream};
|
||
|
use wasi:io/poll@0.2.0.{pollable};
|
||
|
use wasi:clocks/monotonic-clock@0.2.0.{duration};
|
||
|
use network.{network, error-code, ip-socket-address, ip-address-family};
|
||
|
|
||
|
enum shutdown-type {
|
||
|
receive,
|
||
|
send,
|
||
|
both,
|
||
|
}
|
||
|
|
||
|
resource tcp-socket {
|
||
|
start-bind: func(network: borrow<network>, local-address: ip-socket-address) -> result<_, error-code>;
|
||
|
finish-bind: func() -> result<_, error-code>;
|
||
|
start-connect: func(network: borrow<network>, remote-address: ip-socket-address) -> result<_, error-code>;
|
||
|
finish-connect: func() -> result<tuple<input-stream, output-stream>, error-code>;
|
||
|
start-listen: func() -> result<_, error-code>;
|
||
|
finish-listen: func() -> result<_, error-code>;
|
||
|
accept: func() -> result<tuple<tcp-socket, input-stream, output-stream>, error-code>;
|
||
|
local-address: func() -> result<ip-socket-address, error-code>;
|
||
|
remote-address: func() -> result<ip-socket-address, error-code>;
|
||
|
is-listening: func() -> bool;
|
||
|
address-family: func() -> ip-address-family;
|
||
|
set-listen-backlog-size: func(value: u64) -> result<_, error-code>;
|
||
|
keep-alive-enabled: func() -> result<bool, error-code>;
|
||
|
set-keep-alive-enabled: func(value: bool) -> result<_, error-code>;
|
||
|
keep-alive-idle-time: func() -> result<duration, error-code>;
|
||
|
set-keep-alive-idle-time: func(value: duration) -> result<_, error-code>;
|
||
|
keep-alive-interval: func() -> result<duration, error-code>;
|
||
|
set-keep-alive-interval: func(value: duration) -> result<_, error-code>;
|
||
|
keep-alive-count: func() -> result<u32, error-code>;
|
||
|
set-keep-alive-count: func(value: u32) -> result<_, error-code>;
|
||
|
hop-limit: func() -> result<u8, error-code>;
|
||
|
set-hop-limit: func(value: u8) -> result<_, error-code>;
|
||
|
receive-buffer-size: func() -> result<u64, error-code>;
|
||
|
set-receive-buffer-size: func(value: u64) -> result<_, error-code>;
|
||
|
send-buffer-size: func() -> result<u64, error-code>;
|
||
|
set-send-buffer-size: func(value: u64) -> result<_, error-code>;
|
||
|
subscribe: func() -> pollable;
|
||
|
shutdown: func(shutdown-type: shutdown-type) -> result<_, error-code>;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
interface tcp-create-socket {
|
||
|
use network.{network, error-code, ip-address-family};
|
||
|
use tcp.{tcp-socket};
|
||
|
|
||
|
create-tcp-socket: func(address-family: ip-address-family) -> result<tcp-socket, error-code>;
|
||
|
}
|
||
|
|
||
|
interface ip-name-lookup {
|
||
|
use wasi:io/poll@0.2.0.{pollable};
|
||
|
use network.{network, error-code, ip-address};
|
||
|
|
||
|
resource resolve-address-stream {
|
||
|
resolve-next-address: func() -> result<option<ip-address>, error-code>;
|
||
|
subscribe: func() -> pollable;
|
||
|
}
|
||
|
|
||
|
resolve-addresses: func(network: borrow<network>, name: string) -> result<resolve-address-stream, error-code>;
|
||
|
}
|
||
|
|