Skip to content

Instantly share code, notes, and snippets.

View crrobinson14's full-sized avatar

Chad Robinson crrobinson14

View GitHub Profile
@crrobinson14
crrobinson14 / boot.js
Last active February 6, 2020 17:06
ActionHero Secrets-Loading Boot Routine
const { loadSecrets } = require('./src/lib/secrets');
exports.default = async function BOOT() {
await loadSecrets('path/to/my/secret');
};
@crrobinson14
crrobinson14 / chatClient.js
Created January 23, 2020 20:36
WS/REST capable Chat / Action Handling client for ActionHero
const ReconnectingWebSocket = require('reconnecting-websocket');
const axios = require('axios');
const WS = require('ws');
// Written with ES5 metaphors to eliminate the need for Babel in test.
const KEY_CHARS = '0123456789abcdefghijklmnopqrstuvwxyz'.split('');
const generateRequestId = () => {
const uuid = [];
@crrobinson14
crrobinson14 / qosLog.js
Created February 9, 2019 00:21
QOS Logging Middleware for ActionHero
const { Initializer, api } = require('actionhero');
const fs = require('fs');
const shortid = require('../lib/shortid');
const safeApiRequestId = params => (params.apiRequestId || shortid(20))
.replace(/[^0-9a-zA-Z_-]/g, '')
.substring(0, 64);
function instrumentAction(data) {
const { action, params, response, connection } = data;

Requires json2yaml and, of course, ActionHero itself installed in the project. This script is fairly crude and has some hard-coded behaviors, such as expecting to find data models defined on api.models. It is provided here only for reference.

@crrobinson14
crrobinson14 / cors.js
Created October 30, 2018 03:25
ActionHero v19+ CORS middleware
const { Initializer, api } = require('actionhero');
// Adjust to suit... Or optionally move into config...
const allowedOrigins = [
'https://staging.mydomain.com',
'https://www.mydomain.com',
'https://mydomain.com',
'http://localhost:8080',
];

EJS template rendering in ActionHero 19+

This example provides a proof of concept for simple EJS-based template rendering in ActionHero. Note that EJS is this author's favorite "simple" NodeJS template engine but it could easily be replaced with any other engine you wish.

Sample Usage

  1. Copy ejs.js to initializers/.
  2. Create a folder called templates/ and copy leaderboard.js there.
  3. Copy the sample 'getLeaderboard.js' action to actions/.
@crrobinson14
crrobinson14 / initializer.js
Created February 16, 2018 19:34
Clean old workers and tasks
module.exports = {
start: function(_api, next) {
var maxWorkerAge = 10000;
api.log('Removing stuck workers older than ' + maxWorkerAge + 'ms', 'info');
api.resque.queue.cleanOldWorkers(maxWorkerAge, function(err, result) {
if (err) {
api.log(err, 'error');
}
if (Object.keys(result).length > 0) {
api.log('Removed stuck workers with errors: ', 'info', result);
const Redis = require('redis');
const Config = require('./config.js');
const Log = require('./log.js');
let redisClient = Redis.createClient(Config.redis.uri);
// Locking utility function. This is based on https://github.com/errorception/redis-lock but we only needed a simple use-case of it,
// and redis-lock continually retries - we wanted to fail immediately if a lock was in use.
class Lock {
FROM node:8.6.0
#USER node
# Deal with node-gyp permissions issues in Docker
RUN npm -g config set user root
RUN mkdir /root/.npm-global
ENV PATH=/root/.npm-global/bin:$PATH
ENV NPM_CONFIG_PREFIX=/root/.npm-global
# Base tools
v8.6.0
5.3.0
[email protected] /Users/chad/projects/paltalk/webng/chat
├─┬ @webng/[email protected]
│ └── @webng/[email protected] deduped
├─┬ @webng/[email protected]
│ ├── [email protected] deduped
│ └── [email protected] deduped
├─┬ @webng/[email protected]
│ ├─┬ [email protected]