Skip to content
Open
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
1 change: 0 additions & 1 deletion .bsb.lock

This file was deleted.

1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -4,3 +4,4 @@ lib
/node_modules/
.merlin
*.js
.bsb.lock
4 changes: 1 addition & 3 deletions bsconfig.json
Original file line number Diff line number Diff line change
@@ -1,15 +1,13 @@
{
"name": "bs-socket",
"bsc-flags": ["-w", "-20"],
"package-specs": {
"module": "commonjs",
"in-source": true
},
"suffix": ".bs.js",
"namespace": true,
"sources": [
{
"dir": "src",
"dir": "src"
},
{
"dir": "example",
Expand Down
11 changes: 0 additions & 11 deletions example/BsSocket.re

This file was deleted.

66 changes: 24 additions & 42 deletions example/ExampleClient.re
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,8 @@
* All credit goes to Cheng Lou. It was just too hard to figure out jengaboot + bucklescript for now.
* Copy pasted from https://github.com/chenglou/reason-js
**/
[@bs.send] external toString : Js.t('a) => string = "toString";

[@bs.send] external toString: Js.t('a) => string = "toString";

module Event = {
type eventT;
Expand All @@ -18,61 +19,48 @@ module Event = {
/* Created a bunch of modules to keep things clean. This is just for demo purposes. */
module Element = {
type elementT;
[@bs.set] external setInnerHTML : (elementT, string) => unit = "innerHTML";
[@bs.get] external getInnerHTML : elementT => string = "innerHTML";
[@bs.set] external setValue : (elementT, string) => unit = "value";
[@bs.get] external getValue : elementT => string = "value";
[@bs.set] external setInnerHTML: (elementT, string) => unit = "innerHTML";
[@bs.get] external getInnerHTML: elementT => string = "innerHTML";
[@bs.set] external setValue: (elementT, string) => unit = "value";
[@bs.get] external getValue: elementT => string = "value";
[@bs.send]
external addEventListener : (elementT, string, Event.eventT => unit) => unit =
"addEventListener";
external addEventListener: (elementT, string, Event.eventT => unit) => unit = "addEventListener";
};

module Document = {
[@bs.val] external getElementById: string => Element.elementT = "document.getElementById";
[@bs.val]
external getElementById : string => Element.elementT =
"document.getElementById";
[@bs.val]
external addEventListener : (string, Event.eventT => unit) => unit =
"document.addEventListener";
external addEventListener: (string, Event.eventT => unit) => unit = "document.addEventListener";
};

module Window = {
type intervalIdT;
[@bs.val]
external setInterval : (unit => unit, int) => intervalIdT =
"window.setInterval";
[@bs.val]
external clearInterval : intervalIdT => unit = "window.clearInterval";
[@bs.val] external setInterval: (unit => unit, int) => intervalIdT = "window.setInterval";
[@bs.val] external clearInterval: intervalIdT => unit = "window.clearInterval";
};

module MyClient = BsSocket.Client.Make(ExampleMessages);

let socket = MyClient.create();
let socket = Client.create();

MyClient.emit(socket, Hi);
// Fire an event on first connect. This isn't necessary as the server can listen for a `connection` event.
// But it shows that you can send different payloads with different event names.
socket->Socket.emit("login", SharedTypes.Hi);

let chatarea = Document.getElementById("chatarea");

MyClient.on(socket, x =>
socket->Socket.on("message", (. x) =>
switch (x) {
| Message(Data(s)) =>
| SharedTypes.Message(Data(s)) =>
let innerHTML = Element.getInnerHTML(chatarea);
Element.setInnerHTML(
chatarea,
innerHTML
++ "<div><span style='color:red'>Message</span>: "
++ s
++ "</div>",
innerHTML ++ "<div><span style='color:red'>Message</span>: " ++ s ++ "</div>",
);
| Message(OrOthers) => print_endline("OrOthers")
| MessageOnEnter(s) =>
| SharedTypes.Message(OrOthers) => print_endline("OrOthers")
| SharedTypes.MessageOnEnter(s) =>
let innerHTML = Element.getInnerHTML(chatarea);
Element.setInnerHTML(
chatarea,
innerHTML
++ "<div><span style='color:red'>MessageOnEnter</span>: "
++ s
++ "</div>",
innerHTML ++ "<div><span style='color:red'>MessageOnEnter</span>: " ++ s ++ "</div>",
);
}
);
Expand All @@ -81,19 +69,13 @@ let sendbutton = Document.getElementById("sendbutton");

let chatinput = Document.getElementById("chatinput");

Element.addEventListener(sendbutton, "click", (_) =>
MyClient.emit(
socket,
Shared(Message(Data(Element.getValue(chatinput)))),
)
Element.addEventListener(sendbutton, "click", _ =>
socket->Socket.emit("message", SharedTypes.Message(Data(Element.getValue(chatinput))))
);

Document.addEventListener("keyup", e =>
if (Event.isEnterKey(e)) {
MyClient.emit(
socket,
Shared(MessageOnEnter(Element.getValue(chatinput))),
);
socket->Socket.emit("message", SharedTypes.MessageOnEnter(Element.getValue(chatinput)));
Element.setValue(chatinput, "");
}
);
18 changes: 0 additions & 18 deletions example/ExampleMessages.re

This file was deleted.

80 changes: 36 additions & 44 deletions example/ExampleServer.re
Original file line number Diff line number Diff line change
@@ -1,67 +1,59 @@
/* Created a bunch of modules to keep things clean. This is just for demo purposes. */
module Path = {
type pathT;
[@bs.module "path"] [@bs.splice]
external join : array(string) => string = "";
[@bs.module "path"] [@bs.splice] external join: array(string) => string = "join";
};

module Express = {
type expressT;
[@bs.module] external express : unit => expressT = "";
[@bs.send] external use : (expressT, string) => unit = "use";
[@bs.module "express"] external static : string => string = "static";
[@bs.module] external express: unit => expressT = "express";
[@bs.send] external use: (expressT, string) => unit = "use";
[@bs.module "express"] external static: string => string = "static";
type responseT;
[@bs.send] external sendFile : (responseT, string, 'a) => unit = "sendFile";
[@bs.send]
external get : (expressT, string, ('a, responseT) => unit) => unit = "get";
[@bs.send] external sendFile: (responseT, string, 'a) => unit = "sendFile";
[@bs.send] external get: (expressT, string, ('a, responseT) => unit) => unit = "get";
};

module Http = {
type http;
[@bs.module "http"] external create : Express.expressT => http = "Server";
[@bs.send] external listen : (http, int, unit => unit) => unit = "";
[@bs.module "http"] external create: Express.expressT => http = "Server";
[@bs.send] external listen: (http, int, unit => unit) => unit = "listen";
};

/* ------------ Real API demo stars here ------------ */
let app = Express.express();

let http = Http.create(app);

[@bs.val] external __dirname : string = "";

let __dirname =
switch ([%external __dirname]) {
| None => failwith("Should not happen")
| Some(d) => d
};
Express.use(app, Express.static(Path.join([|__dirname, ".."|])));

Express.get(app, "/", (_, res) =>
Express.sendFile(res, "index.html", {"root": __dirname})
);

module MyServer = BsSocket.Server.Make(ExampleMessages);

let io = MyServer.createWithHttp(http);

MyServer.onConnect(
io,
socket => {
open MyServer;
print_endline("Got a connection!");
let socket = Socket.join(socket, "someRoom");
/* Polymorphic pipe which actually knows about ExampleCommon.t from InnerServer */
Socket.on(
socket,
fun
| Shared(message) => {
Socket.broadcast(socket, message);
Socket.emit(socket, message);
}
| Hi => {
Js.log("oh, hi client.");
Js.log(
"Sorry I can't say hi back. Try uncommenting the line below to see why.",
);
/* Socket.emit(socket, Hi); */
},
);
},
);
Express.get(app, "/", (_, res) => Express.sendFile(res, "index.html", {"root": __dirname}));

// module MyServer = BsSocket.Server.Make(ExampleMessages);

let io = Server.createWithHttp(http);

io->Server.onConnect(socket => {
print_endline("Got a connection!");
let socket = socket->Socket.join("someRoom");
/* Polymorphic pipe which actually knows about ExampleCommon.t from InnerServer */
socket->Socket.on("login", (. data) =>
switch (data) {
| SharedTypes.Hi =>
Js.log("oh, hi client.");
Js.log("Sorry I can't say hi back. Try uncommenting the line below to see why.");
/* Socket.emit(socket, Hi); */
}
);
socket->Socket.on("message", (. data) => {
Server.emitBroadcast(socket, "myEvent", data);
Socket.emit(socket, "myEvent", data);
});
});

Http.listen(http, 3000, () => print_endline("listening on *:3000"));
14 changes: 14 additions & 0 deletions example/SharedTypes.re
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
type dataT =
| Data(string)
| OrOthers;

type data2T = string;

// Data sent with event named "message".
type shared =
| Message(dataT)
| MessageOnEnter(data2T);

// Data sent with event named "login".
type loginT =
| Hi;
Loading