Skip to content

Instantly share code, notes, and snippets.

View sperand-io's full-sized avatar

Chris Sperandio sperand-io

  • Stripe
  • SF
View GitHub Profile
@sperand-io
sperand-io / granularDecision.js
Last active October 31, 2023 10:05
Example of using analytics.js conditional loading with TrustArc Consent Manager
// To get started, make sure you're using the latest version of the analytics.js snippet (4.1.0 or above)
// and remove the `analytics.load("YOUR_WRITE_KEY")` call. then drop this script below the snippet.
// this is a standalone script for modern browsers. if you'd like to target older browsers, include
// a fetch polyfill and use that instead of window.fetch. This would require that you build and package the
// script somehow (rollup, webpack, browserify, etc). You may also want to transpile it to ES5 w eg Babel.
// This script is configured to make all collection opt-in (rather than opt-out) for all users.
// If you want to conditionally require whether or not to block data collection before affirmative consent, use something
// like inEU below and pass that function into `conditionallyLoadAnalytics`. If you want to collect data until the user
@sperand-io
sperand-io / worker.js
Last active October 28, 2023 09:41
Cloudflare Workers / Segment Smart Proxy — serve data collection assets and endpoints from your own domain
/**
* Steps to use:
* 1. Create CF Worker, copy and paste this in
* 2. (Optional) Update configuration defaults
* - If you want to manage in code, do so below under "Static Configuration"
* - If you want dynamic custom config: Create CFW KV namespace, link them, and add reference below
*
* - You can overwrite default path prefix for loading analytics.js (<yourdomain>/ajs)
* (corresponding KV entry: `script_path_prefix`)
* - You can overwrite default path prefix for handling first-party data collection (<yourdomain>/data)
@sperand-io
sperand-io / iframeSnippet.html
Last active January 6, 2022 22:56
Using Segment via iFrame Communication
<script>
/**
* Provides a fake analytics object that sends all calls to the parent window for processing
*/
var analytics = (function() {
var eventQueue = [];
// Send the events to the frame if it's ready.
function flush(method, args) {
while (eventQueue.length) {
@sperand-io
sperand-io / index.js
Last active September 7, 2020 12:09
Koa EventSource Streaming (SSE)
const PassThrough = require('stream').PassThrough;
const Router = require('koa-66');
const router = new Router();
const Koa = require('koa');
const app = new Koa();
// ...
const sse = (event, data) => {
return `event:${ event }\ndata: ${ data }\n\n`
@sperand-io
sperand-io / segment-function.js
Last active August 28, 2020 05:36
segment events -> rockset
// https://segment.com/docs/connections/functions/destination-functions/
export const track = insertEvent
export const identify = insertEvent
export const page = insertEvent
export const screen = insertEvent
export const group = insertEvent
// https://docs.rockset.com/rest-api/#patchdocuments
const insertEvent = async (msg, { collection, workspace, apiKey }) => {
const endpoint = `https://api.rs2.usw2.rockset.com/v1/orgs/self/ws/${workspace}/collections/${collection}/docs`
@sperand-io
sperand-io / index.js
Last active March 30, 2020 21:24
Segment OCI Streaming Function
async function track(e, settings) {
return await send(e, settings)
}
async function identify(e, settings) {
return await send(e, settings)
}
async function group(e, settings) {
return await send(e, settings)
@sperand-io
sperand-io / index.js
Created April 24, 2019 17:45
Auryc update
// adds a check (`g.auryc[fn] !== wrapper`) to prevent the recursion when auryc isn’t loaded yet
// fixed the usage of `arguments`
function safeInvoke(g, fn) {
return function wrapper() {
if (g.auryc && typeof g.auryc[fn] !== 'undefined' && g.auryc[fn] !== wrapper) {
g.auryc[fn].call(this, Array.prototype.slice.call(arguments, 0));
}
else {
g.aurycReadyCb.push(function () {
@sperand-io
sperand-io / tagManager.js
Last active April 1, 2019 18:36
Piggybacking Segment Events for Ad-Hoc Conversion Pixels
/**
* Pixel Loader.
* It will make the http request on construction, no need to dom insert.
*/
const loadPixel = (src, fn=()=>{}) => ({
...new Image,
onload() { fn() },
height: 1,
@sperand-io
sperand-io / index.js
Created November 5, 2018 19:48
Override errant referrers
// on page with the payment/login button that they leave from
var link = document.getElementById('paymentOrLoginLinkElementID')
var href = link.getAttribute('href');
link.addEventListener('click', function(event){
// before progressing to the link, save the referrer
event.preventDefault();
sessionStorage.setItem('ctxReferrer', document.referrer);
window.location.href = href;
});
@sperand-io
sperand-io / formIdentify.js
Last active August 1, 2018 18:52
Squarespace Form Submission -> Segment "Identify"
/**
* helper function to take the form and
* get back a js object with field/value mappings
* ignoring submit fields and fields whose name we can't ascertain
*/
function serialize(form){
return Array.prototype.slice.call(form.elements)
.filter(isInputElement)
.filter(isNotSubmit)