socket-function 1.2.2 → 1.2.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/SocketFunction.d.ts +1 -1
- package/SocketFunctionTypes.d.ts +1 -1
- package/hot/HotReloadController.d.ts +3 -3
- package/index.d.ts +25 -10
- package/package.json +1 -1
- package/require/CSSShim.d.ts +1 -1
- package/require/RequireController.d.ts +2 -2
- package/require/compileFlags.d.ts +1 -1
- package/require/require.d.ts +1 -1
- package/src/callManager.d.ts +1 -1
- package/src/webSocketServer.ts +44 -35
- package/test.ts +5 -11
- package/time/trueTimeShim.d.ts +16 -1
- package/time/trueTimeShim.ts +43 -7
- package/dist/SetProcessVariables.ts.cache +0 -9
- package/dist/SocketFunction.ts.cache +0 -467
- package/hot/dist/HotReloadController.ts.cache +0 -252
- package/require/dist/RequireController.ts.cache +0 -386
- package/require/dist/compileFlags.ts.cache +0 -41
- package/require/dist/extMapper.ts.cache +0 -368
- package/require/dist/require.ts.cache +0 -676
- package/src/JSONLACKS/dist/JSONLACKS.ts.cache +0 -469
- package/src/dist/CallFactory.ts.cache +0 -930
- package/src/dist/Zip.ts.cache +0 -156
- package/src/dist/batching.ts.cache +0 -377
- package/src/dist/bits.ts.cache +0 -121
- package/src/dist/buffers.ts.cache +0 -76
- package/src/dist/caching.ts.cache +0 -302
- package/src/dist/callHTTPHandler.ts.cache +0 -264
- package/src/dist/callManager.ts.cache +0 -159
- package/src/dist/certStore.ts.cache +0 -59
- package/src/dist/createSingleton.ts.cache +0 -62
- package/src/dist/fixLargeNetworkCalls.ts.cache +0 -17
- package/src/dist/forwardPort.ts.cache +0 -222
- package/src/dist/https.ts.cache +0 -141
- package/src/dist/misc.ts.cache +0 -499
- package/src/dist/nodeCache.ts.cache +0 -136
- package/src/dist/nodeProxy.ts.cache +0 -57
- package/src/dist/protocolNegotiation.ts.cache +0 -101
- package/src/dist/tlsParsing.ts.cache +0 -85
- package/src/dist/types.ts.cache +0 -9
- package/src/dist/webSocketServer.ts.cache +0 -365
- package/src/dist/websocketFactory.ts.cache +0 -53
- package/src/formatting/dist/colors.ts.cache +0 -98
- package/src/formatting/dist/format.ts.cache +0 -396
- package/src/formatting/dist/logColors.ts.cache +0 -28
- package/src/lz4/dist/LZ4.ts.cache +0 -53
- package/src/profiling/dist/getOwnTime.ts.cache +0 -100
- package/src/profiling/dist/measure.ts.cache +0 -338
- package/src/profiling/dist/stats.ts.cache +0 -202
- package/src/profiling/dist/statsFormat.ts.cache +0 -45
- package/time/dist/trueTimeShim.ts.cache +0 -707
package/SocketFunction.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
+
/// <reference path="require/RequireController.d.ts" />
|
|
1
2
|
/// <reference types="node" />
|
|
2
3
|
/// <reference types="node" />
|
|
3
|
-
/// <reference types="socket-function/require/requirecontroller" />
|
|
4
4
|
import { SocketExposedInterface, SocketFunctionHook, SocketFunctionClientHook, SocketExposedShape, SocketRegistered, CallerContext, FullCallType, SocketRegisterType } from "./SocketFunctionTypes";
|
|
5
5
|
import { SocketServerConfig } from "./src/webSocketServer";
|
|
6
6
|
import { Args, MaybePromise } from "./src/types";
|
package/SocketFunctionTypes.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
/// <reference
|
|
2
|
-
/// <reference
|
|
1
|
+
/// <reference path="../../typenode/index.d.ts" />
|
|
2
|
+
/// <reference path="../require/RequireController.d.ts" />
|
|
3
3
|
/** Enables some hot reload functionality.
|
|
4
4
|
* - Triggers a refresh clientside
|
|
5
5
|
* - Triggers a reload server, for modules marked with `module.hotreload`
|
|
@@ -28,7 +28,7 @@ export declare function isHotReloading(): boolean;
|
|
|
28
28
|
export declare function hotReloadingGuard(): true;
|
|
29
29
|
export declare function setExternalHotReloading(value: boolean): void;
|
|
30
30
|
export declare function onHotReload(callback: (modules: NodeJS.Module[]) => void): void;
|
|
31
|
-
export declare const HotReloadController: import("
|
|
31
|
+
export declare const HotReloadController: import("../SocketFunctionTypes").SocketRegistered<{
|
|
32
32
|
watchFiles: () => Promise<void>;
|
|
33
33
|
fileUpdated: (files: string[], changeTime: number) => Promise<void>;
|
|
34
34
|
}>;
|
package/index.d.ts
CHANGED
|
@@ -7,9 +7,9 @@ declare module "socket-function/SetProcessVariables" {
|
|
|
7
7
|
}
|
|
8
8
|
|
|
9
9
|
declare module "socket-function/SocketFunction" {
|
|
10
|
+
/// <reference path="require/RequireController.d.ts" />
|
|
10
11
|
/// <reference types="node" />
|
|
11
12
|
/// <reference types="node" />
|
|
12
|
-
/// <reference types="socket-function/require/requirecontroller" />
|
|
13
13
|
import { SocketExposedInterface, SocketFunctionHook, SocketFunctionClientHook, SocketExposedShape, SocketRegistered, CallerContext, FullCallType, SocketRegisterType } from "socket-function/SocketFunctionTypes";
|
|
14
14
|
import { SocketServerConfig } from "socket-function/src/webSocketServer";
|
|
15
15
|
import { Args, MaybePromise } from "socket-function/src/types";
|
|
@@ -128,7 +128,7 @@ declare module "socket-function/SocketFunction" {
|
|
|
128
128
|
}
|
|
129
129
|
|
|
130
130
|
declare module "socket-function/SocketFunctionTypes" {
|
|
131
|
-
/// <reference
|
|
131
|
+
/// <reference path="require/RequireController.d.ts" />
|
|
132
132
|
import { getCallObj } from "socket-function/src/nodeProxy";
|
|
133
133
|
import { Args, MaybePromise } from "socket-function/src/types";
|
|
134
134
|
export declare const socket: unique symbol;
|
|
@@ -218,8 +218,8 @@ declare module "socket-function/SocketFunctionTypes" {
|
|
|
218
218
|
}
|
|
219
219
|
|
|
220
220
|
declare module "socket-function/hot/HotReloadController" {
|
|
221
|
-
/// <reference
|
|
222
|
-
/// <reference
|
|
221
|
+
/// <reference path="../../typenode/index.d.ts" />
|
|
222
|
+
/// <reference path="../require/RequireController.d.ts" />
|
|
223
223
|
/** Enables some hot reload functionality.
|
|
224
224
|
* - Triggers a refresh clientside
|
|
225
225
|
* - Triggers a reload server, for modules marked with `module.hotreload`
|
|
@@ -307,15 +307,15 @@ declare module "socket-function/mobx/promiseToObservable" {
|
|
|
307
307
|
}
|
|
308
308
|
|
|
309
309
|
declare module "socket-function/require/CSSShim" {
|
|
310
|
-
/// <reference
|
|
310
|
+
/// <reference path="RequireController.d.ts" />
|
|
311
311
|
export {};
|
|
312
312
|
|
|
313
313
|
}
|
|
314
314
|
|
|
315
315
|
declare module "socket-function/require/RequireController" {
|
|
316
|
+
/// <reference path="../../typenode/index.d.ts" />
|
|
316
317
|
/// <reference types="node" />
|
|
317
318
|
/// <reference types="node" />
|
|
318
|
-
/// <reference types="typenode" />
|
|
319
319
|
declare global {
|
|
320
320
|
namespace NodeJS {
|
|
321
321
|
interface Module {
|
|
@@ -430,8 +430,8 @@ declare module "socket-function/require/RequireController" {
|
|
|
430
430
|
}
|
|
431
431
|
|
|
432
432
|
declare module "socket-function/require/compileFlags" {
|
|
433
|
+
/// <reference path="RequireController.d.ts" />
|
|
433
434
|
/// <reference types="node" />
|
|
434
|
-
/// <reference types="socket-function/require/requirecontroller" />
|
|
435
435
|
/**
|
|
436
436
|
* Adds a global function setFlag(require, "typescript", flag) which sets a flag on the client
|
|
437
437
|
* - Ex, setFlag(require, "typescript", "allowclient") so allowclient = true on the typescript module.
|
|
@@ -453,7 +453,7 @@ declare module "socket-function/require/extMapper" {
|
|
|
453
453
|
}
|
|
454
454
|
|
|
455
455
|
declare module "socket-function/require/require" {
|
|
456
|
-
/// <reference
|
|
456
|
+
/// <reference path="../src/src.d.ts" />
|
|
457
457
|
declare global {
|
|
458
458
|
var onProgressHandler: undefined | ((progress: {
|
|
459
459
|
type: string;
|
|
@@ -789,7 +789,7 @@ declare module "socket-function/src/callHTTPHandler" {
|
|
|
789
789
|
}
|
|
790
790
|
|
|
791
791
|
declare module "socket-function/src/callManager" {
|
|
792
|
-
/// <reference
|
|
792
|
+
/// <reference path="../hot/HotReloadController.d.ts" />
|
|
793
793
|
import { CallerContext, CallType, ClientHookContext, FullCallType, FunctionFlags, HookContext, SocketExposedInterface, SocketExposedShape, SocketFunctionClientHook, SocketFunctionHook, SocketRegistered } from "socket-function/SocketFunctionTypes";
|
|
794
794
|
export declare function getCallFlags(call: CallType): FunctionFlags | undefined;
|
|
795
795
|
export declare function shouldCompressCall(call: CallType): boolean | "LZ4" | undefined;
|
|
@@ -1560,13 +1560,28 @@ declare module "socket-function/time/trueTimeShim" {
|
|
|
1560
1560
|
fromTime: number;
|
|
1561
1561
|
toTime: number;
|
|
1562
1562
|
};
|
|
1563
|
+
export declare function computeTweenedOffset(components: {
|
|
1564
|
+
systemTime: number;
|
|
1565
|
+
fromOffset: number;
|
|
1566
|
+
toOffset: number;
|
|
1567
|
+
fromTime: number;
|
|
1568
|
+
}): number;
|
|
1563
1569
|
export declare function getTimeComponents(): {
|
|
1564
1570
|
systemTime: number;
|
|
1565
1571
|
offset: number;
|
|
1566
1572
|
};
|
|
1567
1573
|
export declare function getTrueTime(): number;
|
|
1568
1574
|
export declare function getTrueTimeOffset(): number;
|
|
1569
|
-
export
|
|
1575
|
+
export type TrueTimeProof = {
|
|
1576
|
+
systemTime: number;
|
|
1577
|
+
fromOffset: number;
|
|
1578
|
+
toOffset: number;
|
|
1579
|
+
fromTime: number;
|
|
1580
|
+
toTime: number;
|
|
1581
|
+
offset: number;
|
|
1582
|
+
measurement?: TimeOffsetProof;
|
|
1583
|
+
};
|
|
1584
|
+
export declare function getTrueTimeProof(): TrueTimeProof | undefined;
|
|
1570
1585
|
export declare function waitForFirstTimeSync(): Promise<void> | undefined;
|
|
1571
1586
|
declare global {
|
|
1572
1587
|
var TRUE_TIME_ALREADY_SHIMMED: boolean;
|
package/package.json
CHANGED
package/require/CSSShim.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
/// <reference
|
|
1
|
+
/// <reference path="RequireController.d.ts" />
|
|
2
2
|
export {};
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
+
/// <reference path="../../typenode/index.d.ts" />
|
|
1
2
|
/// <reference types="node" />
|
|
2
3
|
/// <reference types="node" />
|
|
3
|
-
/// <reference types="typenode" />
|
|
4
4
|
declare global {
|
|
5
5
|
namespace NodeJS {
|
|
6
6
|
interface Module {
|
|
@@ -85,7 +85,7 @@ declare global {
|
|
|
85
85
|
/** @deprecated, not needed, as this defaults to ".", which is a lot easier to reason about anyways. */
|
|
86
86
|
export declare function setRequireBootRequire(dir: string): void;
|
|
87
87
|
export declare function allowAllNodeModules(): void;
|
|
88
|
-
export declare const RequireController: import("
|
|
88
|
+
export declare const RequireController: import("../SocketFunctionTypes").SocketRegistered<{
|
|
89
89
|
rootResolvePath: "Function has implementation but is not exposed in the SocketFunction.register call";
|
|
90
90
|
requireHTML: (config?: {
|
|
91
91
|
requireCalls?: string[];
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
+
/// <reference path="RequireController.d.ts" />
|
|
1
2
|
/// <reference types="node" />
|
|
2
|
-
/// <reference types="socket-function/require/requirecontroller" />
|
|
3
3
|
/**
|
|
4
4
|
* Adds a global function setFlag(require, "typescript", flag) which sets a flag on the client
|
|
5
5
|
* - Ex, setFlag(require, "typescript", "allowclient") so allowclient = true on the typescript module.
|
package/require/require.d.ts
CHANGED
package/src/callManager.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/// <reference
|
|
1
|
+
/// <reference path="../hot/HotReloadController.d.ts" />
|
|
2
2
|
import { CallerContext, CallType, ClientHookContext, FullCallType, FunctionFlags, HookContext, SocketExposedInterface, SocketExposedShape, SocketFunctionClientHook, SocketFunctionHook, SocketRegistered } from "../SocketFunctionTypes";
|
|
3
3
|
export declare function getCallFlags(call: CallType): FunctionFlags | undefined;
|
|
4
4
|
export declare function shouldCompressCall(call: CallType): boolean | "LZ4" | undefined;
|
package/src/webSocketServer.ts
CHANGED
|
@@ -20,6 +20,12 @@ import { formatTime } from "./formatting/format";
|
|
|
20
20
|
import { getExternalIP, testTCPIsListening } from "./networking";
|
|
21
21
|
import { forwardPort } from "./forwardPort";
|
|
22
22
|
|
|
23
|
+
// When a requested port is taken and useAvailablePortIfPortInUse is set, we scan
|
|
24
|
+
// upwards from this base instead of binding a random OS-assigned port, so restarts
|
|
25
|
+
// land on predictable, consistent ports.
|
|
26
|
+
const PORT_SCAN_START = 13000;
|
|
27
|
+
const PORT_SCAN_COUNT = 10000;
|
|
28
|
+
|
|
23
29
|
export type SocketServerConfig = (
|
|
24
30
|
https.ServerOptions & {
|
|
25
31
|
key: string | Buffer;
|
|
@@ -311,52 +317,55 @@ export async function startSocketServer(
|
|
|
311
317
|
|
|
312
318
|
let port = config.port;
|
|
313
319
|
if (!SocketFunction.silent) {
|
|
314
|
-
console.log(yellow(`Trying to
|
|
320
|
+
console.log(yellow(`Trying to listen on ${host}:${port}`));
|
|
315
321
|
}
|
|
316
322
|
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
//
|
|
321
|
-
async function
|
|
323
|
+
// Attempts to bind realServer to a single port. Resolves true once the server is
|
|
324
|
+
// actually listening, false if the port is already in use, and rejects on any
|
|
325
|
+
// other error. After an EADDRINUSE the server is still usable, so the caller can
|
|
326
|
+
// simply retry listen() on the next candidate.
|
|
327
|
+
async function tryListen(candidatePort: number): Promise<boolean> {
|
|
322
328
|
return await new Promise<boolean>((resolve, reject) => {
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
realServer.once("listening", () => {
|
|
327
|
-
resolve(false);
|
|
328
|
-
});
|
|
329
|
-
});
|
|
330
|
-
}
|
|
331
|
-
|
|
332
|
-
if (config.useAvailablePortIfPortInUse && port) {
|
|
333
|
-
realServer.listen(port, host);
|
|
334
|
-
let isListening = await new Promise<boolean>((resolve, reject) => {
|
|
335
|
-
if (realServer.listening) {
|
|
336
|
-
resolve(true);
|
|
337
|
-
return;
|
|
329
|
+
function cleanup() {
|
|
330
|
+
realServer.removeListener("error", onError);
|
|
331
|
+
realServer.removeListener("listening", onListening);
|
|
338
332
|
}
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
333
|
+
function onError(e: NodeJS.ErrnoException) {
|
|
334
|
+
cleanup();
|
|
335
|
+
if (e.code === "EADDRINUSE" || e.message.includes("EADDRINUSE")) {
|
|
336
|
+
resolve(false);
|
|
342
337
|
} else {
|
|
343
338
|
reject(e);
|
|
344
339
|
}
|
|
345
|
-
}
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
340
|
+
}
|
|
341
|
+
function onListening() {
|
|
342
|
+
cleanup();
|
|
343
|
+
resolve(true);
|
|
344
|
+
}
|
|
345
|
+
realServer.once("error", onError);
|
|
346
|
+
realServer.once("listening", onListening);
|
|
347
|
+
realServer.listen(candidatePort, host);
|
|
349
348
|
});
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
349
|
+
}
|
|
350
|
+
|
|
351
|
+
let bound = await tryListen(port);
|
|
352
|
+
if (!bound && config.useAvailablePortIfPortInUse) {
|
|
353
|
+
for (let candidate = PORT_SCAN_START; candidate < PORT_SCAN_START + PORT_SCAN_COUNT; candidate++) {
|
|
354
|
+
if (candidate === port) continue;
|
|
355
|
+
if (await tryListen(candidate)) {
|
|
356
|
+
bound = true;
|
|
357
|
+
port = candidate;
|
|
358
|
+
break;
|
|
359
|
+
}
|
|
354
360
|
}
|
|
355
|
-
|
|
356
|
-
|
|
361
|
+
if (!bound) {
|
|
362
|
+
throw new Error(`Could not find an available port in range ${PORT_SCAN_START}-${PORT_SCAN_START + PORT_SCAN_COUNT - 1} (requested ${config.port})`);
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
if (!bound) {
|
|
366
|
+
throw new Error(`Port ${port} is already in use (set useAvailablePortIfPortInUse to fall back to another port)`);
|
|
357
367
|
}
|
|
358
368
|
|
|
359
|
-
await listeningPromise;
|
|
360
369
|
port = (realServer.address() as net.AddressInfo).port;
|
|
361
370
|
|
|
362
371
|
if (config.autoForwardPort && config.public) {
|
package/test.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { getTimeComponentsDetailed, waitForFirstTimeSync } from "./time/trueTimeShim";
|
|
1
|
+
import { computeTweenedOffset, getTimeComponentsDetailed, waitForFirstTimeSync } from "./time/trueTimeShim";
|
|
2
2
|
import * as fs from "fs";
|
|
3
3
|
import * as path from "path";
|
|
4
4
|
|
|
@@ -19,7 +19,6 @@ async function sampleMode() {
|
|
|
19
19
|
toOffset: number;
|
|
20
20
|
fromTime: number;
|
|
21
21
|
toTime: number;
|
|
22
|
-
fraction: number;
|
|
23
22
|
};
|
|
24
23
|
|
|
25
24
|
const samples: Sample[] = [];
|
|
@@ -28,11 +27,8 @@ async function sampleMode() {
|
|
|
28
27
|
for (let i = 0; i < SAMPLE_COUNT; i++) {
|
|
29
28
|
const detailed = getTimeComponentsDetailed();
|
|
30
29
|
|
|
31
|
-
// Calculate
|
|
32
|
-
const
|
|
33
|
-
const duration = detailed.toTime - detailed.fromTime;
|
|
34
|
-
const fraction = duration > 0 ? Math.min(1, elapsed / duration) : 0;
|
|
35
|
-
const offset = detailed.fromOffset + (detailed.toOffset - detailed.fromOffset) * fraction;
|
|
30
|
+
// Calculate the tween using the same systemTime
|
|
31
|
+
const offset = computeTweenedOffset(detailed);
|
|
36
32
|
|
|
37
33
|
samples.push({
|
|
38
34
|
id: TEST_RUN_ID,
|
|
@@ -42,7 +38,6 @@ async function sampleMode() {
|
|
|
42
38
|
toOffset: detailed.toOffset,
|
|
43
39
|
fromTime: detailed.fromTime,
|
|
44
40
|
toTime: detailed.toTime,
|
|
45
|
-
fraction,
|
|
46
41
|
});
|
|
47
42
|
|
|
48
43
|
if (SAMPLE_INTERVAL_MS > 0) {
|
|
@@ -88,7 +83,6 @@ async function verifyMode() {
|
|
|
88
83
|
toOffset: number;
|
|
89
84
|
fromTime: number;
|
|
90
85
|
toTime: number;
|
|
91
|
-
fraction: number;
|
|
92
86
|
file: string;
|
|
93
87
|
};
|
|
94
88
|
|
|
@@ -126,13 +120,13 @@ async function verifyMode() {
|
|
|
126
120
|
console.error(` systemTime: ${prev.systemTime}`);
|
|
127
121
|
console.error(` offset: ${prev.offset}`);
|
|
128
122
|
console.error(` trueTime: ${prevTrueTime}`);
|
|
129
|
-
console.error(`
|
|
123
|
+
console.error(` tween: ${prev.fromOffset} -> ${prev.toOffset}`);
|
|
130
124
|
console.error(` timeWindow: ${prev.fromTime} -> ${prev.toTime}`);
|
|
131
125
|
console.error(` Current [ID: ${sample.id}, file: ${sample.file}]:`);
|
|
132
126
|
console.error(` systemTime: ${sample.systemTime}`);
|
|
133
127
|
console.error(` offset: ${sample.offset}`);
|
|
134
128
|
console.error(` trueTime: ${trueTime}`);
|
|
135
|
-
console.error(`
|
|
129
|
+
console.error(` tween: ${sample.fromOffset} -> ${sample.toOffset}`);
|
|
136
130
|
console.error(` timeWindow: ${sample.fromTime} -> ${sample.toTime}`);
|
|
137
131
|
console.error(` Difference: ${trueTime - lastTrueTime}ms`);
|
|
138
132
|
}
|
package/time/trueTimeShim.d.ts
CHANGED
|
@@ -15,13 +15,28 @@ export declare function getTimeComponentsDetailed(): {
|
|
|
15
15
|
fromTime: number;
|
|
16
16
|
toTime: number;
|
|
17
17
|
};
|
|
18
|
+
export declare function computeTweenedOffset(components: {
|
|
19
|
+
systemTime: number;
|
|
20
|
+
fromOffset: number;
|
|
21
|
+
toOffset: number;
|
|
22
|
+
fromTime: number;
|
|
23
|
+
}): number;
|
|
18
24
|
export declare function getTimeComponents(): {
|
|
19
25
|
systemTime: number;
|
|
20
26
|
offset: number;
|
|
21
27
|
};
|
|
22
28
|
export declare function getTrueTime(): number;
|
|
23
29
|
export declare function getTrueTimeOffset(): number;
|
|
24
|
-
export
|
|
30
|
+
export type TrueTimeProof = {
|
|
31
|
+
systemTime: number;
|
|
32
|
+
fromOffset: number;
|
|
33
|
+
toOffset: number;
|
|
34
|
+
fromTime: number;
|
|
35
|
+
toTime: number;
|
|
36
|
+
offset: number;
|
|
37
|
+
measurement?: TimeOffsetProof;
|
|
38
|
+
};
|
|
39
|
+
export declare function getTrueTimeProof(): TrueTimeProof | undefined;
|
|
25
40
|
export declare function waitForFirstTimeSync(): Promise<void> | undefined;
|
|
26
41
|
declare global {
|
|
27
42
|
var TRUE_TIME_ALREADY_SHIMMED: boolean;
|
package/time/trueTimeShim.ts
CHANGED
|
@@ -27,6 +27,9 @@ const LMDB_MAX_CORRUPTION_FAILURES = 3;
|
|
|
27
27
|
// the real time to catch up with it.
|
|
28
28
|
const MINIMUM_TIME_RATE = 0.5;
|
|
29
29
|
|
|
30
|
+
// The offset tweens toward its target at this fraction of elapsed real time, then plateaus once it gets there. Must stay below 1 so output time keeps moving forward even while the offset is shrinking. Tweening across the whole transition window instead would mean a badly-off clock (many seconds) takes the entire window to converge, which breaks transactional consistency with other machines.
|
|
31
|
+
const OFFSET_TWEEN_RATE = 0.5;
|
|
32
|
+
|
|
30
33
|
const THROW_ON_ERROR = false;
|
|
31
34
|
|
|
32
35
|
// Hugely important as if we don't synchronize between processes, it means our logs are going to be confusing and out of order.
|
|
@@ -143,13 +146,24 @@ export function getTimeComponentsDetailed(): {
|
|
|
143
146
|
}
|
|
144
147
|
}
|
|
145
148
|
|
|
149
|
+
export function computeTweenedOffset(components: {
|
|
150
|
+
systemTime: number;
|
|
151
|
+
fromOffset: number;
|
|
152
|
+
toOffset: number;
|
|
153
|
+
fromTime: number;
|
|
154
|
+
}): number {
|
|
155
|
+
const elapsed = Math.max(0, components.systemTime - components.fromTime);
|
|
156
|
+
const delta = components.toOffset - components.fromOffset;
|
|
157
|
+
const maxChange = elapsed * OFFSET_TWEEN_RATE;
|
|
158
|
+
if (Math.abs(delta) <= maxChange) {
|
|
159
|
+
return components.toOffset;
|
|
160
|
+
}
|
|
161
|
+
return components.fromOffset + Math.sign(delta) * maxChange;
|
|
162
|
+
}
|
|
163
|
+
|
|
146
164
|
export function getTimeComponents(): { systemTime: number; offset: number } {
|
|
147
165
|
const detailed = getTimeComponentsDetailed();
|
|
148
|
-
|
|
149
|
-
const duration = detailed.toTime - detailed.fromTime;
|
|
150
|
-
const fraction = duration > 0 ? Math.min(1, elapsed / duration) : 0;
|
|
151
|
-
const offset = detailed.fromOffset + (detailed.toOffset - detailed.fromOffset) * fraction;
|
|
152
|
-
return { systemTime: detailed.systemTime, offset };
|
|
166
|
+
return { systemTime: detailed.systemTime, offset: computeTweenedOffset(detailed) };
|
|
153
167
|
}
|
|
154
168
|
|
|
155
169
|
export function getTrueTime() {
|
|
@@ -179,8 +193,30 @@ export function getTrueTimeOffset() {
|
|
|
179
193
|
const { offset } = getTimeComponents();
|
|
180
194
|
return offset;
|
|
181
195
|
}
|
|
182
|
-
export
|
|
183
|
-
|
|
196
|
+
export type TrueTimeProof = {
|
|
197
|
+
systemTime: number;
|
|
198
|
+
// The tween endpoints the current offset is moving between. When offset !== toOffset we are still converging.
|
|
199
|
+
fromOffset: number;
|
|
200
|
+
toOffset: number;
|
|
201
|
+
fromTime: number;
|
|
202
|
+
toTime: number;
|
|
203
|
+
offset: number;
|
|
204
|
+
// The raw measurement that produced the newest offset. Undefined if the offset came from a caller-provided base that only returns numbers.
|
|
205
|
+
measurement?: TimeOffsetProof;
|
|
206
|
+
};
|
|
207
|
+
export function getTrueTimeProof(): TrueTimeProof | undefined {
|
|
208
|
+
const data = cachedTimeOffsetData;
|
|
209
|
+
if (!data) return undefined;
|
|
210
|
+
const detailed = getTimeComponentsDetailed();
|
|
211
|
+
return {
|
|
212
|
+
systemTime: detailed.systemTime,
|
|
213
|
+
fromOffset: detailed.fromOffset,
|
|
214
|
+
toOffset: detailed.toOffset,
|
|
215
|
+
fromTime: detailed.fromTime,
|
|
216
|
+
toTime: detailed.toTime,
|
|
217
|
+
offset: computeTweenedOffset(detailed),
|
|
218
|
+
measurement: data.proof,
|
|
219
|
+
};
|
|
184
220
|
}
|
|
185
221
|
export function waitForFirstTimeSync(): Promise<void> | undefined {
|
|
186
222
|
if (didFirstTimeSync) return undefined;
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
"use strict"; var console = (function shimConsole() { let baseConsole = globalThis.console; if (typeof window !== "undefined") return baseConsole; let name = __filename.replaceAll("\\", "/").split("/").pop(); let dirName = __dirname.replaceAll("\\", "/").split("/").pop(); let context = { __FILE__: __filename, __DIR__: __dirname, __NAME__: name, __DIRNAME__: dirName }; let newConsole = { ...baseConsole }; for (let shim of ["log", "info", "warn", "error"]) { newConsole[shim] = (...args) => { args.push(context); baseConsole[shim](...args); }; } newConsole.__context = context; return newConsole; })(); "use strict"; var console = (function shimConsole() { let baseConsole = globalThis.console; if (typeof window !== "undefined") return baseConsole; let name = __filename.replaceAll("\\", "/").split("/").pop(); let dirName = __dirname.replaceAll("\\", "/").split("/").pop(); let context = { __FILE__: __filename, __DIR__: __dirname, __NAME__: name, __DIRNAME__: dirName }; let newConsole = { ...baseConsole }; for (let shim of ["log", "info", "warn", "error"]) { newConsole[shim] = (...args) => { args.push(context); baseConsole[shim](...args); }; } newConsole.__context = context; return newConsole; })(); "use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true , configurable: true});
|
|
3
|
-
module.allowclient = true;
|
|
4
|
-
const misc_1 = require("./src/misc");
|
|
5
|
-
if (!(0, misc_1.isNode)()) {
|
|
6
|
-
process.env.CBOR_NATIVE_ACCELERATION_DISABLED = "true";
|
|
7
|
-
}
|
|
8
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2V0UHJvY2Vzc1ZhcmlhYmxlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIlNldFByb2Nlc3NWYXJpYWJsZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxNQUFNLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQztBQUMxQixxQ0FBb0M7QUFFcEMsSUFBSSxDQUFDLElBQUEsYUFBTSxHQUFFLEVBQUUsQ0FBQztJQUNaLE9BQU8sQ0FBQyxHQUFHLENBQUMsaUNBQWlDLEdBQUcsTUFBTSxDQUFDO0FBQzNELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJtb2R1bGUuYWxsb3djbGllbnQgPSB0cnVlO1xuaW1wb3J0IHsgaXNOb2RlIH0gZnJvbSBcIi4vc3JjL21pc2NcIjtcblxuaWYgKCFpc05vZGUoKSkge1xuICAgIHByb2Nlc3MuZW52LkNCT1JfTkFUSVZFX0FDQ0VMRVJBVElPTl9ESVNBQkxFRCA9IFwidHJ1ZVwiO1xufSJdfQ=//=
|
|
9
|
-
/* _JS_SOURCE_HASH = "17f221dc44d3e6b670edca79d328239589b294826e978bd1870b2edb56a5e5ed"; */
|