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

net-tftp

v0.0.1

Published

Trivial File Transfer Protocol

Downloads

6

Readme

Trivial File Transfer Protocol (TFTP)

Installation

npm install --save net-tftp

Usage

var TFTP = require( 'net-tftp' )
var server = new TFTP.Server({
  ttl: undefined, // If set, will be used to `socket.setTTL()`
  reuseAddr: false, // Set address reuse for the listening socket
})
server.on( 'read-request', ( transfer ) => {

  // Rejecting a request can be done via `transfer.error()`
  if( transfer.request.filename == 'nope' ) {
    return transfer.error( TFTP.ERROR.NOT_FOUND )
  }

  try {
    var readable = fs.createReadStream( filepath )
    var writable = transfer.accept()
    stream.pipeline( readable, writable, ( error ) => {
      if( error ) transfer.error( TFTP.ERROR.UNDEFINED, 'Internal Server Error' )
    })
  } catch( error ) {
    if( error.code == 'ENOENT' ) {
      transfer.error( TFTP.ERROR.NOT_FOUND )
    } else {
      transfer.error( TFTP.ERROR.UNDEFINED, 'Internal Server Error' )
    }
  }

})
server.on( 'write-request', ( transfer ) => {
  // Accepting a write request returns a readable stream
  var readable = transfer.accept()
  var destination = fs.createWriteStream( transfer.request.filename )

  stream.pipeline( readable, destination, ( error ) => {
    if( error ) transfer.error( TFTP.ERROR.UNDEFINED, 'Internal Server Error' )
  })

})

References

Implemented

  • RFC 1350 - THE TFTP PROTOCOL (REVISION 2)

Intent to Implement

Deviations from RFCs

RFC 1350, Section 2:

TFTP recognizes only one error condition that does not cause termination, the source port of a received packet being incorrect. In this case, an error packet is sent to the originating host.

We do not send error packets to the originating host in this case, to prevent sending interfering traffic, and to protect this from being abused in reflection-based attacks.

Further, any other misdirected packets (such as for example ACKs sent to port 69) receive the same silent treatment, and are simply ignored.

This shouldn't have any detrimental effects as the host sending the misdirected packet should time out eventually on what it believes to be its transaction.

RFC 2347, Negotiation Protocol:

The client appends options at the end of the Read Request or Write request packet, as shown above. Any number of options may be specified; however, an option may only be specified once. The order of the options is not significant.

The restriction that an option may only be specified once is not enforced – instead – the option specified last "wins"