import { wrapFn } from './common/wrap-fn' import messages from './lang/index' import * as methodList from './uni-id' function parseContext (context) { return { appId: context.APPID, platform: context.PLATFORM, locale: context.LOCALE, clientIP: context.CLIENTIP, deviceId: context.DEVICEID } } const uniIDConfig = require('uni-config-center')({ pluginId: 'uni-id' }) class UniID { constructor ({ context, clientInfo, config } = {}) { this._clientInfo = context ? parseContext(context) : clientInfo this.config = config || this._getOriginConfig() this.interceptorMap = new Map() if (uniIDConfig.hasFile('custom-token.js')) { this.setInterceptor('customToken', require(uniIDConfig.resolve('custom-token.js'))) } this._i18n = uniCloud.initI18n({ locale: this._clientInfo.locale, fallbackLocale: 'zh-Hans', messages }) } setInterceptor (timing, handler) { this.interceptorMap.set(timing, handler) } _t (...args) { return this._i18n.t(...args) } _getOriginConfig () { if (uniIDConfig.hasFile('config.json')) { let configContent try { configContent = uniIDConfig.config() } catch (error) { throw new Error('Invalid uni-id config file\n' + error.message) } // require [1,2] => {0:1,1:2} if (Array.isArray(configContent)) { return configContent } return configContent[0] ? Object.values(configContent) : configContent } else { throw new Error('Invalid uni-id config file') } } _getAppConfig () { const originConfig = this._getOriginConfig() if (!Array.isArray(originConfig)) { return originConfig } return originConfig.find(item => item.dcloudAppid === this._clientInfo.appId) || originConfig.find(item => item.isDefaultConfig) } _getPlatformConfig () { const appConfig = this._getAppConfig() if (this._clientInfo.platform === 'app-plus') { this._clientInfo.platform = 'app' } if (this._clientInfo.platform === 'h5') { this._clientInfo.platform = 'web' } const defaultConfig = { tokenExpiresIn: 7200, tokenExpiresThreshold: 1200, passwordErrorLimit: 6, passwordErrorRetryTime: 3600 } const argsRequired = ['tokenSecret', 'tokenExpiresIn'] const config = Object.assign(defaultConfig, appConfig, appConfig[this._clientInfo.platform]) argsRequired.forEach((item) => { if (!config || !config[item]) { throw new Error(`Config parameter missing, ${item} is required`) } }) return config } _getConfig () { return this._getPlatformConfig() } } for (const key in methodList) { UniID.prototype[key] = methodList[key] } function createInstance (params) { // { // context, // clientInfo, // config // } = params const uniIDOrigin = new UniID(params) const uniID = new Proxy(uniIDOrigin, { get (target, prop) { if (prop in target && prop.indexOf('_') !== 0) { if (typeof target[prop] === 'function') { return wrapFn(target[prop]).bind(target) } else if (prop === 'context' || prop === 'config') { } else { return target[prop] } } } }) return uniID } UniID.prototype.createInstance = createInstance const uniID = { // 自4.0.0版起只能使用createInstance创建实例,直接require('uni-id')仅会得到一个包含createInstance方法的对象 createInstance } export default uniID