Class: Dommy::FileReader

Inherits:
Object
  • Object
show all
Includes:
EventTarget
Defined in:
lib/dommy/file_reader.rb

Overview

‘FileReader` — reads `Blob` / `File` instances into Strings, byte arrays, or data URLs. Asynchronous reads schedule a microtask that fires `load` + `loadend`; sync access (via `result` after the microtask drain) mirrors browser behavior.

Spec: w3c.github.io/FileAPI/#APIASynch

Constant Summary collapse

EMPTY =
0
LOADING =
1
DONE =
2
INLINE_HANDLERS =
%w[loadstart progress load loadend abort error].freeze

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods included from EventTarget

#__deliver_event__, #add_event_listener, #dispatch_event, #invoke_listener, #remove_event_listener

Constructor Details

#initialize(window) ⇒ FileReader

Returns a new instance of FileReader.



21
22
23
24
25
26
27
28
29
# File 'lib/dommy/file_reader.rb', line 21

def initialize(window)
  @window = window
  @ready_state = EMPTY
  @result = nil
  @error = nil
  @inline_handlers = {}
  @aborted = false
  @generation = 0
end

Instance Attribute Details

#errorObject (readonly)

Returns the value of attribute error.



19
20
21
# File 'lib/dommy/file_reader.rb', line 19

def error
  @error
end

#ready_stateObject (readonly)

Returns the value of attribute ready_state.



19
20
21
# File 'lib/dommy/file_reader.rb', line 19

def ready_state
  @ready_state
end

#resultObject (readonly)

Returns the value of attribute result.



19
20
21
# File 'lib/dommy/file_reader.rb', line 19

def result
  @result
end

Instance Method Details

#__event_parent__Object



117
118
119
# File 'lib/dommy/file_reader.rb', line 117

def __event_parent__
  nil
end

#__js_call__(method, args) ⇒ Object



96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
# File 'lib/dommy/file_reader.rb', line 96

def __js_call__(method, args)
  case method
  when "readAsText"
    read_as_text(args[0], args[1])
  when "readAsDataURL"
    read_as_data_url(args[0])
  when "readAsArrayBuffer"
    read_as_array_buffer(args[0])
  when "readAsBinaryString"
    read_as_binary_string(args[0])
  when "abort"
    abort
  when "addEventListener"
    add_event_listener(args[0], args[1], args[2])
  when "removeEventListener"
    remove_event_listener(args[0], args[1])
  when "dispatchEvent"
    dispatch_event(args[0])
  end
end

#__js_get__(key) ⇒ Object



71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
# File 'lib/dommy/file_reader.rb', line 71

def __js_get__(key)
  case key
  when "readyState"
    @ready_state
  when "result"
    @result
  when "error"
    @error
  when "EMPTY"
    EMPTY
  when "LOADING"
    LOADING
  when "DONE"
    DONE
  else
    @inline_handlers[inline_event_for(key)]
  end
end

#__js_set__(key, value) ⇒ Object



90
91
92
93
94
# File 'lib/dommy/file_reader.rb', line 90

def __js_set__(key, value)
  event = inline_event_for(key)
  set_inline_handler(event, value) if event
  nil
end

#abortObject



59
60
61
62
63
64
65
66
67
68
69
# File 'lib/dommy/file_reader.rb', line 59

def abort
  return if @ready_state != LOADING

  @aborted = true
  @generation += 1
  @ready_state = DONE
  @result = nil
  dispatch_event(Event.new("abort"))
  dispatch_event(Event.new("loadend"))
  nil
end

#read_as_array_buffer(blob) ⇒ Object Also known as: readAsArrayBuffer



47
48
49
# File 'lib/dommy/file_reader.rb', line 47

def read_as_array_buffer(blob)
  schedule_read(blob) { |raw| raw.bytes }
end

#read_as_binary_string(blob) ⇒ Object Also known as: readAsBinaryString



53
54
55
# File 'lib/dommy/file_reader.rb', line 53

def read_as_binary_string(blob)
  schedule_read(blob) { |raw| raw.dup.force_encoding("ASCII-8BIT") }
end

#read_as_data_url(blob) ⇒ Object Also known as: readAsDataURL



37
38
39
40
41
42
43
# File 'lib/dommy/file_reader.rb', line 37

def read_as_data_url(blob)
  schedule_read(blob) do |raw|
    mime = blob.respond_to?(:type) ? blob.type.to_s : ""
    mime = "application/octet-stream" if mime.empty?
    "data:#{mime};base64,#{[raw].pack("m0")}"
  end
end

#read_as_text(blob, _encoding = "utf-8") ⇒ Object Also known as: readAsText



31
32
33
# File 'lib/dommy/file_reader.rb', line 31

def read_as_text(blob, _encoding = "utf-8")
  schedule_read(blob) { |raw| raw.dup.force_encoding("UTF-8") }
end