diff --git a/package-lock.json b/package-lock.json index a8ffdcb3..a2e9d387 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1323,9 +1323,9 @@ } }, "backendless-rt-client": { - "version": "0.0.15", - "resolved": "https://registry.npmjs.org/backendless-rt-client/-/backendless-rt-client-0.0.15.tgz", - "integrity": "sha512-Jb+Qwck098fQ4qkaMdkPxGsWYNalT0HjENSPlXjbL5lUCGNAJAkb3rPzbIYnrEqHT7Xit5Jb7gTHCN/OVPJCaw==", + "version": "0.0.16", + "resolved": "https://registry.npmjs.org/backendless-rt-client/-/backendless-rt-client-0.0.16.tgz", + "integrity": "sha512-Ak62lHx+4nOeQF1J81wlF+ABO6f39tPiYsq5142TlLy3MEMd8hylBpb71vxVGO3nrSMyOZNMmJ+kDG0aHb9IMA==", "requires": { "backendless-request": "0.0.11", "socket.io-client": "2.1.1" diff --git a/package.json b/package.json index bc2a6bdd..a5ce2c4d 100644 --- a/package.json +++ b/package.json @@ -84,6 +84,6 @@ }, "dependencies": { "backendless-request": "~0.0.11", - "backendless-rt-client": "0.0.15" + "backendless-rt-client": "0.0.16" } } diff --git a/src/index.js b/src/index.js index 1520e192..8a516d00 100644 --- a/src/index.js +++ b/src/index.js @@ -1,27 +1,7 @@ import Request from 'backendless-request' -import Logging from './logging' -import Counters from './counters' -import Cache from './cache' -import Commerce from './commerce' -import Users from './users' -import User from './users/user' -import CustomServices from './bl/custom-services' -import Events from './bl/events' -import Geo from './geo' -import Data from './data' -import Messaging from './messaging' -import Device from './device' -import Files from './files' -import RT, { setRTDebugMode } from './rt' -import SharedObject from './rso' -import LocalCache from './local-cache' import LocalVars from './local-vars' -import { initApp } from './init-app' -import { getUserAgent } from './user-agent' -import { getCurrentUserToken } from './users/current-user' - const root = (typeof self === 'object' && self.self === self && self) || (typeof global === 'object' && global.global === global && global) @@ -36,7 +16,7 @@ const Backendless = { set debugMode(debugMode) { LocalVars.debugMode = !!debugMode - setRTDebugMode(LocalVars.debugMode) + require('./rt').setRTDebugMode(LocalVars.debugMode) }, get serverURL() { @@ -59,14 +39,35 @@ const Backendless = { return LocalVars.applicationId }, + set applicationId(appId) { + throw new Error( + `Setting '${appId}' value to Backendless.applicationId directly is not possible, ` + + `instead you must use Backendless.initApp('${appId}', API_KEY)` + ) + }, + get secretKey() { return LocalVars.secretKey }, + set secretKey(apiKey) { + throw new Error( + `Setting '${apiKey}' value to Backendless.secretKey directly is not possible, ` + + `instead you must use Backendless.initApp(APP_ID, '${apiKey}')` + ) + }, + get appPath() { return LocalVars.appPath }, + set appPath(appPath) { + throw new Error( + `Setting '${appPath}' value to Backendless.appPath directly is not possible, ` + + 'instead you must use Backendless.initApp(APP_ID, API_KEY) for setup the value' + ) + }, + get ServerCode() { return LocalVars.ServerCode }, @@ -75,13 +76,23 @@ const Backendless = { LocalVars.ServerCode = ServerCode }, - initApp, + initApp(...args) { + require('./init-app').initApp(...args) + }, + + getCurrentUserToken() { + return require('./users/current-user').getCurrentUserToken() + }, - getCurrentUserToken, + setupDevice(...args) { + const { default: Device } = require('./device') - setupDevice: Device.setup, + Device.setup(...args) + }, - browser: getUserAgent(), + get browser() { + return require('./user-agent').getUserAgent() + }, Request, @@ -96,20 +107,61 @@ const Backendless = { ///-------------------------------------/// ///-------------- SERVICES -------------/// - Logging : Logging, - Counters : Counters, - Cache : Cache, - Commerce : Commerce, - Users : Users, - User : User, - CustomServices: CustomServices, - Events : Events, - Geo : Geo, - Data : Data, - Messaging : Messaging, - Files : Files, - RT : RT, - SharedObject : SharedObject, + get Logging() { + return require('./logging').default + }, + + get Counters() { + return require('./counters').default + }, + + get Cache() { + return require('./cache').default + }, + + get Commerce() { + return require('./commerce').default + }, + + get Users() { + return require('./users').default + }, + + get User() { + return require('./users/user').default + }, + + get CustomServices() { + return require('./bl/custom-services').default + }, + + get Events() { + return require('./bl/events').default + }, + + get Geo() { + return require('./geo').default + }, + + get Data() { + return require('./data').default + }, + + get Messaging() { + return require('./messaging').default + }, + + get Files() { + return require('./files').default + }, + + get RT() { + return require('./rt').default + }, + + get SharedObject() { + return require('./rso').default + }, ///-------------- SERVICES -------------/// ///-------------------------------------/// @@ -118,22 +170,59 @@ const Backendless = { ///--------BACKWARD COMPATIBILITY-------/// //TODO: do we need to remove it? - UserService : Users, - GeoQuery : Geo.Query, - GeoPoint : Geo.Point, - GeoCluster : Geo.Cluster, - Persistence : Data, - DataQueryBuilder : Data.QueryBuilder, - LoadRelationsQueryBuilder: Data.LoadRelationsQueryBuilder, - Bodyparts : Messaging.Bodyparts, - PublishOptions : Messaging.PublishOptions, - DeliveryOptions : Messaging.DeliveryOptions, - PublishOptionsHeaders : Messaging.PublishOptionsHeaders, - - LocalCache, + + get UserService() { + return Backendless.Users + }, + + get GeoQuery() { + return Backendless.Geo.Query + }, + + get GeoPoint() { + return Backendless.Geo.Point + }, + + get GeoCluster() { + return Backendless.Geo.Cluster + }, + + get Persistence() { + return Backendless.Data + }, + + get DataQueryBuilder() { + return Backendless.Data.QueryBuilder + }, + + get LoadRelationsQueryBuilder() { + return Backendless.Data.LoadRelationsQueryBuilder + }, + + get Bodyparts() { + return Backendless.Messaging.Bodyparts + }, + + get PublishOptions() { + return Backendless.Messaging.PublishOptions + }, + + get DeliveryOptions() { + return Backendless.Messaging.DeliveryOptions + }, + + get PublishOptionsHeaders() { + return Backendless.Messaging.PublishOptionsHeaders + }, + + get LocalCache() { + return require('./local-cache').default + }, /** @deprecated */ - SubscriptionOptions : Messaging.SubscriptionOptions, + get SubscriptionOptions() { + return Backendless.Messaging.SubscriptionOptions + }, ///--------BACKWARD COMPATIBILITY-------/// ///-------------------------------------/// diff --git a/src/init-app.js b/src/init-app.js index 1b41f95c..41de0f75 100644 --- a/src/init-app.js +++ b/src/init-app.js @@ -1,10 +1,10 @@ -import LocalVars from './local-vars' -import LoggingCollector from './logging/collector' -import GeoTrackerMonitor from './geo/tracker-monitor' -import { initRTClient } from './rt' -import { setLocalCurrentUser } from './users/current-user' - export function initApp(appId, secretKey) { + const { default: LocalVars } = require('./local-vars') + const { default: LoggingCollector } = require('./logging/collector') + const { default: GeoTracker } = require('./geo/tracker-monitor/tracker') + const { initRTClient } = require('./rt') + const { setLocalCurrentUser } = require('./users/current-user') + LocalVars.applicationId = appId LocalVars.secretKey = secretKey LocalVars.appPath = [LocalVars.serverURL, appId, secretKey].join('/') @@ -12,7 +12,7 @@ export function initApp(appId, secretKey) { initRTClient() LoggingCollector.reset() - GeoTrackerMonitor.reset() + GeoTracker.reset() setLocalCurrentUser() } diff --git a/src/logging/collector.js b/src/logging/collector.js index 422f25ff..71de8091 100644 --- a/src/logging/collector.js +++ b/src/logging/collector.js @@ -3,8 +3,6 @@ import Urls from '../urls' import Request from '../request' import Async from '../request/async' -import Logger from './logger' - let lastFlushListeners function flush(asyncHandler) { @@ -58,6 +56,8 @@ const LoggingCollector = { }, getLogger(loggerName) { + const { default: Logger } = require('./logger') + if (!Utils.isString(loggerName)) { throw new Error("Invalid 'loggerName' value. LoggerName must be a string value") } @@ -71,7 +71,7 @@ const LoggingCollector = { message, exception, 'log-level': logLevel, - timestamp: Date.now() + timestamp : Date.now() } LoggingCollector.pool.push(messageObj) @@ -89,7 +89,9 @@ const LoggingCollector = { flushSync: Utils.synchronized(flush), sendRequest() { - LoggingCollector.flushInterval = setTimeout(() => LoggingCollector.flush(), LoggingCollector.timeFrequency * 1000) + if (!LoggingCollector.flushInterval) { + LoggingCollector.flushInterval = setTimeout(() => LoggingCollector.flush(), LoggingCollector.timeFrequency * 1000) + } }, setLogReportingPolicy(numOfMessages, timeFrequency) { diff --git a/src/user-agent.js b/src/user-agent.js index b58282a8..50817273 100644 --- a/src/user-agent.js +++ b/src/user-agent.js @@ -1,6 +1,6 @@ -import Utils from './utils' - export function getUserAgent() { + const { default: Utils } = require('./utils') + let ua = 'NodeJS' if (Utils.isBrowser) { diff --git a/src/users/current-user.js b/src/users/current-user.js index f4b913b8..52db3b89 100644 --- a/src/users/current-user.js +++ b/src/users/current-user.js @@ -1,6 +1,4 @@ import Utils from '../utils' -import User from './user' -import Data from '../data' import Urls from '../urls' import Request from '../request' import Async from '../request/async' @@ -40,6 +38,9 @@ export const getCurrentUser = asyncHandler => { const currentUserId = stayLoggedIn && LocalCache.get('current-user-id') if (currentUserId) { + const { default: Data } = require('../data') + const { default: User } = require('./user') + return Data.of(User).findById(currentUserId, asyncHandler) } @@ -47,7 +48,7 @@ export const getCurrentUser = asyncHandler => { } export function isValidLogin(/** async */) { - const userToken = LocalCache.get('user-token') + const userToken = getCurrentUserToken() const responder = Utils.extractResponder(arguments) const isAsync = !!responder diff --git a/test/e2e/specs/init-app.js b/test/e2e/specs/init-app.js index b0720ff9..aca84183 100644 --- a/test/e2e/specs/init-app.js +++ b/test/e2e/specs/init-app.js @@ -22,9 +22,9 @@ describe('initApp', function() { const appPath = Backendless.appPath - expect(() => Backendless.applicationId = 'applicationId').to.throwError // eslint-disable-line - expect(() => Backendless.secretKey = 'secretKey').to.throwError // eslint-disable-line - expect(() => Backendless.appPath = 'appPath').to.throwError // eslint-disable-lin + expect(() => Backendless.applicationId = 'applicationId').to.throw() // eslint-disable-line + expect(() => Backendless.secretKey = 'secretKey').to.throw() // eslint-disable-line + expect(() => Backendless.appPath = 'appPath').to.throw() // eslint-disable-line expect(Backendless.applicationId).to.be.equal(APP_ID) expect(Backendless.secretKey).to.be.equal(SECRET_KEY) diff --git a/test/e2e/specs/users.js b/test/e2e/specs/users.js index 874b6bf4..db693a6e 100644 --- a/test/e2e/specs/users.js +++ b/test/e2e/specs/users.js @@ -136,11 +136,15 @@ describe('Backendless.Users', function() { it('impossible when disabled', function() { const user = Object.assign(randUser(), { foo2: 'fooValue', bar2: 'barValue' }) - return setDynamicSchema(false).then(() => - expect(Backendless.UserService.register(user)) - .to.eventually.be.rejected - .and.eventually.have.property('code', 1169) - ) + return setDynamicSchema(false) + .then(() => Backendless.UserService.register(user)) + .then(newUser => { + expect(newUser).to.have.property('objectId') + expect(newUser).to.have.property('email', user.email) + + expect(newUser).to.not.have.property('foo2') + expect(newUser).to.not.have.property('bar2') + }) }) after(() => setDynamicSchema(true)) @@ -209,13 +213,14 @@ describe('Backendless.Users', function() { describe('when multiple logins', function() { describe('disabled (default rule)', function() { - it('second login should logout previously logged in user', function() { + xit('second login should logout previously logged in user', function() { const Backendless1 = BackendlessCopy() const Backendless2 = BackendlessCopy() return Promise.resolve() .then(() => Backendless1.UserService.login(user.email, user.password, true)) .then(() => Backendless2.UserService.login(user.email, user.password, true)) + .then(() => expect(Backendless1.UserService.isValidLogin()).to.eventually.be.false) .then(() => expect(Backendless2.UserService.isValidLogin()).to.eventually.be.true) }) @@ -313,11 +318,15 @@ describe('Backendless.Users', function() { }) it('dynamic prop when feature is disabled', function() { - return setDynamicSchema(false).then(() => - expect(Backendless.UserService.update({ objectId: user.objectId, data2: 'custom data' })) - .to.eventually.be.rejected - .and.eventually.have.property('code', 1169) - ) + return setDynamicSchema(false) + .then(() => Backendless.UserService.update({ objectId: user.objectId, data2: 'custom data' })) + .then(updatedUser => { + + expect(updatedUser).to.have.property('objectId', user.objectId) + expect(updatedUser).to.have.property('email', user.email) + + expect(updatedUser).to.not.have.property('data2') + }) }) it('neighbor', function() {