Merge pull request #2052 from resin-io/sdk-refactor

feat(sdk): Consolidate low-level components into SDK
This commit is contained in:
Jonas Hermsmeier 2018-02-16 09:59:32 -08:00 committed by GitHub
commit 1fa9d7d7d7
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
45 changed files with 151 additions and 96 deletions

View File

@ -22,10 +22,10 @@ const fs = Bluebird.promisifyAll(require('fs'))
const mountutils = Bluebird.promisifyAll(require('mountutils'))
const drivelist = Bluebird.promisifyAll(require('drivelist'))
const os = require('os')
const imageStream = require('../image-stream')
const imageStream = require('../sdk/image-stream')
const errors = require('../shared/errors')
const constraints = require('../shared/drive-constraints')
const ImageWriter = require('../writer')
const ImageWriter = require('../sdk/writer')
const diskpart = require('./diskpart')
/**

View File

@ -21,7 +21,7 @@ const Bluebird = require('bluebird')
const fs = Bluebird.promisifyAll(require('fs'))
const path = require('path')
const settings = require('../models/settings')
const SDK = require('../../../shared/sdk')
const SDK = require('../../../sdk')
/**
* @summary The Etcher "blobs" directory path
@ -31,7 +31,7 @@ const SDK = require('../../../shared/sdk')
const BLOBS_DIRECTORY = path.join(__dirname, '..', '..', 'blobs')
const scanner = SDK.createScanner({
standard: {
blockdevice: {
get includeSystemDrives () {
return settings.get('unsafeMode')
}

View File

@ -21,7 +21,7 @@ const Bluebird = require('bluebird')
const path = require('path')
const messages = require('../../../../../shared/messages')
const errors = require('../../../../../shared/errors')
const imageStream = require('../../../../../image-stream')
const imageStream = require('../../../../../sdk/image-stream')
const supportedFormats = require('../../../../../shared/supported-formats')
const analytics = require('../../../modules/analytics')
const selectionState = require('../../../../../shared/models/selection-state')

View File

@ -22,15 +22,15 @@ const EventEmitter = require('events')
const drivelist = Bluebird.promisifyAll(require('drivelist'))
/**
* @summary StandardAdapter
* @summary BlockDeviceAdapter
* @class
*/
class StandardAdapter extends EventEmitter {
class BlockDeviceAdapter extends EventEmitter {
/**
* @summary StandardAdapter constructor
* @summary BlockDeviceAdapter constructor
* @class
* @example
* const adapter = new StandardAdapter()
* const adapter = new BlockDeviceAdapter()
*/
constructor () {
super()
@ -51,7 +51,7 @@ class StandardAdapter extends EventEmitter {
* @param {Object} [options] - options
* @param {Object} [options.includeSystemDrives=false] - include system drives
* @param {Function} [callback] - optional callback
* @returns {StandardAdapter}
* @returns {BlockDeviceAdapter}
*
* @example
* adapter.scan({
@ -101,7 +101,7 @@ class StandardAdapter extends EventEmitter {
* @type {String}
* @constant
*/
StandardAdapter.id = 'standard'
BlockDeviceAdapter.id = 'blockdevice'
// Exports
module.exports = StandardAdapter
module.exports = BlockDeviceAdapter

46
lib/sdk/adapters/index.js Normal file
View File

@ -0,0 +1,46 @@
/*
* Copyright 2017 resin.io
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
'use strict'
const _ = require('lodash')
const os = require('os')
/**
* @summary The list of loaded adapters
* @type {Object[]}
* @constant
*/
const ADAPTERS = [
require('./blockdevice')
]
// We don't support usbboot on GNU/Linux yet, given
// that some distributions require root permissions
// to open USB devices.
if (os.platform() !== 'linux') {
ADAPTERS.push(require('./usbboot'))
}
/**
* @summary Initialised adapters
* @type {Object<String,Adapter>}
* @constant
*/
module.exports = _.reduce(ADAPTERS, (adapters, Adapter) => {
adapters[Adapter.id] = new Adapter()
return adapters
}, {})

View File

@ -27,7 +27,7 @@ const Bluebird = require('bluebird')
const debug = require('debug')('sdk:usbboot')
const usb = require('./usb')
const protocol = require('./protocol')
const utils = require('../../utils')
const utils = require('../../../shared/utils')
debug.enabled = true

View File

@ -20,7 +20,7 @@ const Bluebird = require('bluebird')
const _ = require('lodash')
const StreamZip = require('node-stream-zip')
const yauzl = Bluebird.promisifyAll(require('yauzl'))
const errors = require('../../shared/errors')
const errors = require('../../../shared/errors')
/**
* @summary Get all archive entries

View File

@ -21,8 +21,8 @@ const _ = require('lodash')
const PassThroughStream = require('stream').PassThrough
const supportedFileTypes = require('./supported')
const utils = require('./utils')
const errors = require('../shared/errors')
const fileExtensions = require('../shared/file-extensions')
const errors = require('../../shared/errors')
const fileExtensions = require('../../shared/file-extensions')
/**
* @summary Archive metadata base path

View File

@ -29,9 +29,9 @@ const udif = Bluebird.promisifyAll(require('udif'))
const archive = require('./archive')
const utils = require('./utils')
const zipArchiveHooks = require('./archive-hooks/zip')
const fileExtensions = require('../shared/file-extensions')
const fileExtensions = require('../../shared/file-extensions')
const path = require('path')
const errors = require('../shared/errors')
const errors = require('../../shared/errors')
/**
* @summary Default image extension to be assumed

View File

@ -23,7 +23,7 @@ const stream = require('stream')
const mime = require('./mime')
const handlers = require('./handlers')
const supportedFileTypes = require('./supported')
const errors = require('../shared/errors')
const errors = require('../../shared/errors')
const parsePartitions = require('./parse-partitions')
/**
@ -54,7 +54,7 @@ const parsePartitions = require('./parse-partitions')
* @returns {Promise}
*
* @example
* const imageStream = require('./lib/image-stream');
* const imageStream = require('./lib/sdk/image-stream');
*
* imageStream.getFromFilePath('path/to/rpi.img.xz').then((image) => {
* console.log(`The image display name is: ${image.name}`);
@ -106,7 +106,7 @@ exports.getFromFilePath = (file) => {
* @returns {Promise}
*
* @example
* const imageStream = require('./lib/image-stream');
* const imageStream = require('./lib/sdk/image-stream');
*
* imageStream.getImageMetadata('path/to/rpi.img.xz').then((metadata) => {
* console.log(`The image display name is: ${metadata.name}`);
@ -131,7 +131,7 @@ exports.getImageMetadata = (file) => {
* @public
*
* @example
* const imageStream = require('./lib/image-stream');
* const imageStream = require('./lib/sdk/image-stream');
*
* imageStream.supportedFileTypes.forEach((fileType) => {
* console.log('Supported file type: ' + fileType.extension);

View File

@ -18,7 +18,7 @@
const Bluebird = require('bluebird')
const fs = Bluebird.promisifyAll(require('fs'))
const errors = require('../shared/errors')
const errors = require('../../shared/errors')
/**
* @summary Read a buffer from an image file descriptor

47
lib/sdk/index.js Normal file
View File

@ -0,0 +1,47 @@
/*
* Copyright 2017 resin.io
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
'use strict'
const SDK = module.exports
/**
* @summary Initialised adapters
* @type {Object<String,Adapter>}
* @constant
*/
SDK.adapters = require('./adapters')
/**
* Adapter Scanner
* @see scanner.js
* @ignore
*/
SDK.Scanner = require('./scanner')
/**
* @summary Create a new Scanner
* @param {Object} [options] - options
* @returns {SDK.Scanner}
* @example
* SDK.createScanner({
* blockdevice: { ... },
* usbboot: { ... }
* })
*/
SDK.createScanner = (options) => {
return new SDK.Scanner(options)
}

View File

@ -16,54 +16,28 @@
'use strict'
const EventEmitter = require('events')
const _ = require('lodash')
const SDK = module.exports
const debug = require('debug')('sdk')
const os = require('os')
const EventEmitter = require('events')
const debug = require('debug')('sdk:scanner')
const SDK = require('./')
debug.enabled = true
/**
* @summary The list of loaded adapters
* @type {Object[]}
* @constant
*/
const ADAPTERS = [
require('./standard')
]
// We don't support usbboot on GNU/Linux yet, given
// that some distributions require root permissions
// to open USB devices.
if (os.platform() !== 'linux') {
ADAPTERS.push(require('./usbboot'))
}
/**
* @summary Initialised adapters
* @type {Object<String,Adapter>}
* @constant
*/
SDK.adapters = _.reduce(ADAPTERS, (adapters, Adapter) => {
adapters[Adapter.id] = new Adapter()
return adapters
}, {})
/* eslint-disable lodash/prefer-lodash-method */
/**
* Adapter Scanner
* @class Scanner
* @memberOf SDK
*/
SDK.Scanner = class Scanner extends EventEmitter {
class Scanner extends EventEmitter {
/**
* @summary Adapter Scanner constructor
* @param {Object<String,Object>} [options] - device adapter options
* @param {Object} [options.adapters] - map of external device adapters
* @example
* new SDK.Scanner({
* standard: { ... },
* new Scanner({
* blockdevice: { ... },
* usbboot: { ... }
* })
*/
@ -133,7 +107,7 @@ SDK.Scanner = class Scanner extends EventEmitter {
/**
* @summary Start scanning for devices
* @public
* @returns {SDK.Scanner}
* @returns {Scanner}
* @example
* scanner.start()
*/
@ -156,7 +130,7 @@ SDK.Scanner = class Scanner extends EventEmitter {
const runScan = () => {
adapter.scan(options, () => {
if (this.isScanning) {
setTimeout(runScan, SDK.Scanner.MIN_SCAN_DELAY)
setTimeout(runScan, Scanner.MIN_SCAN_DELAY)
}
})
}
@ -177,7 +151,7 @@ SDK.Scanner = class Scanner extends EventEmitter {
/**
* @summary Stop scanning for devices
* @public
* @returns {SDK.Scanner}
* @returns {Scanner}
* @example
* scanner.stop()
*/
@ -202,7 +176,7 @@ SDK.Scanner = class Scanner extends EventEmitter {
* @summary Subscribe to an adapter
* @public
* @param {Adapter} adapter - device adapter
* @returns {SDK.Scanner}
* @returns {Scanner}
* @example
* scanner.subscribe(adapter)
*/
@ -223,7 +197,7 @@ SDK.Scanner = class Scanner extends EventEmitter {
* @summary Unsubscribe from an adapter
* @public
* @param {Adapter} adapter - device adapter
* @returns {SDK.Scanner}
* @returns {Scanner}
* @example
* scanner.unsubscribe(adapter)
* // OR
@ -253,18 +227,6 @@ SDK.Scanner = class Scanner extends EventEmitter {
* @const
* @type {Number}
*/
SDK.Scanner.MIN_SCAN_DELAY = 500
Scanner.MIN_SCAN_DELAY = 500
/**
* @summary Create a new Scanner
* @param {Object} [options] - options
* @returns {SDK.Scanner}
* @example
* SDK.createScanner({
* standard: { ... },
* usbboot: { ... }
* })
*/
SDK.createScanner = (options) => {
return new SDK.Scanner(options)
}
module.exports = Scanner

View File

@ -18,7 +18,7 @@
const _ = require('lodash')
const path = require('path')
const imageStream = require('../image-stream')
const imageStream = require('../sdk/image-stream')
const fileExtensions = require('./file-extensions')
/**

View File

@ -164,7 +164,7 @@ describe('Browser: driveScanner', function () {
path: '/mnt/foo'
}
],
adapter: 'standard',
adapter: 'blockdevice',
isSystem: false,
isRemovable: false
},
@ -178,7 +178,7 @@ describe('Browser: driveScanner', function () {
path: '/mnt/bar'
}
],
adapter: 'standard',
adapter: 'blockdevice',
isSystem: false,
isRemovable: false
}
@ -268,7 +268,7 @@ describe('Browser: driveScanner', function () {
description: 'Foo',
size: '14G',
mountpoints: [],
adapter: 'standard',
adapter: 'blockdevice',
isSystem: false,
isRemovable: false
},
@ -282,7 +282,7 @@ describe('Browser: driveScanner', function () {
path: 'F:'
}
],
adapter: 'standard',
adapter: 'blockdevice',
isSystem: false,
isRemovable: false
}

View File

@ -18,8 +18,8 @@
const m = require('mochainon')
const path = require('path')
const zipHooks = require('../../../lib/image-stream/archive-hooks/zip')
const utils = require('../../../lib/image-stream/utils')
const zipHooks = require('../../../lib/sdk/image-stream/archive-hooks/zip')
const utils = require('../../../lib/sdk/image-stream/utils')
const tester = require('../tester')
const ZIP_PATH = path.join(__dirname, '..', 'data', 'zip')

View File

@ -22,7 +22,7 @@ const path = require('path')
const DATA_PATH = path.join(__dirname, 'data')
const IMAGES_PATH = path.join(DATA_PATH, 'images')
const BZ2_PATH = path.join(DATA_PATH, 'bz2')
const imageStream = require('../../lib/image-stream/index')
const imageStream = require('../../lib/sdk/image-stream/index')
const tester = require('./tester')
describe('ImageStream: BZ2', function () {

View File

@ -21,7 +21,7 @@ const path = require('path')
const DATA_PATH = path.join(__dirname, 'data')
const IMAGES_PATH = path.join(DATA_PATH, 'images')
const errors = require('../../lib/shared/errors')
const imageStream = require('../../lib/image-stream/index')
const imageStream = require('../../lib/sdk/image-stream/index')
describe('ImageStream: Directory', function () {
describe('.getFromFilePath()', function () {

View File

@ -22,7 +22,7 @@ const path = require('path')
const DATA_PATH = path.join(__dirname, 'data')
const IMAGES_PATH = path.join(DATA_PATH, 'images')
const DMG_PATH = path.join(DATA_PATH, 'dmg')
const imageStream = require('../../lib/image-stream/index')
const imageStream = require('../../lib/sdk/image-stream/index')
const tester = require('./tester')
describe('ImageStream: DMG', function () {

View File

@ -22,7 +22,7 @@ const path = require('path')
const DATA_PATH = path.join(__dirname, 'data')
const IMAGES_PATH = path.join(DATA_PATH, 'images')
const GZ_PATH = path.join(DATA_PATH, 'gz')
const imageStream = require('../../lib/image-stream/index')
const imageStream = require('../../lib/sdk/image-stream/index')
const tester = require('./tester')
describe('ImageStream: GZ', function () {

View File

@ -21,7 +21,7 @@ const fs = require('fs')
const path = require('path')
const DATA_PATH = path.join(__dirname, 'data')
const IMAGES_PATH = path.join(DATA_PATH, 'images')
const imageStream = require('../../lib/image-stream/index')
const imageStream = require('../../lib/sdk/image-stream/index')
const tester = require('./tester')
describe('ImageStream: IMG', function () {

View File

@ -18,7 +18,7 @@
const m = require('mochainon')
const _ = require('lodash')
const imageStream = require('../../lib/image-stream/index')
const imageStream = require('../../lib/sdk/image-stream/index')
describe('ImageStream', function () {
describe('.supportedFileTypes', function () {

View File

@ -21,7 +21,7 @@ const fs = require('fs')
const path = require('path')
const DATA_PATH = path.join(__dirname, 'data')
const IMAGES_PATH = path.join(DATA_PATH, 'images')
const imageStream = require('../../lib/image-stream/index')
const imageStream = require('../../lib/sdk/image-stream/index')
const tester = require('./tester')
describe('ImageStream: ISO', function () {

View File

@ -22,7 +22,7 @@ const DATA_PATH = path.join(__dirname, '..', 'data')
const IMAGES_PATH = path.join(DATA_PATH, 'images')
const ZIP_PATH = path.join(DATA_PATH, 'metadata', 'zip')
const tester = require('../tester')
const imageStream = require('../../../lib/image-stream/index')
const imageStream = require('../../../lib/sdk/image-stream/index')
const testMetadataProperty = (archivePath, propertyName, expectedValue) => {
return imageStream.getFromFilePath(archivePath).then((image) => {

View File

@ -19,7 +19,7 @@
const m = require('mochainon')
const path = require('path')
const DATA_PATH = path.join(__dirname, 'data')
const mime = require('../../lib/image-stream/mime')
const mime = require('../../lib/sdk/image-stream/mime')
describe('ImageStream: MIME', function () {
describe('.getMimeTypeFromFileName()', function () {

View File

@ -22,7 +22,7 @@ const Bluebird = require('bluebird')
const fs = Bluebird.promisifyAll(require('fs'))
const os = require('os')
const path = require('path')
const imageStream = require('../../lib/image-stream/index')
const imageStream = require('../../lib/sdk/image-stream/index')
const doFilesContainTheSameData = (file1, file2) => {
return Bluebird.props({

View File

@ -18,7 +18,7 @@
const m = require('mochainon')
const StreamReadable = require('stream').Readable
const utils = require('../../lib/image-stream/utils')
const utils = require('../../lib/sdk/image-stream/utils')
describe('ImageStream: Utils', function () {
describe('.extractStream()', function () {

View File

@ -22,7 +22,7 @@ const path = require('path')
const DATA_PATH = path.join(__dirname, 'data')
const IMAGES_PATH = path.join(DATA_PATH, 'images')
const XZ_PATH = path.join(DATA_PATH, 'xz')
const imageStream = require('../../lib/image-stream/index')
const imageStream = require('../../lib/sdk/image-stream/index')
const tester = require('./tester')
describe('ImageStream: XZ', function () {

View File

@ -22,7 +22,7 @@ const path = require('path')
const DATA_PATH = path.join(__dirname, 'data')
const IMAGES_PATH = path.join(DATA_PATH, 'images')
const ZIP_PATH = path.join(DATA_PATH, 'zip')
const imageStream = require('../../lib/image-stream/index')
const imageStream = require('../../lib/sdk/image-stream/index')
const tester = require('./tester')
describe('ImageStream: ZIP', function () {

View File

@ -39,7 +39,7 @@ module.exports = {
// on the tree (for testing purposes) or inside a generated
// bundle (for production purposes), by translating
// relative require paths within the bundle.
if (/\.\/(shared|image-stream)/i.test(request)) {
if (/\/(sdk|shared)/i.test(request)) {
return callback(null, `commonjs ../../../lib/${_.replace(request, /(\.\.\/)*/, '')}`)
}