king-crimson
A library that provides classes for managing sequential data.
Installation
npm install king-crimson
Usage
The following two management classes are provided.
DateTimeDataManager
: Manage data with datetime information.
IntervalDataManager
: Manages data with interval information.
DateTimeDataManager
import { DateTimeDataManager } from "king-crimson";
import { DateTime, Duration, Interval } from "luxon";
import queryString from "query-string";
// Event data to manage
interface MyEventData {
timestamp: number;
event: string;
}
// Create an async function to call API
const fetchData = async (since: number, until: number, signal: AbortSignal) => {
const query = queryString.stringify({ since, until });
const url = `https://example.com/api/data?${query}`;
const res = await fetch(uri, { signal });
const data = await res.json();
return data;
};
// Create instance
const ddm = new DateTimeDataManager<MyEventData>({
fetchFn(period: Interval) {
const controller = new AbortController();
const signal = controller.signal;
const since = period.start.toMillis();
const until = period.end.toMillis();
return {
promise: fetchData(since, until, signal),
cancel() {
controller.abort();
}
};
},
itemKey(item: MyEventData) {
return item.timestamp;
}
});
// Execute fetch
const datetime = DateTime.local();
ddm.fetch(datetime);
// Cancel fetch
ddm.cansel();
// Search data
const interval = datetime.before(Duration.fromObject({ hour: 1 }));
const data = ddm.searchBetween(interval);
Config
Property |
Type |
Description |
fetchFn |
(period: Interval) => { promise: Promise<T[]>, cancel: () => void } |
Methods that request data and methods that cancel requests. |
itemKey |
(item: T) => any |
Key value of AVL tree. |
Options
Property |
Type |
Default |
Description |
fetchDuration |
Duration |
Duration.fromObject({ hour: 24 }) |
Duration for making data requests in batch. |
requestDurationLimit |
Duration |
Duration.fromObject({ minute: 180 }) |
Duration limit for one data request. |
updateInterceptor |
((payload: { items: T[], period: Interval }) => { items: T[], period: Interval }) | null |
null |
Interceptor that transforms the payload before handling the update event. |
IntervalDataManager
import { IntervalDataManager } from "king-crimson";
import { DateTime, Duration, Interval } from "luxon";
import queryString from "query-string";
// Event data to manage
interface MyEventData {
timestamp: number;
duration: number;
event: string;
}
// Create an async function to call API
const fetchData = async (since: number, until: number, signal: AbortSignal) => {
const query = queryString.stringify({ since, until });
const url = `https://example.com/api/data?${query}`;
const res = await fetch(uri, { signal });
const data = await res.json();
return data;
};
// Create instance
const idm = new IntervalDataManager<MyEventData>({
fetchFn(period: Interval) {
const controller = new AbortController();
const signal = controller.signal;
const since = period.start.toMillis();
const until = period.end.toMillis();
return {
promise: fetchData(since, until, signal),
cancel() {
controller.abort();
}
};
},
itemKey(item: MyEventData) {
return item.timestamp;
},
itemTimestamp(item: MyEventData) {
return item.timestamp;
},
itemDuration(item: MyEventData) {
return item.duration;
}
});
// Execute fetch
const datetime = DateTime.local();
idm.fetch(datetime);
// Cancel fetch
idm.cansel();
// Search data
const interval = datetime.before(Duration.fromObject({ hour: 1 }));
let data = idm.searchBetween(interval);
// Search for data that includes a specified datetime
data = searchOn(datetime);
Config
Property |
Type |
Description |
fetchFn |
(period: Interval) => { promise: Promise<T[]>, cancel: () => void } |
Methods that request data and methods that cancel requests. |
itemKey |
(item: T) => any |
Key value of AVL tree. |
itemTimestamp |
(item: T) => number |
Method that returns the timestamp of data in Unixtime in milliseconds. |
itemDuration |
(item: T) => number |
Method that returns duration of data in milliseconds. |
Options
Property |
Type |
Default |
Description |
fetchDuration |
Duration |
Duration.fromObject({ hour: 24 }) |
Duration for making data requests in batch. |
requestDurationLimit |
Duration |
Duration.fromObject({ minute: 180 }) |
Duration limit for one data request. |
updateInterceptor |
((payload: { items: T[], period: Interval }) => { items: T[], period: Interval }) | null |
null |
Interceptor that transforms the payload before handling the update event. |
Event
Both classes emit the following events:
Event |
Payload |
Description |
update |
{ items: T[], period: Interval } |
When each data fetch is completed, the acquired data and the acquisition period are notified. |