Connect-WebSocket.ps1
+11
-0
diff --git a/Connect-WebSocket.ps1 b/Connect-WebSocket.ps1
new file mode 100644
index 0000000..1b02b85
@@ -0,0 +1,11 @@
[CmdletBinding()]
[OutputType([System.Net.WebSockets.ClientWebSocket])]
param (
[Parameter(Mandatory = $true, Position = 0)]
[uri]
$Uri
)
$WebSocket = [System.Net.WebSockets.ClientWebSocket]::new();
$WebSocket.ConnectAsync($uri, [System.Threading.CancellationToken]::None).GetAwaiter().GetResult() | Out-Null;
return $WebSocket;
Disconnect-WebSocket.ps1
+17
-0
diff --git a/Disconnect-WebSocket.ps1 b/Disconnect-WebSocket.ps1
new file mode 100644
index 0000000..70efe61
@@ -0,0 +1,17 @@
[CmdletBinding()]
param (
[Parameter(Mandatory = $true, Position = 0)]
[System.Net.WebSockets.ClientWebSocket]
$WebSocket
)
if ($WebSocket.State -eq [System.Net.WebSockets.WebSocketState]::Closed) {
return;
}
if ($WebSocket.State -ne [System.Net.WebSockets.WebSocketState]::Open) {
Write-Error "Cannot disconnect when $($WebSocket.State)";
return;
}
$WebSocket.CloseAsync([System.Net.WebSockets.WebSocketCloseStatus]::NormalClosure, "", [System.Threading.CancellationToken]::None).GetAwaiter().GetResult() | Out-Null;
$WebSocket.Dispose();
README.md
+29
-0
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..f99f2b9
@@ -0,0 +1,29 @@
# PowerShell WebSocket commands
These are a collection of CmdLets for interacting with WebSocket servers.
## Usage
Connect to a WebSocket server:
```pwsh
$ws = Connect-WebSocket "wss://example.org/ws"
```
Wait for one message:
```pwsh
Receive-WebSocket $ws -OutVariable message
```
Send one message:
```pwsh
Send-WebSocket $ws "Message"
```
Disconnect from the WebSocket server:
```pwsh
Disconnect-WebSocket $ws
```
Receive-WebSocket.ps1
+50
-0
diff --git a/Receive-WebSocket.ps1 b/Receive-WebSocket.ps1
new file mode 100644
index 0000000..d785e67
@@ -0,0 +1,50 @@
[CmdletBinding()]
[OutputType([string])]
param (
[Parameter(Mandatory = $true, Position = 0)]
[System.Net.WebSockets.ClientWebSocket]
$WebSocket
)
begin {
$cts = [System.Threading.CancellationTokenSource]::new();
if ($WebSocket.State -ne [System.Net.WebSockets.WebSocketState]::Open) {
Write-Error "Can only receive from Open WebSockets, was $($WebSocket.State)";
$abort = $true;
}
}
process {
if ($abort) {
return;
}
$endOfMessage = $false;
[string]$message = "";
$memory = [System.Memory[byte]]::new([byte[]]::new(1024));
while (-not $endOfMessage) {
$task = $WebSocket.ReceiveAsync($memory, $cts.Token);
while ($null -eq $result) {
if ($task.IsCompletedSuccessfully) {
$result = $task.Result
}
elseif ($task.IsFaulted) {
Write-Error "Receiving faulted";
return;
}
elseif ($task.IsCanceled) {
return;
}
}
$part = [System.Text.Encoding]::UTF8.GetString($memory.Slice(0, $result.Count).ToArray());
$message += $part;
$endOfMessage = $result.EndOfMessage;
$result = $null;
}
return $message;
}
clean {
$cts.Cancel();
}
Send-WebSocket.ps1
+16
-0
diff --git a/Send-WebSocket.ps1 b/Send-WebSocket.ps1
new file mode 100644
index 0000000..b34b883
@@ -0,0 +1,16 @@
[CmdletBinding()]
param (
[Parameter(Mandatory = $true, Position = 0)]
[System.Net.WebSockets.ClientWebSocket]
$WebSocket,
[Parameter(Mandatory = $true, Position = 1, ValueFromPipeline = $true)]
[string]
$Body
)
if ($WebSocket.State -ne [System.Net.WebSockets.WebSocketState]::Open) {
Write-Error "Can only send from Open WebSockets, was $($WebSocket.State)";
return;
}
$WebSocket.SendAsync([System.Memory[byte]]::new([System.Text.Encoding]::UTF8.GetBytes($Body)), [System.Net.WebSockets.WebSocketMessageType]::Text, $true, [System.Threading.CancellationToken]::None).GetAwaiter().GetResult();