123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596 |
- 'use strict'
- /*!
- * Canvas - Image
- * Copyright (c) 2010 LearnBoost <tj@learnboost.com>
- * MIT Licensed
- */
- /**
- * Module dependencies.
- */
- const bindings = require('./bindings')
- const Image = module.exports = bindings.Image
- const util = require('util')
- // Lazily loaded simple-get
- let get
- const { GetSource, SetSource } = bindings
- Object.defineProperty(Image.prototype, 'src', {
- /**
- * src setter. Valid values:
- * * `data:` URI
- * * Local file path
- * * HTTP or HTTPS URL
- * * Buffer containing image data (i.e. not a `data:` URI stored in a Buffer)
- *
- * @param {String|Buffer} val filename, buffer, data URI, URL
- * @api public
- */
- set (val) {
- if (typeof val === 'string') {
- if (/^\s*data:/.test(val)) { // data: URI
- const commaI = val.indexOf(',')
- // 'base64' must come before the comma
- const isBase64 = val.lastIndexOf('base64', commaI) !== -1
- const content = val.slice(commaI + 1)
- setSource(this, Buffer.from(content, isBase64 ? 'base64' : 'utf8'), val)
- } else if (/^\s*https?:\/\//.test(val)) { // remote URL
- const onerror = err => {
- if (typeof this.onerror === 'function') {
- this.onerror(err)
- } else {
- throw err
- }
- }
- if (!get) get = require('simple-get')
- get.concat({
- url: val,
- headers: { 'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.0.0 Safari/537.36' }
- }, (err, res, data) => {
- if (err) return onerror(err)
- if (res.statusCode < 200 || res.statusCode >= 300) {
- return onerror(new Error(`Server responded with ${res.statusCode}`))
- }
- setSource(this, data)
- })
- } else { // local file path assumed
- setSource(this, val)
- }
- } else if (Buffer.isBuffer(val)) {
- setSource(this, val)
- }
- },
- get () {
- // TODO https://github.com/Automattic/node-canvas/issues/118
- return getSource(this)
- },
- configurable: true
- })
- // TODO || is for Node.js pre-v6.6.0
- Image.prototype[util.inspect.custom || 'inspect'] = function () {
- return '[Image' +
- (this.complete ? ':' + this.width + 'x' + this.height : '') +
- (this.src ? ' ' + this.src : '') +
- (this.complete ? ' complete' : '') +
- ']'
- }
- function getSource (img) {
- return img._originalSource || GetSource.call(img)
- }
- function setSource (img, src, origSrc) {
- SetSource.call(img, src)
- img._originalSource = origSrc
- }
|