architect 0.0.1 → 0.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +88 -12
- data/app/assets/javascripts/architect/version.coffee.erb +2 -5
- data/app/assets/javascripts/architect/worker.coffee +1 -4
- data/app/assets/javascripts/architect/workers/ajax_worker.coffee +1 -4
- data/app/assets/javascripts/architect/workers/jsonp_worker.coffee +1 -4
- data/app/assets/javascripts/architect/workers/proxy_worker.coffee +1 -4
- data/app/assets/javascripts/architect.coffee.erb +45 -34
- data/lib/architect/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: daa8aa8ac05c622ddde6c3d2ede4dec0600a655c
|
4
|
+
data.tar.gz: aad21f214942aac852900fef7bf51ccbd740652a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c77723dd253c39a2249168eff0a57a0672ff08c9edf50f319d89f1b8e2478fd64f4b55c99570c2ee1347c76f94f9a4829d95648c62226ad32fbe5f41b4c1c662
|
7
|
+
data.tar.gz: 367cb3d57759dd32c63f98960e1935abb6e0981c98545689de99bb4748d6b517220e1cfee2e68af8bd07de616931d076d48e6fe55b286751406fab402ce72222
|
data/README.md
CHANGED
@@ -1,12 +1,22 @@
|
|
1
|
-
|
2
|
-
|
1
|
+
<p align="center">
|
2
|
+
<a href="https://github.com/EtienneLem/architect">
|
3
|
+
<img src="https://f.cloud.github.com/assets/436043/856991/59ff07ce-f547-11e2-9a89-74501d0878c3.png">
|
4
|
+
</a>
|
5
|
+
</p>
|
6
|
+
|
7
|
+
<p align="center">
|
8
|
+
<strong>Architect</strong> is a JavaScript library built on top of <a href="http://www.whatwg.org/specs/web-apps/current-work/multipage/workers.html">Web Workers</a>.<br>
|
9
|
+
He will manage and polyfill them workers so you don’t have to.
|
10
|
+
</p>
|
11
|
+
|
12
|
+
## Short-lived workers
|
13
|
+
These will be automatically terminated as soon as the work is done. It will spawn a new worker every time.
|
3
14
|
|
4
|
-
## Methods
|
5
15
|
### proxy
|
6
16
|
Returns anything it receives in a background process. Useful when dealing with heavy DOM manipulation (i.e. Infinite scroll). It greatly improves initial page load speed, especially on mobiles.
|
7
17
|
|
8
18
|
```js
|
9
|
-
images = ['foo.png', 'bar.png', 'twiz.png', 'foozle.png', 'barzle.png', 'twizle.png']
|
19
|
+
var images = ['foo.png', 'bar.png', 'twiz.png', 'foozle.png', 'barzle.png', 'twizle.png']
|
10
20
|
Architect.proxy(images, function(data) {
|
11
21
|
console.log(data)
|
12
22
|
// => ['foo.png', 'bar.png', 'twiz.png', 'foozle.png', 'barzle.png', 'twizle.png']
|
@@ -20,6 +30,8 @@ Architect.proxy(images, function(data) {
|
|
20
30
|
})
|
21
31
|
```
|
22
32
|
|
33
|
+
Alias for `Architect.work(data, 'proxy', callback)`.
|
34
|
+
|
23
35
|
### ajax
|
24
36
|
Makes an Ajax request in a background process.
|
25
37
|
|
@@ -30,8 +42,10 @@ Architect.ajax('/users/1', function(data) {
|
|
30
42
|
})
|
31
43
|
```
|
32
44
|
|
45
|
+
Alias for `Architect.work(url, 'ajax', callback)`.
|
46
|
+
|
33
47
|
### jsonp
|
34
|
-
Makes a JSONP request in a background process. **Do not add `?callback=foo` to your URL**, Architect will handle JSONP callbacks himself.
|
48
|
+
Makes a JSONP request in a background process. **Do not add `?callback=foo` to your URL**, Architect will handle JSONP callbacks himself. See the [request Architect makes](https://api.github.com/users/etiennelem?callback=architect_jsonp).
|
35
49
|
|
36
50
|
```js
|
37
51
|
Architect.jsonp('https://api.github.com/users/etiennelem', function(data) {
|
@@ -40,7 +54,72 @@ Architect.jsonp('https://api.github.com/users/etiennelem', function(data) {
|
|
40
54
|
})
|
41
55
|
```
|
42
56
|
|
43
|
-
|
57
|
+
Alias for `Architect.work(url, 'jsonp', callback)`.
|
58
|
+
|
59
|
+
## Long-lived workers
|
60
|
+
These need to be manually terminated when the work is done. The same worker can therefore be reused many times with different data.
|
61
|
+
|
62
|
+
### proxyOn
|
63
|
+
```js
|
64
|
+
var images, jobName, imagesCount
|
65
|
+
|
66
|
+
images = ['foo.png', 'bar.png', 'twiz.png', 'foozle.png', 'barzle.png', 'twizle.png']
|
67
|
+
jobName = 'appendImages'
|
68
|
+
imagesCount = 0
|
69
|
+
|
70
|
+
images.forEach(function(image) {
|
71
|
+
Architect.proxyOn(jobName, image, function(data) {
|
72
|
+
imagesCount++
|
73
|
+
|
74
|
+
img = document.createElement('img')
|
75
|
+
img.src = data
|
76
|
+
document.body.appendChild(img)
|
77
|
+
|
78
|
+
if (imagesCount == images.length) { Architect.endJob(jobName) }
|
79
|
+
})
|
80
|
+
})
|
81
|
+
```
|
82
|
+
|
83
|
+
Alias for `Architect.workOn(jobName, data, 'proxy', callback)`.
|
84
|
+
|
85
|
+
### ajaxOn
|
86
|
+
```js
|
87
|
+
var totalPages, jobName, queryApi
|
88
|
+
|
89
|
+
totalPages = 10
|
90
|
+
jobName = 'getUsers'
|
91
|
+
|
92
|
+
queryApi = function(page) {
|
93
|
+
Architect.ajaxOn(jobName, '/users?page=' + page, function(data) {
|
94
|
+
// [Add DOM elements, do your thing ;)]
|
95
|
+
|
96
|
+
if (page == totalPages) {
|
97
|
+
// Manually terminate the 'getUsers' ajax worker
|
98
|
+
Architect.endJob(jobName)
|
99
|
+
console.log('Done')
|
100
|
+
} else {
|
101
|
+
// Reuse the same worker
|
102
|
+
queryApi(page + 1)
|
103
|
+
}
|
104
|
+
})
|
105
|
+
}
|
106
|
+
|
107
|
+
queryApi(1)
|
108
|
+
```
|
109
|
+
|
110
|
+
Alias for `Architect.workOn(jobName, url, 'ajax', callback)`.
|
111
|
+
|
112
|
+
### jsonpOn
|
113
|
+
```js
|
114
|
+
Architect.jsonpOn('profile', 'https://api.github.com/users/etiennelem', function(data) {
|
115
|
+
console.log(data);
|
116
|
+
// => { meta: { status: 200, … }, data: { login: 'EtienneLem', company: 'Heliom', … } }
|
117
|
+
|
118
|
+
Architect.endJob('profile')
|
119
|
+
})
|
120
|
+
```
|
121
|
+
|
122
|
+
Alias for `Architect.workOn(jobName, url, 'jsonp', callback)`.
|
44
123
|
|
45
124
|
## Setup
|
46
125
|
### Rails
|
@@ -49,11 +128,8 @@ See the [request Architect makes](https://api.github.com/users/etiennelem?callba
|
|
49
128
|
3. Restart your server and you'll have access to your very own Architect!
|
50
129
|
|
51
130
|
### Other
|
52
|
-
You’ll need to serve the [worker files](/static/workers) at `/architect` (i.e. `http://foo.com/architect/proxy_worker.min.js`) and manually
|
131
|
+
You’ll need to serve the [worker files](/static/workers) at `/architect` (i.e. `http://foo.com/architect/proxy_worker.min.js`) and manually include [architect.min.js](/static/architect.min.js) to your HTML pages.
|
53
132
|
|
54
133
|
## Todo
|
55
|
-
-
|
56
|
-
- Support
|
57
|
-
|
58
|
-
[Web Workers]: http://www.whatwg.org/specs/web-apps/current-work/multipage/workers.html
|
59
|
-
[Shared workers]: http://www.whatwg.org/specs/web-apps/current-work/multipage/workers.html#shared-workers
|
134
|
+
- Tests
|
135
|
+
- Support Shared Workers [[See #3](https://github.com/EtienneLem/architect/issues/3)]
|
@@ -1,7 +1,7 @@
|
|
1
1
|
#= require_self
|
2
2
|
#= require_tree ./workers
|
3
3
|
|
4
|
-
class Architect.Worker
|
4
|
+
class @Architect.Worker
|
5
5
|
|
6
6
|
constructor: ->
|
7
7
|
@callbacks = {}
|
@@ -24,6 +24,3 @@ class Architect.Worker
|
|
24
24
|
this.dispatch('message', data)
|
25
25
|
|
26
26
|
terminate: -> # This is meant to be empty
|
27
|
-
|
28
|
-
# Global scope
|
29
|
-
window.Architect.Worker = Architect.Worker
|
@@ -1,4 +1,4 @@
|
|
1
|
-
class Architect.AjaxWorker extends Architect.Worker
|
1
|
+
class @Architect.AjaxWorker extends @Architect.Worker
|
2
2
|
|
3
3
|
postMessage: (url) ->
|
4
4
|
xhr = new XMLHttpRequest
|
@@ -9,6 +9,3 @@ class Architect.AjaxWorker extends Architect.Worker
|
|
9
9
|
this.handleRequest(xhr.responseText)
|
10
10
|
|
11
11
|
xhr.send()
|
12
|
-
|
13
|
-
# Global scope
|
14
|
-
window.Architect.AjaxWorker = Architect.AjaxWorker
|
@@ -1,4 +1,4 @@
|
|
1
|
-
class Architect.JSONPWorker extends Architect.Worker
|
1
|
+
class @Architect.JSONPWorker extends @Architect.Worker
|
2
2
|
|
3
3
|
constructor: ->
|
4
4
|
super()
|
@@ -19,6 +19,3 @@ class Architect.JSONPWorker extends Architect.Worker
|
|
19
19
|
|
20
20
|
appendQuery: (url, query) ->
|
21
21
|
(url + '&' + query).replace(/[&?]{1,2}/, '?')
|
22
|
-
|
23
|
-
# Global scope
|
24
|
-
window.Architect.JSONPWorker = Architect.JSONPWorker
|
@@ -1,37 +1,48 @@
|
|
1
1
|
#= require ./architect/version
|
2
2
|
#= require ./architect/worker
|
3
3
|
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
4
|
+
# Constants
|
5
|
+
@Architect.SUPPORT_WORKER = !!window.Worker
|
6
|
+
@Architect.WORKERS =
|
7
|
+
proxy: { polyfill: @Architect.ProxyWorker, workerPath: '<%= Architect.worker_path("proxy") %>' }
|
8
|
+
ajax: { polyfill: @Architect.AjaxWorker, workerPath: '<%= Architect.worker_path("ajax") %>' }
|
9
|
+
jsonp: { polyfill: @Architect.JSONPWorker, workerPath: '<%= Architect.worker_path("jsonp") %>' }
|
10
|
+
|
11
|
+
# Private methods
|
12
|
+
spawnWorker = (type) ->
|
13
|
+
return new @Architect.WORKERS[type].polyfill unless @Architect.SUPPORT_WORKER
|
14
|
+
new Worker(@Architect.WORKERS[type].workerPath)
|
15
|
+
|
16
|
+
# Short-lived workers
|
17
|
+
@Architect.work = (data, type, callback) ->
|
18
|
+
worker = spawnWorker(type)
|
19
|
+
worker.postMessage(data)
|
20
|
+
worker.addEventListener 'message', (e) ->
|
21
|
+
worker.terminate()
|
22
|
+
callback(e.data)
|
23
|
+
|
24
|
+
@Architect.proxy = (data, callback) => @Architect.work(data, 'proxy', callback)
|
25
|
+
@Architect.ajax = (url, callback) => @Architect.work(url, 'ajax', callback)
|
26
|
+
@Architect.jsonp = (url, callback) => @Architect.work(url, 'jsonp', callback)
|
27
|
+
|
28
|
+
# Long-lived workers
|
29
|
+
jobs = {}
|
30
|
+
@Architect.workOn = (jobName, data, type, callback) ->
|
31
|
+
alreadySpawned = !!jobs[jobName]
|
32
|
+
|
33
|
+
worker = jobs[jobName] ||= spawnWorker(type)
|
34
|
+
worker.postMessage(data)
|
35
|
+
|
36
|
+
return if alreadySpawned
|
37
|
+
worker.addEventListener 'message', (e) ->
|
38
|
+
callback(e.data)
|
39
|
+
|
40
|
+
@Architect.endJob = (jobName) ->
|
41
|
+
return unless worker = jobs[jobName]
|
42
|
+
|
43
|
+
worker.terminate()
|
44
|
+
delete jobs[jobName]
|
45
|
+
|
46
|
+
@Architect.proxyOn = (jobName, data, callback) => @Architect.workOn(jobName, data, 'proxy', callback)
|
47
|
+
@Architect.ajaxOn = (jobName, url, callback) => @Architect.workOn(jobName, url, 'ajax', callback)
|
48
|
+
@Architect.jsonpOn = (jobName, url, callback) => @Architect.workOn(jobName, url, 'jsonp', callback)
|
data/lib/architect/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: architect
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Etienne Lemay
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-07-
|
11
|
+
date: 2013-07-29 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: coffee-rails
|