Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
40 changes: 0 additions & 40 deletions .babelrc.js

This file was deleted.

41 changes: 41 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,47 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.

## [Unreleased]

### Changed

- Bumped dependencies, by [@compulim](https://github.com/compulim), in PR [#351](https://github.com/microsoft/BotFramework-DirectLineJS/pull/351)
- Production dependencies
- [`@babel/runtime@7.14.8`](https://npmjs.com/package/@babel/runtime)
- [`botframework-streaming@4.14.1`](https://npmjs.com/package/botframework-streaming)
- [`buffer@6.0.3`](https://npmjs.com/package/buffer)
- [`core-js@3.15.2`](https://npmjs.com/package/core-js)
- [`cross-fetch@3.1.4`](https://npmjs.com/package/cross-fetch)
- [`rxjs@5.5.12`](https://npmjs.com/package/rxjs)
- [`url-search-params-polyfill@8.1.1`](https://npmjs.com/package/url-search-params-polyfill)
- Development dependencies
- [`@babel/cli@7.14.8`](https://npmjs.com/package/@babel/cli)
- [`@babel/core@7.14.8`](https://npmjs.com/package/@babel/core)
- [`@babel/plugin-transform-runtime@7.14.5`](https://npmjs.com/package/@babel/plugin-transform-runtime)
- [`@babel/preset-env@7.14.8`](https://npmjs.com/package/@babel/preset-env)
- [`@babel/preset-typescript@7.14.5`](https://npmjs.com/package/@babel/preset-typescript)
- [`@types/jest@26.0.24`](https://npmjs.com/package/@types/jest)
- [`@types/jsonwebtoken@8.5.4`](https://npmjs.com/package/@types/jsonwebtoken)
- [`@types/node@16.4.0`](https://npmjs.com/package/@types/node)
- [`babel-loader@8.2.2`](https://npmjs.com/package/babel-loader)
- [`babel-jest@27.0.6`](https://npmjs.com/package/babel-jest)
- [`babel-plugin-istanbul@6.0.0`](https://npmjs.com/package/babel-plugin-istanbul)
- [`concurrently@6.2.0`](https://npmjs.com/package/concurrently)
- [`dotenv@10.0.0`](https://npmjs.com/package/dotenv)
- [`event-target-shim@6.0.2`](https://npmjs.com/package/event-target-shim)
- [`get-port@5.1.1`](https://npmjs.com/package/get-port)
- [`global-agent@2.2.0`](https://npmjs.com/package/global-agent)
- [`jest@27.0.6`](https://npmjs.com/package/jest)
- [`jest-environment-jsdom@27.0.6`](https://npmjs.com/package/jest-environment-jsdom)
- [`jsdom@16.6.0`](https://npmjs.com/package/jsdom)
- [`nock@13.1.1`](https://npmjs.com/package/nock)
- [`node-fetch@2.6.1`](https://npmjs.com/package/node-fetch)
- [`restify@8.5.1`](https://npmjs.com/package/restify)
- [`rimraf@3.0.2`](https://npmjs.com/package/rimraf)
- [`simple-update-in@2.2.0`](https://npmjs.com/package/simple-update-in)
- [`typescript@4.3.5`](https://npmjs.com/package/typescript)
- [`webpack@5.45.1`](https://npmjs.com/package/webpack)
- [`webpack-cli@4.7.2`](https://npmjs.com/package/webpack-cli)
- [`webpack-stats-plugin@1.0.3`](https://npmjs.com/package/webpack-stats-plugin)

## [0.14.1] - 2021-02-10

### Changed
Expand Down
4 changes: 4 additions & 0 deletions __tests__/setup.ts
Original file line number Diff line number Diff line change
Expand Up @@ -21,3 +21,7 @@ test('createServer setup correctly', async () => {
dispose();
}
});

test('test environment has Web Cryptography API', () => {
expect(typeof global.crypto.getRandomValues).toBe('function');
});
14 changes: 12 additions & 2 deletions __tests__/setup/createDirectLineForwarder.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,11 @@ import { createProxyServer } from 'http-proxy';
import { createServer } from 'http';
import { promisify } from 'util';

export default async function createDirectLineForwarder(port, handler, target = 'https://directline.botframework.com/') {
export default async function createDirectLineForwarder(
port,
handler,
target = 'https://directline.botframework.com/'
) {
// We need a reverse proxy (a.k.a. forwarder) to control the network traffic.
// This is because we need to modify the HTTP header by changing its host header (directline.botframework.com do not like "Host: localhost").

Expand All @@ -12,14 +16,20 @@ export default async function createDirectLineForwarder(port, handler, target =
target
});

proxy.on('proxyReq', (proxyRes, req, res, options) => {
// JSDOM requires all HTTP response, including those already pre-flighted, to have "Access-Control-Allow-Origin".
// https://github.com/jsdom/jsdom/issues/2024
res.setHeader('Access-Control-Allow-Origin', req.headers.origin || '*');
});

const proxyServer = createServer((req, res) => {
handler(req, res, () => proxy.web(req, res));
});

await promisify(proxyServer.listen.bind(proxyServer))(port);

return {
domain: `http://localhost:${ port }/v3/directline`,
domain: `http://localhost:${port}/v3/directline`,
unsubscribe: promisify(proxyServer.close.bind(proxyServer))
};
}
35 changes: 16 additions & 19 deletions __tests__/setup/createServer.ts
Original file line number Diff line number Diff line change
Expand Up @@ -41,10 +41,12 @@ export default async function (options: CreateServerOptions): Promise<CreateServ
deferred: createDeferred()
}));
} else {
return [{
...unorderedPlaybacks,
deferred: createDeferred()
}];
return [
{
...unorderedPlaybacks,
deferred: createDeferred()
}
];
}
});

Expand All @@ -58,11 +60,7 @@ export default async function (options: CreateServerOptions): Promise<CreateServ
const unorderedPlaybacks = Array.isArray(firstPlayback) ? firstPlayback : [firstPlayback];
let handled;

unorderedPlaybacks.forEach(({
deferred,
req: preq = {},
res: pres = {}
}, index) => {
unorderedPlaybacks.forEach(({ deferred, req: preq = {}, res: pres = {} }, index) => {
if (req.url === (preq.url || '/')) {
if (req.method === 'OPTIONS') {
res.send(200, '', {
Expand All @@ -80,14 +78,13 @@ export default async function (options: CreateServerOptions): Promise<CreateServ
headers['Content-Type'] = 'text/plain';
}

res.send(
pres.code || 200,
pres.body,
{
...headers,
...pres.headers
}
);
res.send(pres.code || 200, pres.body, {
// JSDOM requires all HTTP response, including those already pre-flighted, to have "Access-Control-Allow-Origin".
// https://github.com/jsdom/jsdom/issues/2024
'Access-Control-Allow-Origin': req.header('Origin') || '*',
...headers,
...pres.headers
});

handled = true;
deferred.resolve();
Expand All @@ -114,11 +111,11 @@ export default async function (options: CreateServerOptions): Promise<CreateServ
return new Promise(resolve => server.close(resolve));
},
port,
promises: options.playbacks.map((unorderedPlayback: (Playback | Playback[]), index) => {
promises: options.playbacks.map((unorderedPlayback: Playback | Playback[], index) => {
if (Array.isArray(unorderedPlayback)) {
return (orderedPlaybacks[index] as PlaybackWithDeferred[]).map(({ deferred: { promise } }) => promise);
} else {
return (orderedPlaybacks[index][0]).deferred.promise;
return orderedPlaybacks[index][0].deferred.promise;
}
})
};
Expand Down
6 changes: 3 additions & 3 deletions __tests__/setup/jsdomEnvironmentWithProxy.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ require('global-agent/bootstrap');

// To use proxy, SET GLOBAL_AGENT_HTTP_PROXY=http://localhost:8888

const JSDOMEnvironment = require('jest-environment-jsdom-fourteen');
const JSDOMEnvironment = require('jest-environment-jsdom');

class JSDOMEnvironmentWithProxy extends JSDOMEnvironment {
setup() {
Expand All @@ -14,9 +14,9 @@ class JSDOMEnvironmentWithProxy extends JSDOMEnvironment {
// This is because the ResourceLoader instance constructor is of "slightly" different type when on runtime (probably Jest magic).
// Thus, when we set it thru testEnvironmentOptions.resources, it will fail on "--watch" but succeed when running without watch.
this.global._resourceLoader = resources;

return super.setup();
}

return super.setup();
}
}

Expand Down
25 changes: 25 additions & 0 deletions __tests__/setup/setupCrypto.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
const crypto = require('crypto');

global.crypto = {
// uuid.v4() required Web Cryptography.
// https://www.w3.org/TR/WebCryptoAPI/#Crypto-method-getRandomValues
getRandomValues(array) {
if (
!(
array instanceof Int8Array ||
array instanceof Uint8Array ||
array instanceof Int16Array ||
array instanceof Uint16Array ||
array instanceof In32Array ||
array instanceof Uint32Array ||
array instanceof Uint8ClampedArray
)
) {
throw new Error('TypeMismatchError');
} else if (array.length > 65536) {
throw new Error('QuotaExceededError');
}

return crypto.randomFillSync(array);
}
};
25 changes: 18 additions & 7 deletions __tests__/unhappy.brokenWebSocket.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import 'dotenv/config';
import 'global-agent/bootstrap';

import { defineEventAttribute, EventTarget } from 'event-target-shim';
import { EventTarget, getEventAttributeValue, setEventAttributeValue } from 'event-target-shim';
import nock from 'nock';
import onErrorResumeNext from 'on-error-resume-next';

Expand Down Expand Up @@ -64,9 +64,7 @@ describe('Unhappy path', () => {
.options(uri => uri.startsWith('/v3/directline/conversations'))
);

window.WebSocket = class extends (
EventTarget
) {
window.WebSocket = class extends EventTarget {
constructor() {
super();

Expand All @@ -79,10 +77,23 @@ describe('Unhappy path', () => {
this.dispatchEvent(new CustomEvent('close'));
}, 10);
}
};

defineEventAttribute(window.WebSocket.prototype, 'close');
defineEventAttribute(window.WebSocket.prototype, 'error');
get onclose() {
return getEventAttributeValue(this, 'close');
}

set onclose(value) {
setEventAttributeValue(this, 'close', value);
}

get onerror() {
return getEventAttributeValue(this, 'error');
}

set onerror(value) {
setEventAttributeValue(this, 'error', value);
}
};
});

afterEach(() => {
Expand Down
20 changes: 12 additions & 8 deletions __tests__/unhappy.postActivityFatalAfterConnect.js
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ import waitForConnected from './setup/waitForConnected';
describe('Unhappy path', () => {
let unsubscribes;

beforeEach(() => unsubscribes = []);
beforeEach(() => (unsubscribes = []));
afterEach(() => unsubscribes.forEach(fn => onErrorResumeNext(fn)));

describe('channel returned 404 on post activity after connected', () => {
Expand All @@ -23,7 +23,7 @@ describe('Unhappy path', () => {

beforeEach(async () => {
proxyPort = await getPort();
proxyDomain = `http://localhost:${ proxyPort }/v3/directline`;
proxyDomain = `http://localhost:${proxyPort}/v3/directline`;
});

describe('using REST', () => {
Expand Down Expand Up @@ -57,23 +57,27 @@ describe('Unhappy path', () => {

afterEach(async () => {
// If directLine object is undefined, that means the test is failing.
if (!directLine) { return; }
if (!directLine) {
return;
}

let lastConnectionStatus;

const connectionStatusSubscription = directLine.connectionStatus$.subscribe({
next(value) { lastConnectionStatus = value; }
next(value) {
lastConnectionStatus = value;
}
});

unsubscribes.push(connectionStatusSubscription.unsubscribe.bind(connectionStatusSubscription));

let alwaysReturn404;

const { unsubscribe } = await createDirectLineForwarder(proxyPort, (req, res, next) => {
if (
req.method !== 'OPTIONS'
&& alwaysReturn404
) {
if (req.method !== 'OPTIONS' && alwaysReturn404) {
// JSDOM requires all HTTP response, including those already pre-flighted, to have "Access-Control-Allow-Origin".
// https://github.com/jsdom/jsdom/issues/2024
res.setHeader('Access-Control-Allow-Origin', req.headers.origin || '*');
res.statusCode = 404;
res.end();
} else {
Expand Down
15 changes: 15 additions & 0 deletions babel-jest-config.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
const {
default: { createTransformer }
} = require('babel-jest');
const { join } = require('path');
const { readFileSync } = require('fs');

const stringifiedBabelOptions = readFileSync(join(__dirname, 'babel.config.json'), 'utf8');
const babelOptions = JSON.parse(stringifiedBabelOptions);
const transformer = createTransformer(babelOptions);

// Jest is supposed to use babel-jest to consume the .babelrc file in the root of the project,
// but for some reason it can't seem to locate the file, so we must manually load the .babelrc
// file in memory and create a transformer for it.

module.exports = transformer;
27 changes: 27 additions & 0 deletions babel.config.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
{
"env": {
"test": {
"plugins": ["babel-plugin-istanbul"]
}
},
"plugins": [
"@babel/plugin-transform-runtime",
[
"transform-inline-environment-variables",
{
"include": ["npm_package_version"]
}
]
],
"presets": [
[
"@babel/preset-env",
{
"forceAllTransforms": true,
"modules": "commonjs"
}
],
"@babel/preset-typescript"
],
"sourceMaps": "inline"
}
Loading