# nesquirk

> Ties Nes + minimongo together for gloryful reactive apps.

Latest version **4.0.1** (published 2017-08-29) · MIT license · 0 weekly downloads

## Install

```sh
npm install nesquirk
pnpm add nesquirk
yarn add nesquirk
bun add nesquirk
```

## Health

**Score 15/100 (F)** — status: abandoned.

Positive: no vulnerabilities.

Warnings: low downloads; no types; no esm support.

Negative: abandoned; low maintenance score.

## Facts

| | |
|---|---|
| Version | 4.0.1 |
| Published | 2017-08-29 |
| First published | 2017-07-25 |
| Weekly downloads | 0 |
| License | MIT |
| TypeScript types | none |
| Module format | CommonJS |
| Dependencies | 8 |
| Known vulnerabilities | 0 |
| Install scripts | no |
| GitHub stars | 0 |
| Author | Alan Shaw |
| Maintainers | alanshaw |
| Keywords | minimongo, mingo, nes, hapi, hapijs, websockets, reactive, react |

## Links

- npm: https://www.npmjs.com/package/nesquirk
- Repository: https://github.com/alanshaw/nesquirk
- Homepage: https://github.com/alanshaw/nesquirk#readme
- Issues: https://github.com/alanshaw/nesquirk/issues
- npm.io page: https://npm.io/package/nesquirk

## Dependencies (8)

- [nes](https://npm.io/package/nes.md) ^6.4.3
- [ejson](https://npm.io/package/ejson.md) ^2.1.2
- [mingo](https://npm.io/package/mingo.md) ^2.0.0
- [react](https://npm.io/package/react.md) ^15.6.1
- [events](https://npm.io/package/events.md) ^1.1.1
- [prop-types](https://npm.io/package/prop-types.md) ^15.5.10
- [bson-objectid](https://npm.io/package/bson-objectid.md) ^1.1.5
- [hoist-non-react-statics](https://npm.io/package/hoist-non-react-statics.md) ^2.2.1

## Alternatives

- [@opentelemetry/exporter-zipkin](https://npm.io/package/@opentelemetry/exporter-zipkin.md) — 14.8M weekly downloads
- [pusher-js](https://npm.io/package/pusher-js.md) — 2.0M weekly downloads
- [browserify](https://npm.io/package/browserify.md) — 1.7M weekly downloads
- [sqs-consumer](https://npm.io/package/sqs-consumer.md) — 1.7M weekly downloads
- [@sanity/eventsource](https://npm.io/package/@sanity/eventsource.md) — 930.8K weekly downloads

## Recent versions

- 4.0.1 (latest) — 2017-08-29
- 4.0.0 — 2017-08-29
- 3.0.0 — 2017-08-29
- 2.0.0 — 2017-08-25
- 1.2.2 — 2017-08-25
- 1.2.1 — 2017-08-25
- 1.2.0 — 2017-08-25
- 1.1.1 — 2017-08-24
- 1.1.0 — 2017-08-24
- 1.0.0 — 2017-08-22
- 0.1.1 — 2017-07-30
- 0.1.0 — 2017-07-30
- 0.0.1 — 2017-07-26
- 0.0.0 — 2017-07-25

## README

# Nesquirk [![Build Status](https://travis-ci.org/alanshaw/nesquirk.svg?branch=master)](https://travis-ci.org/alanshaw/nesquirk) [![dependencies Status](https://david-dm.org/alanshaw/nesquirk/status.svg)](https://david-dm.org/alanshaw/nesquirk)

Ties [Nes](https://github.com/hapijs/nes) + [minimongo](https://github.com/kofrasa/mingo) together for gloryful reactive apps.

## Server

```js
const Hapi = require('hapi')
const Nesquirk = require('nesquirk')

const server = new Hapi.Server()

server.connection({ host: 'localhost', port: 3000 })

server.register(Nesquirk, () => {
  // Declare a nesquirk subscription
  // opts are Nes server.subscription options
  server.nq.subscription('/item/{_id}', opts, (socket, path, params, reply) => {
    // Get your initial object, reply(obj)
  })
  // Behind the scenes, the callback is attached to opts.onSubscribe
  // We call socket.publish for sending results, and then next
})
```

### Managing the subscription

We don't keep subscription documents in memory, so you have to maintain your subscriptions, just like with `Nes`.

```js
// Single item (_id) must be in the url, or in the update obj to work
server.nq.update('/item/{_id}', { _id: '59527fc54cad8b7efd5f5835', status: 'complete' })

// Multiple items
server.nq.add('/items', { _id: '5953813562844d958c6f6815', status: 'pending' })
server.nq.add('/items', [/* ... */]) // Also pass arrays here (and update/remove)
server.nq.update('/items', { _id: '5953813562844d958c6f6815', status: 'active' }) // Note: needs _id in object(s) to merge
server.nq.remove('/items', '5953813562844d958c6f6815') // Note: only pass ID(s)
```

## Client

```js
const { Client, Collection } = require('nesquirk')
const client = new Client('ws://localhost:3000')

// A mingo backed minimongo collection
const Items = new Collection('items')

client.connect((err) => {
  // Hook the '/items' publication up to the Items collection
  const handle = client.subscribe('/items', Items, (err) => {
    console.log('Ready or error')
  })

  // Stop
  handle.stop() // or
  client.unsubscribe('/items', Items)
})
```

### React

More typically, you'll use the `nesquirk` React components to manage your subscriptions and retrieve data from minimongo collections.

**main.js**

```js
import React from 'react'
import ReactDOM from 'react-dom'
import { Client, Provider } from 'nesquirk'

import MyComponent from './MyComponent'

// Setup the client connection
const client = new Client('ws://localhost:3000')
client.connect((err) => { if (err) console.error('Failed to connect', err) })

// The Provider allows you to gain access to the client from child components
// using the `withClient` helper (see below)
ReactDOM.render(
  <Provider client={client}>
    <MyComponent />
  </Provider>,
  document.getElementById('root')
)
```

**MyComponent.js**

```js
import React from 'react'
import { createContainer } from 'nesquirk'
import Items from './Items'

const MyComponent = ({ items }) => items.map((i) => <div>{i._id}</div>)

export default createContainer(function (props) {
  // Subscribe - will be auto unsubscribed on componentWillUnmount
  // Hooks the Items collection up to the '/items' subscription
  const handle = this.subscribe('/items', Items)

  // Fetch any data from your collections
  return {
    items: Items.find().all(),
    loading: !handle.ready()
  }
}, MyComponent))
```

**Items.js**

```js
import { Collection } from 'nesquirk'
export default new Collection('items')
```

---
_Source: https://npm.io/package/nesquirk · Machine-readable twin of the npm.io package page. Health data is recomputed on every publish._
