fix non local host networking
Some checks failed
Build and Deploy / build-windows (CLANG64) (push) Has been cancelled
Build and Deploy / package-dist (push) Has been cancelled
Build and Deploy / deploy-itch (push) Has been cancelled
Build and Deploy / deploy-gitea (push) Has been cancelled
Build and Deploy / build-macos (push) Has been cancelled
Build and Deploy / build-linux (push) Has been cancelled

This commit is contained in:
2025-05-21 12:34:46 -05:00
parent 3cbb95831c
commit 449e25e0f3
2 changed files with 43 additions and 5 deletions

View File

@@ -288,6 +288,7 @@ function startServer() {
$_.portal(e => { $_.portal(e => {
console.log("Portal received contact message"); console.log("Portal received contact message");
// Reply with this actor to establish connection // Reply with this actor to establish connection
console.log (json.encode($_))
$_.send(e, $_); $_.send(e, $_);
console.log("Portal replied with server actor"); console.log("Portal replied with server actor");
}, 5678); }, 5678);

View File

@@ -630,15 +630,20 @@ function print_actor() {
function create_actor(data = {}) { function create_actor(data = {}) {
var newactor = Object.create($actor) var newactor = Object.create($actor)
// Store actual address/port values on the data object
data._address = data._address || local_address
data._port = data._port || local_port
Object.defineProperty(data, 'address', { Object.defineProperty(data, 'address', {
get: function() { return local_address }, get: function() { return this._address || local_address },
set: function(x) {}, set: function(x) { this._address = x },
enumerable: true enumerable: true
}) })
Object.defineProperty(data, 'port', { Object.defineProperty(data, 'port', {
get: function() { return local_port }, get: function() { return this._port || local_port },
set: function(x) {}, set: function(x) { this._port = x },
enumerable: true enumerable: true
}) })
@@ -745,9 +750,14 @@ function handle_host(e) {
break break
case "receive": case "receive":
var data = nota.decode(e.data) var data = nota.decode(e.data)
if (data.replycc && !data.replycc.address) { if (data.replycc && !data.replycc.__ACTORDATA__.address) {
data.replycc.__ACTORDATA__.address = e.peer.address data.replycc.__ACTORDATA__.address = e.peer.address
data.replycc.__ACTORDATA__.port = e.peer.port data.replycc.__ACTORDATA__.port = e.peer.port
// Store in global lookup for future routing
id_address[data.replycc.__ACTORDATA__.id] = {
address: e.peer.address,
port: e.peer.port
}
} }
// Also populate address/port for any actor objects in the message data // Also populate address/port for any actor objects in the message data
function populate_actor_addresses(obj) { function populate_actor_addresses(obj) {
@@ -755,6 +765,11 @@ function handle_host(e) {
if (obj.__ACTORDATA__ && !obj.__ACTORDATA__.address) { if (obj.__ACTORDATA__ && !obj.__ACTORDATA__.address) {
obj.__ACTORDATA__.address = e.peer.address obj.__ACTORDATA__.address = e.peer.address
obj.__ACTORDATA__.port = e.peer.port obj.__ACTORDATA__.port = e.peer.port
// Store in global lookup for future routing
id_address[obj.__ACTORDATA__.id] = {
address: e.peer.address,
port: e.peer.port
}
} }
for (var key in obj) { for (var key in obj) {
if (obj.hasOwnProperty(key)) { if (obj.hasOwnProperty(key)) {
@@ -848,6 +863,12 @@ function actor_send(actor, message) {
os.mailbox_push(actor.__ACTORDATA__.id, message) os.mailbox_push(actor.__ACTORDATA__.id, message)
return return
} }
// Use fallback address lookup if actor doesn't have address info
if (!actor.__ACTORDATA__.address && id_address[actor.__ACTORDATA__.id]) {
Object.assign(actor.__ACTORDATA__, id_address[actor.__ACTORDATA__.id])
}
if (actor.__ACTORDATA__.address) { if (actor.__ACTORDATA__.address) {
if (actor.__ACTORDATA__.id) message.target = actor.__ACTORDATA__.id if (actor.__ACTORDATA__.id) message.target = actor.__ACTORDATA__.id
else message.type = "contact" else message.type = "contact"
@@ -1018,6 +1039,9 @@ function handle_message(msg) {
var greeter = greeters[msg.id] var greeter = greeters[msg.id]
if (greeter) greeter({type: "actor_started", actor: create_actor(msg)}) if (greeter) greeter({type: "actor_started", actor: create_actor(msg)})
break; break;
case "ping":
// Keep-alive ping, no action needed
break;
default: default:
if (receive_fn) receive_fn(msg) if (receive_fn) receive_fn(msg)
break; break;
@@ -1028,6 +1052,19 @@ function enet_check()
{ {
if (portal) portal.service(handle_host) if (portal) portal.service(handle_host)
if (contactor) contactor.service(handle_host) if (contactor) contactor.service(handle_host)
send_messages();
// Send keep-alive ping to all active peers to prevent timeout
for (var peerKey in peers) {
var peer = peers[peerKey]
if (peer && peer.state === 1) { // ENET_PEER_STATE_CONNECTED
try {
peer.send(nota.encode({type: 'ping'}))
} catch (e) {
console.debug(`Failed to send ping to ${peerKey}:`, e)
}
}
}
$_.delay(enet_check, service_delay); $_.delay(enet_check, service_delay);
} }