const src_canvas = document.querySelector('canvas#source');
const src_ctx = src_canvas.getContext('2d');
const result_canvas = document.querySelector('canvas#result');
const result_ctx = result_canvas.getContext('2d');
const check_canvas = document.querySelector('canvas#check');
const check_ctx = check_canvas.getContext('2d');
const w = src_canvas.width = result_canvas.width = check_canvas.width = 180;
const h = src_canvas.height = result_canvas.height = check_canvas.height = 180;
const gradient = src_ctx.createRadialGradient(w/2,h/2,0, w/2,h/2,w/3);
gradient.addColorStop(0, 'rgba(0,0,0,1)');
gradient.addColorStop(1, 'rgba(0,0,0,0)');
src_ctx.fillStyle = gradient;
src_ctx.fillRect(0,0,w,h);
result_ctx.drawImage(src_canvas,0,0);
result_ctx.globalCompositeOperation = 'source-out';
result_ctx.fillRect(0,0,w,h); // uses default fillStyle = 'black'
check_ctx.fillStyle = 'yellow'; // to check if the figure isn't fully opaque
check_ctx.fillRect(0,0,w,h);
check_ctx.drawImage(result_canvas,0,0);
<canvas id="source"></canvas>
<canvas id="result"></canvas>
<canvas id="check"></canvas>