Skip to content

Commit

Permalink
Add support for running using deno (#362)
Browse files Browse the repository at this point in the history
* Add missing CRLF line ending

* Add support for running using deno

Prefix node imports with "node:" and gate a socket API that is not
implemented in [deno](https://deno.land) so that the library can be used
there. This should not break node and doesn't in my brief testing.
  • Loading branch information
Douile authored Oct 10, 2023
1 parent 150fa00 commit 01794f6
Show file tree
Hide file tree
Showing 11 changed files with 32 additions and 14 deletions.
2 changes: 2 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,8 @@
* Operation: Harsh Doorstop (2023) - Added support.
* Insurgency: Modern Infantry Combat (2007) - Added support.
* Capatilzed Unturned in game.txt
* Added Deno support: the library and CLI can now be experimentally used with the [Deno runtime](https://deno.com)
* `deno run --allow-net --allow-read=. bin/gamedig.js --type tf2 127.0.0.1`

### 4.1.0
* Replace `compressjs` dependency by `seek-bzip` to solve some possible import issues.
Expand Down
2 changes: 2 additions & 0 deletions bin/gamedig.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
#!/usr/bin/env node

import * as process from "node:process";

import Minimist from 'minimist'
import GameDig from './../lib/index.js'

Expand Down
2 changes: 1 addition & 1 deletion bin/genreadme.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
#!/usr/bin/env node

import * as fs from 'fs'
import * as fs from 'node:fs'
import GameResolver from '../lib/GameResolver'

const gameResolver = new GameResolver()
Expand Down
4 changes: 2 additions & 2 deletions lib/DnsResolver.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import * as dns from 'dns'
import * as dns from 'node:dns'
import punycode from 'punycode/punycode.js'
import { promisify } from 'util'
import { promisify } from 'node:util'

const dnsLookupAsync = promisify(dns.lookup)
const dnsResolveAsync = promisify(dns.resolve)
Expand Down
6 changes: 3 additions & 3 deletions lib/GameResolver.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import * as path from 'path'
import { fileURLToPath } from 'url'
import * as fs from 'fs'
import * as path from 'node:path'
import { fileURLToPath } from 'node:url'
import * as fs from 'node:fs'

export default class GameResolver {
constructor () {
Expand Down
11 changes: 7 additions & 4 deletions lib/GlobalUdpSocket.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { createSocket } from 'dgram'
import { createSocket } from 'node:dgram'
import { debugDump } from './HexUtil.js'
import { promisify } from 'util'
import { promisify } from 'node:util'
import Logger from './Logger.js'

export default class GlobalUdpSocket {
Expand All @@ -18,7 +18,10 @@ export default class GlobalUdpSocket {
type: 'udp4',
reuseAddr: true
})
udpSocket.unref()
// https://github.com/denoland/deno/issues/20138
if (typeof Deno === "undefined") {
udpSocket.unref();
}
udpSocket.on('message', (buffer, rinfo) => {
const fromAddress = rinfo.address
const fromPort = rinfo.port
Expand Down Expand Up @@ -59,7 +62,7 @@ export default class GlobalUdpSocket {
this.debuggingCallbacks.add(callback)
this.logger.debugEnabled = true
}
}
}

removeCallback (callback) {
this.callbacks.delete(callback)
Expand Down
1 change: 1 addition & 0 deletions lib/Logger.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import { debugDump } from './HexUtil.js'
import { Buffer} from 'node:buffer'

export default class Logger {
constructor () {
Expand Down
11 changes: 10 additions & 1 deletion lib/QueryRunner.js
Original file line number Diff line number Diff line change
Expand Up @@ -69,12 +69,21 @@ export default class QueryRunner {
for (const attempt of attempts) {
for (let retry = 0; retry < numRetries; retry++) {
attemptNum++
let result
try {
return await this._attempt(attempt)
result = await this._attempt(attempt)
} catch (e) {
e.stack = 'Attempt #' + attemptNum + ' - Port=' + attempt.port + ' Retry=' + (retry) + ':\n' + e.stack
errors.push(e)
} finally {
// Deno doesn't support unref, so we must close the socket after every connection
// https://github.com/denoland/deno/issues/20138
if (typeof Deno !== "undefined") {
this.udpSocket?.socket?.close()
delete this.udpSocket
}
}
if (result) return result
}
}

Expand Down
2 changes: 1 addition & 1 deletion lib/reader.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import Iconv from 'iconv-lite'
import Long from 'long'
import { Buffer } from 'buffer'
import { Buffer } from 'node:buffer'
import Varint from 'varint'

function readUInt64BE (buffer, offset) {
Expand Down
4 changes: 2 additions & 2 deletions protocols/core.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { EventEmitter } from 'events'
import * as net from 'net'
import { EventEmitter } from 'node:events'
import * as net from 'node:net'
import Reader from '../lib/reader.js'
import { debugDump } from '../lib/HexUtil.js'
import Logger from '../lib/Logger.js'
Expand Down
1 change: 1 addition & 0 deletions protocols/valve.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import Bzip2 from 'seek-bzip'
import Core from './core.js'
import { Buffer } from 'node:buffer'

const AppId = {
Squad: 393380,
Expand Down

0 comments on commit 01794f6

Please sign in to comment.