Skip to content

Commit 90ddb98

Browse files
committed
first commit
1 parent 46ee583 commit 90ddb98

File tree

8 files changed

+195
-0
lines changed

8 files changed

+195
-0
lines changed

.gitignore

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
/.*
2+
!/.gitignore
3+
!/.eslintrc.json
4+
!/.github/
5+
package-lock.json
6+
/bower_components/
7+
/node_modules/
8+
/output/

bower.json

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
{
2+
"name": "purescript-web-workers",
3+
"license": [
4+
"MIT"
5+
],
6+
"repository": {
7+
"type": "git",
8+
"url": "https://github.com/gbagan/purescript-web-workers"
9+
},
10+
"ignore": [
11+
"**/.*",
12+
"node_modules",
13+
"bower_components",
14+
"output"
15+
],
16+
"dependencies": {
17+
"purescript-effect": "^v4.0.0",
18+
"purescript-maybe": "^v6.0.0",
19+
"purescript-prelude": "^v6.0.0"
20+
}
21+
}

package.json

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
{
2+
"private": true,
3+
"scripts": {
4+
"clean": "rimraf output && rimraf .pulp-cache",
5+
"build": "eslint src && pulp build -- --censor-lib --strict"
6+
},
7+
"devDependencies": {
8+
"eslint": "^8.15.0",
9+
"pulp": "^16.0.1",
10+
"purescript-psa": "^0.8.2",
11+
"rimraf": "^3.0.2",
12+
"spago": "^0.20.9"
13+
}
14+
}

spago.dhall

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
{ name = "web-workers"
2+
, license = "MIT"
3+
, repository = "https://github.com/gbagan/purescript-web-workers"
4+
, dependencies = ["prelude", "effect", "maybe"]
5+
, packages = ./packages.dhall
6+
, sources = [ "src/**/*.purs" ]
7+
}

src/Web/Worker/Event.js

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
export function data_(ev) {
2+
return ev.data;
3+
}
4+
5+
export function origin(ev) {
6+
return ev.origin;
7+
}
8+
9+
export function lastEventId(ev) {
10+
return ev.lastEventId;
11+
}

src/Web/Worker/Event.purs

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
module Web.Worker.Event where
2+
3+
import Foreign (Foreign)
4+
5+
foreign import data MessageEvent :: Type
6+
7+
foreign import data_ :: MessageEvent -> Foreign
8+
9+
foreign import origin :: MessageEvent -> String
10+
11+
foreign import lastEventId :: MessageEvent -> String
12+
13+
-- source :: WindwProxy | MessagePort | ServiceWorker
14+
-- ports :: Array MessagePort

src/Web/Worker/Worker.js

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
export function newImpl (src) {
2+
return function (opts) {
3+
return function () {
4+
return new Worker(src, opts);
5+
};
6+
};
7+
}
8+
9+
export function postMessage(data) {
10+
return function (transfer) {
11+
return function (worker) {
12+
return function () {
13+
worker.postMessage(data, transfer.length > 0 ? transfer : undefined);
14+
};
15+
};
16+
};
17+
}
18+
19+
export function terminate (worker) {
20+
return function () {
21+
worker.terminate();
22+
};
23+
}
24+
25+
export function onMessage(f) {
26+
return function (worker) {
27+
return function () {
28+
worker.onmessage = f;
29+
};
30+
};
31+
}
32+
33+
export function onError(f) {
34+
return function (worker) {
35+
return function () {
36+
worker.onerror = f;
37+
};
38+
};
39+
}

src/Web/Worker/Worker.purs

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
module Web.Worker.Worker
2+
( Worker
3+
, WorkerType
4+
, Credentials
5+
, WorkerOptions
6+
, fromEventTarget
7+
, toEventTarget
8+
, new
9+
, defaultWorkerOptions
10+
, postMessage
11+
, onError
12+
, onMessage
13+
, terminate
14+
)
15+
where
16+
17+
import Prelude
18+
import Data.Maybe (Maybe)
19+
import Effect (Effect)
20+
import Unsafe.Coerce (unsafeCoerce)
21+
import Web.Event.Event (Event)
22+
import Web.Event.EventTarget (EventTarget)
23+
import Web.Internal.FFI (unsafeReadProtoTagged)
24+
import Web.Worker.Event (MessageEvent)
25+
26+
27+
foreign import data Worker :: Type
28+
29+
30+
fromEventTarget :: EventTarget -> Maybe Worker
31+
fromEventTarget = unsafeReadProtoTagged "Worker"
32+
33+
toEventTarget :: Worker -> EventTarget
34+
toEventTarget = unsafeCoerce
35+
36+
data WorkerType = Classic | Module
37+
data Credentials = Omit | SameOrigin | Include
38+
39+
type WorkerOptions =
40+
{ credentials :: Credentials
41+
, name :: String
42+
, type :: WorkerType
43+
}
44+
45+
defaultWorkerOptions :: WorkerOptions
46+
defaultWorkerOptions =
47+
{ name: ""
48+
, credentials: Omit
49+
, type: Classic
50+
}
51+
52+
--foreign import onError :: (Error -> Effect Unit) -> Worker -> Effect Unit
53+
54+
foreign import newImpl :: String -> { name :: String, credentials :: String, type :: String } -> Effect Worker
55+
56+
new :: String -> WorkerOptions -> Effect Worker
57+
new url {name, type: t, credentials} = newImpl url
58+
{ name
59+
, credentials: show credentials
60+
, type: show t
61+
}
62+
63+
64+
foreign import postMessage :: forall msg tr. msg -> Array tr -> Worker -> Effect Unit
65+
66+
foreign import terminate :: Worker -> Effect Unit
67+
68+
foreign import onMessage :: (MessageEvent -> Effect Unit) -> Worker -> Effect Unit
69+
70+
foreign import onError :: (Event -> Effect Unit) -> Worker -> Effect Unit
71+
72+
instance Show WorkerType where
73+
show = case _ of
74+
Classic -> "classic"
75+
Module -> "module"
76+
77+
instance Show Credentials where
78+
show = case _ of
79+
Omit -> "omit"
80+
SameOrigin -> "same-origin"
81+
Include -> "include"

0 commit comments

Comments
 (0)