arc-server
API
The arc-server
api is split into 3 submodules:
arc-server
import { withFlags, setFlags, getFlags } from "arc-server";
setFlags(flags): void
: sets arc flags for the current synchronous execution and then persists the flags through any following asynchronous calls.withFlags<T>(flags, fn: () => T): T
: sets arc flags for the synchronous execution of the provided fn
and then persists the flags through asynchronous calls made within the provided fn
. Returns the result of calling fn
.getFlags(): Record<string, boolean> | undefined
: gets the currently set flags or undefined.
Example
setFlags
import { setFlags, getFlags } from "arc-server";
function start(flags, delay) {
setFlags(flags);
wait(delay);
}
function wait(delay) {
setTimeout(logFlags, delay);
}
function logFlags() {
console.log(getFlags());
}
start({ foo: true }, 100);
start({ baz: true }, 10);
start({ baz: true }, 50);
withFlags
import { withFlags, getFlags } from "arc-server";
function start(flags, delay) {
withFlags(flags, () => {
wait(delay);
});
}
function wait(delay) {
setTimeout(logFlags, delay);
}
function logFlags() {
console.log(getFlags());
}
start({ foo: true }, 100);
start({ baz: true }, 10);
start({ baz: true }, 50);
Example usage in example-arc-server/index.js
arc-server/install
import "arc-server/install";
If you are not bundling your server files with another arc
plugin, you should import
/require
this module near the beginning of your application entry point before loading any modules that need to be adaptable.
arc-server/proxy
import createAdaptiveProxy from "arc-server/proxy";
An AdaptiveProxy
is returned from an import
/require
call. It can be treated as if it were the underlying module (with a few caveats. You probably won't need to use this module directly.
createAdaptiveProxy(matches)
matches
: a MatchSet
where each value is the loaded module
Proxy caveats
Primitive values
Applies if you require an adaptive file that sets exports
to a primitive value:
module.exports = "Hello World";
Proxy and Reflect are used to provide adaptive values, but these do not support primitive values (string
, number
, boolean
).
To work around this, these primitives are converted into instances of String
, Number
, or Boolean
. In many cases, you will be able to treat this as if it were the original value, but there are differences.
One notable example is truthiness:
!!new Boolean(false) === true;
!!new String("") === true;
!!new Number(0) === true;
Another is typeof
:
typeof new Boolean(true) === "object";
typeof new String("hello") === "object";
typeof new Number(10) === "object";
If you need a true primitive, you can convert an adaptive primitive to its resolved primitive value using valueOf
:
let string = adaptiveString.valueOf();
Autobound native functions
Native functions, eg from Object.prototype
, or String.prototype
are bound to the adapted object:
let valueOf = adaptiveValue.valueOf;
valueOf();
valueOf.bind(newThis);