Add comprehensive installation and setup documentation

- Add GETTING_STARTED.md with quick start guide and development modes
- Add INSTALL.sh automated installation script
- Add INSTALLATION_CHECKLIST.md, INSTALLATION_SUCCESS.md, and INSTALLATION_SUMMARY.md
- Add QUICK_REFERENCE.md for common commands
- Add SETUP_GUIDE.md with detailed setup instructions
- Update README.md with improved project overview
- Add did-wallet app dependencies and node_modules
This commit is contained in:
Dorian
2026-01-27 17:18:21 +00:00
parent a81f655133
commit 0d073fa89e
22658 changed files with 4494151 additions and 6 deletions
+104
View File
@@ -0,0 +1,104 @@
# race-signal
[![codecov](https://img.shields.io/codecov/c/github/achingbrain/race-signal.svg?style=flat-square)](https://codecov.io/gh/achingbrain/race-signal)
[![CI](https://img.shields.io/github/actions/workflow/status/achingbrain/race-signal/js-test-and-release.yml?branch=main\&style=flat-square)](https://github.com/achingbrain/race-signal/actions/workflows/js-test-and-release.yml?query=branch%3Amain)
> Race a promise against an AbortSignal
# About
<!--
!IMPORTANT!
Everything in this README between "# About" and "# Install" is automatically
generated and will be overwritten the next time the doc generator is run.
To make changes to this section, please update the @packageDocumentation section
of src/index.js or src/index.ts
To experiment with formatting, please run "npm run docs" from the root of this
repo and examine the changes made.
-->
Pass a promise and an abort signal and await the result.
## Example - Basic usage
```ts
import { raceSignal } from 'race-signal'
const controller = new AbortController()
const promise = new Promise((resolve, reject) => {
setTimeout(() => {
resolve('a value')
}, 1000)
})
setTimeout(() => {
controller.abort()
}, 500)
// throws an AbortError
const resolve = await raceSignal(promise, controller.signal)
```
## Example - Overriding errors
By default the thrown error is the `.reason` property of the signal but it's
possible to override this behaviour with the `translateError` option:
```ts
import { raceSignal } from 'race-signal'
const controller = new AbortController()
const promise = new Promise((resolve, reject) => {
setTimeout(() => {
resolve('a value')
}, 1000)
})
setTimeout(() => {
controller.abort()
}, 500)
// throws `Error('Oh no!')`
const resolve = await raceSignal(promise, controller.signal, {
translateError: (signal) => {
// use `signal`, or don't
return new Error('Oh no!')
}
})
```
# Install
```console
$ npm i race-signal
```
## Browser `<script>` tag
Loading this module through a script tag will make its exports available as `RaceSignal` in the global namespace.
```html
<script src="https://unpkg.com/race-signal/dist/index.min.js"></script>
```
# API Docs
- <https://achingbrain.github.io/race-signal>
# License
Licensed under either of
- Apache 2.0, ([LICENSE-APACHE](https://github.com/achingbrain/race-signal/LICENSE-APACHE) / <http://www.apache.org/licenses/LICENSE-2.0>)
- MIT ([LICENSE-MIT](https://github.com/achingbrain/race-signal/LICENSE-MIT) / <http://opensource.org/licenses/MIT>)
# Contribution
Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.
+4
View File
@@ -0,0 +1,4 @@
(function (root, factory) {(typeof module === 'object' && module.exports) ? module.exports = factory() : root.RaceSignal = factory()}(typeof self !== 'undefined' ? self : this, function () {
"use strict";var RaceSignal=(()=>{var o=Object.defineProperty;var l=Object.getOwnPropertyDescriptor;var u=Object.getOwnPropertyNames;var f=Object.prototype.hasOwnProperty;var i=(e,r)=>{for(var n in r)o(e,n,{get:r[n],enumerable:!0})},s=(e,r,n,a)=>{if(r&&typeof r=="object"||typeof r=="function")for(let t of u(r))!f.call(e,t)&&t!==n&&o(e,t,{get:()=>r[t],enumerable:!(a=l(r,t))||a.enumerable});return e};var d=e=>s(o({},"__esModule",{value:!0}),e);var b={};i(b,{raceSignal:()=>E});function v(e){return e.reason}async function E(e,r,n){if(r==null)return e;let a=n?.translateError??v;if(r.aborted)return e.catch(()=>{}),Promise.reject(a(r));let t;try{return await Promise.race([e,new Promise((y,c)=>{t=()=>{c(a(r))},r.addEventListener("abort",t)})])}finally{t!=null&&r.removeEventListener("abort",t)}}return d(b);})();
return RaceSignal}));
//# sourceMappingURL=index.min.js.map
+7
View File
@@ -0,0 +1,7 @@
{
"version": 3,
"sources": ["../src/index.ts"],
"sourcesContent": ["/**\n * @packageDocumentation\n *\n * Pass a promise and an abort signal and await the result.\n *\n * @example Basic usage\n *\n * ```ts\n * import { raceSignal } from 'race-signal'\n *\n * const controller = new AbortController()\n *\n * const promise = new Promise((resolve, reject) => {\n * setTimeout(() => {\n * resolve('a value')\n * }, 1000)\n * })\n *\n * setTimeout(() => {\n * controller.abort()\n * }, 500)\n *\n * // throws an AbortError\n * const resolve = await raceSignal(promise, controller.signal)\n * ```\n *\n * @example Overriding errors\n *\n * By default the thrown error is the `.reason` property of the signal but it's\n * possible to override this behaviour with the `translateError` option:\n *\n * ```ts\n * import { raceSignal } from 'race-signal'\n *\n * const controller = new AbortController()\n *\n * const promise = new Promise((resolve, reject) => {\n * setTimeout(() => {\n * resolve('a value')\n * }, 1000)\n * })\n *\n * setTimeout(() => {\n * controller.abort()\n * }, 500)\n *\n * // throws `Error('Oh no!')`\n * const resolve = await raceSignal(promise, controller.signal, {\n * translateError: (signal) => {\n * // use `signal`, or don't\n * return new Error('Oh no!')\n * }\n * })\n * ```\n */\n\nexport interface RaceSignalOptions {\n /**\n * By default the rejection reason will be taken from the `.reason` field of\n * the aborted signal.\n *\n * Passing a function here allows overriding the default error.\n */\n translateError?(signal: AbortSignal): Error\n}\n\nfunction defaultTranslate (signal: AbortSignal): Error {\n return signal.reason\n}\n\n/**\n * Race a promise against an abort signal\n */\nexport async function raceSignal <T> (promise: Promise<T>, signal?: AbortSignal, opts?: RaceSignalOptions): Promise<T> {\n if (signal == null) {\n return promise\n }\n\n const translateError = opts?.translateError ?? defaultTranslate\n\n if (signal.aborted) {\n // the passed promise may yet resolve or reject but the use has signalled\n // they are no longer interested so smother the error\n promise.catch(() => {})\n return Promise.reject(translateError(signal))\n }\n\n let listener\n\n try {\n return await Promise.race([\n promise,\n new Promise<T>((resolve, reject) => {\n listener = () => {\n reject(translateError(signal))\n }\n signal.addEventListener('abort', listener)\n })\n ])\n } finally {\n if (listener != null) {\n signal.removeEventListener('abort', listener)\n }\n }\n}\n"],
"mappings": ";8bAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,gBAAAE,IAkEA,SAASC,EAAkBC,EAAmB,CAC5C,OAAOA,EAAO,MAChB,CAKA,eAAsBF,EAAgBG,EAAqBD,EAAsBE,EAAwB,CACvG,GAAIF,GAAU,KACZ,OAAOC,EAGT,IAAME,EAAiBD,GAAM,gBAAkBH,EAE/C,GAAIC,EAAO,QAGT,OAAAC,EAAQ,MAAM,IAAK,CAAE,CAAC,EACf,QAAQ,OAAOE,EAAeH,CAAM,CAAC,EAG9C,IAAII,EAEJ,GAAI,CACF,OAAO,MAAM,QAAQ,KAAK,CACxBH,EACA,IAAI,QAAW,CAACI,EAASC,IAAU,CACjCF,EAAW,IAAK,CACdE,EAAOH,EAAeH,CAAM,CAAC,CAC/B,EACAA,EAAO,iBAAiB,QAASI,CAAQ,CAC3C,CAAC,EACF,CACH,SACMA,GAAY,MACdJ,EAAO,oBAAoB,QAASI,CAAQ,CAEhD,CACF",
"names": ["index_exports", "__export", "raceSignal", "defaultTranslate", "signal", "promise", "opts", "translateError", "listener", "resolve", "reject"]
}
+69
View File
@@ -0,0 +1,69 @@
/**
* @packageDocumentation
*
* Pass a promise and an abort signal and await the result.
*
* @example Basic usage
*
* ```ts
* import { raceSignal } from 'race-signal'
*
* const controller = new AbortController()
*
* const promise = new Promise((resolve, reject) => {
* setTimeout(() => {
* resolve('a value')
* }, 1000)
* })
*
* setTimeout(() => {
* controller.abort()
* }, 500)
*
* // throws an AbortError
* const resolve = await raceSignal(promise, controller.signal)
* ```
*
* @example Overriding errors
*
* By default the thrown error is the `.reason` property of the signal but it's
* possible to override this behaviour with the `translateError` option:
*
* ```ts
* import { raceSignal } from 'race-signal'
*
* const controller = new AbortController()
*
* const promise = new Promise((resolve, reject) => {
* setTimeout(() => {
* resolve('a value')
* }, 1000)
* })
*
* setTimeout(() => {
* controller.abort()
* }, 500)
*
* // throws `Error('Oh no!')`
* const resolve = await raceSignal(promise, controller.signal, {
* translateError: (signal) => {
* // use `signal`, or don't
* return new Error('Oh no!')
* }
* })
* ```
*/
export interface RaceSignalOptions {
/**
* By default the rejection reason will be taken from the `.reason` field of
* the aborted signal.
*
* Passing a function here allows overriding the default error.
*/
translateError?(signal: AbortSignal): Error;
}
/**
* Race a promise against an abort signal
*/
export declare function raceSignal<T>(promise: Promise<T>, signal?: AbortSignal, opts?: RaceSignalOptions): Promise<T>;
//# sourceMappingURL=index.d.ts.map
+1
View File
@@ -0,0 +1 @@
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsDG;AAEH,MAAM,WAAW,iBAAiB;IAChC;;;;;OAKG;IACH,cAAc,CAAC,CAAC,MAAM,EAAE,WAAW,GAAG,KAAK,CAAA;CAC5C;AAMD;;GAEG;AACH,wBAAsB,UAAU,CAAE,CAAC,EAAG,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,EAAE,WAAW,EAAE,IAAI,CAAC,EAAE,iBAAiB,GAAG,OAAO,CAAC,CAAC,CAAC,CA+BrH"}
+91
View File
@@ -0,0 +1,91 @@
/**
* @packageDocumentation
*
* Pass a promise and an abort signal and await the result.
*
* @example Basic usage
*
* ```ts
* import { raceSignal } from 'race-signal'
*
* const controller = new AbortController()
*
* const promise = new Promise((resolve, reject) => {
* setTimeout(() => {
* resolve('a value')
* }, 1000)
* })
*
* setTimeout(() => {
* controller.abort()
* }, 500)
*
* // throws an AbortError
* const resolve = await raceSignal(promise, controller.signal)
* ```
*
* @example Overriding errors
*
* By default the thrown error is the `.reason` property of the signal but it's
* possible to override this behaviour with the `translateError` option:
*
* ```ts
* import { raceSignal } from 'race-signal'
*
* const controller = new AbortController()
*
* const promise = new Promise((resolve, reject) => {
* setTimeout(() => {
* resolve('a value')
* }, 1000)
* })
*
* setTimeout(() => {
* controller.abort()
* }, 500)
*
* // throws `Error('Oh no!')`
* const resolve = await raceSignal(promise, controller.signal, {
* translateError: (signal) => {
* // use `signal`, or don't
* return new Error('Oh no!')
* }
* })
* ```
*/
function defaultTranslate(signal) {
return signal.reason;
}
/**
* Race a promise against an abort signal
*/
export async function raceSignal(promise, signal, opts) {
if (signal == null) {
return promise;
}
const translateError = opts?.translateError ?? defaultTranslate;
if (signal.aborted) {
// the passed promise may yet resolve or reject but the use has signalled
// they are no longer interested so smother the error
promise.catch(() => { });
return Promise.reject(translateError(signal));
}
let listener;
try {
return await Promise.race([
promise,
new Promise((resolve, reject) => {
listener = () => {
reject(translateError(signal));
};
signal.addEventListener('abort', listener);
})
]);
}
finally {
if (listener != null) {
signal.removeEventListener('abort', listener);
}
}
}
//# sourceMappingURL=index.js.map
+1
View File
@@ -0,0 +1 @@
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsDG;AAYH,SAAS,gBAAgB,CAAE,MAAmB;IAC5C,OAAO,MAAM,CAAC,MAAM,CAAA;AACtB,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAAM,OAAmB,EAAE,MAAoB,EAAE,IAAwB;IACvG,IAAI,MAAM,IAAI,IAAI,EAAE,CAAC;QACnB,OAAO,OAAO,CAAA;IAChB,CAAC;IAED,MAAM,cAAc,GAAG,IAAI,EAAE,cAAc,IAAI,gBAAgB,CAAA;IAE/D,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QACnB,yEAAyE;QACzE,qDAAqD;QACrD,OAAO,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAA;QACvB,OAAO,OAAO,CAAC,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAA;IAC/C,CAAC;IAED,IAAI,QAAQ,CAAA;IAEZ,IAAI,CAAC;QACH,OAAO,MAAM,OAAO,CAAC,IAAI,CAAC;YACxB,OAAO;YACP,IAAI,OAAO,CAAI,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;gBACjC,QAAQ,GAAG,GAAG,EAAE;oBACd,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAA;gBAChC,CAAC,CAAA;gBACD,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAA;YAC5C,CAAC,CAAC;SACH,CAAC,CAAA;IACJ,CAAC;YAAS,CAAC;QACT,IAAI,QAAQ,IAAI,IAAI,EAAE,CAAC;YACrB,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAA;QAC/C,CAAC;IACH,CAAC;AACH,CAAC"}
+6
View File
@@ -0,0 +1,6 @@
{
"RaceSignalOptions": "https://achingbrain.github.io/race-signal/interfaces/RaceSignalOptions.html",
".:RaceSignalOptions": "https://achingbrain.github.io/race-signal/interfaces/RaceSignalOptions.html",
"raceSignal": "https://achingbrain.github.io/race-signal/functions/raceSignal.html",
".:raceSignal": "https://achingbrain.github.io/race-signal/functions/raceSignal.html"
}
+143
View File
@@ -0,0 +1,143 @@
{
"name": "race-signal",
"version": "2.0.0",
"description": "Race a promise against an AbortSignal",
"author": "Alex Potsides <alex@achingbrain.net>",
"license": "Apache-2.0 OR MIT",
"homepage": "https://github.com/achingbrain/race-signal#readme",
"repository": {
"type": "git",
"url": "git+https://github.com/achingbrain/race-signal.git"
},
"bugs": {
"url": "https://github.com/achingbrain/race-signal/issues"
},
"publishConfig": {
"access": "public",
"provenance": true
},
"type": "module",
"types": "./dist/src/index.d.ts",
"files": [
"src",
"dist",
"!dist/test",
"!**/*.tsbuildinfo"
],
"exports": {
".": {
"types": "./dist/src/index.d.ts",
"import": "./dist/src/index.js"
}
},
"release": {
"branches": [
"main"
],
"plugins": [
[
"@semantic-release/commit-analyzer",
{
"preset": "conventionalcommits",
"releaseRules": [
{
"breaking": true,
"release": "major"
},
{
"revert": true,
"release": "patch"
},
{
"type": "feat",
"release": "minor"
},
{
"type": "fix",
"release": "patch"
},
{
"type": "docs",
"release": "patch"
},
{
"type": "test",
"release": "patch"
},
{
"type": "deps",
"release": "patch"
},
{
"scope": "no-release",
"release": false
}
]
}
],
[
"@semantic-release/release-notes-generator",
{
"preset": "conventionalcommits",
"presetConfig": {
"types": [
{
"type": "feat",
"section": "Features"
},
{
"type": "fix",
"section": "Bug Fixes"
},
{
"type": "chore",
"section": "Trivial Changes"
},
{
"type": "docs",
"section": "Documentation"
},
{
"type": "deps",
"section": "Dependencies"
},
{
"type": "test",
"section": "Tests"
}
]
}
}
],
"@semantic-release/changelog",
"@semantic-release/npm",
"@semantic-release/github",
[
"@semantic-release/git",
{
"assets": [
"CHANGELOG.md",
"package.json"
]
}
]
]
},
"scripts": {
"clean": "aegir clean",
"lint": "aegir lint",
"build": "aegir build",
"test": "aegir test",
"test:node": "aegir test -t node --cov",
"test:chrome": "aegir test -t browser --cov",
"test:chrome-webworker": "aegir test -t webworker",
"test:firefox": "aegir test -t browser -- --browser firefox",
"test:firefox-webworker": "aegir test -t webworker -- --browser firefox",
"release": "aegir release",
"dep-check": "aegir dep-check",
"docs": "aegir docs"
},
"devDependencies": {
"aegir": "^47.0.21"
}
}
+105
View File
@@ -0,0 +1,105 @@
/**
* @packageDocumentation
*
* Pass a promise and an abort signal and await the result.
*
* @example Basic usage
*
* ```ts
* import { raceSignal } from 'race-signal'
*
* const controller = new AbortController()
*
* const promise = new Promise((resolve, reject) => {
* setTimeout(() => {
* resolve('a value')
* }, 1000)
* })
*
* setTimeout(() => {
* controller.abort()
* }, 500)
*
* // throws an AbortError
* const resolve = await raceSignal(promise, controller.signal)
* ```
*
* @example Overriding errors
*
* By default the thrown error is the `.reason` property of the signal but it's
* possible to override this behaviour with the `translateError` option:
*
* ```ts
* import { raceSignal } from 'race-signal'
*
* const controller = new AbortController()
*
* const promise = new Promise((resolve, reject) => {
* setTimeout(() => {
* resolve('a value')
* }, 1000)
* })
*
* setTimeout(() => {
* controller.abort()
* }, 500)
*
* // throws `Error('Oh no!')`
* const resolve = await raceSignal(promise, controller.signal, {
* translateError: (signal) => {
* // use `signal`, or don't
* return new Error('Oh no!')
* }
* })
* ```
*/
export interface RaceSignalOptions {
/**
* By default the rejection reason will be taken from the `.reason` field of
* the aborted signal.
*
* Passing a function here allows overriding the default error.
*/
translateError?(signal: AbortSignal): Error
}
function defaultTranslate (signal: AbortSignal): Error {
return signal.reason
}
/**
* Race a promise against an abort signal
*/
export async function raceSignal <T> (promise: Promise<T>, signal?: AbortSignal, opts?: RaceSignalOptions): Promise<T> {
if (signal == null) {
return promise
}
const translateError = opts?.translateError ?? defaultTranslate
if (signal.aborted) {
// the passed promise may yet resolve or reject but the use has signalled
// they are no longer interested so smother the error
promise.catch(() => {})
return Promise.reject(translateError(signal))
}
let listener
try {
return await Promise.race([
promise,
new Promise<T>((resolve, reject) => {
listener = () => {
reject(translateError(signal))
}
signal.addEventListener('abort', listener)
})
])
} finally {
if (listener != null) {
signal.removeEventListener('abort', listener)
}
}
}