day-start-interval
v1.0.0
Published
Time-zone-aware `setInterval` that fires at the start of each day
Downloads
85
Maintainers
Readme
day-start-interval
This package exports an isomorphic function that works like setInterval
, but aligns itself to the
start of each day. You might use this client-side to update a UI that shows new information each
day. You might use this server-side, from within a websocket handler, to push new information to the
client when the day changes.
Installation
For use from both the browser and Node:
npm install day-start-interval
For use in the browser, you will also need to install moment-timezone
as described
here, and configure your bundler to resolve
that dependency. If you wish to load moment-timezone
from a CDN like JSDelivr, for instance, and
are using Rollup, you might do:
<!-- in your HTML -->
<script src="//cdn.jsdelivr.net/combine/npm/[email protected]/moment.min.js,npm/[email protected]/builds/moment-timezone-with-data.min.js"></script>
// Part of your Rollup configuration
{
external: ['moment-timezone'],
globals: {
'moment-timezone': 'moment'
}
}
You may also need to configure your bundler to upconvert this module from CJS to ESM e.g. using
rollup-plugin-commonjs
(exercise left to the reader). https://github.com/mixmaxhq/day-start-interval/issues/4
tracks adding a ESM build to this project.
Usage
First, import the library:
// In the browser:
import { setDayStartInterval } from 'day-start-interval';
// In Node:
const { setDayStartInterval } = require('day-start-interval');
Then, determine the user's time zone. The library can't determine when the day starts without this information: as of this writing, it is 2:06pm on September 18th in San Francisco, but already 6:36am on September 19th in Adelaide, Australia!
Client-side, you can use moment-timezone
and use moment.tz.guess()
to figure this out:
import moment from 'moment-timezone';
const tz = moment.tz.guess();
If you wish to use this library server-side, you can determine the time zone client-side and then pass that to the server (exercise left to the reader).
Finally:
setDayStartInterval(() => {
console.log("It's a new day!");
}, { tz });
Does this library expect your code to actually run for more than 24 hours?
I mean… it might, right? Some users keep tabs open forever, and you might even expect them to do so if you're making some sort of dashboard for them.
And if the client is alive for more than 24 hours, than a corresponding websocket process might live for more than 24 hours too. (Theoretically—you should make sure that your client can gracefully reconnect if your websocket servers cycle, the network connection drops, etc!)
But, it's totally possible for setDayStartInterval
to fire much sooner than 24 hours, depending
on when you call it—if you call it at 11:59pm, then it will fire for the first time in just
one minute.
Error handling
As with setInterval
, if func
throws, that exception will not be caught. You are responsible
for adding your own try-catch
inside func
if needed. If func
throws, this library does not
make any guarantees about whether the interval will continue to run.
Contributing
We welcome bug reports and feature suggestions, as well as contributions!
Please add tests for any changes. You can run the tests continuously as you work by doing env
WATCH=true npm run test
.