bool.ls -> boot.js
This commit is contained in:
		
							parent
							
								
									94e983a5cc
								
							
						
					
					
						commit
						264051cb1e
					
				
					 6 changed files with 173 additions and 158 deletions
				
			
		|  | @ -5,7 +5,7 @@ | |||
| const riot = require('riot'); | ||||
| document.title = 'Misskey | アプリの連携'; | ||||
| require('./tags.ls'); | ||||
| const boot = require('../boot.ls'); | ||||
| const boot = require('../boot.js'); | ||||
| 
 | ||||
| /** | ||||
|  * Boot | ||||
|  |  | |||
							
								
								
									
										169
									
								
								src/web/app/boot.js
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										169
									
								
								src/web/app/boot.js
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,169 @@ | |||
| /* | ||||
| MISSKEY BOOT LOADER | ||||
| 
 | ||||
| Misskeyを起動します。 | ||||
| 1. 初期化 | ||||
| 2. ユーザー取得(ログインしていれば) | ||||
| 3. アプリケーションをマウント | ||||
| */ | ||||
| 
 | ||||
| // LOAD DEPENDENCIES
 | ||||
| 
 | ||||
| const riot = require('riot'); | ||||
| require('velocity'); | ||||
| const log = require('./common/scripts/log.ls'); | ||||
| const api = require('./common/scripts/api.ls'); | ||||
| const signout = require('./common/scripts/signout.ls'); | ||||
| const generateDefaultUserdata = require('./common/scripts/generate-default-userdata.ls'); | ||||
| const mixins = require('./common/mixins.ls'); | ||||
| const checkForUpdate = require('./common/scripts/check-for-update.ls'); | ||||
| require('./common/tags.ls'); | ||||
| 
 | ||||
| // MISSKEY ENTORY POINT
 | ||||
| 
 | ||||
| document.domain = CONFIG.host; | ||||
| 
 | ||||
| // ↓ iOS待ちPolyfill (SEE: http://caniuse.com/#feat=fetch)
 | ||||
| require('fetch'); | ||||
| 
 | ||||
| // ↓ NodeList、HTMLCollectionで forEach を使えるようにする
 | ||||
| if (NodeList.prototype.forEach === undefined) { | ||||
|   NodeList.prototype.forEach = Array.prototype.forEach; | ||||
| } | ||||
| if (HTMLCollection.prototype.forEach === undefined) { | ||||
|   HTMLCollection.prototype.forEach = Array.prototype.forEach; | ||||
| } | ||||
| 
 | ||||
| // ↓ iOSでプライベートモードだとlocalStorageが使えないので既存のメソッドを上書きする
 | ||||
| try { | ||||
|   localStorage.setItem('kyoppie', 'yuppie'); | ||||
| } catch (e) { | ||||
|   Storage.prototype.setItem = () => { }; // noop
 | ||||
| } | ||||
| 
 | ||||
| // MAIN PROCESS
 | ||||
| 
 | ||||
| log("Misskey (aoi) v:" + VERSION); | ||||
| 
 | ||||
| // Check for Update
 | ||||
| checkForUpdate(); | ||||
| 
 | ||||
| // Get token from cookie
 | ||||
| const i = (document.cookie.match(/i=(\w+)/) || [null, null])[1]; | ||||
| 
 | ||||
| if (i != null) { | ||||
|   log("ME: " + i); | ||||
| } | ||||
| 
 | ||||
| // ユーザーをフェッチしてコールバックする
 | ||||
| module.exports = callback => { | ||||
| 	// Get cached account data
 | ||||
|   let cachedMe = JSON.parse(localStorage.getItem('me')); | ||||
| 
 | ||||
|   if (cachedMe != null && cachedMe.data != null && cachedMe.data.cache) { | ||||
|     fetched(cachedMe); | ||||
| 
 | ||||
| 		// 後から新鮮なデータをフェッチ
 | ||||
|     fetchme(i, true, freshData => { | ||||
|       Object.assign(cachedMe, freshData); | ||||
|       cachedMe.trigger('updated'); | ||||
|     }); | ||||
|   } else { | ||||
| 		// キャッシュ無効なのにキャッシュが残ってたら掃除
 | ||||
|     if (cachedMe != null) { | ||||
|       localStorage.removeItem('me'); | ||||
|     } | ||||
|     fetchme(i, false, fetched); | ||||
|   } | ||||
| 
 | ||||
|   function fetched(me) { | ||||
|     if (me != null) { | ||||
|       riot.observable(me); | ||||
|       if (me.data.cache) { | ||||
|         localStorage.setItem('me', JSON.stringify(me)); | ||||
|         me.on('updated', () => { | ||||
| 					// キャッシュ更新
 | ||||
|           localStorage.setItem('me', JSON.stringify(me)); | ||||
|         }); | ||||
|       } | ||||
|       log("Fetched! Hello " + me.username + "."); | ||||
|     } | ||||
|     mixins(me); | ||||
|     const init = document.getElementById('init'); | ||||
|     init.parentNode.removeChild(init); | ||||
|     const app = document.createElement('div'); | ||||
|     app.setAttribute('id', 'app'); | ||||
|     document.body.appendChild(app); | ||||
|     try { | ||||
|       callback(me); | ||||
|     } catch (e) { | ||||
|       panic(e); | ||||
|     } | ||||
|   } | ||||
| }; | ||||
| 
 | ||||
| // ユーザーをフェッチしてコールバックする
 | ||||
| function fetchme(token, silent, cb) { | ||||
|   let me = null; | ||||
| 
 | ||||
| 	// Return when not signed in
 | ||||
|   if (token == null) { | ||||
|     done(); | ||||
|   } | ||||
| 
 | ||||
| 	// Fetch user
 | ||||
|   fetch(CONFIG.api.url + "/i", { | ||||
|     method: 'POST', | ||||
|     headers: { | ||||
|       'Content-Type': 'application/x-www-form-urlencoded; charset=utf-8' | ||||
|     }, | ||||
|     body: "i=" + token | ||||
|   }).then(res => { | ||||
| 		// When failed to authenticate user
 | ||||
|     if (res.status !== 200) { | ||||
|       signout(); | ||||
|     } | ||||
|     res.json().then(i => { | ||||
|       me = i; | ||||
|       me.token = token; | ||||
| 
 | ||||
| 			// initialize it if user data is empty
 | ||||
|       if (me.data != null) { | ||||
|         done(); | ||||
|       } else { | ||||
|         init(); | ||||
|       } | ||||
|     }); | ||||
|   }).catch(() => { | ||||
|     if (!silent) { | ||||
|       const info = document.body.appendChild(document.createElement('mk-core-error')); | ||||
|       riot.mount(info, { | ||||
|         retry: () => { | ||||
|           fetchme(token, false, cb); | ||||
|         } | ||||
|       }); | ||||
| 		} | ||||
|   }); | ||||
| 
 | ||||
|   function done() { | ||||
|     if (cb != null) { | ||||
|     	cb(me); | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
|   function init() { | ||||
|     var data, this$ = this; | ||||
|     data = generateDefaultUserdata(); | ||||
|     api(token, 'i/appdata/set', { | ||||
|       data: JSON.stringify(data) | ||||
|     }).then(() => { | ||||
|       me.data = data; | ||||
|       done(); | ||||
|     }); | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| function panic(e) { | ||||
|   console.error(e); | ||||
|   document.body.innerHTML = '<div id="error"><p>致命的な問題が発生しました。</p></div>'; | ||||
| } | ||||
|  | @ -1,154 +0,0 @@ | |||
| #================================ | ||||
| # MISSKEY BOOT LOADER | ||||
| # | ||||
| # Misskeyを起動します。 | ||||
| # 1. 初期化 | ||||
| # 2. ユーザー取得(ログインしていれば) | ||||
| # 3. アプリケーションをマウント | ||||
| #================================ | ||||
| 
 | ||||
| # LOAD DEPENDENCIES | ||||
| #-------------------------------- | ||||
| 
 | ||||
| riot = require \riot | ||||
| require \velocity | ||||
| log = require './common/scripts/log.ls' | ||||
| api = require './common/scripts/api.ls' | ||||
| signout = require './common/scripts/signout.ls' | ||||
| generate-default-userdata = require './common/scripts/generate-default-userdata.ls' | ||||
| mixins = require './common/mixins.ls' | ||||
| check-for-update = require './common/scripts/check-for-update.ls' | ||||
| require './common/tags.ls' | ||||
| 
 | ||||
| # MISSKEY ENTORY POINT | ||||
| #-------------------------------- | ||||
| 
 | ||||
| # for subdomains | ||||
| document.domain = CONFIG.host | ||||
| 
 | ||||
| # ↓ iOS待ちPolyfill (SEE: http://caniuse.com/#feat=fetch) | ||||
| require \fetch | ||||
| 
 | ||||
| # ↓ NodeList、HTMLCollectionで forEach を使えるようにする | ||||
| if NodeList.prototype.for-each == undefined | ||||
| 	NodeList.prototype.for-each = Array.prototype.for-each | ||||
| if HTMLCollection.prototype.for-each == undefined | ||||
| 	HTMLCollection.prototype.for-each = Array.prototype.for-each | ||||
| 
 | ||||
| # ↓ iOSでプライベートモードだとlocalStorageが使えないので既存のメソッドを上書きする | ||||
| try | ||||
| 	local-storage.set-item \kyoppie \yuppie | ||||
| catch e | ||||
| 	Storage.prototype.set-item = ~> # noop | ||||
| 
 | ||||
| # MAIN PROCESS | ||||
| #-------------------------------- | ||||
| 
 | ||||
| log "Misskey (aoi) v:#{VERSION}" | ||||
| 
 | ||||
| # Check for Update | ||||
| check-for-update! | ||||
| 
 | ||||
| # Get token from cookie | ||||
| i = ((document.cookie.match /i=(\w+)/) || [null null]).1 | ||||
| 
 | ||||
| if i? then log "ME: #{i}" | ||||
| 
 | ||||
| # ユーザーをフェッチしてコールバックする | ||||
| module.exports = (callback) ~> | ||||
| 	# Get cached account data | ||||
| 	cached-me = JSON.parse local-storage.get-item \me | ||||
| 
 | ||||
| 	if cached-me?.data?.cache | ||||
| 		fetched cached-me | ||||
| 
 | ||||
| 		# 後から新鮮なデータをフェッチ | ||||
| 		fetchme i, true, (fresh-data) ~> | ||||
| 			Object.assign cached-me, fresh-data | ||||
| 			cached-me.trigger \updated | ||||
| 	else | ||||
| 		# キャッシュ無効なのにキャッシュが残ってたら掃除 | ||||
| 		if cached-me? | ||||
| 			local-storage.remove-item \me | ||||
| 
 | ||||
| 		fetchme i, false, fetched | ||||
| 
 | ||||
| 	function fetched me | ||||
| 
 | ||||
| 		if me? | ||||
| 			riot.observable me | ||||
| 
 | ||||
| 			if me.data.cache | ||||
| 				local-storage.set-item \me JSON.stringify me | ||||
| 
 | ||||
| 				me.on \updated ~> | ||||
| 					# キャッシュ更新 | ||||
| 					local-storage.set-item \me JSON.stringify me | ||||
| 
 | ||||
| 			log "Fetched! Hello #{me.username}." | ||||
| 
 | ||||
| 		# activate mixins | ||||
| 		mixins me | ||||
| 
 | ||||
| 		# destroy loading screen | ||||
| 		init = document.get-element-by-id \init | ||||
| 		init.parent-node.remove-child init | ||||
| 
 | ||||
| 		# set main element | ||||
| 		document.create-element \div | ||||
| 			..set-attribute \id \app | ||||
| 			.. |> document.body.append-child | ||||
| 
 | ||||
| 		# Call main proccess | ||||
| 		try | ||||
| 			callback me | ||||
| 		catch error | ||||
| 			panic error | ||||
| 
 | ||||
| # ユーザーをフェッチしてコールバックする | ||||
| function fetchme token, silent, cb | ||||
| 	me = null | ||||
| 
 | ||||
| 	# Return when not signed in | ||||
| 	if not token? then return done! | ||||
| 
 | ||||
| 	# Fetch user | ||||
| 	fetch "#{CONFIG.api.url}/i" do | ||||
| 		method: \POST | ||||
| 		headers: | ||||
| 			'Content-Type': 'application/x-www-form-urlencoded; charset=utf-8' | ||||
| 		body: "i=#token" | ||||
| 	.then (res) ~> | ||||
| 		# When failed to authenticate user | ||||
| 		if res.status != 200 then signout! | ||||
| 
 | ||||
| 		i <~ res.json!.then | ||||
| 		me := i | ||||
| 		me.token = token | ||||
| 
 | ||||
| 		# initialize it if user data is empty | ||||
| 		if me.data? then done! else init! | ||||
| 	.catch ~> | ||||
| 		if not silent | ||||
| 			info = document.create-element \mk-core-error | ||||
| 				|> document.body.append-child | ||||
| 			riot.mount info, do | ||||
| 				retry: ~> fetchme token, false, cb | ||||
| 		else | ||||
| 			# noop | ||||
| 
 | ||||
| 	function done | ||||
| 		if cb? then cb me | ||||
| 
 | ||||
| 	function init | ||||
| 		data = generate-default-userdata! | ||||
| 
 | ||||
| 		api token, \i/appdata/set do | ||||
| 			data: JSON.stringify data | ||||
| 		.then ~> | ||||
| 			me.data = data | ||||
| 			done! | ||||
| 
 | ||||
| function panic e | ||||
| 	console.error e | ||||
| 	document.body.innerHTML = '<div id="error"><p>致命的な問題が発生しました。</p></div>' | ||||
|  | @ -5,7 +5,7 @@ | |||
| require('chart.js'); | ||||
| require('./tags.ls'); | ||||
| const riot = require('riot'); | ||||
| const boot = require('../boot.ls'); | ||||
| const boot = require('../boot.js'); | ||||
| const mixins = require('./mixins.ls'); | ||||
| const route = require('./router.ls'); | ||||
| const fuckAdBlock = require('./scripts/fuck-ad-block.ls'); | ||||
|  |  | |||
|  | @ -3,7 +3,7 @@ | |||
|  */ | ||||
| 
 | ||||
| require('./tags.ls'); | ||||
| const boot = require('../boot.ls'); | ||||
| const boot = require('../boot.js'); | ||||
| const route = require('./router.ls'); | ||||
| 
 | ||||
| /** | ||||
|  |  | |||
|  | @ -4,7 +4,7 @@ | |||
| 
 | ||||
| require('./tags.ls'); | ||||
| require('./scripts/sp-slidemenu.js'); | ||||
| const boot = require('../boot.ls'); | ||||
| const boot = require('../boot.js'); | ||||
| const mixins = require('./mixins.ls'); | ||||
| const route = require('./router.ls'); | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue