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'); | const riot = require('riot'); | ||||||
| document.title = 'Misskey | アプリの連携'; | document.title = 'Misskey | アプリの連携'; | ||||||
| require('./tags.ls'); | require('./tags.ls'); | ||||||
| const boot = require('../boot.ls'); | const boot = require('../boot.js'); | ||||||
| 
 | 
 | ||||||
| /** | /** | ||||||
|  * Boot |  * 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('chart.js'); | ||||||
| require('./tags.ls'); | require('./tags.ls'); | ||||||
| const riot = require('riot'); | const riot = require('riot'); | ||||||
| const boot = require('../boot.ls'); | const boot = require('../boot.js'); | ||||||
| const mixins = require('./mixins.ls'); | const mixins = require('./mixins.ls'); | ||||||
| const route = require('./router.ls'); | const route = require('./router.ls'); | ||||||
| const fuckAdBlock = require('./scripts/fuck-ad-block.ls'); | const fuckAdBlock = require('./scripts/fuck-ad-block.ls'); | ||||||
|  |  | ||||||
|  | @ -3,7 +3,7 @@ | ||||||
|  */ |  */ | ||||||
| 
 | 
 | ||||||
| require('./tags.ls'); | require('./tags.ls'); | ||||||
| const boot = require('../boot.ls'); | const boot = require('../boot.js'); | ||||||
| const route = require('./router.ls'); | const route = require('./router.ls'); | ||||||
| 
 | 
 | ||||||
| /** | /** | ||||||
|  |  | ||||||
|  | @ -4,7 +4,7 @@ | ||||||
| 
 | 
 | ||||||
| require('./tags.ls'); | require('./tags.ls'); | ||||||
| require('./scripts/sp-slidemenu.js'); | require('./scripts/sp-slidemenu.js'); | ||||||
| const boot = require('../boot.ls'); | const boot = require('../boot.js'); | ||||||
| const mixins = require('./mixins.ls'); | const mixins = require('./mixins.ls'); | ||||||
| const route = require('./router.ls'); | const route = require('./router.ls'); | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue