Skip to content

Commit

Permalink
feat(core): add requireConnectionToken option
Browse files Browse the repository at this point in the history
  • Loading branch information
juanrgm committed May 18, 2022
1 parent e92a037 commit b919a8c
Show file tree
Hide file tree
Showing 4 changed files with 67 additions and 8 deletions.
5 changes: 5 additions & 0 deletions .changeset/olive-moles-decide.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@smcp/core": minor
---

Add `requireConnectionToken` option
51 changes: 50 additions & 1 deletion packages/core-browser-test/src/index.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,9 @@ let server!: {
before(async () => {
server = {
normal: await createServer(0),
token: await createServer(0, "secret"),
token: await createServer(0, {
connectionTokens: ["secret"],
}),
};
await browser.url(server.normal.address);
});
Expand Down Expand Up @@ -159,4 +161,51 @@ describe("smcp", () => {
}, server.token.instance.port)
).toBeTruthy();
});

it("throws require connection token error", async () => {
const server = await createServer(0, {
requireConnectionToken: true,
});
expect(
await browser.executeAsync(async (port, done) => {
const client = new Client({
url: { port },
});
try {
await client.api.dummy.returnString();
done(true);
} catch (error) {
done(false);
}
}, server.instance.port)
).toBeFalsy();

await server.instance.stop();
});

it("returns string using require connection token", async () => {
const connectionToken = "X";
const server = await createServer(0, {
requireConnectionToken: true,
connectionTokens: [connectionToken],
});
expect(
await browser.executeAsync(
async ([port, connectionToken], done) => {
const client = new Client({
url: { port },
connectionToken,
});
try {
done(await client.api.dummy.returnString());
} catch (error) {
done(false);
}
},
[server.instance.port, connectionToken] as const
)
).toBe("hello world");

await server.instance.stop();
});
});
11 changes: 6 additions & 5 deletions packages/core-browser-test/src/server/createServer.ts
Original file line number Diff line number Diff line change
@@ -1,15 +1,16 @@
import api from "./api";
import configs from "./configs";
import { Server } from "@smcp/core/Server";
import { Server, OptionsType } from "@smcp/core/Server";

export default async function createServer(port = 0, connectionToken?: string) {
export default async function createServer(
port = 0,
options: Omit<OptionsType<any, any, any>, "api"> = {}
) {
const instance = new Server({
configs,
api,
publicPath: __dirname + "/../../dist",
...(connectionToken && {
connectionTokens: [connectionToken],
}),
...options,
});
await instance.start(port);
const address = `http://127.0.0.1:${instance.port}`;
Expand Down
8 changes: 6 additions & 2 deletions packages/core/src/Server.ts
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ export type OptionsType<
logging?: boolean;
publicPath?: string;
connectionTokens?: string[];
requireConnectionToken?: boolean;
port?: number;
address?: string;
protocols?: { http: boolean; ws: boolean };
Expand Down Expand Up @@ -63,7 +64,10 @@ export class Server<
this.ws = new WebSocketServer({
noServer: true,
verifyClient: (info, next) => {
if (this.options.connectionTokens) {
if (
this.options.requireConnectionToken ||
this.options.connectionTokens
) {
const error = this.getConnectionTokenError(
new URL(info.req.url as string, "file://").searchParams.get(
"x-smcp-token"
Expand Down Expand Up @@ -207,7 +211,7 @@ export class Server<

const url = new URL(request.url as string, "file://");

if (this.options.connectionTokens) {
if (this.options.requireConnectionToken || this.options.connectionTokens) {
const token =
request.headers["x-smcp-token"] ?? url.searchParams.get("x-smcp-token");
const tokenError = this.getConnectionTokenError(token);
Expand Down

0 comments on commit b919a8c

Please sign in to comment.