Skip to content

Commit

Permalink
added websocket example
Browse files Browse the repository at this point in the history
  • Loading branch information
mallpopstar committed Aug 9, 2023
1 parent 0609556 commit 4b3b953
Show file tree
Hide file tree
Showing 6 changed files with 87 additions and 7 deletions.
2 changes: 1 addition & 1 deletion .github/workflows/deploy-spa.yml
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ jobs:
- name: Upload artifact
uses: actions/upload-pages-artifact@v1
with:
path: './example'
path: './examples'
- name: Deploy to GitHub Pages
id: deployment
uses: actions/deploy-pages@v1
12 changes: 6 additions & 6 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -110,7 +110,7 @@ sender.connect(channel)
const documentSender = createDocumentSender(sender)

documentSender.subscribe('form', 'submit', req => {
console.log('form submitted:', res)
console.log('form submitted:', req)
}, { preventDefault: true })
```

Expand All @@ -137,11 +137,11 @@ npm run dev

## Roadmap

- Better Documentation (right now, use examples in [src/main.ts](src/main.ts))
- Intercept errors and reporting them (Think [LogRocket](https://logrocket.com/))
- Example using WebSocket
- Example using WebRTC
- Example using Custom Channel - Connecting to a server
- [ ] Better Documentation (right now, use examples in [src/main.ts](src/main.ts))
- [ ] Intercept errors and reporting them (Think [LogRocket](https://logrocket.com/))
- [X] Example using WebSocket (see [examples/websocket](examples/websocket))
- [ ] Example using WebRTC
- [ ] Example using Custom Channel

## Alternatives to Remote Control

Expand Down
File renamed without changes.
File renamed without changes.
58 changes: 58 additions & 0 deletions examples/websocket/index.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>WebSocket Example</title>
<script src="https://unpkg.com/@mallpopstar/partyline@latest/dist/partyline.min.js"></script>
<script src="https://unpkg.com/@mallpopstar/rc@latest/dist/rc.min.js"></script>
</head>
<body>
<form>
<input type="text" name="name" />
<input type="submit" value="Submit" />
</form>

<script>
const { createReceiver, createSender } = partyline
const { createDocumentReceiver, createDocumentSender } = remotecontrol
const subscribers = new Map()

const receiver = createReceiver()
receiver.connect(window)
createDocumentReceiver(receiver).start()

const sender = createSender()
sender.connect(window)
const documentSender = createDocumentSender(sender)

// Connect to web socket
const socket = new WebSocket('ws://localhost:8000')

socket.addEventListener('open', () => {
console.log('Connected to server')
})

socket.addEventListener('message', evt => {
const { type, selector, event } = JSON.parse(evt.data)
if (type === 'subscribe') {
const unsub = documentSender.subscribe(
selector,
event,
req => {
socket.send(JSON.stringify(req))
},
{ preventDefault: true }
)
subscribers.set(`${selector}:${event}`, unsub)
} else if (type === 'unsubscribe') {
console.log('Unsubscribing', selector, event)
const unsub = subscribers.get(`${selector}:${event}`)
if(unsub) unsub()
} else {
console.log('Unknown message type', type)
}
})
</script>
</body>
</html>
22 changes: 22 additions & 0 deletions examples/websocket/server.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
// deno run --allow-net server.ts
Deno.serve(req => {
if (req.headers.get('upgrade') !== 'websocket') {
return new Response(null, { status: 501 })
}

const { socket, response } = Deno.upgradeWebSocket(req)
socket.addEventListener('open', () => {
console.log('a client connected!')
socket.send(JSON.stringify({ type: 'subscribe', selector: 'form', event: 'submit' }))
})

socket.addEventListener('message', event => {
const payload = JSON.parse(event.data)
console.log(payload)
if(payload.body.selector === 'form' && payload.body.type === 'submit') {
console.log('unsubscribing from form')
socket.send(JSON.stringify({ type: 'unsubscribe', selector: 'form', event: 'submit' }))
}
})
return response
})

0 comments on commit 4b3b953

Please sign in to comment.