Skip to content

Commit

Permalink
chore: Refactoring adding test and examples
Browse files Browse the repository at this point in the history
  • Loading branch information
pigri committed Mar 15, 2024
1 parent 2f8f46f commit e2ebc14
Show file tree
Hide file tree
Showing 18 changed files with 3,496 additions and 490 deletions.
23 changes: 23 additions & 0 deletions .github/workflows/test.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
name: Sync service prod

on:
push:
branches:
- main
paths:
- src/**
- tests/**
- .github/workflows/**.yaml
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Use Node.js
uses: actions/setup-node@v4
with:
node-version: '20.x'
cache: 'pnpm'
- run: pnpm install
- run: pnpm run build
- run: NODE_ENV=test pnpm test
7 changes: 6 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -131,4 +131,9 @@ dist
wrangler.toml
.wrangler
.idea
lib/
lib/

# Build files
/dist
example/node_modules
example/.wrangler
46 changes: 6 additions & 40 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,50 +1,16 @@
# cf-n8n-proxy
Cloudflare worker for n8n proxy

You need a paid Worker plan ($5 USD) for this service due to the queue.
Requirements:
- A cloudflare domain

cloudflare -> cloudflare worker -> n8n
# Hash function for Cloudflare Workers

## How to use?

### Wrangler install
```
npm install -g wrangler pnpm
```

### NPM package install
```
pnpm install
```

### Wrangler login
```
wrangler login
```
### Hasher
[Available hash functions](https://developer.mozilla.org/en-US/docs/Web/API/SubtleCrypto/digest#algorithm)

### Create your wrangler config
```
cp wrangler.toml_example wrangler.toml
import { hasher } from 'cf-workers-hash';
await hasher('test', 'SHA-256');
```

- Change everywhere example.com to your domain


### Create queue
```
wrangler queues create cf-n8n-proxy-production -e production
wrangler queues create dlq-cf-n8n-proxy-production -e production
```

### Deploy your service
```
wrangler deploy -e production
```


### How to test in local?
```
wrangler dev
npm test
```
54 changes: 54 additions & 0 deletions example/.eslint.rc.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
module.exports = {
parser: '@typescript-eslint/parser',
parserOptions: {
ecmaVersion: 2018, // Allows for the parsing of modern ECMAScript features
sourceType: 'module' // Allows for the use of imports
},
root: true,
env: { node: true, browser: true, serviceworker: true },
plugins: ['@typescript-eslint', 'prettier'],
extends: ['plugin:@typescript-eslint/eslint-recommended', 'prettier/@typescript-eslint'],
ignorePatterns: ['dist/', 'node_modules/'],
rules: {
// 'no-console': process.env.NODE_ENV === 'production' ? 'error' : 'off',
// 'no-debugger': process.env.NODE_ENV === 'production' ? 'error' : 'off',
'array-callback-return': 'error',
complexity: ['error', { max: 5 }],
'max-lines-per-function': ['error', { max: 33 }],
'max-nested-callbacks': ['error', 3],
'max-depth': ['error', 4],
'max-statements': ['error', 10, { ignoreTopLevelFunctions: true }],
'consistent-return': 'error',
eqeqeq: ['error', 'always'],
'no-implicit-coercion': 'error',
'no-invalid-this': 'error',
'no-new-wrappers': 'error',
'no-return-assign': 'error',
'no-return-await': 'error',
'no-sequences': 'error',
'no-throw-literal': 'error',
'no-unused-expressions': 'error',
'no-useless-catch': 'error',
'no-useless-escape': 'error',
'@typescript-eslint/no-unused-vars': [
'error',
{
argsIgnorePattern: '^_',
ignoreRestSiblings: true,
caughtErrors: 'none'
}
],
'no-useless-return': 'error',
'prefer-promise-reject-errors': 'error',
'require-await': 'error',
yoda: 'error',
camelcase: 'error',
'no-mixed-operators': 'error',
'prefer-const': 'error',
'prefer-template': 'error',
'template-curly-spacing': ['error', 'never'],
'func-names': ['error', 'always'],
'padding-line-between-statements': ['error', { blankLine: 'always', prev: '*', next: 'return' }],
'arrow-parens': [2, 'as-needed']
}
};
5 changes: 5 additions & 0 deletions example/.prettierrc
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
{
"printWidth": 140,
"singleQuote": true,
"semi": true
}
25 changes: 25 additions & 0 deletions example/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
{
"name": "cf-n8n-proxy",
"scripts": {
"dev": "wrangler dev"
},
"devDependencies": {
"@cloudflare/workers-types": "4.20240314.0",
"@types/node": "20.11.28",
"eslint-config-prettier": "9.1.0",
"eslint-plugin-prettier": "5.1.3",
"pnpm": "latest",
"prettier": "3.2.5",
"typescript": "5.4.2",
"wrangler": "3.34.2"
},
"dependencies": {
"cf-workers-hash": "github:pigri/cf-workers-hash",
"itty-fetcher": "0.9.4",
"itty-router": "4.2.1"
},
"engines": {
"node": ">=18",
"pnpm": ">=8"
}
}
14 changes: 14 additions & 0 deletions example/src/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
import { hasher } from '../../src';

export default {
async fetch(request: Request) {
const testString = 'test';
const hash = await hasher(testString, 'SHA-256');
const data = {
testString,
hash,
};

return Response.json(data);
},
} satisfies ExportedHandler;
118 changes: 118 additions & 0 deletions example/tsconfig.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,118 @@
{
"compilerOptions": {
/* Visit https://aka.ms/tsconfig.json to read more about this file */

/* Projects */
// "incremental": true, /* Enable incremental compilation */
// "composite": true, /* Enable constraints that allow a TypeScript project to be used with project references. */
// "tsBuildInfoFile": "./", /* Specify the folder for .tsbuildinfo incremental compilation files. */
// "disableSourceOfProjectReferenceRedirect": true, /* Disable preferring source files instead of declaration files when referencing composite projects */
// "disableSolutionSearching": true, /* Opt a project out of multi-project reference checking when editing. */
// "disableReferencedProjectLoad": true, /* Reduce the number of projects loaded automatically by TypeScript. */

/* Language and Environment */
"target": "esnext"
/* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */,
"lib": [
"esnext"
]
/* Specify a set of bundled library declaration files that describe the target runtime environment. */,
// "experimentalDecorators": true, /* Enable experimental support for TC39 stage 2 draft decorators. */
// "emitDecoratorMetadata": true, /* Emit design-type metadata for decorated declarations in source files. */
// "jsxFactory": "", /* Specify the JSX factory function used when targeting React JSX emit, e.g. 'React.createElement' or 'h' */
// "jsxFragmentFactory": "", /* Specify the JSX Fragment reference used for fragments when targeting React JSX emit e.g. 'React.Fragment' or 'Fragment'. */
// "jsxImportSource": "", /* Specify module specifier used to import the JSX factory functions when using `jsx: react-jsx*`.` */
// "reactNamespace": "", /* Specify the object invoked for `createElement`. This only applies when targeting `react` JSX emit. */
// "noLib": true, /* Disable including any library files, including the default lib.d.ts. */
// "useDefineForClassFields": true, /* Emit ECMAScript-standard-compliant class fields. */

/* Modules */
"module": "esnext"
/* Specify what module code is generated. */,
// "rootDir": "./", /* Specify the root folder within your source files. */
"moduleResolution": "node"
/* Specify how TypeScript looks up a file from a given module specifier. */,
// "baseUrl": "./", /* Specify the base directory to resolve non-relative module names. */
// "paths": {}, /* Specify a set of entries that re-map imports to additional lookup locations. */
// "rootDirs": [], /* Allow multiple folders to be treated as one when resolving modules. */
// "typeRoots": [], /* Specify multiple folders that act like `./node_modules/@types`. */
"types": [
"@cloudflare/workers-types",
"@types/node"
]
/* Specify type package names to be included without being referenced in a source file. */,
// "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */
"resolveJsonModule": true
/* Enable importing .json files */,
// "noResolve": true, /* Disallow `import`s, `require`s or `<reference>`s from expanding the number of files TypeScript should add to a project. */

/* JavaScript Support */
"allowJs": true
/* Allow JavaScript files to be a part of your program. Use the `checkJS` option to get errors from these files. */,
"checkJs": false
/* Enable error reporting in type-checked JavaScript files. */,
// "maxNodeModuleJsDepth": 1, /* Specify the maximum folder depth used for checking JavaScript files from `node_modules`. Only applicable with `allowJs`. */

/* Emit */
// "declaration": true, /* Generate .d.ts files from TypeScript and JavaScript files in your project. */
// "declarationMap": true, /* Create sourcemaps for d.ts files. */
// "emitDeclarationOnly": true, /* Only output d.ts files and not JavaScript files. */
// "sourceMap": true, /* Create source map files for emitted JavaScript files. */
// "outFile": "./", /* Specify a file that bundles all outputs into one JavaScript file. If `declaration` is true, also designates a file that bundles all .d.ts output. */
// "outDir": "./", /* Specify an output folder for all emitted files. */
// "removeComments": true, /* Disable emitting comments. */
"noEmit": true
/* Disable emitting files from a compilation. */,
// "importHelpers": true, /* Allow importing helper functions from tslib once per project, instead of including them per-file. */
// "importsNotUsedAsValues": "remove", /* Specify emit/checking behavior for imports that are only used for types */
// "downlevelIteration": true, /* Emit more compliant, but verbose and less performant JavaScript for iteration. */
// "sourceRoot": "", /* Specify the root path for debuggers to find the reference source code. */
// "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */
// "inlineSourceMap": true, /* Include sourcemap files inside the emitted JavaScript. */
// "inlineSources": true, /* Include source code in the sourcemaps inside the emitted JavaScript. */
// "emitBOM": true, /* Emit a UTF-8 Byte Order Mark (BOM) in the beginning of output files. */
// "newLine": "crlf", /* Set the newline character for emitting files. */
// "stripInternal": true, /* Disable emitting declarations that have `@internal` in their JSDoc comments. */
// "noEmitHelpers": true, /* Disable generating custom helper functions like `__extends` in compiled output. */
// "noEmitOnError": true, /* Disable emitting files if any type checking errors are reported. */
// "preserveConstEnums": true, /* Disable erasing `const enum` declarations in generated code. */
// "declarationDir": "./", /* Specify the output directory for generated declaration files. */
// "preserveValueImports": true, /* Preserve unused imported values in the JavaScript output that would otherwise be removed. */

/* Interop Constraints */
"isolatedModules": true
/* Ensure that each file can be safely transpiled without relying on other imports. */,
"allowSyntheticDefaultImports": true
/* Allow 'import x from y' when a module doesn't have a default export. */,
// "esModuleInterop": true /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables `allowSyntheticDefaultImports` for type compatibility. */,
// "preserveSymlinks": true, /* Disable resolving symlinks to their realpath. This correlates to the same flag in node. */
"forceConsistentCasingInFileNames": true
/* Ensure that casing is correct in imports. */,
/* Type Checking */
"strict": true
/* Enable all strict type-checking options. */,
// "noImplicitAny": true, /* Enable error reporting for expressions and declarations with an implied `any` type.. */
// "strictNullChecks": true, /* When type checking, take into account `null` and `undefined`. */
// "strictFunctionTypes": true, /* When assigning functions, check to ensure parameters and the return values are subtype-compatible. */
// "strictBindCallApply": true, /* Check that the arguments for `bind`, `call`, and `apply` methods match the original function. */
// "strictPropertyInitialization": true, /* Check for class properties that are declared but not set in the constructor. */
// "noImplicitThis": true, /* Enable error reporting when `this` is given the type `any`. */
// "useUnknownInCatchVariables": true, /* Type catch clause variables as 'unknown' instead of 'any'. */
// "alwaysStrict": true, /* Ensure 'use strict' is always emitted. */
// "noUnusedLocals": true, /* Enable error reporting when a local variables aren't read. */
// "noUnusedParameters": true, /* Raise an error when a function parameter isn't read */
// "exactOptionalPropertyTypes": true, /* Interpret optional property types as written, rather than adding 'undefined'. */
// "noImplicitReturns": true, /* Enable error reporting for codepaths that do not explicitly return in a function. */
// "noFallthroughCasesInSwitch": true, /* Enable error reporting for fallthrough cases in switch statements. */
// "noUncheckedIndexedAccess": true, /* Include 'undefined' in index signature results */
// "noImplicitOverride": true, /* Ensure overriding members in derived classes are marked with an override modifier. */
// "noPropertyAccessFromIndexSignature": true, /* Enforces using indexed accessors for keys declared using an indexed type */
// "allowUnusedLabels": true, /* Disable error reporting for unused labels. */
// "allowUnreachableCode": true, /* Disable error reporting for unreachable code. */

/* Completeness */
// "skipDefaultLibCheck": true, /* Skip type checking .d.ts files that are included with TypeScript. */
"skipLibCheck": true
/* Skip type checking all .d.ts files. */
}
}
14 changes: 14 additions & 0 deletions example/worker-configuration.d.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
interface Queue<any> {
send(message: any): Promise<void>;
}

interface Env {
readonly ENVIRONMENT: string;
readonly ERROR_QUEUE: Queue<any>;
readonly PROXY_DOMAIN: string;
readonly WEBHOOK_PATH: string;
readonly WEBHOOK_TEST_PATH: string;
readonly DEDUPLICATION: boolean;
readonly DEDUPLICATION_TTL: number;
readonly DEDUPLICATION_KV: KVNamespace;
}
4 changes: 4 additions & 0 deletions jest.config.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
module.exports = {
preset: "ts-jest",
testEnvironment: "node",
};
21 changes: 15 additions & 6 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,15 @@
"name": "cf-workers-hash",
"version": "0.0.1",
"description": "A simple hash function for Cloudflare Workers",
"main": "index.js",
"main": "./dist/index.js",
"module": "./dist/index.mjs",
"types": "./dist/index.d.ts",
"files": [
"dist"
],
"scripts": {
"test": "npm test",
"build": "tsc"
"test": "jest",
"build": "tsup"
},
"repository": {
"type": "git",
Expand All @@ -19,14 +24,18 @@
"cf"
],
"devDependencies": {
"@types/node": "20.11.28",
"@cloudflare/workers-types": "4.20240314.0",
"@types/jest": "29.5.12",
"@types/node": "20.11.28",
"eslint-config-prettier": "9.1.0",
"eslint-plugin-prettier": "5.1.3",
"jest": "29.7.0",
"pnpm": "latest",
"prettier": "3.2.5",
"ts-jest": "29.1.2",
"tsup": "8.0.2",
"typescript": "5.4.2",
"wrangler": "3.34.2",
"pnpm": "latest"
"wrangler": "3.34.2"
},
"engines": {
"node": ">=18",
Expand Down
Loading

0 comments on commit e2ebc14

Please sign in to comment.