npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

day-start-interval

v1.0.0

Published

Time-zone-aware `setInterval` that fires at the start of each day

Downloads

85

Readme

day-start-interval

Build Status

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.