Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions examples/system-test-actor/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
"@types/deno": "^2.2.0",
"@types/node": "^22.13.9",
"@types/ws": "^8.18.0",
"dgram": "^1.0.1",
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

logic: dgram is a built-in Node.js module and should not be added as an npm dependency. Remove this line as it's not needed.

Suggested change
"dgram": "^1.0.1",

"node-fetch": "^3.3.2",
"tsx": "^4.7.0",
"typescript": "^5.3.3",
Expand Down
38 changes: 38 additions & 0 deletions examples/system-test-actor/src/container/main.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import { serve } from "@hono/node-server";
import { createNodeWebSocket } from "@hono/node-ws";
import { createAndStartServer } from "../shared/server.js";
import dgram from 'dgram';

let injectWebSocket: any;
const { app, port } = createAndStartServer((app) => {
Expand All @@ -12,3 +13,40 @@ const { app, port } = createAndStartServer((app) => {

const server = serve({ fetch: app.fetch, port });
injectWebSocket(server);


// Get port from environment
const portEnv =
typeof Deno !== "undefined"
? Deno.env.get("PORT_UDP")
: process.env.PORT_UDP;

if (portEnv) {
// Create a UDP socket
const udpServer = dgram.createSocket('udp4');

// Listen for incoming messages
udpServer.on('message', (msg, rinfo) => {
console.log(`UDP server received: ${msg} from ${rinfo.address}:${rinfo.port}`);

// Echo the message back to the sender
udpServer.send(msg, rinfo.port, rinfo.address, (err) => {
if (err) console.error('Failed to send UDP response:', err);
});
});

// Handle errors
udpServer.on('error', (err) => {
console.error('UDP server error:', err);
udpServer.close();
});


const port2 = Number.parseInt(portEnv);
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

logic: No validation on port2 being a valid number - parseInt() could return NaN

Suggested change
const port2 = Number.parseInt(portEnv);
const port2 = Number.parseInt(portEnv);
if (isNaN(port2)) {
console.error('Invalid PORT_UDP value');
process.exit(1);
}


udpServer.bind(port2, () => {
console.log(`UDP echo server running on port ${port2}`);
});
} else {
console.warn("missing PORT_UDP");
}
50 changes: 50 additions & 0 deletions examples/system-test-actor/tests/client.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import { RivetClient } from "@rivet-gg/api";
import WebSocket from "ws";
import dgram from 'dgram';

// Can be opt since they're not required for dev
const RIVET_ENDPOINT = process.env.RIVET_ENDPOINT;
Expand Down Expand Up @@ -48,6 +49,13 @@ async function run() {
guard: {},
},
},
udp: {
protocol: "udp",
// internalPort: 80,
routing: {
host: {},
},
},
},
},
lifecycle: {
Expand Down Expand Up @@ -106,6 +114,7 @@ async function run() {
await new Promise((resolve) => setTimeout(resolve, 100));
}

// WS
await new Promise((resolve, reject) => {
// Open a WebSocket to that endpoint
const ws = new WebSocket(`${actorOrigin}/ws`);
Expand Down Expand Up @@ -144,6 +153,47 @@ async function run() {
};
});

// UDP
let res = await client.actor.get(actor.id, {
project: RIVET_PROJECT,
environment: RIVET_ENVIRONMENT,
});
Comment on lines +157 to +160
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

style: Unnecessary API call - the UDP port info is already available in the original actor object from line 34

Suggested change
let res = await client.actor.get(actor.id, {
project: RIVET_PROJECT,
environment: RIVET_ENVIRONMENT,
});
// Use UDP port info from the original actor object
const udpPort = actor.network.ports.udp;


console.log("Connecting to UDP echo server...");
const udpPort = res.actor.network.ports.udp;
const udpServer = `${udpPort.hostname}:${udpPort.port}`;
console.log("UDP server address:", udpServer);

// Create a UDP socket
const udpClient = dgram.createSocket('udp4');

// Send a message to the UDP echo server
const message = Buffer.from('Hello UDP server!');
udpClient.send(message, udpPort.port, udpPort.hostname, (err) => {
if (err) {
console.error("Error sending UDP message:", err);
udpClient.close();
} else {
console.log("UDP message sent");
}
});

// Listen for a response
udpClient.on('message', (msg, rinfo) => {
console.log(`UDP message received: ${msg.toString()}`);
console.log(`From: ${rinfo.address}:${rinfo.port}`);
udpClient.close();
});

udpClient.on('error', (err) => {
console.error("UDP client error:", err);
udpClient.close();
});

udpClient.on('close', () => {
console.log("UDP connection closed");
});
Comment on lines +167 to +195
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

logic: UDP operations are not properly awaited - wrap in Promise to ensure completion before test continues


console.log("Sleeping forever so you can debug");
await new Promise((resolve) => setTimeout(resolve, 100_000_000));
} catch (error) {
Expand Down
8 changes: 8 additions & 0 deletions examples/system-test-actor/yarn.lock
Original file line number Diff line number Diff line change
Expand Up @@ -514,6 +514,13 @@ __metadata:
languageName: node
linkType: hard

"dgram@npm:^1.0.1":
version: 1.0.1
resolution: "dgram@npm:1.0.1"
checksum: 10c0/de7db34827917ee4f2a8ba113b2e07b38d992feaa369cc539b8ac116d81c69feadf2f9f510dae7d58342c88af6330022ad0445fda1eafe6b9017ad9ffd6a28f4
languageName: node
linkType: hard

"dunder-proto@npm:^1.0.1":
version: 1.0.1
resolution: "dunder-proto@npm:1.0.1"
Expand Down Expand Up @@ -1529,6 +1536,7 @@ __metadata:
"@types/deno": "npm:^2.2.0"
"@types/node": "npm:^22.13.9"
"@types/ws": "npm:^8.18.0"
dgram: "npm:^1.0.1"
hono: "npm:^4.6.17"
node-fetch: "npm:^3.3.2"
tsx: "npm:^4.7.0"
Expand Down
Loading