-
-
Notifications
You must be signed in to change notification settings - Fork 1.2k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
refactor: tighten up cloudflare detection (#3170)
* refactor: tighten up cloudflare detection The previous approach to detecting whether to use Cloudflare's sockets was to check for missing polyfills. But as we improve the polyfills that Wrangler can provide these checks are no longer valid. Now we just try to use the Cloudflare API first and fallback to Node.js if those are not available. * fixup! refactor: tighten up cloudflare detection
- Loading branch information
1 parent
3e4d545
commit f7e484e
Showing
1 changed file
with
69 additions
and
16 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,28 +1,81 @@ | ||
const { getStream, getSecureStream } = getStreamFuncs() | ||
|
||
module.exports = { | ||
/** | ||
* Get a socket stream compatible with the current runtime environment. | ||
* @returns {Duplex} | ||
*/ | ||
getStream, | ||
/** | ||
* Get a TLS secured socket, compatible with the current environment, | ||
* using the socket and other settings given in `options`. | ||
* @returns {Duplex} | ||
*/ | ||
getSecureStream, | ||
} | ||
|
||
/** | ||
* Get a socket stream compatible with the current runtime environment. | ||
* @returns {Duplex} | ||
* The stream functions that work in Node.js | ||
*/ | ||
module.exports.getStream = function getStream(ssl) { | ||
const net = require('net') | ||
if (typeof net.Socket === 'function') { | ||
function getNodejsStreamFuncs() { | ||
function getStream(ssl) { | ||
const net = require('net') | ||
return new net.Socket() | ||
} else { | ||
const { CloudflareSocket } = require('pg-cloudflare') | ||
return new CloudflareSocket(ssl) | ||
} | ||
|
||
function getSecureStream(options) { | ||
var tls = require('tls') | ||
return tls.connect(options) | ||
} | ||
return { | ||
getStream, | ||
getSecureStream, | ||
} | ||
} | ||
|
||
/** | ||
* Get a TLS secured socket, compatible with the current environment, | ||
* using the socket and other settings given in `options`. | ||
* @returns {Duplex} | ||
* The stream functions that work in Cloudflare Workers | ||
*/ | ||
module.exports.getSecureStream = function getSecureStream(options) { | ||
var tls = require('tls') | ||
if (tls.connect) { | ||
return tls.connect(options) | ||
} else { | ||
function getCloudflareStreamFuncs() { | ||
function getStream(ssl) { | ||
const { CloudflareSocket } = require('pg-cloudflare') | ||
return new CloudflareSocket(ssl) | ||
} | ||
|
||
function getSecureStream(options) { | ||
options.socket.startTls(options) | ||
return options.socket | ||
} | ||
return { | ||
getStream, | ||
getSecureStream, | ||
} | ||
} | ||
|
||
/** | ||
* Are we running in a Cloudflare Worker? | ||
* | ||
* @returns true if the code is currently running inside a Cloudflare Worker. | ||
*/ | ||
function isCloudflareRuntime() { | ||
// Since 2022-03-21 the `global_navigator` compatibility flag is on for Cloudflare Workers | ||
// which means that `navigator.userAgent` will be defined. | ||
if (typeof navigator === 'object' && navigator !== null && typeof navigator.userAgent === 'string') { | ||
return navigator.userAgent === 'Cloudflare-Workers' | ||
} | ||
// In case `navigator` or `navigator.userAgent` is not defined then try a more sneaky approach | ||
if (typeof Response === 'function') { | ||
const resp = new Response(null, { cf: { thing: true } }) | ||
if (typeof resp.cf === 'object' && resp.cf !== null && resp.cf.thing) { | ||
return true | ||
} | ||
} | ||
return false | ||
} | ||
|
||
function getStreamFuncs() { | ||
if (isCloudflareRuntime()) { | ||
return getCloudflareStreamFuncs() | ||
} | ||
return getNodejsStreamFuncs() | ||
} |