From 94c5637024bb3d5f2aa2f24b8f62f0e17d27f996 Mon Sep 17 00:00:00 2001 From: ericrius1 Date: Thu, 5 Nov 2015 17:27:30 -0800 Subject: [PATCH 1/9] marketplace spawner --- examples/marketplace/marketplaceSpawner.js | 50 ++++++++++++++++++++++ 1 file changed, 50 insertions(+) create mode 100644 examples/marketplace/marketplaceSpawner.js diff --git a/examples/marketplace/marketplaceSpawner.js b/examples/marketplace/marketplaceSpawner.js new file mode 100644 index 0000000000..3e655e3e74 --- /dev/null +++ b/examples/marketplace/marketplaceSpawner.js @@ -0,0 +1,50 @@ +var floorPosition = Vec3.sum(MyAvatar.position, Vec3.multiply(3, Quat.getFront(Camera.getOrientation())));; +floorPosition.y = MyAvatar.position.y - 5; + +var modelsToLoad = [ + { + lowURL: "https://s3.amazonaws.com/hifi-public/ozan/3d_marketplace/sets/tuscany/tuscany_low.fbx", + highURL: "https://s3.amazonaws.com/hifi-public/ozan/3d_marketplace/sets/tuscany/tuscany_hi.fbx" + } +]; + +var models = []; + +var floor = Entities.addEntity({ + type: "Model", + modelURL: "https://hifi-public.s3.amazonaws.com/ozan/3d_marketplace/props/floor/3d_mp_floor.fbx", + position: floorPosition, + shapeType: 'box', + dimensions: {x: 1000, y: 9, z: 1000} +}); + +//Create grid +var modelParams = { + type: "Model", + shapeType: "box", + dimensions: {x: 53, y: 15.7, z: 44.8}, + velocity: {x: 0, y: -1, z: 0}, + gravity: {x: 0, y: -1, z: 0}, + collisionsWillMove: true +}; + +var modelPosition = {x: floorPosition.x + 10, y: floorPosition.y + 15, z: floorPosition.z}; +for (var i = 0; i < modelsToLoad.length; i++) { + modelParams.modelURL = modelsToLoad[i].lowURL; + modelPosition.z -= 10; + modelParams.position = modelPosition; + var model = Entities.addEntity(modelParams); + models.push(model); +} + + + + +function cleanup() { + Entities.deleteEntity(floor); + models.forEach(function(model) { + Entities.deleteEntity(model); + }); +} + +Script.scriptEnding.connect(cleanup); \ No newline at end of file From a432a62deecf405ad1f53911a479feb07d3a0001 Mon Sep 17 00:00:00 2001 From: ericrius1 Date: Fri, 6 Nov 2015 13:53:25 -0800 Subject: [PATCH 2/9] model swapping --- examples/marketplace/marketplaceSpawner.js | 68 ++++++++++++++++------ examples/marketplace/modelSwap.js | 41 +++++++++++++ 2 files changed, 91 insertions(+), 18 deletions(-) create mode 100644 examples/marketplace/modelSwap.js diff --git a/examples/marketplace/marketplaceSpawner.js b/examples/marketplace/marketplaceSpawner.js index 3e655e3e74..6799ed63a3 100644 --- a/examples/marketplace/marketplaceSpawner.js +++ b/examples/marketplace/marketplaceSpawner.js @@ -1,12 +1,17 @@ var floorPosition = Vec3.sum(MyAvatar.position, Vec3.multiply(3, Quat.getFront(Camera.getOrientation())));; floorPosition.y = MyAvatar.position.y - 5; -var modelsToLoad = [ - { - lowURL: "https://s3.amazonaws.com/hifi-public/ozan/3d_marketplace/sets/tuscany/tuscany_low.fbx", - highURL: "https://s3.amazonaws.com/hifi-public/ozan/3d_marketplace/sets/tuscany/tuscany_hi.fbx" - } -]; +Script.include('../libraries/utils.js'); + +var entityScriptURL = Script.resolvePath("modelSwap.js"); + +var modelsToLoad = [{ + lowURL: "https://s3.amazonaws.com/hifi-public/ozan/3d_marketplace/sets/dojo/dojo_low.fbx", + highURL: "https://s3.amazonaws.com/hifi-public/ozan/3d_marketplace/sets/dojo/dojo_hi.fbx" +}, { + lowURL: "https://s3.amazonaws.com/hifi-public/ozan/3d_marketplace/sets/tuscany/tuscany_low.fbx", + highURL: "https://s3.amazonaws.com/hifi-public/ozan/3d_marketplace/sets/tuscany/tuscany_hi.fbx" +}]; var models = []; @@ -15,35 +20,62 @@ var floor = Entities.addEntity({ modelURL: "https://hifi-public.s3.amazonaws.com/ozan/3d_marketplace/props/floor/3d_mp_floor.fbx", position: floorPosition, shapeType: 'box', - dimensions: {x: 1000, y: 9, z: 1000} + dimensions: { + x: 1000, + y: 9, + z: 1000 + } }); //Create grid var modelParams = { type: "Model", - shapeType: "box", - dimensions: {x: 53, y: 15.7, z: 44.8}, - velocity: {x: 0, y: -1, z: 0}, - gravity: {x: 0, y: -1, z: 0}, - collisionsWillMove: true + dimensions: { + x: 31.85, + y: 7.75, + z: 54.51 + }, + script: entityScriptURL, + userData: JSON.stringify({ + grabbableKey: { + wantsTrigger: true + } + }) + }; -var modelPosition = {x: floorPosition.x + 10, y: floorPosition.y + 15, z: floorPosition.z}; +var modelPosition = { + x: floorPosition.x + 10, + y: floorPosition.y + 8.5, + z: floorPosition.z - 30 +}; for (var i = 0; i < modelsToLoad.length; i++) { modelParams.modelURL = modelsToLoad[i].lowURL; - modelPosition.z -= 10; modelParams.position = modelPosition; - var model = Entities.addEntity(modelParams); - models.push(model); -} + var lowModel = Entities.addEntity(modelParams); + modelParams.modelURL = modelsToLoad[i].highURL; + modelParams.visible = false; + modelParams.dimensions = Vec3.multiply(modelParams.dimensions, 0.5); + var highModel = Entities.addEntity(modelParams); + models.push({ + low: lowModel, + high: highModel + }); + // customKey, id, data + setEntityCustomData('modelCounterpart', lowModel, {modelCounterpartId: highModel}); + setEntityCustomData('modelCounterpart', highModel, {modelCounterpartId: lowModel}); + + modelPosition.z -= 60; +} function cleanup() { Entities.deleteEntity(floor); models.forEach(function(model) { - Entities.deleteEntity(model); + Entities.deleteEntity(model.low); + Entities.deleteEntity(model.high); }); } diff --git a/examples/marketplace/modelSwap.js b/examples/marketplace/modelSwap.js new file mode 100644 index 0000000000..29dbc84e98 --- /dev/null +++ b/examples/marketplace/modelSwap.js @@ -0,0 +1,41 @@ +// When user holds down trigger on model for enough time, the model with do a cool animation and swap out with the low or high version of it + + + +(function() { + + var _this; + ModelSwaper = function() { + _this = this; + }; + + ModelSwaper.prototype = { + + startFarTrigger: function() { + print("START TRIGGER") + + //make self invisible and make the model's counterpart visible! + var dimensions = Entities.getEntityProperties(this.entityID, "dimensions").dimensions; + Entities.editEntity(this.entityID, { + visible: false, + dimensions: Vec3.multiply(dimensions, 0.5) + }); + dimensions = Entities.getEntityProperties(this.modelCounterpartId, "dimensions").dimensions; + Entities.editEntity(this.modelCounterpartId, { + visible: true, + dimensions: Vec3.multiply(dimensions, 2) + }); + + }, + + preload: function(entityID) { + this.entityID = entityID; + var props = Entities.getEntityProperties(this.entityID, ["userData"]); + this.modelCounterpartId = JSON.parse(props.userData).modelCounterpart.modelCounterpartId; + } + + }; + + // entity scripts always need to return a newly constructed object of our type + return new ModelSwaper(); +}); \ No newline at end of file From e4b271d6d8ffe6f3e554d65f641560d7aed4364a Mon Sep 17 00:00:00 2001 From: ericrius1 Date: Tue, 10 Nov 2015 16:49:46 -0800 Subject: [PATCH 3/9] dynamic loading content from s3 --- examples/marketplace/dynamicLoader.js | 74 +++++++++++++++++++++++++++ 1 file changed, 74 insertions(+) create mode 100644 examples/marketplace/dynamicLoader.js diff --git a/examples/marketplace/dynamicLoader.js b/examples/marketplace/dynamicLoader.js new file mode 100644 index 0000000000..5c9c4560d8 --- /dev/null +++ b/examples/marketplace/dynamicLoader.js @@ -0,0 +1,74 @@ +var BASE_URL = "https://hifi-public.s3.amazonaws.com/"; +var models = []; +var floorPosition = Vec3.sum(MyAvatar.position, Vec3.multiply(3, Quat.getFront(Camera.getOrientation())));; +floorPosition.y = MyAvatar.position.y - 5; +var floor = Entities.addEntity({ + type: "Model", + modelURL: "https://hifi-public.s3.amazonaws.com/ozan/3d_marketplace/props/floor/3d_mp_floor.fbx", + position: floorPosition, + shapeType: 'box', + dimensions: { + x: 1000, + y: 9, + z: 1000 + } +}); + +var urls = []; +var req = new XMLHttpRequest(); +req.open("GET", "https://serene-headland-4300.herokuapp.com/?assetDir=ozan/3d_marketplace/sets", false); +// req.open("GET", "http://localhost:5000", false); +req.send(); + +var res = req.responseText; +var urls = JSON.parse(res).urls; +if (urls.length > 0) { + print("WAAAH") + // We've got an array of urls back from server- let's display them in grid + createGrid(); +} + +function createGrid() { + var fbxUrls = urls.filter(function(url) { + return url.indexOf('fbx') !== -1; + }); + print(JSON.stringify(fbxUrls)); + + var modelParams = { + type: "Model", + // dimensions: { + // x: 31.85, + // y: 7.75, + // z: 54.51 + // }, + }; + + var modelPosition = { + x: floorPosition.x + 10, + y: floorPosition.y + 8.5, + z: floorPosition.z + }; + + for (var i = 0; i < fbxUrls.length; i++) { + if(i % 2 === 0) { + modelPosition.x = floorPosition.x - 40 + } else { + modelPosition.x = floorPosition.x + 40 + } + modelPosition.z -= 30; + modelParams.position = modelPosition; + modelParams.modelURL = BASE_URL + fbxUrls[i] + var model = Entities.addEntity(modelParams); + models.push(model); + } +} + +function cleanup() { + Entities.deleteEntity(floor); + models.forEach(function(model) { + Entities.deleteEntity(model); + }); + Entities.deleteEntity(model); +} + +Script.scriptEnding.connect(cleanup); \ No newline at end of file From 0aefb8747f3c59c14138077ba25368e1b6fd6624 Mon Sep 17 00:00:00 2001 From: ericrius1 Date: Tue, 10 Nov 2015 16:55:17 -0800 Subject: [PATCH 4/9] Dynamic loading of models from specified directory --- examples/marketplace/dynamicLoader.js | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/examples/marketplace/dynamicLoader.js b/examples/marketplace/dynamicLoader.js index 5c9c4560d8..b40eaa9dba 100644 --- a/examples/marketplace/dynamicLoader.js +++ b/examples/marketplace/dynamicLoader.js @@ -17,13 +17,11 @@ var floor = Entities.addEntity({ var urls = []; var req = new XMLHttpRequest(); req.open("GET", "https://serene-headland-4300.herokuapp.com/?assetDir=ozan/3d_marketplace/sets", false); -// req.open("GET", "http://localhost:5000", false); req.send(); var res = req.responseText; var urls = JSON.parse(res).urls; if (urls.length > 0) { - print("WAAAH") // We've got an array of urls back from server- let's display them in grid createGrid(); } @@ -36,11 +34,11 @@ function createGrid() { var modelParams = { type: "Model", - // dimensions: { - // x: 31.85, - // y: 7.75, - // z: 54.51 - // }, + dimensions: { + x: 10, + y: 10, + z: 10 + }, }; var modelPosition = { @@ -61,6 +59,15 @@ function createGrid() { var model = Entities.addEntity(modelParams); models.push(model); } + + Script.setTimeout(function() { + //Until we add callbacks on model loaded, we need to set a timeout and hope model is loaded by the time + //we hit it in order to set model dimensions correctly + for(var i = 0; i < models.length; i++){ + var modelDimensions = Entities.getEntityProperties(models[i], 'naturalDimensions').naturalDimensions; + Entities.editEntity(models[i], {dimensions: modelDimensions}); + } + }, 10000); } function cleanup() { From c2fe937a5c4cc34b6b4b6f6c08ee9b4a28468769 Mon Sep 17 00:00:00 2001 From: Eric Levin Date: Tue, 10 Nov 2015 17:07:55 -0800 Subject: [PATCH 5/9] Removed logging line --- examples/marketplace/dynamicLoader.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/examples/marketplace/dynamicLoader.js b/examples/marketplace/dynamicLoader.js index b40eaa9dba..bc7f4f5fb9 100644 --- a/examples/marketplace/dynamicLoader.js +++ b/examples/marketplace/dynamicLoader.js @@ -30,7 +30,6 @@ function createGrid() { var fbxUrls = urls.filter(function(url) { return url.indexOf('fbx') !== -1; }); - print(JSON.stringify(fbxUrls)); var modelParams = { type: "Model", @@ -78,4 +77,4 @@ function cleanup() { Entities.deleteEntity(model); } -Script.scriptEnding.connect(cleanup); \ No newline at end of file +Script.scriptEnding.connect(cleanup); From 3f5cd0237d351556d0d9106e801a9d063df3e569 Mon Sep 17 00:00:00 2001 From: ericrius1 Date: Tue, 10 Nov 2015 17:29:15 -0800 Subject: [PATCH 6/9] Added header to dynamicLoader and removed files that are not ready for merging --- examples/marketplace/dynamicLoader.js | 14 ++++ examples/marketplace/marketplaceSpawner.js | 82 ---------------------- examples/marketplace/modelSwap.js | 41 ----------- 3 files changed, 14 insertions(+), 123 deletions(-) delete mode 100644 examples/marketplace/marketplaceSpawner.js delete mode 100644 examples/marketplace/modelSwap.js diff --git a/examples/marketplace/dynamicLoader.js b/examples/marketplace/dynamicLoader.js index bc7f4f5fb9..674b6e86cd 100644 --- a/examples/marketplace/dynamicLoader.js +++ b/examples/marketplace/dynamicLoader.js @@ -1,3 +1,17 @@ +// +// dynamicLoader.js +// examples +// +// Created by Eric Levin on 11/10/2015. +// Copyright 2013 High Fidelity, Inc. +// +// This is script loads models from a specified directory +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html + + + var BASE_URL = "https://hifi-public.s3.amazonaws.com/"; var models = []; var floorPosition = Vec3.sum(MyAvatar.position, Vec3.multiply(3, Quat.getFront(Camera.getOrientation())));; diff --git a/examples/marketplace/marketplaceSpawner.js b/examples/marketplace/marketplaceSpawner.js deleted file mode 100644 index 6799ed63a3..0000000000 --- a/examples/marketplace/marketplaceSpawner.js +++ /dev/null @@ -1,82 +0,0 @@ -var floorPosition = Vec3.sum(MyAvatar.position, Vec3.multiply(3, Quat.getFront(Camera.getOrientation())));; -floorPosition.y = MyAvatar.position.y - 5; - -Script.include('../libraries/utils.js'); - -var entityScriptURL = Script.resolvePath("modelSwap.js"); - -var modelsToLoad = [{ - lowURL: "https://s3.amazonaws.com/hifi-public/ozan/3d_marketplace/sets/dojo/dojo_low.fbx", - highURL: "https://s3.amazonaws.com/hifi-public/ozan/3d_marketplace/sets/dojo/dojo_hi.fbx" -}, { - lowURL: "https://s3.amazonaws.com/hifi-public/ozan/3d_marketplace/sets/tuscany/tuscany_low.fbx", - highURL: "https://s3.amazonaws.com/hifi-public/ozan/3d_marketplace/sets/tuscany/tuscany_hi.fbx" -}]; - -var models = []; - -var floor = Entities.addEntity({ - type: "Model", - modelURL: "https://hifi-public.s3.amazonaws.com/ozan/3d_marketplace/props/floor/3d_mp_floor.fbx", - position: floorPosition, - shapeType: 'box', - dimensions: { - x: 1000, - y: 9, - z: 1000 - } -}); - -//Create grid -var modelParams = { - type: "Model", - dimensions: { - x: 31.85, - y: 7.75, - z: 54.51 - }, - script: entityScriptURL, - userData: JSON.stringify({ - grabbableKey: { - wantsTrigger: true - } - }) - -}; - -var modelPosition = { - x: floorPosition.x + 10, - y: floorPosition.y + 8.5, - z: floorPosition.z - 30 -}; -for (var i = 0; i < modelsToLoad.length; i++) { - modelParams.modelURL = modelsToLoad[i].lowURL; - modelParams.position = modelPosition; - var lowModel = Entities.addEntity(modelParams); - - modelParams.modelURL = modelsToLoad[i].highURL; - modelParams.visible = false; - modelParams.dimensions = Vec3.multiply(modelParams.dimensions, 0.5); - var highModel = Entities.addEntity(modelParams); - models.push({ - low: lowModel, - high: highModel - }); - // customKey, id, data - setEntityCustomData('modelCounterpart', lowModel, {modelCounterpartId: highModel}); - setEntityCustomData('modelCounterpart', highModel, {modelCounterpartId: lowModel}); - - modelPosition.z -= 60; -} - - - -function cleanup() { - Entities.deleteEntity(floor); - models.forEach(function(model) { - Entities.deleteEntity(model.low); - Entities.deleteEntity(model.high); - }); -} - -Script.scriptEnding.connect(cleanup); \ No newline at end of file diff --git a/examples/marketplace/modelSwap.js b/examples/marketplace/modelSwap.js deleted file mode 100644 index 29dbc84e98..0000000000 --- a/examples/marketplace/modelSwap.js +++ /dev/null @@ -1,41 +0,0 @@ -// When user holds down trigger on model for enough time, the model with do a cool animation and swap out with the low or high version of it - - - -(function() { - - var _this; - ModelSwaper = function() { - _this = this; - }; - - ModelSwaper.prototype = { - - startFarTrigger: function() { - print("START TRIGGER") - - //make self invisible and make the model's counterpart visible! - var dimensions = Entities.getEntityProperties(this.entityID, "dimensions").dimensions; - Entities.editEntity(this.entityID, { - visible: false, - dimensions: Vec3.multiply(dimensions, 0.5) - }); - dimensions = Entities.getEntityProperties(this.modelCounterpartId, "dimensions").dimensions; - Entities.editEntity(this.modelCounterpartId, { - visible: true, - dimensions: Vec3.multiply(dimensions, 2) - }); - - }, - - preload: function(entityID) { - this.entityID = entityID; - var props = Entities.getEntityProperties(this.entityID, ["userData"]); - this.modelCounterpartId = JSON.parse(props.userData).modelCounterpart.modelCounterpartId; - } - - }; - - // entity scripts always need to return a newly constructed object of our type - return new ModelSwaper(); -}); \ No newline at end of file From 4fc44b09294e903f22a70126db5222006efe3aba Mon Sep 17 00:00:00 2001 From: ericrius1 Date: Wed, 11 Nov 2015 15:19:36 -0800 Subject: [PATCH 7/9] Updated header summary to be more specific with how the loading works --- examples/marketplace/dynamicLoader.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/examples/marketplace/dynamicLoader.js b/examples/marketplace/dynamicLoader.js index 674b6e86cd..27f50aa9cd 100644 --- a/examples/marketplace/dynamicLoader.js +++ b/examples/marketplace/dynamicLoader.js @@ -5,7 +5,8 @@ // Created by Eric Levin on 11/10/2015. // Copyright 2013 High Fidelity, Inc. // -// This is script loads models from a specified directory +// This script is an example of a way to dynamically load and place models in a grid from a specified s3 directory on the hifi-public bucket. +// The directory can be specified by changing the query string variable on line 19 to the desired relative path. // // Distributed under the Apache License, Version 2.0. // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html From 56dc9092e0ec8df78576be16b4af64dbe13aa71d Mon Sep 17 00:00:00 2001 From: ericrius1 Date: Wed, 11 Nov 2015 15:52:12 -0800 Subject: [PATCH 8/9] added s3 server --- examples/marketplace/S3Server/Procfile | 1 + examples/marketplace/S3Server/index.js | 44 ++++++++++++++++++++++ examples/marketplace/S3Server/package.json | 18 +++++++++ 3 files changed, 63 insertions(+) create mode 100644 examples/marketplace/S3Server/Procfile create mode 100644 examples/marketplace/S3Server/index.js create mode 100644 examples/marketplace/S3Server/package.json diff --git a/examples/marketplace/S3Server/Procfile b/examples/marketplace/S3Server/Procfile new file mode 100644 index 0000000000..5ec9cc2c50 --- /dev/null +++ b/examples/marketplace/S3Server/Procfile @@ -0,0 +1 @@ +web: node index.js \ No newline at end of file diff --git a/examples/marketplace/S3Server/index.js b/examples/marketplace/S3Server/index.js new file mode 100644 index 0000000000..e21adb99ad --- /dev/null +++ b/examples/marketplace/S3Server/index.js @@ -0,0 +1,44 @@ +var express = require('express'); +var app = express(); +var AWS = require('aws-sdk'); +var url = require('url'); +var querystring = require('querystring'); +var _ = require('underscore'); + +AWS.config.update({ + region: "us-east-1" +}); + +var s3 = new AWS.S3(); + +app.set('port', (process.env.PORT || 5000)); + +app.get('/', function(req, res) { + var urlParts = url.parse(req.url) + var query = querystring.parse(urlParts.query); + + var params = { + Bucket: "hifi-public", + Marker: query.assetDir, + MaxKeys: 10 + }; + s3.listObjects(params, function(err, data) { + if (err) { + console.log(err, err.stack); + res.send("ERROR") + } else { + var keys = _.pluck(data.Contents, 'Key') + res.send({ + urls: keys + }); + } + }); +}); + + +app.listen(app.get('port'), function() { + console.log('Node app is running on port', app.get('port')); +}) + + +//ozan/3d_marketplace \ No newline at end of file diff --git a/examples/marketplace/S3Server/package.json b/examples/marketplace/S3Server/package.json new file mode 100644 index 0000000000..51a77e7ff9 --- /dev/null +++ b/examples/marketplace/S3Server/package.json @@ -0,0 +1,18 @@ +{ + "name": "s3fileserver", + "version": "1.0.0", + "description": "", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "author": "eric", + "license": "ISC", + "dependencies": { + "aws-sdk": "^2.2.15", + "express": "^4.13.3", + "querystring": "^0.2.0", + "underscore": "^1.8.3", + "url": "^0.11.0" + } +} \ No newline at end of file From 806d303dcd8b245de1d2093846c6d445d97655e5 Mon Sep 17 00:00:00 2001 From: ericrius1 Date: Wed, 11 Nov 2015 15:55:32 -0800 Subject: [PATCH 9/9] Added header file --- examples/marketplace/S3Server/index.js | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/examples/marketplace/S3Server/index.js b/examples/marketplace/S3Server/index.js index e21adb99ad..ff7eac6cdf 100644 --- a/examples/marketplace/S3Server/index.js +++ b/examples/marketplace/S3Server/index.js @@ -1,3 +1,18 @@ +// +// index.js +// examples +// +// Created by Eric Levin on 11/10/2015. +// Copyright 2013 High Fidelity, Inc. +// +// This is a simple REST API that allows an interface client script to get a list of files paths from an S3 bucket. +// To change your bucket, modify line 34 to your desired bucket. +// Please refer to http://docs.aws.amazon.com/AWSJavaScriptSDK/guide/node-configuring.html +// for instructions on how to configure the SDK to work with your bucket. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html + var express = require('express'); var app = express(); var AWS = require('aws-sdk'); @@ -40,5 +55,3 @@ app.listen(app.get('port'), function() { console.log('Node app is running on port', app.get('port')); }) - -//ozan/3d_marketplace \ No newline at end of file