syncano-server
v0.8.5
Published
A library to intereact with the Syncano API on a server side
Downloads
29
Readme
Syncano Server-side Library
This library supposed to be used in Syncano Sockets (inside scripts) to communicate with Syncano Core Services. Syncano provides various Core Services:
- Database (db) - NoSQL database to store your application data
- Users Management (users) - service to store and manage users and groups of your application
- Event Loop (events) - service to emit events which can be caught by any Socket
- Realtime Channels (channels) - implement publish/subscribe model for realtime communication
Library initialization
To initialize library simply type:
import { data, users, socket, response, event, logger } from 'syncano-server'
Library initiated that way will grab necessary information from the context of you Socket Script - it means that you don't need to provide additional information such as Instance name or authentication key (token) to your Instance.
If you want to force the library to connect to specified instance type:
import Server from 'syncano-server'
const { data, events } = new Server({
token: '9-12jdiasdnfo23nrokms',
instanceName: 'example-instance-name'
})
Examples
Using Database (data)
In this example tags
is a name of a class (data model) configured for that instance.
// Create new object in tags class
data.tags
.create({
name: 'javascript',
usage_count: 0
})
.then(tag => {});
// Get list of 140 tags used more than 100 times
data.tags
.where('usage_count', 'gt', 100)
.take(140)
.list()
.then(tags => {})
// Get list of post where author is reference to other class
// and author email is [email protected]
data.posts
.where('author.email', '[email protected]')
.list()
.then(posts => {})
// Get list of post - author column will be expanded with data from target class
data.posts
.with('author')
.list()
.then(posts => {})
// Delete tags with with given array of ids
data.tags.delete([8735, 8733])
// Delete single tag
data.tags.delete(7652)
Managing users (users)
// Get first user with given mail
users
.where('email', '[email protected]')
.first()
.then(user => {
// user variable is null if not found
// so no need for catch method
})
// Get first user with given mail, throws error if user was not found
users
.where('email', '[email protected]')
.firstOrFail()
.then(user => {})
.catch(err => {
// error is thrown if user was not found
})
Using Events (events)
event.emit('my_signal', {dummyKey: 'dummy_value'})
.then(event => {})
.catch(err => {
// error is thrown if emit was unsuccessful
})
Publishing to channels
channel.publish('my_channel', {dummyKey: 'dummy_value'})
.then(res => {})
.catch(err => {})
Socket connection
const latestTags = await socket.get('tags/list', { sort: 'latest' })
const createdTag = await socket.post('tags/create', { name: 'nature' })
HTTP Responses
// Simple text/plain response
// response(content, status, contentType, headers)
response('Hello world')
response('Hello world', 200, 'text/plain', {
'X-RATE-LIMIT': 50
})
// Respond with custom header
response
.header('X-RATE-LIMIT', 50)
.header('X-USAGE', 35)
('Check headers')
// Respond with json string
response.json({
title: "Post title",
content: "Lorem ipsum dolor sit amet."
})
response
.header('X-RATE-LIMIT', 50)
.json({
title: "Post title",
content: "Lorem ipsum dolor sit amet."
})
Logging
For debug purposes you can use logger
:
Example:
import {logger} from 'syncano-server'
// Listen for all events
logger.listen(event => {
// Handle event - save to db or send email
})
// Create custom logger levels - optionally
// Defaults are: error, warn, debug, info
logger.levels(['error', 'notice', 'fatal'])
// Initialize logger with scope "User Socket"
const log = logger('User Socket')
// Specific level loggers
log.error('This is error message!')
log.warn('This is warning message!')
log.info('This is info message!', {hello: "world"})
log.debug('This is debug message!')
Check documentation to learn more.