@tai-kun/surrealdb
Version:
The SurrealDB SDK for JavaScript
60 lines (50 loc) • 1.64 kB
text/typescript
import type { DataItem } from "@tai-kun/surrealdb/cbor";
import { NumberRangeError } from "@tai-kun/surrealdb/errors";
import { defineAsDuration } from "../_internals/define";
export type DurationSource =
// SurrealDB 独自
// データ型は std::time::Duration に従う。
// https://doc.rust-lang.org/stable/std/time/struct.Duration.html#method.new
| readonly [
// u64
seconds?: DataItem.UnsignedInteger["value"] | undefined,
// u32
nanoseconds?: undefined,
]
| readonly [
// u64
seconds: DataItem.UnsignedInteger["value"],
// u32
nanoseconds?:
| DataItem.UnsignedInteger.Tiny["value"]
| DataItem.UnsignedInteger.OneByte["value"]
| DataItem.UnsignedInteger.TwoBytes["value"]
| DataItem.UnsignedInteger.FourBytes["value"]
| undefined,
];
const NANOSECONDS_PER_SECOND = 1_000_000_000n;
const MAX_UINT_64 = 18446744073709551615n;
/**
* [API Reference](https://tai-kun.github.io/surrealdb.js/v2/api/data/duration)
*/
export default class Duration {
protected _seconds: bigint;
protected _nanoseconds: number;
constructor(source: DurationSource) {
let [s = 0n, ns = 0n] = source;
this._seconds = BigInt(s) + (ns = BigInt(ns)) / NANOSECONDS_PER_SECOND;
this._nanoseconds = Number(ns % NANOSECONDS_PER_SECOND);
defineAsDuration(this);
if (this._seconds < 0n || this._seconds > MAX_UINT_64) {
throw new NumberRangeError([0n, MAX_UINT_64], this._seconds, {
integer: true,
});
}
}
get seconds(): bigint {
return this._seconds;
}
get nanoseconds(): number {
return this._nanoseconds;
}
}