Skip to content

Instantly share code, notes, and snippets.


Daniel Bradley danielrbradley

View GitHub Profile
danielrbradley / index.ts
Created Sep 16, 2021
AWS API Gateway, JWT Authorizer with Cognito and CORS support
View index.ts
* Annotated, real-world example of how to use
* AWS API Gateway V2 + JWT authorizer + Cognito
* with support for CORS & good security practices
* deployed with Pulumi (
import * as pulumi from '@pulumi/pulumi';
import * as aws from '@pulumi/aws';
import serverlessExpress from '@vendia/serverless-express';
import express from 'express';
danielrbradley / Stream Analytics UDS int
Last active Mar 2, 2021
Reproduction of Stream Analytics Query UDF integer overflow
View Stream Analytics UDS int

When returning a number from a UDF function which is greater than 2,147,483,647 but less than long.MaxValue and bound to a Stream Analytics bigint type then the number is shown as a negative which indicates that the integer has been overflowed. This error does not happen when using the local or portal query tester.

The workaround we've used to return the value as a string. However, this behaviour does not match the documentation:

danielrbradley / OfflineApp.tsx
Created Nov 5, 2019
Integrating service worker auto-refresh with reach router
View OfflineApp.tsx
import React, { useEffect, useRef } from 'react';
import { Location } from '@reach/router';
import { register } from '../serviceWorker';
* Include this component around your router to register a service worker to cache the application
* so it works offline. Then, when the application has automatically updated itself, intercept the
* Reach router location change and do a hard browser navigation to enble the application updates
* to be applied.
* @example
danielrbradley / exec.ts
Created Oct 25, 2019
Pulumi custom component for running local commands
View exec.ts
import * as pulumi from '@pulumi/pulumi';
import { exec, ExecOptions } from 'child_process';
export type ExecArgs = {
command: pulumi.Input<string>;
options?: pulumi.Lifted<ExecOptions>;
export class Exec extends pulumi.ComponentResource {
stdout: pulumi.Output<string>;
danielrbradley /
Created Oct 22, 2019
Setting up ESLint & Prettier for Pulumi

Setting up ESLint & Prettier for Pulumi

This is my process for addint ESLint and Prettier support for a new Pulumi TypeScript project.

Install packages

yarn add -D @typescript-eslint/eslint-plugin @typescript-eslint/parser eslint eslint-config-airbnb-base eslint-config-prettier eslint-plugin-import eslint-plugin-prettier prettier
danielrbradley /
Last active Jan 8, 2020
Get console session with AWS access for 36 hours when using MFA
# Note: Depends on having jq and AWS CLI installed: `brew install jq`, `brew install awscli`
set -e # stop on error
export AWS_CONFIG_FILE='/dev/null' # ignore config file so CLI doesn't pick up MFA config
read -p "Enter MFA code for $MFA_SERIAL: " MFA
danielrbradley /
Created Aug 3, 2018
Script for backing up processed photos

My method for storing and backing up photos is as follows:

  1. All photos get downloaded into the Archive folder, in a folder for the current year, with the batch folder name starting with the date.
  2. The photos get reviewed, the ones which get picked are edited, exported as JPEGs, and the edit metadata saved alongside.
  3. Once editing is complete, the processed JPEGs are uploaded to wherever they're being shared (e.g. Google Photos).
  4. Run the script below which copies only files which have been picked and edited into the Best folder using the same folder names, but not grouped into years.
  5. The Best folder is backed up to a second local disk, and an offsite location (AWS Glacier).
  6. The Archive folder is only backed up onto a second local replicated disk.
danielrbradley / type.test.ts
Created Sep 15, 2017
Testing JSON matches TypeScript types
View type.test.ts
import { writeFileSync, mkdirSync, existsSync } from 'fs'
import { resolve } from 'path'
import * as ts from 'typescript'
function checkForTypeErrors(jsonContent: string) {
const tempDir = resolve('.tmp')
const tempFilePath = resolve(tempDir, 'typecheck.ts')
if (!existsSync(tempDir)) {
danielrbradley /
Last active Apr 13, 2017
AWS API Gateway proxy via Lambda

Headers added by chrome...

Going direct to the PNG:


When linked from img tag in an html page:

danielrbradley / unsafe.fsx
Last active Jan 1, 2017
Types instead of Hungarian notation
View unsafe.fsx
// Response to
// How to use types in place of naming conventions
module Unsafe
// What different variations do we want to handle?
type Encodable =
| Safe of string
| Unsafe of string
// Wrap our Request method to always mark the output as unsafe