sumomo 0.7.3 → 0.8.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/data/sumomo/api_modules/real_script.js +18 -0
- data/data/sumomo/api_modules/test_script.js +45 -3
- data/lib/sumomo.rb +2 -1
- data/lib/sumomo/api.rb +79 -5
- data/lib/sumomo/cdn.rb +17 -4
- data/lib/sumomo/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: 7e272e7159b46a624aad9e1fd27d42206ff0089d
|
4
|
+
data.tar.gz: be5daaba9aa97814db24f976f6e0aa7f32496275
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2b526710d8fb56ca84de1b0f7e7d8979534a82f8b7e8608428a804340d52e80bcf54eb7360488fdf1e33f03125b4ff45f9338319012fed37f5cfd168442387c4
|
7
|
+
data.tar.gz: 8c2e126517ea84d32df7b2ee77b99a7c5eba3f4d9fbfb8ac41b2cdf8e5102d952234357b22f943f7744ff0da2269856a8b0ea989071b0bb8f69a55d0e3067682
|
@@ -80,6 +80,24 @@ function Storage()
|
|
80
80
|
|
81
81
|
var Store = new Storage();
|
82
82
|
|
83
|
+
function parseQuery(queryString) {
|
84
|
+
try
|
85
|
+
{
|
86
|
+
var res = JSON.parse(queryString)
|
87
|
+
return res;
|
88
|
+
}
|
89
|
+
catch(e) { }
|
90
|
+
var query = {};
|
91
|
+
var pairs = queryString.split('&');
|
92
|
+
for (var i = 0; i < pairs.length; i++) {
|
93
|
+
var pair = pairs[i].split('=');
|
94
|
+
query[decodeURIComponent(pair[0])] = decodeURIComponent(pair[1] || '');
|
95
|
+
}
|
96
|
+
return query;
|
97
|
+
}
|
98
|
+
|
99
|
+
{{ SCRIPT }}
|
100
|
+
|
83
101
|
function prepare(handler)
|
84
102
|
{
|
85
103
|
return function(request, callback)
|
@@ -7,28 +7,52 @@ var http = require('http');
|
|
7
7
|
var url = require('url');
|
8
8
|
var merge = require('utils-merge');
|
9
9
|
var Router = require('router')
|
10
|
+
var fs = require('fs')
|
10
11
|
|
11
12
|
// Simulated store
|
12
13
|
function Storage()
|
13
14
|
{
|
14
15
|
var store = {}
|
15
16
|
|
17
|
+
try
|
18
|
+
{
|
19
|
+
var store_contents = fs.readFileSync(".store")
|
20
|
+
store = JSON.parse(store_contents)
|
21
|
+
}
|
22
|
+
catch (e)
|
23
|
+
{
|
24
|
+
console.log("Error reading .store; will start with blank store")
|
25
|
+
console.log(e)
|
26
|
+
}
|
27
|
+
|
16
28
|
this.get = function(key, onComplete, onError)
|
17
29
|
{
|
18
30
|
if (store[key] === undefined)
|
19
31
|
{
|
20
|
-
onError
|
32
|
+
if (onError)
|
33
|
+
{
|
34
|
+
onError({err: "no_such_key"});
|
35
|
+
}
|
21
36
|
}
|
22
37
|
else
|
23
38
|
{
|
24
|
-
onComplete
|
39
|
+
if (onComplete)
|
40
|
+
{
|
41
|
+
onComplete(store[key]);
|
42
|
+
}
|
25
43
|
}
|
26
44
|
}
|
27
45
|
|
28
46
|
this.set = function(key, value, onComplete, onError)
|
29
47
|
{
|
30
48
|
store[key] = value;
|
31
|
-
|
49
|
+
fs.writeFile(".store", JSON.stringify(store), function()
|
50
|
+
{
|
51
|
+
if (onComplete)
|
52
|
+
{
|
53
|
+
onComplete(key);
|
54
|
+
}
|
55
|
+
})
|
32
56
|
}
|
33
57
|
|
34
58
|
return this;
|
@@ -56,6 +80,24 @@ var server = http.createServer(function(req, res) {
|
|
56
80
|
});
|
57
81
|
});
|
58
82
|
|
83
|
+
function parseQuery(queryString) {
|
84
|
+
try
|
85
|
+
{
|
86
|
+
var res = JSON.parse(queryString)
|
87
|
+
return res;
|
88
|
+
}
|
89
|
+
catch(e) { }
|
90
|
+
var query = {};
|
91
|
+
var pairs = (queryString[0] === '?' ? queryString.substr(1) : queryString).split('&');
|
92
|
+
for (var i = 0; i < pairs.length; i++) {
|
93
|
+
var pair = pairs[i].split('=');
|
94
|
+
query[decodeURIComponent(pair[0])] = decodeURIComponent(pair[1] || '');
|
95
|
+
}
|
96
|
+
return query;
|
97
|
+
}
|
98
|
+
|
99
|
+
{{ SCRIPT }}
|
100
|
+
|
59
101
|
// Simulate API Gateway Lambda Proxy Event
|
60
102
|
function prepare(handler)
|
61
103
|
{
|
data/lib/sumomo.rb
CHANGED
@@ -183,7 +183,7 @@ module Sumomo
|
|
183
183
|
instance_eval(&block)
|
184
184
|
end
|
185
185
|
|
186
|
-
def make_api(domain_name, name:, script:nil, dns:nil, cert:nil, &block)
|
186
|
+
def make_api(domain_name, name:, script:nil, dns:nil, cert:nil, with_statements: [], &block)
|
187
187
|
@apis[name] = block
|
188
188
|
end
|
189
189
|
|
@@ -213,6 +213,7 @@ module Sumomo
|
|
213
213
|
|
214
214
|
script = File.read(File.join(Gem.loaded_specs['sumomo'].full_gem_path, "data", "sumomo", "api_modules", "test_script.js"))
|
215
215
|
script.sub!("// {{ ROUTES }}", apigen.generate);
|
216
|
+
script.gsub!("{{ SCRIPT }}", apigen.init_script);
|
216
217
|
|
217
218
|
File.write(".test.js", script)
|
218
219
|
|
data/lib/sumomo/api.rb
CHANGED
@@ -3,8 +3,33 @@ module Sumomo
|
|
3
3
|
module Stack
|
4
4
|
|
5
5
|
class APIGenerator
|
6
|
+
|
7
|
+
class CorsInfo
|
8
|
+
attr_accessor :allowed_origins, :allowed_headers
|
9
|
+
|
10
|
+
def apply(&block)
|
11
|
+
@allowed_origins = []
|
12
|
+
@allowed_headers = ['origin', 'content-type', 'accept', 'cache-control', 'x-requested-with', 'if-modified-since']
|
13
|
+
instance_eval(&block) if block
|
14
|
+
end
|
15
|
+
|
16
|
+
def AllowOrigin(value)
|
17
|
+
@allowed_origins << value
|
18
|
+
end
|
19
|
+
|
20
|
+
def AllowHeaders(value)
|
21
|
+
@allowed_headers << value
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
6
25
|
def initialize(pretty_print: false, &block)
|
7
26
|
@methods = {}
|
27
|
+
@cors = CorsInfo.new
|
28
|
+
@script = ""
|
29
|
+
# defaults
|
30
|
+
@cors.apply do
|
31
|
+
AllowOrigin "*"
|
32
|
+
end
|
8
33
|
@pretty_print = pretty_print
|
9
34
|
instance_eval(&block)
|
10
35
|
end
|
@@ -23,6 +48,18 @@ module Sumomo
|
|
23
48
|
end
|
24
49
|
end
|
25
50
|
|
51
|
+
def CORS(&block)
|
52
|
+
@cors.apply(&block)
|
53
|
+
end
|
54
|
+
|
55
|
+
def SCRIPT(value)
|
56
|
+
@script = value
|
57
|
+
end
|
58
|
+
|
59
|
+
def init_script
|
60
|
+
@script
|
61
|
+
end
|
62
|
+
|
26
63
|
def generate
|
27
64
|
|
28
65
|
if @pretty_print
|
@@ -32,7 +69,30 @@ module Sumomo
|
|
32
69
|
end
|
33
70
|
|
34
71
|
result = ""
|
72
|
+
|
73
|
+
all_methods = @methods.clone
|
74
|
+
|
75
|
+
# Generate appropriate options methods as well
|
76
|
+
|
35
77
|
@methods.each do |path, resource|
|
78
|
+
meths = resource.map{|meth,info| meth}
|
79
|
+
|
80
|
+
# Insert OPTIONS method if there isn't already one
|
81
|
+
if !all_methods[path].has_key?("OPTIONS")
|
82
|
+
all_methods[path]["OPTIONS"] = { script: <<-SCRIPT, params: [] }
|
83
|
+
var headers = {}
|
84
|
+
headers["Access-Control-Allow-Origin"] = #{@cors.allowed_origins.join(",").inspect}
|
85
|
+
headers["Access-Control-Request-Method"] = '*'
|
86
|
+
headers["Access-Control-Allow-Methods"] = '#{meths.join(', ')}'
|
87
|
+
headers["Access-Control-Allow-Headers"] = #{@cors.allowed_headers.join(",").inspect}
|
88
|
+
|
89
|
+
respond_with({methods: #{meths.inspect}}, 200, headers)
|
90
|
+
SCRIPT
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
|
95
|
+
all_methods.each do |path, resource|
|
36
96
|
resource.each do |method, method_info|
|
37
97
|
|
38
98
|
parameter_list = method_info[:params].join(", ")
|
@@ -44,15 +104,28 @@ module Sumomo
|
|
44
104
|
|
45
105
|
var retval = {};
|
46
106
|
|
107
|
+
var bodyParameters = parseQuery(event.body);
|
108
|
+
|
47
109
|
var params = merge(event.queryStringParameters || {}, event.pathParameters || {});
|
110
|
+
params = merge(params, bodyParameters);
|
48
111
|
|
49
|
-
function respond_with(response_object, response_status)
|
112
|
+
function respond_with(response_object, response_status, response_headers)
|
50
113
|
{
|
114
|
+
var headers = {}
|
115
|
+
headers["Content-Type"] = "application/json; charset=utf-8"
|
116
|
+
headers["Access-Control-Allow-Origin"] = #{@cors.allowed_origins.join(",").inspect}
|
117
|
+
|
118
|
+
if (response_headers)
|
119
|
+
{
|
120
|
+
for(var key in response_headers)
|
121
|
+
{
|
122
|
+
headers[key] = response_headers[key];
|
123
|
+
}
|
124
|
+
}
|
125
|
+
|
51
126
|
var response = {
|
52
127
|
statusCode: response_status || 200,
|
53
|
-
headers:
|
54
|
-
"Content-Type" : "application/json; charset=utf-8"
|
55
|
-
},
|
128
|
+
headers: headers,
|
56
129
|
body: JSON.stringify(response_object#{pretty_print})
|
57
130
|
};
|
58
131
|
|
@@ -72,6 +145,7 @@ module Sumomo
|
|
72
145
|
end
|
73
146
|
end
|
74
147
|
|
148
|
+
|
75
149
|
def make_api(domain_name, name:, script:nil, dns:nil, cert:nil, with_statements:[], &block)
|
76
150
|
|
77
151
|
api = make "AWS::ApiGateway::RestApi", name: name do
|
@@ -82,7 +156,7 @@ module Sumomo
|
|
82
156
|
|
83
157
|
apigen = APIGenerator.new(&block);
|
84
158
|
script.sub!("// {{ ROUTES }}", apigen.generate);
|
85
|
-
|
159
|
+
script.gsub!("{{ SCRIPT }}", apigen.init_script);
|
86
160
|
script.gsub!("{{ REGION }}", @region);
|
87
161
|
script.gsub!("{{ BUCKET }}", @bucket_name);
|
88
162
|
script.gsub!("{{ STORE_PREFIX }}", "functions/" + name);
|
data/lib/sumomo/cdn.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
|
2
2
|
module Sumomo
|
3
3
|
module Stack
|
4
|
-
def make_cdn_from_dir(domain:, dns:nil, name:nil, dir:, low_ttl: [])
|
4
|
+
def make_cdn_from_dir(domain:, cert:nil, dns:nil, name:nil, dir:, low_ttl: [])
|
5
5
|
|
6
6
|
bucket_name = @bucket_name
|
7
7
|
|
@@ -32,6 +32,11 @@ module Sumomo
|
|
32
32
|
})
|
33
33
|
end
|
34
34
|
|
35
|
+
viewer_policy = "allow-all"
|
36
|
+
if cert
|
37
|
+
viewer_policy = "redirect-to-https"
|
38
|
+
end
|
39
|
+
|
35
40
|
cdn = make "AWS::CloudFront::Distribution", name: name do
|
36
41
|
DistributionConfig do
|
37
42
|
Origins [{
|
@@ -51,7 +56,7 @@ module Sumomo
|
|
51
56
|
Cookies: { Forward: "none" }
|
52
57
|
},
|
53
58
|
TargetOriginId: "originBucket",
|
54
|
-
ViewerProtocolPolicy:
|
59
|
+
ViewerProtocolPolicy: viewer_policy,
|
55
60
|
DefaultTTL: 60,
|
56
61
|
MaxTTL: 60,
|
57
62
|
MinTTL: 60
|
@@ -61,12 +66,20 @@ module Sumomo
|
|
61
66
|
Enabled "true"
|
62
67
|
DefaultRootObject "index.html"
|
63
68
|
Aliases [ domain ]
|
64
|
-
|
69
|
+
|
70
|
+
if cert
|
71
|
+
ViewerCertificate {
|
72
|
+
AcmCertificateArn cert
|
73
|
+
SslSupportMethod "sni-only"
|
74
|
+
}
|
75
|
+
else
|
76
|
+
ViewerCertificate { CloudFrontDefaultCertificate "true" }
|
77
|
+
end
|
65
78
|
|
66
79
|
DefaultCacheBehavior do
|
67
80
|
AllowedMethods ["GET", "HEAD", "OPTIONS"]
|
68
81
|
TargetOriginId "originBucket"
|
69
|
-
ViewerProtocolPolicy
|
82
|
+
ViewerProtocolPolicy viewer_policy
|
70
83
|
ForwardedValues {
|
71
84
|
QueryString "false"
|
72
85
|
Cookies { Forward "none" }
|
data/lib/sumomo/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sumomo
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.8.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- David Siaw
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-01-
|
11
|
+
date: 2018-01-15 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|