Skip to content

Commit

Permalink
Create remote-controlled-promise
Browse files Browse the repository at this point in the history
  • Loading branch information
KSXGitHub committed Jun 6, 2018
1 parent 481e9f7 commit f902d12
Show file tree
Hide file tree
Showing 5 changed files with 153 additions and 0 deletions.
3 changes: 3 additions & 0 deletions packages/typescript/remote-controlled-promise/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
import create from './lib'
export default create
export * from './lib'
59 changes: 59 additions & 0 deletions packages/typescript/remote-controlled-promise/lib/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
export function create<Value, Reason = Error> () {
let resolve: Controller.Resolver<Value>
let reject: Controller.Rejecter<Reason>

const controller = new Controller<Value, Reason>(
x => resolve(x),
x => reject(x)
)

const promise = new Promise<Value>((res, rej) => {
resolve = res
reject = rej
})

return new ControlledPromise(controller, promise)
}

export class ControlledPromise<Value, Reason> {
readonly controller: Controller<Value, Reason>
readonly promise: Promise<Value>

constructor (
controller: Controller<Value, Reason>,
promise: Promise<Value>
) {
this.controller = controller
this.promise = promise
}

resolve (value: Value) {
this.controller.resolve(value)
return this.promise
}

reject (reason: Reason) {
this.controller.reject(reason)
return this.promise
}
}

export class Controller<Value, Reason> {
readonly resolve: Controller.Resolver<Value>
readonly reject: Controller.Rejecter<Reason>

constructor (
resolve: Controller.Resolver<Value>,
reject: Controller.Rejecter<Reason>
) {
this.resolve = resolve
this.reject = reject
}
}

export namespace Controller {
export type Resolver<X> = (x: Promise<X> | X) => void
export type Rejecter<X> = (x: X) => void
}

export default create
28 changes: 28 additions & 0 deletions packages/typescript/remote-controlled-promise/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
{
"name": "remote-controlled-promise",
"version": "0.0.0",
"description": "Create a Promise object that is controllable from outside",
"author": "Hoàng Văn Khải <hvksmr1996@gmail.com>",
"license": "MIT",
"homepage": "https://github.com/ksxnodemodules/nodemonorepo#readme",
"repository": {
"type": "git",
"url": "git+https://github.com/ksxnodemodules/nodemonorepo.git"
},
"bugs": {
"url": "https://github.com/ksxnodemodules/nodemonorepo/issues"
},
"keywords": [
"promise",
"remote",
"control",
"external"
],
"dependencies": {
"tslib": "^1.9.2",
"@types/node": "^10.3.0"
},
"engines": {
"node": ">= 8.9.0"
}
}
18 changes: 18 additions & 0 deletions packages/typescript/remote-controlled-promise/shrinkwrap.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
dependencies:
'@types/node': 10.3.1
tslib: 1.9.2
packages:
/@types/node/10.3.1:
dev: false
resolution:
integrity: sha512-IsX9aDHDzJohkm3VCDB8tkzl5RQ34E/PFA29TQk6uDGb7Oc869ZBtmdKVDBzY3+h9GnXB8ssrRXEPVZrlIOPOw==
/tslib/1.9.2:
dev: false
resolution:
integrity: sha512-AVP5Xol3WivEr7hnssHDsaM+lVrVXWUvd1cfXTRkTj80b//6g2wIFEH6hZG0muGZRnHGrfttpdzRk3YlBkWjKw==
registry: 'https://registry.npmjs.org/'
shrinkwrapMinorVersion: 7
shrinkwrapVersion: 3
specifiers:
'@types/node': ^10.3.0
tslib: ^1.9.2
45 changes: 45 additions & 0 deletions packages/typescript/remote-controlled-promise/test/index.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
import create, {ControlledPromise, Controller} from '../index'

describe('returns correct types', () => {
const sample = create()

it('sample is an instance of ControlledPromise', () => {
expect(sample).toBeInstanceOf(ControlledPromise)
})

it('sample.controller is an instance of Controller', () => {
expect(sample.controller).toBeInstanceOf(Controller)
})

it('sample.promise is an instance of Promise', () => {
expect(sample.promise).toBeInstanceOf(Promise)
})
})

describe('resolves', () => {
const value = 'Resolved Value'
const sample = create<typeof value>()
const result = sample.resolve(value)

it('sample.promise resolves', async () => {
expect(await sample.promise).toBe(value)
})

it('sample.resolve() resolves', async () => {
expect(await result).toBe(value)
})
})

describe('rejects', () => {
const reason = 'Rejected Reason'
const sample = create<never, typeof reason>()
const result = sample.reject(reason)

it('sample.promise rejects', () => {
return expect(sample.promise).rejects.toBe(reason)
})

it('sample.reject() rejects', async () => {
return expect(result).rejects.toBe(reason)
})
})

0 comments on commit f902d12

Please sign in to comment.